การตั้งค่าและวิธีการเขียน Script PlayerController 2D เบื้องต้น

การควบคุมตัวละคร 2D ใน Unity ให้เดิน วิ่ง เลี้ยวซ้ายขวา กระโดด และมีแอนิเมชันพร้อมการตรวจจับพื้นด้วย OnCollisionEnter2D ของ Player สามารถทำได้ตามขั้นตอนด้านล่างนี้เลยครับ


1. การตั้งค่าเบื้องต้นใน Unity

1.1 สร้าง Player GameObject

  • สร้าง Sprite สำหรับ Player: นำรูปภาพ Player ที่ต้องการมาลากใส่ Hierarchy (เช่น เป็น Sprite Renderer ของ Player GameObject)
  • เพิ่ม Component: เลือก Player GameObject แล้วเพิ่ม Component ดังนี้:
    • Rigidbody2D: ตั้ง Body Type เป็น Dynamic เพื่อให้สามารถเคลื่อนไหวและถูกแรงโน้มถ่วงได้
    • Capsule Collider 2D หรือ Box Collider 2D: ปรับขนาด Collider ให้พอดีกับตัวละคร เพื่อใช้ในการชนและตรวจจับพื้น

1.2 สร้าง Ground GameObject

  • สร้าง Sprite สำหรับ Ground: สร้าง Sprite หรือ Tilemap สำหรับพื้น
  • เพิ่ม Component: เลือก Ground GameObject แล้วเพิ่ม Component:
    • Box Collider 2D: ตั้ง Is Trigger เป็น false เพื่อให้เป็นพื้นแข็งที่ตัวละครสามารถยืนได้

1.3 ตั้งค่า Tag

  • เลือก Ground GameObject แล้วตั้ง Tag เป็น Ground (ถ้ายังไม่มี ให้กด Add Tag... แล้วสร้าง Tag ชื่อ Ground ขึ้นมา)

2. การสร้าง Animation

2.1 สร้าง Animation Clips

  • เลือก Player GameObject
  • เปิดหน้าต่าง Animation (Window > Animation > Animation)
  • กด Create เพื่อสร้าง Animation Clip ใหม่
  • สร้าง Animation Clips ที่จำเป็น เช่น:
    • Idle: ตัวละครยืนนิ่ง
    • Walk: ตัวละครเดิน
    • Run: ตัวละครวิ่ง
    • Jump: ตัวละครกระโดด

2.2 สร้าง Animator Controller

  • หลังจากสร้าง Animation Clips แล้ว Unity จะสร้าง Animator Controller ขึ้นมาโดยอัตโนมัติ (อยู่ใน Folder เดียวกับ Animation Clips)
  • เปิด Animator Controller (ดับเบิลคลิกที่ไฟล์)
  • สร้าง Parameters: ที่หน้าต่าง Animator แท็บ Parameters กด + เพื่อสร้าง Parameters ดังนี้:
    • Speed (Float): สำหรับควบคุม Animation เดิน/วิ่ง/ยืน
    • IsJumping (Bool): สำหรับควบคุม Animation กระโดด
  • สร้าง Transitions: ลากเส้นเชื่อมระหว่าง State ต่างๆ (Idle, Walk, Run, Jump) และกำหนด Conditions โดยใช้ Parameters ที่สร้างไว้
    • Any State -> Jump: Condition: IsJumping is true
    • Jump -> Idle: Condition: IsJumping is false
    • Idle -> Walk: Condition: Speed > 0.01 (และ IsJumping is false)
    • Walk -> Idle: Condition: Speed < 0.01 (และ IsJumping is false)
    • Walk -> Run: Condition: Speed > ค่าที่กำหนด (เช่น 2)
    • Run -> Walk: Condition: Speed น้อยกว่าค่าที่กำหนด
    • ตั้งค่า Has Exit Time เป็น false สำหรับ Transitions ที่ต้องการให้เปลี่ยน Animation ทันที (เช่น กระโดด)

3. สคริปต์ C# สำหรับควบคุม Player

สร้าง C# Script ชื่อ PlayerController แล้วนำไปใส่ใน Player GameObject

