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

ระบบคะแนนใน Unity: ชนวัตถุ, ได้/เสียคะแนน, และเปลี่ยน Scene
ระบบนี้จะประกอบไปด้วย 3 ส่วนหลัก:
- Script สำหรับผู้เล่น (Player Script): จัดการการชนวัตถุ, การเพิ่ม/ลดคะแนน, และการตรวจสอบเงื่อนไขการชนะ/แพ้
- วัตถุที่ให้คะแนน/หักคะแนน: วัตถุที่ผู้เล่นจะชนด้วย
- 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 แต่แนะนำ)
- ใน Unity Editor, คลิกขวาที่ Hierarchy -> UI -> Text – TextMeshPro (หากคุณใช้ TextMeshPro) หรือ UI -> Text (หากใช้ Text ธรรมดา).
- ตรวจสอบว่าคุณได้ติดตั้ง TextMeshPro Essential Resources แล้ว ถ้าหากยังไม่ได้ติดตั้งจะขึ้นแจ้งเตือนให้ติดตั้ง.
- ปรับแต่งตำแหน่ง, ขนาด, และสีของ Text ตามต้องการ.
- ลาก GameObject ของ Text ที่คุณสร้างไปใส่ในช่อง
Score Text
ใน Inspector ของPlayerScore
Script บน Player GameObject.
4. การเพิ่ม Scene ใน Build Settings
สำคัญมาก! Unity จะรู้จักและสามารถเปลี่ยน Scene ได้ก็ต่อเมื่อคุณได้เพิ่ม Scene เหล่านั้นใน Build Settings แล้ว:
- ไปที่ File -> Build Settings…
- ลาก 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)
- มี
ขั้นตอนการทดสอบ
- เล่นเกม: ลองเคลื่อนที่ผู้เล่นของคุณไปชนวัตถุ “Score_Good” และ “Score_Bad”
- สังเกตคะแนน: ดูว่าคะแนนใน UI (และใน Debug.Log ของ Console) เปลี่ยนแปลงถูกต้องหรือไม่
- ทดสอบการชนะ: ลองเก็บ “GoodScore” ให้ถึง
scoreToWin
ที่คุณกำหนดไว้ (เช่น 5) แล้วดูว่าเกมเปลี่ยนไป “WinScene” หรือไม่ - ทดสอบการแพ้: ลองเก็บ “BadScore” ให้คะแนนลดลงถึง
scoreToLose
ที่คุณกำหนดไว้ (เช่น -3) แล้วดูว่าเกมกลับไป “StartScene” หรือไม่