บทที่ 5: การโต้ตอบกับผู้เล่น (Player Interaction)
5.2 การสร้างระบบการชน (Collision)
ใน Unity การตรวจจับการชนของวัตถุเป็นส่วนสำคัญในการสร้างการโต้ตอบในเกม เช่น เมื่อผู้เล่นชนกับสิ่งกีดขวาง หรือเก็บไอเทมที่พบในฉาก ระบบการชนใช้ Physics ของ Unity ในการจัดการกับวัตถุที่เคลื่อนไหวและตรวจจับการชน
การใช้ Physics และการตรวจจับการชนของวัตถุ
1. การใช้ Collider:
-
- ใน Unity การตรวจจับการชนของวัตถุจะเกิดขึ้นผ่าน Collider ซึ่งเป็น Component ที่กำหนดขอบเขตของวัตถุเพื่อให้ Unity สามารถตรวจจับการชนได้
- Unity มี Collider หลายประเภท เช่น Box Collider (ใช้กับวัตถุรูปทรงลูกบาศก์หรือสี่เหลี่ยม), Sphere Collider (ใช้กับวัตถุทรงกลม), และ Mesh Collider (ใช้กับโมเดลสามมิติที่ซับซ้อน)
2. การใช้ Rigidbody:
-
- Rigidbody เป็น Component ที่ทำให้วัตถุใน Unity มีการทำงานตามกฎของฟิสิกส์ เช่น การเคลื่อนที่โดยมีแรงโน้มถ่วง หรือการปะทะเมื่อชนกับวัตถุอื่น ๆ
- ในการทำให้วัตถุสามารถเคลื่อนที่และชนกับวัตถุอื่น ๆ ได้ตามกฎของฟิสิกส์ คุณต้องเพิ่ม Rigidbody เข้าไปใน GameObject โดยเลือก GameObject นั้น จากนั้นไปที่ Inspector แล้วเลือก Add Component > Rigidbody
3. การตรวจจับการชน (Collision Detection):
-
- ในการตรวจจับการชนของวัตถุ Unity จะใช้ฟังก์ชัน OnCollisionEnter() สำหรับวัตถุที่มี Rigidbody และ Collider โดยฟังก์ชันนี้จะถูกเรียกเมื่อมีการชนกันระหว่างวัตถุที่มี Collider ทั้งสอง
ตัวอย่างโค้ด:
- ในการตรวจจับการชนของวัตถุ Unity จะใช้ฟังก์ชัน OnCollisionEnter() สำหรับวัตถุที่มี Rigidbody และ Collider โดยฟังก์ชันนี้จะถูกเรียกเมื่อมีการชนกันระหว่างวัตถุที่มี Collider ทั้งสอง
using UnityEngine;
public class CollisionHandler : MonoBehaviour
{
void OnCollisionEnter(Collision collision)
{
// ตรวจจับการชนและแสดงชื่อวัตถุที่ชนกัน
Debug.Log("ชนกับ: " + collision.gameObject.name);
}
}
ในโค้ดนี้:
-
-
- OnCollisionEnter() จะถูกเรียกใช้เมื่อ GameObject ที่มีสคริปต์นี้ชนกับวัตถุอื่นที่มี Collider และ Rigidbody
-
การสร้างปฏิกิริยาเมื่อวัตถุชนกัน
หลังจากตรวจจับการชนได้แล้ว คุณสามารถสร้างปฏิกิริยาต่าง ๆ เมื่อวัตถุชนกัน เช่น การแสดงผลลัพธ์ในเกม การเพิ่มคะแนน หรือการทำให้วัตถุหายไปจากฉาก
1. การทำให้วัตถุหายไปเมื่อชนกัน:
ตัวอย่างโค้ดนี้จะทำให้วัตถุที่ถูกชนหายไปจากฉากเมื่อเกิดการชน:
using UnityEngine;
public class DestroyOnCollision : MonoBehaviour
{
void OnCollisionEnter(Collision collision)
{
// ลบวัตถุที่ถูกชนออกจากฉาก
Destroy(collision.gameObject);
}
}
ในโค้ดนี้:
-
- เมื่อวัตถุชนกับ GameObject อื่น ฟังก์ชัน Destroy() จะถูกเรียกเพื่อทำลายวัตถุที่ถูกชน ทำให้หายไปจากฉาก
2. การเพิ่มคะแนนเมื่อเกิดการชน:
หากคุณต้องการเพิ่มคะแนนให้กับผู้เล่นเมื่อวัตถุชนกัน คุณสามารถใช้โค้ดต่อไปนี้:
using UnityEngine;
public class ScoreOnCollision : MonoBehaviour
{
public int score = 0;
void OnCollisionEnter(Collision collision)
{
// เพิ่มคะแนนเมื่อชนกับวัตถุที่มีชื่อว่า "Coin"
if (collision.gameObject.name == "Coin")
{
score += 10;
Debug.Log("คะแนนปัจจุบัน: " + score);
Destroy(collision.gameObject); // ลบวัตถุ Coin ออก
}
}
}
ในโค้ดนี้:
-
- เมื่อวัตถุชนกับ GameObject ที่มีชื่อว่า "Coin" จะเพิ่มคะแนนให้กับผู้เล่นและลบวัตถุ Coin ออกจากฉาก
3. การสร้างเอฟเฟกต์พิเศษเมื่อชนกัน:
คุณสามารถสร้างปฏิกิริยาเพิ่มเติมเมื่อวัตถุชนกัน เช่น การแสดงเอฟเฟกต์แสงหรือเสียง:
using UnityEngine;
public class EffectOnCollision : MonoBehaviour
{
public GameObject explosionEffect;
void OnCollisionEnter(Collision collision)
{
// เมื่อชนเกิดเอฟเฟกต์ระเบิด
Instantiate(explosionEffect, collision.transform.position, collision.transform.rotation);
Destroy(collision.gameObject); // ลบวัตถุออกหลังจากชน
}
}
ในโค้ดนี้:
-
- เมื่อเกิดการชน ระบบจะสร้างเอฟเฟกต์ระเบิดที่ตำแหน่งของวัตถุที่ถูกชน และทำลายวัตถุนั้นออกจากฉาก
สรุป:
- Collider และ Rigidbody เป็นสอง Component ที่สำคัญในการตรวจจับการชนและจัดการกับฟิสิกส์ของวัตถุใน Unity
- OnCollisionEnter() เป็นฟังก์ชันหลักที่ใช้ในการตรวจจับการชนของวัตถุ และสามารถใช้เพื่อสร้างปฏิกิริยาต่าง ๆ เช่น การลบวัตถุ การเพิ่มคะแนน หรือการสร้างเอฟเฟกต์พิเศษเมื่อวัตถุชนกัน