บทที่ 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 ทั้งสอง

      ตัวอย่างโค้ด:

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() เป็นฟังก์ชันหลักที่ใช้ในการตรวจจับการชนของวัตถุ และสามารถใช้เพื่อสร้างปฏิกิริยาต่าง ๆ เช่น การลบวัตถุ การเพิ่มคะแนน หรือการสร้างเอฟเฟกต์พิเศษเมื่อวัตถุชนกัน