ระบบคะแนนใน Unity: ชนวัตถุ, ได้/เสียคะแนน, และเปลี่ยน Scene Game 3D

ระบบคะแนนใน Unity: ชนวัตถุ, ได้/เสียคะแนน, และเปลี่ยน Scene

ระบบนี้จะประกอบไปด้วย 3 ส่วนหลัก:

  1. Script สำหรับผู้เล่น (Player Script): จัดการการชนวัตถุ, การเพิ่ม/ลดคะแนน, และการตรวจสอบเงื่อนไขการชนะ/แพ้
  2. วัตถุที่ให้คะแนน/หักคะแนน: วัตถุที่ผู้เล่นจะชนด้วย
  3. UI สำหรับแสดงคะแนน (Optional): แสดงคะแนนปัจจุบันให้ผู้เล่นเห็น

1. การตั้งค่า Scene และ GameObject

ก่อนอื่น, ตรวจสอบให้แน่ใจว่าคุณมีสิ่งเหล่านี้ใน Unity:

  • Player GameObject: ควรมี Rigidbody และ Collider (เช่น Box Collider หรือ Capsule Collider) โดยตั้งค่า Is Trigger ของ Collider เป็น true เพื่อให้สามารถตรวจจับการชนได้โดยไม่เกิดแรงกระทำทางฟิสิกส์.
  • วัตถุที่ให้คะแนน (Score_Good): สร้าง GameObject (เช่น Cube) ตั้งชื่อว่า “Score_Good” และเพิ่ม Collider (ตั้งค่า Is Trigger เป็น true) และ Tag เป็น “GoodScore”.
  • วัตถุที่หักคะแนน (Score_Bad): สร้าง GameObject (เช่น Cube) ตั้งชื่อว่า “Score_Bad” และเพิ่ม Collider (ตั้งค่า Is Trigger เป็น true) และ Tag เป็น “BadScore”.
  • Scene สำหรับชนะ (WinScene): สร้าง Scene ใหม่และตั้งชื่อว่า “WinScene”.
  • Scene สำหรับแพ้/กลับไปเริ่มต้น (LoseScene/StartScene): หากคุณต้องการให้กลับไป Scene เริ่มต้นเมื่อแพ้ คุณสามารถใช้ Scene ปัจจุบันเป็น Scene เริ่มต้น หรือสร้าง Scene ใหม่สำหรับกลับไปเมื่อแพ้ก็ได้. ในตัวอย่างนี้จะถือว่า Scene ที่ผู้เล่นอยู่ในปัจจุบันคือ Scene “StartScene” และจะกลับมาที่นี่เมื่อแพ้

2. สร้าง Script สำหรับผู้เล่น (PlayerScore.cs)

สร้าง C# Script ใหม่ ตั้งชื่อว่า PlayerScore แล้วลากไปใส่ที่ GameObject ของผู้เล่นของคุณ

C#

using UnityEngine;
using UnityEngine.SceneManagement; // ต้องใช้สำหรับเปลี่ยน Scene
using TMPro; // ถ้าใช้ TextMeshPro สำหรับ UI แสดงคะแนน

public class PlayerScore : MonoBehaviour
{
    public int currentScore = 0; // คะแนนปัจจุบันของผู้เล่น
    public int scoreToWin = 5;    // คะแนนที่ต้องการเพื่อให้ชนะ
    public int scoreToLose = -3;   // คะแนนที่ผู้เล่นแพ้เมื่อถึงจุดนี้

    public string winSceneName = "WinScene"; // ชื่อ Scene ที่จะเปลี่ยนไปเมื่อชนะ
    public string startSceneName = "StartScene"; // ชื่อ Scene เริ่มต้น (กลับไปเมื่อแพ้)

    // ตัวแปรสำหรับแสดงคะแนนบน UI (ถ้ามี)
    public TextMeshProUGUI scoreText; // หรือ public Text scoreText; ถ้าใช้ Text ธรรมดา

