Game DevelopmentUnity 3D

Unity 3D การสร้าง Dialogue System โดยอ่านจากไฟล์ Text

ตัวอย่างการสร้าง 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 แบบง่ายๆ

Asst. Prof. Banyapon Poolsawas

อาจารย์ประจำสาขาวิชาการออกแบบเชิงโต้ตอบ และการพัฒนาเกม วิทยาลัยครีเอทีฟดีไซน์ & เอ็นเตอร์เทนเมนต์เทคโนโลยี มหาวิทยาลัยธุรกิจบัณฑิตย์ ผู้ก่อตั้ง บริษัท Daydev Co., Ltd, (เดย์เดฟ จำกัด)

Related Articles

Back to top button

Adblock Detected

เราตรวจพบว่าคุณใช้ Adblock บนบราวเซอร์ของคุณ,กรุณาปิดระบบ Adblock ก่อนเข้าอ่าน Content ของเรานะครับ, ถือว่าช่วยเหลือกัน