ตัวอย่าง 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;
}
}
หลักการทำงาน:
OnCollisionEnter2D(Collision2D collision)
: เมธอดนี้จะถูกเรียกเมื่อRigidbody2D
ของ GameObject ที่มีสคริปต์นี้ ชน กับ Collider 2D อื่นๆ.- ภายในเมธอด เราจะใช้
collision.gameObject.CompareTag("Ground")
เพื่อตรวจสอบว่า GameObject ที่ชนนั้นมี Tag เป็น “Ground” หรือไม่. - คุณต้องแน่ใจว่าได้ตั้งค่า Tag “Ground” ให้กับทุก GameObject ที่เป็นพื้นใน Scene ของคุณ.
- หากชนกับ GameObject ที่มี Tag “Ground” เราจะตั้งค่า
isGrounded
ให้เป็นtrue
เพื่อบ่งบอกว่าผู้เล่นอยู่บนพื้นและสามารถกระโดดได้.
- ภายในเมธอด เราจะใช้
OnCollisionExit2D(Collision2D collision)
: เมธอดนี้จะถูกเรียกเมื่อRigidbody2D
ของ GameObject เลิกชน กับ Collider 2D อื่นๆ.- คล้ายกับ
OnCollisionEnter2D
เราตรวจสอบ Tag “Ground” อีกครั้ง. - หากผู้เล่นกระโดดออกจากพื้น หรือตกจากขอบพื้น
isGrounded
จะถูกตั้งค่าเป็นfalse
เพื่อป้องกันการกระโดดกลางอากาศ.
- คล้ายกับ
การตั้งค่าใน Unity Editor:
- สำหรับ Player GameObject:
- ต้องมี Rigidbody2D Component (ตั้งค่า
Gravity Scale
ตามความเหมาะสม). - ต้องมี Collider2D Component (เช่น
BoxCollider2D
หรือCapsuleCollider2D
).
- ต้องมี Rigidbody2D Component (ตั้งค่า
- สำหรับ Ground GameObjects:
- ต้องมี Collider2D Component (เช่น
BoxCollider2D
). - สำคัญมาก: สร้าง Tag ใหม่ ชื่อ “Ground” ใน Unity Editor (ไปที่ Inspector ของ GameObject ที่เป็นพื้น -> Tag -> Add Tag…) แล้วกำหนด Tag “Ground” ให้กับ GameObject เหล่านั้น.
- ต้องมี Collider2D Component (เช่น
โค้ดนี้เป็นพื้นฐานที่ดีในการเริ่มต้นสร้างเกมแพลตฟอร์ม 2D ใน Unity ครับ คุณสามารถนำไปปรับแต่งและเพิ่มฟีเจอร์อื่นๆ ได้ตามต้องการ.