บทที่ 9: การสร้างเกมหลายด่าน (Multiple Scenes)
ในเกมหลายเกม ผู้เล่นต้องเล่นผ่านด่านหรือฉาก (Scenes) ต่าง ๆ เพื่อดำเนินการไปสู่เป้าหมายต่อไป ใน Unity เราสามารถสร้างด่านหลายด่านหรือหลายฉากได้อย่างง่ายดาย โดยใช้ระบบ Scenes ของ Unity ระบบนี้จะช่วยให้เราสามารถสร้างฉากต่าง ๆ แยกจากกัน และเปลี่ยนฉากเมื่อผู้เล่นทำตามเงื่อนไขหรือผ่านด่านสำเร็จ ในบทนี้เราจะเรียนรู้วิธีสร้างเกมที่มีหลายด่านและวิธีการเปลี่ยนฉากใน Unity
การสร้างหลายฉาก (Scenes)
ฉาก (Scenes) ใน Unity คือพื้นที่ที่แยกกัน ซึ่งอาจเป็นด่าน (Levels) หรือสถานที่ต่าง ๆ ในเกม เช่น ฉากเริ่มต้น ฉากผจญภัย หรือฉากจบ
ขั้นตอนการสร้างฉากใหม่
- ไปที่เมนู File > New Scene เพื่อสร้างฉากใหม่
- เมื่อสร้างฉากเสร็จแล้ว เราสามารถเพิ่มวัตถุและตัวละครลงในฉากตามที่ต้องการ เช่น การสร้างวัตถุที่เป็นพื้นดินหรือฉากหลัง (Background)
- บันทึกฉากโดยไปที่ File > Save As ตั้งชื่อฉากตามความเหมาะสม เช่น "Level1" หรือ "MainMenu"
เมื่อเรามีหลายฉากแล้ว เราสามารถสลับไปมาระหว่างฉากเหล่านี้ได้โดยใช้ระบบ SceneManager ของ Unity
การสลับฉากด้วย SceneManager
การสลับฉากเมื่อผู้เล่นทำภารกิจสำเร็จหรือผ่านด่านสามารถทำได้ด้วยโค้ดโดยใช้ SceneManager ใน Unity เราจะใช้ฟังก์ชัน LoadScene()
เพื่อเปลี่ยนไปยังฉากถัดไป ตัวอย่างเช่น เมื่อผู้เล่นเดินผ่านประตูหรือพื้นที่ที่กำหนดไว้
ตัวอย่างโค้ดการเปลี่ยนฉาก
using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneSwitcher : MonoBehaviour
{
void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.tag == "Player")
{
SceneManager.LoadScene("NextLevel"); // เปลี่ยนไปยังฉากถัดไปเมื่อผู้เล่นเดินเข้าไปในพื้นที่
}
}
}
ในโค้ดนี้ เมื่อผู้เล่นชนกับวัตถุที่มีแท็กว่า "Player" ระบบจะทำการเปลี่ยนไปยังฉากที่ชื่อว่า "NextLevel"
การเปลี่ยนฉากด้วยปุ่ม
นอกจากการเปลี่ยนฉากโดยการชนกับวัตถุแล้ว เรายังสามารถสร้างปุ่ม UI เพื่อให้ผู้เล่นคลิกและเปลี่ยนฉากได้ ตัวอย่างเช่น การคลิกปุ่มเริ่มเกมในหน้าจอเมนูเพื่อเริ่มด่านแรก:
- สร้างปุ่ม UI โดยไปที่ Hierarchy > UI > Button
- เพิ่มโค้ดเพื่อควบคุมการเปลี่ยนฉากเมื่อปุ่มถูกคลิก
ตัวอย่างโค้ดการเปลี่ยนฉากเมื่อคลิกปุ่ม
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class MainMenu : MonoBehaviour
{
public Button startButton;
void Start()
{
startButton.onClick.AddListener(StartGame);
}
void StartGame()
{
SceneManager.LoadScene("Level1"); // เปลี่ยนไปยังด่านแรกเมื่อคลิกปุ่มเริ่มเกม
}
}
ในโค้ดนี้ เมื่อผู้เล่นคลิกปุ่ม startButton
ระบบจะเปลี่ยนไปยังฉาก "Level1"
การโหลดฉากต่อเนื่อง (Loading Scenes)
Unity ยังมีระบบที่ช่วยให้เราสามารถโหลดฉากใหม่ในขณะที่ฉากปัจจุบันยังคงแสดงอยู่ได้ ระบบนี้เรียกว่า Loading Scenes หรือการโหลดฉากต่อเนื่อง ซึ่งเป็นประโยชน์เมื่อเราต้องการโหลดข้อมูลในฉากใหม่ระหว่างการเปลี่ยนฉาก
ตัวอย่างการสร้างฉากโหลด (Loading Scene)
- สร้างฉากใหม่ที่ใช้สำหรับแสดงข้อความหรือภาพระหว่างการโหลด เช่น ฉากที่แสดงคำว่า "Loading..."
- ในการโหลดฉากพร้อมกันสามารถใช้ฟังก์ชัน
LoadSceneAsync()
ตัวอย่างเช่น:
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class LoadingScene : MonoBehaviour
{
public Text loadingText;
void Start()
{
StartCoroutine(LoadLevelAsync("NextLevel"));
}
IEnumerator LoadLevelAsync(string sceneName)
{
AsyncOperation operation = SceneManager.LoadSceneAsync(sceneName);
while (!operation.isDone)
{
loadingText.text = "Loading... " + (operation.progress * 100).ToString("F0") + "%";
yield return null;
}
}
}
ในโค้ดนี้ เราใช้ฟังก์ชัน LoadSceneAsync()
เพื่อโหลดฉากใหม่ และแสดงเปอร์เซ็นต์ความคืบหน้าของการโหลดในข้อความ loadingText
การใช้ DontDestroyOnLoad สำหรับวัตถุที่ไม่ต้องการให้ถูกทำลาย
บางครั้งเราอาจต้องการให้วัตถุหรือข้อมูลคงอยู่ระหว่างการเปลี่ยนฉาก เช่น คะแนนของผู้เล่นหรือเพลงประกอบ เราสามารถใช้ฟังก์ชัน DontDestroyOnLoad()
เพื่อให้วัตถุไม่ถูกทำลายเมื่อมีการเปลี่ยนฉาก
ตัวอย่างการใช้ DontDestroyOnLoad
using UnityEngine;
public class MusicManager : MonoBehaviour
{
void Awake()
{
DontDestroyOnLoad(gameObject); // ไม่ให้วัตถุนี้ถูกทำลายเมื่อเปลี่ยนฉาก
}
}
ในโค้ดนี้ วัตถุที่มี MusicManager
ติดอยู่จะยังคงอยู่เมื่อมีการเปลี่ยนฉาก ทำให้เสียงเพลงที่เล่นไม่ถูกหยุด