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

1. การตั้งค่าเบื้องต้นใน Unity
1.1 สร้าง Player GameObject
- สร้าง Sprite สำหรับ Player: นำรูปภาพ Player ที่ต้องการมาลากใส่ Hierarchy (เช่น เป็น
Sprite RendererของPlayerGameObject) - เพิ่ม Component: เลือก
PlayerGameObject แล้วเพิ่ม Component ดังนี้:Rigidbody2D: ตั้งBody Typeเป็นDynamicเพื่อให้สามารถเคลื่อนไหวและถูกแรงโน้มถ่วงได้Capsule Collider 2DหรือBox Collider 2D: ปรับขนาด Collider ให้พอดีกับตัวละคร เพื่อใช้ในการชนและตรวจจับพื้น
1.2 สร้าง Ground GameObject
- สร้าง Sprite สำหรับ Ground: สร้าง
SpriteหรือTilemapสำหรับพื้น - เพิ่ม Component: เลือก
GroundGameObject แล้วเพิ่ม Component:Box Collider 2D: ตั้งIs Triggerเป็นfalseเพื่อให้เป็นพื้นแข็งที่ตัวละครสามารถยืนได้
1.3 ตั้งค่า Tag
- เลือก
GroundGameObject แล้วตั้งTagเป็นGround(ถ้ายังไม่มี ให้กดAdd Tag...แล้วสร้าง Tag ชื่อGroundขึ้นมา)
2. การสร้าง Animation
2.1 สร้าง Animation Clips
- เลือก
PlayerGameObject - เปิดหน้าต่าง
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:IsJumpingistrueJump->Idle: Condition:IsJumpingisfalseIdle->Walk: Condition:Speed> 0.01 (และIsJumpingisfalse)Walk->Idle: Condition:Speed< 0.01 (และIsJumpingisfalse)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 ของ UnityRigidbody2D rb: อ้างอิงถึง ComponentRigidbody2Dของ Player เพื่อใช้ในการเคลื่อนที่โดยใช้ฟิสิกส์Animator animator: อ้างอิงถึง ComponentAnimatorของ Player เพื่อควบคุม Animationbool isGrounded: ตัวแปรสถานะที่บอกว่า Player กำลังยืนอยู่บนพื้นหรือไม่Update():Input.GetAxis("Horizontal"): รับค่า Input แกนแนวนอน (ปุ่ม A/D หรือลูกศรซ้าย/ขวา)Input.GetButtonDown("Jump"): ตรวจจับการกดปุ่ม Jump (Spacebar โดย Default)transform.localScale: ใช้สำหรับพลิกตัวละครให้หันซ้ายหรือขวาตามทิศทางการเคลื่อนที่animator.SetFloat("Speed", Mathf.Abs(horizontalInput)): ตั้งค่า ParameterSpeedใน Animator ให้เป็นค่าสัมบูรณ์ของhorizontalInputเพื่อควบคุม Animation เดิน/วิ่ง/ยืน (เมื่อhorizontalInputเป็น 0Speedจะเป็น 0 ทำให้เล่น AnimationIdle)
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 ได้แล้วครับ
หากมีคำถามเพิ่มเติมหรือต้องการปรับปรุงส่วนไหน บอกได้เลยนะครับ!