    void Start()
    {
        // ตรวจสอบและตั้งค่าชื่อ Scene ปัจจุบันเป็น StartScene หากยังไม่ได้กำหนด
        if (string.IsNullOrEmpty(startSceneName))
        {
            startSceneName = SceneManager.GetActiveScene().name;
        }

        UpdateScoreUI(); // อัปเดต UI คะแนนเมื่อเริ่มต้น
    }

    void OnTriggerEnter(Collider other)
    {
        // ตรวจสอบว่าชนกับวัตถุที่ Tag "GoodScore"
        if (other.CompareTag("GoodScore"))
        {
            currentScore += 1; // เพิ่มคะแนน
            Debug.Log("ได้คะแนน! คะแนนปัจจุบัน: " + currentScore);
            Destroy(other.gameObject); // ทำลายวัตถุที่ชน (Optional)
        }
        // ตรวจสอบว่าชนกับวัตถุที่ Tag "BadScore"
        else if (other.CompareTag("BadScore"))
        {
            currentScore -= 1; // ลดคะแนน
            Debug.Log("เสียคะแนน! คะแนนปัจจุบัน: " + currentScore);
            Destroy(other.gameObject); // ทำลายวัตถุที่ชน (Optional)
        }

        UpdateScoreUI(); // อัปเดต UI คะแนนทุกครั้งที่มีการเปลี่ยนแปลง

        CheckGameStatus(); // ตรวจสอบเงื่อนไขการชนะ/แพ้
    }

    void UpdateScoreUI()
    {
        if (scoreText != null)
        {
            scoreText.text = "คะแนน: " + currentScore;
        }
    }

    void CheckGameStatus()
    {
        // ถ้าคะแนนถึงเป้าหมายการชนะ
        if (currentScore >= scoreToWin)
        {
            Debug.Log("คุณชนะ!");
            SceneManager.LoadScene(winSceneName); // เปลี่ยนไป Scene ชนะ
        }
        // ถ้าคะแนนถึงเป้าหมายการแพ้
        else if (currentScore <= scoreToLose)
        {
            Debug.Log("คุณแพ้!");
            SceneManager.LoadScene(startSceneName); // กลับไป Scene เริ่มต้น
        }
    }
}

คำอธิบายโค้ด:

  • currentScore: เก็บค่าคะแนนปัจจุบันของผู้เล่น
  • scoreToWin: กำหนดคะแนนที่ผู้เล่นต้องทำให้ได้เพื่อชนะ
  • scoreToLose: กำหนดคะแนนที่ผู้เล่นจะแพ้เมื่อแตะถึงหรือต่ำกว่าค่านี้
  • winSceneName: ชื่อของ Scene ที่จะโหลดเมื่อผู้เล่นชนะ
  • startSceneName: ชื่อของ Scene ที่จะโหลดเมื่อผู้เล่นแพ้ (ปกติคือ Scene เริ่มต้นของเกม)
  • OnTriggerEnter(Collider other): ฟังก์ชันนี้จะถูกเรียกเมื่อ Collider ของผู้เล่น (ที่เป็น Trigger) ชนกับ Collider ของวัตถุอื่น
    • other.CompareTag("GoodScore"): ตรวจสอบว่าวัตถุที่ชนมี Tag เป็น “GoodScore” หรือไม่
    • other.CompareTag("BadScore"): ตรวจสอบว่าวัตถุที่ชนมี Tag เป็น “BadScore” หรือไม่
    • Destroy(other.gameObject): ทำลายวัตถุที่ชนหลังจากได้/เสียคะแนน (สามารถเอาออกได้ถ้าไม่ต้องการให้วัตถุหายไป)
  • UpdateScoreUI(): อัปเดตข้อความบน UI เพื่อแสดงคะแนนปัจจุบัน
  • CheckGameStatus(): ตรวจสอบเงื่อนไขการชนะหรือแพ้โดยดูจาก currentScore เทียบกับ scoreToWin และ scoreToLose
  • SceneManager.LoadScene(sceneName): ใช้สำหรับเปลี่ยน Scene

