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

การควบคุมตัวละคร 3D ใน Unity ให้สามารถเดิน วิ่ง เลี้ยวซ้ายขวา กระโดด และมีแอนิเมชันที่สอดคล้องกับการเคลื่อนไหว พร้อมทั้งเช็กการสัมผัสพื้นด้วย OnCollisionEnter เป็นสิ่งสำคัญในการสร้างเกม นี่คือคำอธิบายและแนวทางการเขียนโค้ด C# สำหรับการควบคุมตัวละครนี้:


การควบคุมตัวละครและการจัดการแอนิเมชัน

ในการควบคุมตัวละคร คุณจำเป็นต้องใช้คอมโพเนนต์หลัก ๆ เช่น Rigidbody สำหรับการจัดการฟิสิกส์และการเคลื่อนไหว และ Animator สำหรับการจัดการแอนิเมชัน

1. การกำหนดตัวแปรและการเคลื่อนที่

เริ่มต้นด้วยการสร้างสคริปต์ C# (เช่น PlayerController.cs) และกำหนดตัวแปรที่จำเป็น:

C#

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float moveSpeed = 5f;
    public float runSpeed = 10f;
    public float jumpForce = 7f;
    public Animator animator;
    public Rigidbody rb;

    private bool isGrounded;
    private float currentSpeed;

    void Start()
    {
        // รับคอมโพเนนต์ Rigidbody และ Animator
        rb = GetComponent<Rigidbody>();
        animator = GetComponent<Animator>();
    }

    void Update()
    {
        // ตรวจสอบการรับอินพุต
        HandleMovement();
        HandleJump();
        UpdateAnimations();
    }
}

2. การเคลื่อนที่ (เดิน, วิ่ง, เลี้ยว)

ใช้ Input.GetAxis("Horizontal") และ Input.GetAxis("Vertical") สำหรับการรับค่าการเคลื่อนที่:

C#

    void HandleMovement()
    {
        float horizontalInput = Input.GetAxis("Horizontal");
        float verticalInput = Input.GetAxis("Vertical");

        // ตรวจสอบว่ากำลังวิ่งหรือไม่ (เช่น กด Shift)
        if (Input.GetKey(KeyCode.LeftShift))
        {
            currentSpeed = runSpeed;
        }
        else
        {
            currentSpeed = moveSpeed;
        }

        Vector3 movement = new Vector3(horizontalInput, 0f, verticalInput).normalized * currentSpeed * Time.deltaTime;
        
        // เคลื่อนย้ายตัวละคร
        transform.Translate(movement, Space.Self);

        // การเลี้ยว (Turn)
        if (movement.magnitude > 0)
        {
            Quaternion targetRotation = Quaternion.LookRotation(new Vector3(horizontalInput, 0, verticalInput));
            transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 10f);
        }
    }

3. การกระโดด (Jump)

ใช้ Rigidbody.AddForce() เพื่อให้ตัวละครกระโดด:

C#

    void HandleJump()
    {
        if (isGrounded && Input.GetButtonDown("Jump"))
        {
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
            isGrounded = false;
        }
    }

การเช็กพื้น (Ground Check) ด้วย OnCollisionEnter และ OnCollisionExit

การเช็กว่าตัวละครอยู่บนพื้นหรือไม่นั้น สำคัญมากสำหรับการกระโดด การใช้ OnCollisionEnter และ OnCollisionExit เป็นวิธีที่ง่ายและมีประสิทธิภาพ โดยเราจะใช้แท็ก (Tag) เพื่อระบุว่าวัตถุที่ชนคือพื้น

1. การกำหนดแท็ก “Ground”

ใน Unity Editor ให้เลือกวัตถุที่เป็นพื้น (เช่น Terrain หรือ Plane) และกำหนด Tag เป็น “Ground”

2. การใช้ OnCollisionEnter และ OnCollisionExit ในสคริปต์

เพิ่มฟังก์ชันเหล่านี้ในสคริปต์ PlayerController.cs:

C#

    void OnCollisionEnter(Collision collision)
    {
        // ตรวจสอบว่าชนกับวัตถุที่มี Tag "Ground"
        if (collision.gameObject.CompareTag("Ground"))
        {
            isGrounded = true;
            // ตั้งค่าแอนิเมชันการกระโดดให้กลับเป็น Idle/Walk/Run
            animator.SetBool("IsJumping", false); 
        }
    }

    void OnCollisionExit(Collision collision)
    {
        // เมื่อออกจากพื้นที่ชน (เช่น กระโดดออกจากพื้น)
        if (collision.gameObject.CompareTag("Ground"))
        {
            isGrounded = false;
            // ตั้งค่าแอนิเมชันการกระโดด
            if (rb.velocity.y > 0) // ตรวจสอบว่ากำลังเคลื่อนที่ขึ้น (กระโดด)
            {
                animator.SetBool("IsJumping", true);
            }
        }
    }

การเชื่อมโยงแอนิเมชัน (Animations)

เราจะใช้ Animator เพื่อเปลี่ยนแอนิเมชันตามการเคลื่อนไหวของตัวละคร

1. การตั้งค่า Animator

ใน Unity Editor ให้ตั้งค่า Animator Controller และสร้าง Parameters สำหรับควบคุมแอนิเมชัน:

  • IsMoving (Boolean): สำหรับ Walk/Run
  • IsRunning (Boolean): สำหรับ Run
  • IsJumping (Boolean): สำหรับ Jump

2. การอัปเดตแอนิเมชันในสคริปต์

เพิ่มฟังก์ชัน UpdateAnimations() เพื่ออัปเดตสถานะของ Animator:

C#

    void UpdateAnimations()
    {
        // คำนวณความเร็วในแนวระนาบ (ไม่รวมการเคลื่อนที่ในแนวแกน Y)
        float speed = new Vector3(rb.velocity.x, 0, rb.velocity.z).magnitude;

        // กำหนดสถานะการเคลื่อนไหว
        bool isMoving = speed > 0.1f;
        animator.SetBool("IsMoving", isMoving);

        // กำหนดสถานะการวิ่ง (โดยใช้ความเร็วเป็นเกณฑ์)
        bool isRunning = isMoving && (currentSpeed == runSpeed);
        animator.SetBool("IsRunning", isRunning);

        // Note: isJumping จะถูกกำหนดใน OnCollisionExit เมื่อกระโดด
    }

สรุปขั้นตอนการใช้งาน

  1. สร้างโมเดลตัวละคร 3D: นำเข้าโมเดลตัวละครของคุณ
  2. เพิ่มคอมโพเนนต์:
    • Character Controller หรือ Rigidbody (แนะนำ Rigidbody เพื่อใช้ OnCollisionEnter)
    • Capsule Collider
    • Animator
  3. สร้าง Animator Controller: กำหนดสถานะแอนิเมชัน (Idle, Walk, Run, Jump) และพารามิเตอร์ (Parameters)
  4. เพิ่มสคริปต์ PlayerController.cs: คัดลอกโค้ดด้านบนและแนบไปกับตัวละคร
  5. ตั้งค่า Tag “Ground”: ให้วัตถุพื้นในฉากมี Tag เป็น “Ground”
  6. ลากคอมโพเนนต์: ลาก Rigidbody และ Animator ใน Hierarchy ไปยังช่องว่างใน Inspector ของสคริปต์ PlayerController.cs

ด้วยขั้นตอนเหล่านี้ คุณจะมีระบบควบคุมตัวละครที่สมบูรณ์แบบ ทั้งการเคลื่อนที่ แอนิเมชัน และการเช็กพื้นสำหรับการกระโดด

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

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

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

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

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