ตัวอย่าง Code Unity 2D สำหรับการเคลื่อนที่ของตัวละคร (ผู้เล่น) โดยครอบคลุมการเดิน วิ่ง หัน และกระโดด พร้อมคำอธิบายในแต่ละส่วนและวิธีการตรวจจับพื้นด้วย OnCollisionEnter2D

นี่คือตัวอย่าง Code Unity 2D สำหรับการเคลื่อนที่ของตัวละคร (ผู้เล่น) โดยครอบคลุมการเดิน วิ่ง หัน และกระโดด พร้อมคำอธิบายในแต่ละส่วนและวิธีการตรวจจับพื้นด้วย OnCollisionEnter2D ครับ


ตัวอย่าง Code Unity 2D: การเคลื่อนที่ของตัวละคร

C#

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float walkSpeed = 5f; // ความเร็วในการเดิน
    public float runSpeedMultiplier = 1.5f; // ตัวคูณความเร็วในการวิ่ง
    public float jumpForce = 10f; // แรงกระโดด

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

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

    void Update()
    {
        // 1. การเดินและวิ่ง
        float horizontalInput = Input.GetAxis("Horizontal");
        float currentSpeed = walkSpeed;

        if (Input.GetKey(KeyCode.LeftShift)) // กด Shift เพื่อวิ่ง
        {
            currentSpeed *= runSpeedMultiplier;
        }

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

        // 2. การหันซ้าย/ขวา
        if (horizontalInput > 0)
        {
            transform.localScale = new Vector3(1, 1, 1); // หันขวา
        }
        else if (horizontalInput < 0)
        {
            transform.localScale = new Vector3(-1, 1, 1); // หันซ้าย
        }

        // 3. การกระโดด
        if (Input.GetButtonDown("Jump") && isGrounded)
        {
            rb.velocity = new Vector2(rb.velocity.x, jumpForce);
            isGrounded = false; // กำหนดให้ไม่อยู่บนพื้นทันทีหลังจากกระโดด
        }
    }

    // ตรวจจับการชน
    void OnCollisionEnter2D(Collision2D collision)
    {
        // ตรวจสอบว่าชนกับ "Ground" tag หรือไม่
        if (collision.gameObject.CompareTag("Ground"))
        {
            isGrounded = true;
        }
    }

    // (เพิ่มเติม) ตรวจสอบเมื่อออกจากพื้น
    void OnCollisionExit2D(Collision2D collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
        {
            isGrounded = false;
        }
    }
}

คำอธิบายแต่ละหัวข้อ

1. การเดิน (Walking)

ในส่วนของการเดิน โค้ดจะใช้ Input.GetAxis("Horizontal") เพื่อรับค่าอินพุตจากปุ่มซ้าย/ขวา (โดยปกติคือ A/D หรือลูกศรซ้าย/ขวา) ค่าที่ได้จะเป็น:

  • -1 เมื่อกดไปทางซ้ายสุด
  • 0 เมื่อไม่ได้กด
  • 1 เมื่อกดไปทางขวาสุด

ค่า horizontalInput นี้จะถูกนำไปคูณกับ walkSpeed เพื่อกำหนดความเร็วในแนวนอนของ Rigidbody2D ของผู้เล่น rb.velocity.y จะคงไว้ซึ่งความเร็วในแนวตั้งปัจจุบัน เพื่อไม่ให้การเดินส่งผลต่อการกระโดดหรือการตก.

2. การวิ่ง (Running)

การวิ่งเป็นการขยายจากการเดิน โดยเพิ่มเงื่อนไข if (Input.GetKey(KeyCode.LeftShift)) เข้ามา หากผู้เล่นกดปุ่ม Left Shift ค้างไว้ currentSpeed จะถูกคูณด้วย runSpeedMultiplier ทำให้ตัวละครเคลื่อนที่เร็วขึ้น.

3. การหัน (Turning)

ส่วนนี้ใช้ transform.localScale เพื่อพลิกรูปภาพของตัวละครในแกน X ทำให้ดูเหมือนว่าตัวละครหันไปอีกทางหนึ่ง:

C#

if (horizontalInput > 0)
{
    transform.localScale = new Vector3(1, 1, 1); // หันขวา
}
else if (horizontalInput < 0)
{
    transform.localScale = new Vector3(-1, 1, 1); // หันซ้าย
}
  • เมื่อ horizontalInput เป็น ค่าบวก (เคลื่อนที่ไปทางขวา) transform.localScale จะถูกตั้งค่าเป็น (1, 1, 1) ซึ่งเป็นขนาดปกติของ GameObject ทำให้ตัวละครหันไปทางขวา.
  • เมื่อ horizontalInput เป็น ค่าลบ (เคลื่อนที่ไปทางซ้าย) transform.localScale จะถูกตั้งค่าเป็น (-1, 1, 1) การที่แกน X เป็น -1 จะเป็นการ พลิก (flip) GameObject ในแนวนอน ทำให้ตัวละครหันไปทางซ้าย.การใช้วิธีนี้ง่ายและมีประสิทธิภาพสำหรับการพลิกภาพตัวละคร 2D โดยไม่ต้องเปลี่ยน Rotation ในแกน Z.

