การตั้งค่าและวิธีการเขียน 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
istrue
Jump
->Idle
: Condition:IsJumping
isfalse
Idle
->Walk
: Condition:Speed
> 0.01 (และIsJumping
isfalse
)Walk
->Idle
: Condition:Speed
< 0.01 (และIsJumping
isfalse
)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
ได้แล้วครับ
หากมีคำถามเพิ่มเติมหรือต้องการปรับปรุงส่วนไหน บอกได้เลยนะครับ!