3. การเพิ่ม UI แสดงคะแนน (Optional แต่แนะนำ)

  1. ใน Unity Editor, คลิกขวาที่ Hierarchy -> UI -> Text – TextMeshPro (หากคุณใช้ TextMeshPro) หรือ UI -> Text (หากใช้ Text ธรรมดา).
  2. ตรวจสอบว่าคุณได้ติดตั้ง TextMeshPro Essential Resources แล้ว ถ้าหากยังไม่ได้ติดตั้งจะขึ้นแจ้งเตือนให้ติดตั้ง.
  3. ปรับแต่งตำแหน่ง, ขนาด, และสีของ Text ตามต้องการ.
  4. ลาก GameObject ของ Text ที่คุณสร้างไปใส่ในช่อง Score Text ใน Inspector ของ PlayerScore Script บน Player GameObject.

4. การเพิ่ม Scene ใน Build Settings

สำคัญมาก! Unity จะรู้จักและสามารถเปลี่ยน Scene ได้ก็ต่อเมื่อคุณได้เพิ่ม Scene เหล่านั้นใน Build Settings แล้ว:

  1. ไปที่ File -> Build Settings…
  2. ลาก Scene ปัจจุบัน (ที่กำลังเล่นเกมอยู่) และ Scene “WinScene” (และ Scene อื่นๆ ที่เกี่ยวข้อง) เข้าไปในช่อง “Scenes In Build”. ตรวจสอบให้แน่ใจว่า Scene “StartScene” (Scene ที่เกมเริ่มต้นหรือกลับมาเมื่อแพ้) มี Index เป็น 0 หรือเป็น Scene แรกที่คุณต้องการให้โหลด.

5. การตั้งค่าวัตถุและ Tags

  • Player:
    • มี Rigidbody
    • มี Collider (เช่น Box Collider) และ ติ๊กช่อง Is Trigger
    • ลาก PlayerScore.cs ไปใส่
    • กำหนด Score To Win, Score To Lose, Win Scene Name, Start Scene Name ใน Inspector
    • ลาก UI Text GameObject ไปใส่ใน Score Text (ถ้ามี)
  • Score_Good GameObject:
    • มี Collider (เช่น Box Collider) และ ติ๊กช่อง Is Trigger
    • ตั้งค่า Tag เป็น “GoodScore” (ถ้ายังไม่มี Tag นี้ ให้ Add Tag ใหม่ใน Inspector)
  • Score_Bad GameObject:
    • มี Collider (เช่น Box Collider) และ ติ๊กช่อง Is Trigger
    • ตั้งค่า Tag เป็น “BadScore” (ถ้ายังไม่มี Tag นี้ ให้ Add Tag ใหม่ใน Inspector)

ขั้นตอนการทดสอบ

  1. เล่นเกม: ลองเคลื่อนที่ผู้เล่นของคุณไปชนวัตถุ “Score_Good” และ “Score_Bad”
  2. สังเกตคะแนน: ดูว่าคะแนนใน UI (และใน Debug.Log ของ Console) เปลี่ยนแปลงถูกต้องหรือไม่
  3. ทดสอบการชนะ: ลองเก็บ “GoodScore” ให้ถึง scoreToWin ที่คุณกำหนดไว้ (เช่น 5) แล้วดูว่าเกมเปลี่ยนไป “WinScene” หรือไม่
  4. ทดสอบการแพ้: ลองเก็บ “BadScore” ให้คะแนนลดลงถึง scoreToLose ที่คุณกำหนดไว้ (เช่น -3) แล้วดูว่าเกมกลับไป “StartScene” หรือไม่

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

ตั้งค่าความเป็นส่วนตัว

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

ยอมรับทั้งหมด
จัดการความเป็นส่วนตัว
  • เปิดใช้งานตลอด

บันทึกการตั้งค่า