C#

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    // กำหนดค่าความเร็ว
    public float walkSpeed = 5f;
    public float runSpeed = 8f;
    public float jumpForce = 10f;

    // ตรวจสอบสถานะ
    private Rigidbody2D rb;
    private Animator animator;
    private bool isGrounded; // ตรวจสอบว่าอยู่บนพื้นหรือไม่
    private float horizontalInput;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        animator = GetComponent<Animator>();
    }

    void Update()
    {
        // รับค่า Input สำหรับการเดินซ้ายขวา
        horizontalInput = Input.GetAxis("Horizontal");

        // ตรวจจับการกระโดด
        if (Input.GetButtonDown("Jump") && isGrounded)
        {
            rb.velocity = new Vector2(rb.velocity.x, jumpForce);
            animator.SetBool("IsJumping", true); // ตั้งค่า Animator Parameter
        }

        // สำหรับเปลี่ยนทิศทาง Player (หันซ้าย/ขวา)
        if (horizontalInput > 0)
        {
            transform.localScale = new Vector3(1, 1, 1); // หันขวา
        }
        else if (horizontalInput < 0)
        {
            transform.localScale = new Vector3(-1, 1, 1); // หันซ้าย
        }

        // ตั้งค่า Animator Parameter สำหรับ Speed
        // ใช้ Mathf.Abs เพื่อให้ค่าเป็นบวกเสมอ ไม่ว่าจะเดินซ้ายหรือขวา
        animator.SetFloat("Speed", Mathf.Abs(horizontalInput));
    }

    void FixedUpdate()
    {
        // การเคลื่อนที่ใน FixedUpdate เพื่อความแม่นยำกับฟิสิกส์
        float currentSpeed = walkSpeed;

        // ตรวจสอบว่ากด Shift เพื่อวิ่งหรือไม่
        if (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
        {
            currentSpeed = runSpeed;
        }

        rb.velocity = new Vector2(horizontalInput * currentSpeed, rb.velocity.y);
    }

    // --- การตรวจจับพื้นด้วย OnCollisionEnter2D และ OnCollisionExit2D ---

    void OnCollisionEnter2D(Collision2D collision)
    {
        // ตรวจสอบว่าชนกับ GameObject ที่มี Tag เป็น "Ground" หรือไม่
        if (collision.gameObject.CompareTag("Ground"))
        {
            isGrounded = true;
            animator.SetBool("IsJumping", false); // ตั้งค่า Animator Parameter เมื่อลงถึงพื้น
        }
    }

    void OnCollisionExit2D(Collision2D collision)
    {
        // เมื่อออกจาก Ground
        if (collision.gameObject.CompareTag("Ground"))
        {
            isGrounded = false;
        }
    }
}

4. คำอธิบายโค้ดและส่วนสำคัญ

  • walkSpeed, runSpeed, jumpForce: ตัวแปรสำหรับปรับความเร็วในการเดิน วิ่ง และแรงกระโดด สามารถปรับได้ใน Inspector ของ Unity
  • Rigidbody2D rb: อ้างอิงถึง Component Rigidbody2D ของ Player เพื่อใช้ในการเคลื่อนที่โดยใช้ฟิสิกส์
  • Animator animator: อ้างอิงถึง Component Animator ของ Player เพื่อควบคุม Animation
  • bool isGrounded: ตัวแปรสถานะที่บอกว่า Player กำลังยืนอยู่บนพื้นหรือไม่
  • Update():
    • Input.GetAxis("Horizontal"): รับค่า Input แกนแนวนอน (ปุ่ม A/D หรือลูกศรซ้าย/ขวา)
    • Input.GetButtonDown("Jump"): ตรวจจับการกดปุ่ม Jump (Spacebar โดย Default)
    • transform.localScale: ใช้สำหรับพลิกตัวละครให้หันซ้ายหรือขวาตามทิศทางการเคลื่อนที่
    • animator.SetFloat("Speed", Mathf.Abs(horizontalInput)): ตั้งค่า Parameter Speed ใน Animator ให้เป็นค่าสัมบูรณ์ของ horizontalInput เพื่อควบคุม Animation เดิน/วิ่ง/ยืน (เมื่อ horizontalInput เป็น 0 Speed จะเป็น 0 ทำให้เล่น Animation Idle)
  • FixedUpdate():
    • ใช้สำหรับโค้ดที่เกี่ยวข้องกับฟิสิกส์ (เช่น การเคลื่อนที่ของ Rigidbody) เพื่อให้การเคลื่อนที่ราบรื่นและไม่ขึ้นกับ Frame Rate
    • Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift): ตรวจสอบว่าผู้เล่นกำลังกดปุ่ม Shift ซ้ายหรือขวาเพื่อวิ่งหรือไม่
    • rb.velocity = new Vector2(horizontalInput * currentSpeed, rb.velocity.y): กำหนดความเร็วของ Rigidbody ในแกน X (แนวนอน) โดยคงความเร็วในแกน Y (แนวดิ่ง) ไว้ (ซึ่งจะถูกแรงโน้มถ่วงจัดการ)
  • OnCollisionEnter2D(Collision2D collision):
    • เป็นฟังก์ชันที่ถูกเรียกเมื่อ Collider ของ Player ชนกับ Collider อื่น
    • collision.gameObject.CompareTag("Ground"): ตรวจสอบว่า GameObject ที่ชนด้วยมี Tag เป็น “Ground” หรือไม่
    • ถ้าชนกับ “Ground” แสดงว่า Player อยู่บนพื้น (isGrounded = true;) และตั้งค่า IsJumping ใน Animator เป็น false เพื่อกลับสู่ Animation ยืน/เดิน/วิ่ง
  • OnCollisionExit2D(Collision2D collision):
    • เป็นฟังก์ชันที่ถูกเรียกเมื่อ Collider ของ Player เลิกชนกับ Collider อื่น
    • ถ้าเลิกชนกับ “Ground” แสดงว่า Player ไม่ได้อยู่บนพื้นแล้ว (isGrounded = false;)

สรุป

ด้วยโค้ดและขั้นตอนเหล่านี้ คุณจะสามารถสร้างตัวละคร 2D ที่สามารถเดิน, วิ่ง, เลี้ยวซ้ายขวา, กระโดด และเล่นแอนิเมชันที่เหมาะสมกับการกระทำต่างๆ พร้อมทั้งมีการตรวจจับพื้นอย่างถูกต้องด้วย OnCollisionEnter2D ได้แล้วครับ

หากมีคำถามเพิ่มเติมหรือต้องการปรับปรุงส่วนไหน บอกได้เลยนะครับ!

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

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

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

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

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