การตั้งค่าและวิธีการเขียน 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/RunIsRunning
(Boolean): สำหรับ RunIsJumping
(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 เมื่อกระโดด
}
สรุปขั้นตอนการใช้งาน
- สร้างโมเดลตัวละคร 3D: นำเข้าโมเดลตัวละครของคุณ
- เพิ่มคอมโพเนนต์:
- Character Controller หรือ Rigidbody (แนะนำ Rigidbody เพื่อใช้
OnCollisionEnter
) - Capsule Collider
- Animator
- Character Controller หรือ Rigidbody (แนะนำ Rigidbody เพื่อใช้
- สร้าง Animator Controller: กำหนดสถานะแอนิเมชัน (Idle, Walk, Run, Jump) และพารามิเตอร์ (Parameters)
- เพิ่มสคริปต์
PlayerController.cs
: คัดลอกโค้ดด้านบนและแนบไปกับตัวละคร - ตั้งค่า Tag “Ground”: ให้วัตถุพื้นในฉากมี Tag เป็น “Ground”
- ลากคอมโพเนนต์: ลาก Rigidbody และ Animator ใน Hierarchy ไปยังช่องว่างใน Inspector ของสคริปต์
PlayerController.cs
ด้วยขั้นตอนเหล่านี้ คุณจะมีระบบควบคุมตัวละครที่สมบูรณ์แบบ ทั้งการเคลื่อนที่ แอนิเมชัน และการเช็กพื้นสำหรับการกระโดด