บทที่ 2: การสร้างระบบตัวละคร ด้วยการเขียนโค้ด C#
การสร้าง ระบบตัวละคร (Character System) ในเกมเป็นหนึ่งในองค์ประกอบหลักที่ทำให้ผู้เล่นสามารถโต้ตอบกับเกมได้อย่างเต็มที่ ไม่ว่าจะเป็นการเดิน วิ่ง กระโดด หรือการโต้ตอบกับวัตถุและสิ่งแวดล้อม ใน Unity การควบคุมตัวละครสามารถทำได้โดยการเขียนโค้ด C# เพื่อควบคุมพฤติกรรมและการเคลื่อนไหวของตัวละคร
การสร้างตัวละครใน Unity
ก่อนที่จะเขียนโค้ดควบคุมตัวละคร เราต้องสร้างตัวละครในฉากเกม (Scene) ก่อน โดยสามารถใช้วัตถุ 2D หรือ 3D ขึ้นอยู่กับประเภทของเกมที่เรากำลังพัฒนา
- สร้างวัตถุตัวละครใน Unity โดยไปที่ Hierarchy คลิกขวา > 3D Object (หรือ 2D Object สำหรับเกม 2D) > Cube (หรือ Sprite ในเกม 2D) เพื่อสร้างตัวละครพื้นฐาน
- ตั้งชื่อวัตถุให้ชัดเจน เช่น Player
- เพิ่ม Rigidbody ให้กับตัวละครเพื่อให้สามารถโต้ตอบกับระบบฟิสิกส์ เช่น การตกลงพื้น การกระโดด โดยไปที่ Inspector > Add Component > ค้นหา Rigidbody
การเคลื่อนไหวของตัวละคร
การควบคุมการเคลื่อนไหวของตัวละครต้องอาศัยการเขียนโค้ด C# โดยสามารถใช้ฟังก์ชัน Update() เพื่อตรวจสอบการกดปุ่มจากผู้เล่น และใช้ฟังก์ชัน Translate() หรือ Rigidbody ในการเคลื่อนย้ายตัวละคร
ตัวอย่างโค้ดการเคลื่อนไหวของตัวละคร
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float moveSpeed = 5f;
public float jumpForce = 7f;
private Rigidbody rb;
void Start()
{
rb = GetComponent(); // เข้าถึง Rigidbody ของตัวละคร
}
void Update()
{
// การเคลื่อนที่ซ้าย-ขวา
float moveX = Input.GetAxis("Horizontal") * moveSpeed * Time.deltaTime;
transform.Translate(moveX, 0, 0);
// การกระโดด
if (Input.GetKeyDown(KeyCode.Space) && Mathf.Abs(rb.velocity.y) < 0.001f)
{
rb.AddForce(new Vector3(0, jumpForce, 0), ForceMode.Impulse);
}
}
}
คำอธิบายโค้ด:
- ตัวแปร moveSpeed ถูกใช้เพื่อกำหนดความเร็วในการเคลื่อนที่ของตัวละคร
- ฟังก์ชัน Input.GetAxis("Horizontal") จะตรวจสอบการกดปุ่มลูกศรซ้าย-ขวาหรือปุ่ม A และ D บนคีย์บอร์ดเพื่อควบคุมทิศทางการเคลื่อนที่ของตัวละคร
- การกระโดดจะตรวจสอบปุ่ม Space หากกดปุ่มนี้และตัวละครอยู่บนพื้น ระบบจะเพิ่มแรงกระโดดให้กับตัวละครด้วย AddForce() ผ่าน Rigidbody
การปรับแต่งการเคลื่อนไหวในเกม 2D
หากเราพัฒนาเกมในรูปแบบ 2D การเคลื่อนไหวของตัวละครจะทำได้ง่ายขึ้น โดยใช้ฟังก์ชัน Translate() เพื่อเคลื่อนที่ในแนวแกน X และ Y
ตัวอย่างโค้ดการเคลื่อนไหวในเกม 2D
using UnityEngine;
public class PlayerMovement2D : MonoBehaviour
{
public float moveSpeed = 5f;
public float jumpForce = 7f;
private Rigidbody2D rb;
void Start()
{
rb = GetComponent(); // เข้าถึง Rigidbody2D ของตัวละคร
}
void Update()
{
// การเคลื่อนไหวในแกน X
float moveX = Input.GetAxis("Horizontal") * moveSpeed * Time.deltaTime;
transform.Translate(moveX, 0, 0);
// การกระโดด
if (Input.GetKeyDown(KeyCode.Space) && Mathf.Abs(rb.velocity.y) < 0.001f)
{
rb.AddForce(new Vector2(0, jumpForce), ForceMode2D.Impulse);
}
}
}
ในกรณีนี้ เราใช้ Rigidbody2D แทน Rigidbody สำหรับการเคลื่อนไหวในเกม 2D และการกระโดดยังคงใช้หลักการเดียวกันกับเกม 3D
การจัดการการโต้ตอบของตัวละครกับวัตถุอื่น ๆ
ในเกม ตัวละครมักต้องโต้ตอบกับวัตถุอื่น ๆ เช่น การเก็บไอเท็ม หรือการชนกับศัตรู การจัดการเหตุการณ์เหล่านี้สามารถทำได้โดยใช้ Collider เพื่อรับรู้ว่าตัวละครสัมผัสกับวัตถุอื่นหรือไม่
การตรวจจับการชน (Collision Detection)
Unity มีระบบ OnCollisionEnter ที่จะถูกเรียกเมื่อวัตถุที่มี Collider ชนกับวัตถุอื่น
ตัวอย่างโค้ดการตรวจจับการชน
using UnityEngine;
public class PlayerCollision : MonoBehaviour
{
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.tag == "Enemy")
{
Debug.Log("ผู้เล่นชนกับศัตรู!");
// โค้ดเพื่อลดพลังชีวิตหรือสิ้นสุดเกม
}
}
}
การตรวจจับการชนแบบ Trigger หากเราต้องการให้ตัวละครสามารถเดินผ่านวัตถุได้ แต่ยังคงตรวจจับการสัมผัสได้ เราสามารถใช้ Trigger แทนการชนจริงได้
ตัวอย่างโค้ดการตรวจจับ Trigger
using UnityEngine;
public class PlayerTrigger : MonoBehaviour
{
void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "Item")
{
Debug.Log("ผู้เล่นเก็บไอเท็มได้!");
Destroy(other.gameObject); // ทำลายไอเท็มเมื่อเก็บได้
}
}
}
ในโค้ดนี้ เราใช้ OnTriggerEnter เพื่อให้ตัวละครเก็บไอเท็มเมื่อสัมผัสไอเท็ม โดยไอเท็มจะถูกทำลายหลังจากที่เก็บได้
บทที่ 2 นี้จะช่วยให้นักเรียนเข้าใจวิธีการสร้างระบบตัวละครในเกม ไม่ว่าจะเป็นการเคลื่อนไหว การกระโดด หรือการโต้ตอบกับวัตถุอื่น ๆ โดยใช้การเขียนโค้ด C# ใน Unity