บทที่ 7: การสร้างเกมหลายด่านที่มีความท้าทายมากขึ้น
การสร้างเกมที่มีหลายด่าน (Multiple Levels) เป็นวิธีหนึ่งในการเพิ่มความท้าทายและความน่าสนใจให้กับเกม เกมที่มีหลายด่านมักจะมีการเปลี่ยนแปลงความยากของแต่ละด่าน และมีเป้าหมายที่ต่างกันเพื่อกระตุ้นให้ผู้เล่นต้องใช้ทักษะและความสามารถที่เพิ่มมากขึ้นในการผ่านด่านไปเรื่อย ๆ การออกแบบด่านที่ดีควรมีการปรับระดับความยากอย่างเหมาะสม รวมถึงการจัดวางสิ่งกีดขวางและศัตรูในลักษณะที่ท้าทายแต่ยังคงความยุติธรรมในการเล่น
ในบทนี้ เราจะเรียนรู้วิธีการออกแบบเกมหลายด่านใน Unity ตั้งแต่การสร้างแต่ละด่าน, การเปลี่ยนด่าน (Scene Switching), ไปจนถึงการบันทึกความคืบหน้า (Saving Progress) ของผู้เล่น และการปลดล็อกด่านถัดไปเมื่อผ่านเงื่อนไขที่กำหนด
การสร้างด่าน (Level Creation)
การออกแบบด่าน (Level Design) คือการกำหนดโครงสร้างของแต่ละด่านในเกม รวมถึงการจัดวางฉาก, ศัตรู, สิ่งกีดขวาง และไอเท็มต่าง ๆ ที่ผู้เล่นจะต้องโต้ตอบ การจัดวางที่ดีควรมีความท้าทายและสนุกสนานสำหรับผู้เล่น
ขั้นตอนการสร้างด่าน
- สร้าง Scene ใหม่สำหรับแต่ละด่านโดยไปที่ File > New Scene
- ตั้งชื่อ Scene ตามด่าน เช่น Level1 หรือ Stage1
- เพิ่มวัตถุต่าง ๆ ในด่าน เช่น พื้นดิน, สิ่งกีดขวาง, ศัตรู และไอเท็ม
- ตั้งค่า NavMesh หรือ Collider เพื่อให้ตัวละครสามารถโต้ตอบกับวัตถุเหล่านี้ได้
- สร้างปุ่ม UI หรือระบบตรวจจับเพื่อให้ผู้เล่นสามารถเปลี่ยนไปยังด่านถัดไปได้เมื่อผ่านด่าน
การเปลี่ยนด่าน (Scene Switching)
เมื่อผู้เล่นผ่านด่านสำเร็จ เกมจะต้องทำการเปลี่ยนจากด่านหนึ่งไปยังอีกด่านหนึ่ง Unity มีระบบ SceneManager ที่สามารถใช้ในการเปลี่ยนด่านได้อย่างง่ายดาย
ตัวอย่างโค้ดการเปลี่ยนด่าน
using UnityEngine;
using UnityEngine.SceneManagement;
public class LevelManager : MonoBehaviour
{
public void LoadNextLevel()
{
int currentSceneIndex = SceneManager.GetActiveScene().buildIndex;
SceneManager.LoadScene(currentSceneIndex + 1); // โหลดด่านถัดไป
}
}
คำอธิบายโค้ด
- ฟังก์ชัน SceneManager.GetActiveScene() ใช้เพื่อดึงข้อมูลของด่านปัจจุบัน
- ฟังก์ชัน SceneManager.LoadScene() ใช้เพื่อโหลดด่านใหม่ โดยในที่นี้จะโหลดด่านถัดไปจากด่านปัจจุบัน
การปลดล็อกด่าน (Level Unlocking)
เกมหลายด่านมักจะมีระบบการปลดล็อกด่าน (Unlocking Levels) ที่ผู้เล่นสามารถเล่นด่านถัดไปได้ก็ต่อเมื่อผ่านด่านก่อนหน้า การปลดล็อกด่านสามารถทำได้โดยการบันทึกความคืบหน้าของผู้เล่น
การบันทึกความคืบหน้า (Saving Progress) เราสามารถบันทึกข้อมูลการปลดล็อกด่านโดยใช้ PlayerPrefs ซึ่งเป็นฟีเจอร์ใน Unity ที่ใช้ในการจัดเก็บข้อมูลที่ง่ายและสะดวก เช่น การบันทึกด่านที่ผู้เล่นผ่านแล้ว
ตัวอย่างโค้ดการบันทึกและปลดล็อกด่าน
using UnityEngine;
using UnityEngine.SceneManagement;
public class LevelUnlocker : MonoBehaviour
{
public int levelToUnlock = 2; // ด่านที่ต้องการปลดล็อก
void Start()
{
// ตรวจสอบว่าด่านนี้ถูกปลดล็อกแล้วหรือไม่
if (PlayerPrefs.GetInt("UnlockedLevel", 1) < levelToUnlock)
{
Debug.Log("ด่านนี้ยังไม่ถูกปลดล็อก");
// สามารถใส่โค้ดเพิ่มเติมเพื่อแสดงข้อความหรือปิดการเข้าถึงด่านนี้
}
}
public void UnlockNextLevel()
{
// ปลดล็อกด่านถัดไป
PlayerPrefs.SetInt("UnlockedLevel", levelToUnlock);
Debug.Log("ปลดล็อกด่านถัดไปเรียบร้อยแล้ว!");
}
}
คำอธิบายโค้ด
- PlayerPrefs.GetInt() ใช้เพื่อดึงข้อมูลว่าผู้เล่นผ่านด่านไปถึงระดับไหนแล้ว
- PlayerPrefs.SetInt() ใช้เพื่อบันทึกข้อมูลด่านที่ผู้เล่นปลดล็อก
- เมื่อผู้เล่นผ่านด่าน เราสามารถใช้ฟังก์ชันนี้เพื่อปลดล็อกด่านถัดไป
การเพิ่มความท้าทายในด่าน (Increasing Difficulty)
เพื่อให้เกมมีความน่าสนใจและท้าทายมากขึ้น เราสามารถปรับเปลี่ยนองค์ประกอบต่าง ๆ ในแต่ละด่าน เช่น:
- การเพิ่มจำนวนศัตรู: ในด่านที่ยากขึ้น ศัตรูอาจจะมากขึ้นหรือเคลื่อนไหวเร็วขึ้น
- การจัดวางสิ่งกีดขวางที่ซับซ้อนขึ้น: เช่น เพิ่มสิ่งกีดขวางที่เคลื่อนไหวหรือหมุนได้ เพื่อให้ผู้เล่นต้องใช้ทักษะในการหลบหลีกมากขึ้น
- เพิ่มเวลาจำกัด (Time Limits): การกำหนดเวลาที่จำกัดให้ผู้เล่นผ่านด่านจะเพิ่มความท้าทาย
- การเพิ่มบอส (Boss Levels): ด่านสุดท้ายอาจจะมีการต่อสู้กับบอสที่มีพลังสูงและต้องใช้ทักษะในการต่อสู้มากกว่าปกติ
ตัวอย่างโค้ดการเพิ่มความยากด้วยจำนวนศัตรู
using UnityEngine;
public class EnemySpawner : MonoBehaviour
{
public GameObject enemyPrefab;
public int enemyCount = 5; // จำนวนศัตรูที่ต้องการให้ปรากฏในด่าน
void Start()
{
for (int i = 0; i < enemyCount; i++)
{
SpawnEnemy(); // เรียกใช้ฟังก์ชันสร้างศัตรู
}
}
void SpawnEnemy()
{
Instantiate(enemyPrefab, GetRandomPosition(), Quaternion.identity); // สร้างศัตรูใหม่ในตำแหน่งสุ่ม
}
Vector3 GetRandomPosition()
{
float x = Random.Range(-10f, 10f);
float z = Random.Range(-10f, 10f);
return new Vector3(x, 0, z); // คืนค่าตำแหน่งสุ่ม
}
}
คำอธิบายโค้ด
- ฟังก์ชัน SpawnEnemy() ใช้เพื่อสร้างศัตรูในตำแหน่งสุ่ม โดยจำนวนศัตรูที่สร้างจะขึ้นอยู่กับตัวแปร enemyCount
การสร้างระบบ UI เพื่อแสดงความคืบหน้าของผู้เล่น
การแสดงความคืบหน้า (Progress) ของผู้เล่นในแต่ละด่าน เช่น จำนวนไอเท็มที่เก็บได้ หรือจำนวนด่านที่ผ่านแล้ว เป็นส่วนสำคัญในการกระตุ้นให้ผู้เล่นมีเป้าหมายชัดเจนในการเล่นเกม
ตัวอย่างโค้ดแสดงความคืบหน้าของผู้เล่นผ่าน UI
using UnityEngine;
using UnityEngine.UI;
public class LevelProgress : MonoBehaviour
{
public Text progressText;
private int itemsCollected = 0;
private int totalItems = 5;
void Start()
{
UpdateProgressText();
}
public void CollectItem()
{
itemsCollected++;
UpdateProgressText();
}
void UpdateProgressText()
{
progressText.text = "Items Collected: " + itemsCollected + "/" + totalItems;
}
}
คำอธิบายโค้ด
- ฟังก์ชัน CollectItem() จะถูกเรียกเมื่อผู้เล่นเก็บไอเท็มสำเร็จ
- UpdateProgressText() จะแสดงจำนวนไอเท็มที่เก็บได้เทียบกับจำนวนไอเท็มทั้งหมดบนหน้าจอผ่าน UI Text
บทที่ 7 นี้ช่วยให้นักเรียนได้เรียนรู้วิธีการออกแบบเกมหลายด่าน ตั้งแต่การสร้างด่าน, การเปลี่ยนด่าน, การปลดล็อกด่านถัดไป ไปจนถึงการเพิ่มความท้าทายในการเล่น นักเรียนจะสามารถสร้างเกมที่มีความยากเพิ่มขึ้นเรื่อย ๆ เพื่อให้เกมมีความน่าสนใจและสนุกยิ่งขึ้น