บทที่ 4: การชนและการทำงานของ Trigger ใน 3D
ระบบการชน (Collision System) และการตรวจจับการกระทำผ่าน Trigger เป็นหนึ่งในองค์ประกอบหลักของการพัฒนาเกมใน Unity โดยเฉพาะในเกม 3D ซึ่งมีมิติในการเคลื่อนไหวและโต้ตอบที่ซับซ้อนมากขึ้น ในบทนี้เราจะเรียนรู้วิธีการจัดการการชนระหว่างวัตถุในเกม และวิธีการใช้ Trigger เพื่อสร้างเหตุการณ์ที่เกิดขึ้นเมื่อผู้เล่นสัมผัสกับวัตถุโดยไม่เกิดการชนที่ทำให้ตัวละครหยุด
การจัดการการชน (Collision System) ใน 3D
การชนระหว่างวัตถุใน Unity สามารถทำได้โดยการใช้ Collider ซึ่งเป็น Component ที่ทำหน้าที่ตรวจจับการชนระหว่างวัตถุ โดยเมื่อมีการชนกันจะสามารถสร้างเหตุการณ์ต่าง ๆ ขึ้นมาได้ เช่น ผู้เล่นชนกับศัตรูหรือตกลงบนพื้น
ขั้นตอนการใช้ Collider ใน Unity
- ไปที่วัตถุที่ต้องการตรวจจับการชน เช่น ตัวละครหลัก หรือวัตถุอื่นในเกม
- เพิ่ม Collider ให้กับวัตถุ โดยไปที่ Inspector คลิกที่ Add Component และพิมพ์ค้นหา Collider เช่น Box Collider, Sphere Collider หรือ Mesh Collider ขึ้นอยู่กับรูปร่างของวัตถุ
- ตรวจสอบให้แน่ใจว่าวัตถุที่เคลื่อนที่มี Rigidbody เพิ่มเข้ามาเพื่อให้การชนทำงานร่วมกับระบบฟิสิกส์
การเขียนโค้ดเพื่อตรวจจับการชน
ใน Unity เราสามารถใช้ฟังก์ชัน OnCollisionEnter เพื่อตรวจจับการชนของวัตถุ เมื่อมีการชนเกิดขึ้น โค้ดที่อยู่ในฟังก์ชันนี้จะถูกเรียกใช้งาน
ตัวอย่างโค้ดการตรวจจับการชน
using UnityEngine;
public class PlayerCollision : MonoBehaviour
{
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.tag == "Enemy")
{
Debug.Log("ผู้เล่นชนกับศัตรู!");
// ใส่โค้ดเพิ่มเติม เช่น ลดพลังชีวิตผู้เล่น
}
}
}
คำอธิบายโค้ด
- ฟังก์ชัน OnCollisionEnter(Collision collision) จะถูกเรียกเมื่อวัตถุที่มี Collider ชนกับวัตถุอื่น
- collision.gameObject.tag จะตรวจสอบว่า วัตถุที่ชนกันมีแท็ก (Tag) เป็น "Enemy" หรือไม่ หากใช่ ก็สามารถดำเนินการที่ต้องการ เช่น ลดพลังชีวิตหรือแสดงข้อความ
การใช้ Trigger เพื่อสร้างเหตุการณ์
Trigger คือคอมโพเนนต์ที่ใช้ตรวจจับการสัมผัสระหว่างวัตถุโดยไม่ทำให้เกิดการชนจริง กล่าวคือ วัตถุสามารถเดินผ่านกันได้แต่สามารถสร้างเหตุการณ์เมื่อเกิดการสัมผัส เช่น ผู้เล่นเดินผ่านประตูเพื่อเปิดประตู หรือเดินเข้าสู่พื้นที่หนึ่งเพื่อเริ่มต้นภารกิจใหม่
ขั้นตอนการใช้ Trigger ใน Unity
- เพิ่ม Collider ให้กับวัตถุที่ต้องการใช้เป็น Trigger เช่น ประตูหรือพื้นที่ตรวจจับ
- ใน Inspector ของ Collider ทำเครื่องหมายที่ตัวเลือก Is Trigger
- เขียนโค้ดเพื่อตรวจจับเมื่อมีการสัมผัสเกิดขึ้นโดยใช้ฟังก์ชัน OnTriggerEnter
ตัวอย่างโค้ดการใช้ Trigger
using UnityEngine;
public class DoorTrigger : MonoBehaviour
{
void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "Player")
{
Debug.Log("ผู้เล่นเดินเข้าสู่พื้นที่ตรวจจับ!");
// ใส่โค้ดเพื่อเปิดประตูหรือเริ่มภารกิจใหม่
}
}
}
คำอธิบายโค้ด
- ฟังก์ชัน OnTriggerEnter จะถูกเรียกเมื่อวัตถุที่มี Is Trigger ถูกสัมผัสโดยวัตถุอื่น
- ในโค้ดนี้ ตรวจสอบว่าวัตถุที่เข้าสู่ Trigger เป็นผู้เล่น (Player) หรือไม่ และสามารถสร้างเหตุการณ์ต่าง ๆ เช่น เปิดประตูหรือเริ่มต้นภารกิจ
การจัดการระบบฟิสิกส์ในการชน
ในเกม 3D ระบบการชนและ Trigger ทำงานควบคู่กับระบบฟิสิกส์ (Physics System) ของ Unity วัตถุที่มี Rigidbody จะถูกควบคุมโดยระบบฟิสิกส์ ทำให้การเคลื่อนไหวและการชนดูสมจริงมากขึ้น การตั้งค่าระบบฟิสิกส์ที่เหมาะสมจะช่วยให้เกมทำงานได้ลื่นไหลและเสถียร
การตั้งค่าการชนของ Rigidbody
- Mass (มวล): ใช้กำหนดน้ำหนักของวัตถุ ยิ่งมีมวลมาก การเคลื่อนที่หรือการชนจะส่งผลมากขึ้น
- Drag (แรงต้าน): ใช้กำหนดแรงต้านการเคลื่อนไหวของวัตถุ เช่น หากต้องการให้วัตถุเคลื่อนไหวช้าลงสามารถเพิ่มค่า Drag ได้
- Use Gravity (การใช้แรงโน้มถ่วง): ใช้กำหนดว่าต้องการให้วัตถุถูกแรงโน้มถ่วงดึงลงหรือไม่ หากไม่ต้องการให้วัตถุตกลงพื้นเมื่อวางไว้ ให้ปิดการใช้งาน
การใช้ Physics Material ในการจัดการการชน การใช้ Physics Material ช่วยให้เราควบคุมพฤติกรรมของการชนได้ เช่น การเด้งกลับเมื่อวัตถุชนกัน หรือการลดแรงเสียดทานเมื่อวัตถุเคลื่อนที่
ขั้นตอนการใช้ Physics Material
- ไปที่ Assets > คลิกขวา > Create > Physics Material เพื่อสร้าง Physics Material ใหม่
- ตั้งค่าคุณสมบัติของ Material เช่น:
- Bounciness: ใช้กำหนดการเด้งกลับเมื่อวัตถุชนกัน ยิ่งค่านี้สูง วัตถุจะเด้งมากขึ้น
- Friction: ใช้กำหนดแรงเสียดทานระหว่างวัตถุเมื่อเคลื่อนที่
- ลาก Physics Material ที่สร้างไว้ไปวางใน Collider ของวัตถุที่ต้องการ
การรวมระบบการชนและ Trigger เพื่อสร้างเกมที่มีปฏิสัมพันธ์
การรวมระบบการชนและ Trigger ช่วยให้เราสามารถสร้างสถานการณ์ต่าง ๆ ในเกมได้ เช่น เมื่อผู้เล่นเดินเข้าสู่พื้นที่ใดพื้นที่หนึ่ง จะเริ่มต้นการโจมตีจากศัตรู หรือเมื่อผู้เล่นเดินผ่านประตู ประตูก็จะเปิด
ตัวอย่างการรวมระบบการชนและ Trigger
- การสร้างศัตรูที่โจมตีเมื่อผู้เล่นเดินเข้าใกล้: เราสามารถใช้ Trigger เพื่อเริ่มต้นการโจมตีเมื่อผู้เล่นเข้าสู่พื้นที่
- การเก็บไอเท็มเมื่อผู้เล่นชนกับไอเท็ม: เราสามารถใช้ระบบการชนเพื่อตรวจจับว่าผู้เล่นเก็บไอเท็ม และทำลายไอเท็มเมื่อถูกเก็บ
ตัวอย่างโค้ดการรวมระบบการชนและ Trigger
using UnityEngine;
public class PlayerInteraction : MonoBehaviour
{
public GameObject door;
public ScoreManager scoreManager;
void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "Item")
{
scoreManager.AddScore(10); // เพิ่มคะแนนเมื่อเก็บไอเท็ม
Destroy(other.gameObject); // ทำลายไอเท็ม
}
if (other.gameObject.tag == "Door")
{
door.GetComponent().SetTrigger("Open"); // เปิดประตูเมื่อเดินเข้าใกล้
}
}
}
ในโค้ดนี้ ผู้เล่นจะสามารถเก็บไอเท็มและเปิดประตูเมื่อเดินเข้าใกล้ โดยใช้ระบบ Trigger และการตรวจจับการชน
บทที่ 4 นี้ช่วยให้นักเรียนได้เรียนรู้การจัดการระบบการชนในเกม 3D รวมถึงการใช้ Trigger เพื่อสร้างเหตุการณ์และปฏิสัมพันธ์ที่หลากหลายระหว่างผู้เล่นและวัตถุในเกม