ตัวอย่างการสร้าง Dialogue system หรือ ระบบสนทนาอย่างง่ายให้เกมของเรา บน Unity 3D โดยใช้วิธีการเรียกอ่านทีละบรรทัดจากไฟล์ Text นามสกุล .txt
รอบนี้เอาตัวอย่างแบบง่ายๆ มาให้ลองทำกันดูครับ เป็นวิธีการเรียกไฟล์ txt มาทีละบรรทัดโดยใช้การเคาะ Space Bar ของเราให้เปลี่ยนบรรทัดเพื่อแสดงบทสนทนาครับ
ขอนำโมเดล 3D ของนักศึกษาสาขาการออกแบบเชิงโต้ตอบและการพัฒนาเกม มหาวิทยาลัยธุรกิจบัณฑิตย์เกม Waveup ที่แข่ง Game Jam 2017 มาใช้ประกอบตัวอย่างการเรียนนะครับ ให้เปิดโปรแกรม Unity 3D ขึ้นมา ทำการ Rigged สร้างแอนิเมชันเคลื่อนไหวให้เรียบร้อย หลังจากนั้นให้สร้างไฟล์ .txt หรือ Text File ไว้ใน Folder ชื่อ Assets ของ Project เราครับใส่บทสนทนาทีละบบรรทัดตามตัวอย่าง
ตำแหน่งที่ไฟล์จะวางอยู่จะอยู่ในตำแหน่งนี้ครับดังรูป
ต่อมาให้เราออกแบบ Scene ของเราโดยนำตัวละครไปวางจัดแสง ท่าทางให้เรียบร้อย
เมื่อเราได้ท่าทางที่ต้องการแล้วให้เราสร้าง UI Group ขึ้นมาประกอบไปด้วย Canvas, Panel และ Text ครับโดยเฉพาะ Text ให้ปรับขนาดตัวอักษรเป็นสีขาว และตัวใหญ่ประมาณหนึ่งเพื่ออ่านได้ง่าย
ปรับส่วนของ Canvas Scaler ให้เป็น “Scale With Screen Size” เพื่อปรับให้เป็น Responsive View สำหรับทุกหน้าจอโดยอ้างอิงตามขนาดของหน้าจอ
เมื่อเสร็จแล้วให้ไปที่ “MainCamera” สร้างไฟล์ C# ขึ้นมาว่าอะไรก็ได้ในตัวอย่างใช้ “dialogToggle.cs”
ทำการประกาศตัวแปร ดังนี้เพื่อ ทำงานร่วมกับ UI ที่ตำแหน่ง Header
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;
ประกาศ TextAsset ไว้ในตัวแปร TextFile สำหรับลาก Text File ที่เราสร้างไว้มาวาง กำหนด Panel ให้เก็บในตัวแปร panel_msg กำหนดตัวแปร Dialog_1 เป็น Text สำหรับ Display
สร้างการอ่าน บรรทัดของไฟล์ Text ถ้าเป็นค่าว่างให้ไม่แสดงผลใน เมธอด Start()
public GameObject panel_msg; public TextAsset TextFile; public Text Dialog_1; public int line = 0; void Start () { if(line == null){ line = 0; } if(TextFile!=null){ GetDialog(0); } }
ในฟังก์ชันเมธอด Update ทำงานดังนี้
void Update () { StartCoroutine(delayWords()); if(Input.GetKeyDown(KeyCode.Space)){ line =line +1; //ทำงาน } } public IEnumerator delayWords(){ yield return new WaitForSeconds(1.0f); }
ให้ Delay ระยะเวลา 1 วินาทีเพื่อเรียกบรรทัดใหม่ เมื่อเกิดการกดปุ่ม Space Bar หลังจากนั้นแทนค่าของ “//ทำงาน” ด้วย
GetDialog(line);
เพิ่มเมธอดทำงานส่วนของการเรียกบรรทัดใหม่ดังนี้
void GetDialog(int line) { string[] linesInFile = TextFile.text.Split('\n'); if(line < linesInFile.Length){ Debug.Log(linesInFile.Length); Dialog_1.text = linesInFile[line]; }else{ Dialog_1.text = "Loading Data....."; panel_msg.gameObject.SetActive(false); StartCoroutine(LoadData()); } } public IEnumerator LoadData(){ yield return new WaitForSeconds(2.0f); Time.timeScale = 0; Application.LoadLevel("Quit"); }
ไฟล์ dialogToggle.cs จะเป็นดังนี้
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class dialogToggle : MonoBehaviour { public GameObject panel_msg; public TextAsset TextFile; public Text Dialog_1; public int line = 0; void Start () { if(line == null){ line = 0; } if(TextFile!=null){ GetDialog(0); } } void Update () { StartCoroutine(delayWords()); if(Input.GetKeyDown(KeyCode.Space)){ line =line +1; GetDialog(line); } } public IEnumerator delayWords(){ yield return new WaitForSeconds(1.0f); } void GetDialog(int line) { string[] linesInFile = TextFile.text.Split('\n'); if(line < linesInFile.Length){ Debug.Log(linesInFile.Length); Dialog_1.text = linesInFile[line]; }else{ Dialog_1.text = "Loading Data....."; panel_msg.gameObject.SetActive(false); StartCoroutine(LoadData()); } } public IEnumerator LoadData(){ yield return new WaitForSeconds(2.0f); Time.timeScale = 0; Application.LoadLevel("Quit"); } }
ทำงานง่ายๆคือ ลากทุกสิ่งใน Hierarchy ไปวางใน MainCamera ตามภาพ
ทำการทดสอบแล้วกด Space Bar
เมื่อจบบรรทัดไม่มีต่อ ก็จะลบ Panel และ Text ออกไปจากจอ
แค่นี้แหละครับเทคนิคการสร้าง ระบบ Dialogue system แบบง่ายๆ