4. การกระโดด (Jumping)

การกระโดดจะเกิดขึ้นเมื่อผู้เล่นกดปุ่ม “Jump” (โดยปกติคือ Spacebar) และ isGrounded เป็น true (หมายความว่าตัวละครอยู่บนพื้น).

  • Input.GetButtonDown("Jump") จะตรวจสอบว่าปุ่ม “Jump” ถูกกดลงในเฟรมปัจจุบันหรือไม่.
  • เมื่อเงื่อนไขทั้งสองเป็นจริง rb.velocity ในแนวแกน Y จะถูกตั้งค่าเป็น jumpForce ทำให้ตัวละครพุ่งขึ้นไป.
  • หลังจากกระโดด isGrounded จะถูกตั้งค่าเป็น false ทันที เพื่อป้องกันการกระโดดกลางอากาศหลายครั้ง (double jump) เว้นแต่จะชนพื้นอีกครั้ง.

การตรวจจับพื้น (Check Ground) ด้วย OnCollisionEnter2D

วิธีการตรวจจับว่าตัวละครอยู่บนพื้นหรือไม่นั้น สำคัญมากสำหรับการกระโดด เราใช้เมธอด OnCollisionEnter2D และ OnCollisionExit2D ของ Unity.

C#

void OnCollisionEnter2D(Collision2D collision)
{
    // ตรวจสอบว่าชนกับ "Ground" tag หรือไม่
    if (collision.gameObject.CompareTag("Ground"))
    {
        isGrounded = true;
    }
}

void OnCollisionExit2D(Collision2D collision)
{
    if (collision.gameObject.CompareTag("Ground"))
    {
        isGrounded = false;
    }
}

หลักการทำงาน:

  1. OnCollisionEnter2D(Collision2D collision): เมธอดนี้จะถูกเรียกเมื่อ Rigidbody2D ของ GameObject ที่มีสคริปต์นี้ ชน กับ Collider 2D อื่นๆ.
    • ภายในเมธอด เราจะใช้ collision.gameObject.CompareTag("Ground") เพื่อตรวจสอบว่า GameObject ที่ชนนั้นมี Tag เป็น “Ground” หรือไม่.
    • คุณต้องแน่ใจว่าได้ตั้งค่า Tag “Ground” ให้กับทุก GameObject ที่เป็นพื้นใน Scene ของคุณ.
    • หากชนกับ GameObject ที่มี Tag “Ground” เราจะตั้งค่า isGrounded ให้เป็น true เพื่อบ่งบอกว่าผู้เล่นอยู่บนพื้นและสามารถกระโดดได้.
  2. OnCollisionExit2D(Collision2D collision): เมธอดนี้จะถูกเรียกเมื่อ Rigidbody2D ของ GameObject เลิกชน กับ Collider 2D อื่นๆ.
    • คล้ายกับ OnCollisionEnter2D เราตรวจสอบ Tag “Ground” อีกครั้ง.
    • หากผู้เล่นกระโดดออกจากพื้น หรือตกจากขอบพื้น isGrounded จะถูกตั้งค่าเป็น false เพื่อป้องกันการกระโดดกลางอากาศ.

การตั้งค่าใน Unity Editor:

  1. สำหรับ Player GameObject:
    • ต้องมี Rigidbody2D Component (ตั้งค่า Gravity Scale ตามความเหมาะสม).
    • ต้องมี Collider2D Component (เช่น BoxCollider2D หรือ CapsuleCollider2D).
  2. สำหรับ Ground GameObjects:
    • ต้องมี Collider2D Component (เช่น BoxCollider2D).
    • สำคัญมาก: สร้าง Tag ใหม่ ชื่อ “Ground” ใน Unity Editor (ไปที่ Inspector ของ GameObject ที่เป็นพื้น -> Tag -> Add Tag…) แล้วกำหนด Tag “Ground” ให้กับ GameObject เหล่านั้น.

โค้ดนี้เป็นพื้นฐานที่ดีในการเริ่มต้นสร้างเกมแพลตฟอร์ม 2D ใน Unity ครับ คุณสามารถนำไปปรับแต่งและเพิ่มฟีเจอร์อื่นๆ ได้ตามต้องการ.

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

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

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

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

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