บทที่ 6: การสร้างแอนิเมชันขั้นสูง
การสร้าง แอนิเมชัน (Animation) เป็นส่วนสำคัญในการทำให้ตัวละครและวัตถุในเกมดูมีชีวิตชีวาและสมจริงมากขึ้น Unity มีเครื่องมือที่เรียกว่า Animator ที่ช่วยให้เราสามารถสร้างและจัดการแอนิเมชันของตัวละครได้อย่างมีประสิทธิภาพ นอกจากแอนิเมชันพื้นฐาน เช่น การเดิน การวิ่ง หรือการกระโดด เรายังสามารถสร้างแอนิเมชันขั้นสูงที่ซับซ้อนยิ่งขึ้น เช่น การใช้ Blend Trees เพื่อเชื่อมโยงแอนิเมชันหลาย ๆ แบบเข้าด้วยกัน
ในบทนี้ เราจะเรียนรู้การสร้างแอนิเมชันขั้นสูงใน Unity โดยใช้ Animator Controller, Blend Trees, และการควบคุมแอนิเมชันผ่านโค้ด C# เพื่อให้สามารถสร้างการเคลื่อนไหวที่ราบรื่นและตอบสนองต่อการกระทำของผู้เล่นได้ดีขึ้น
การใช้ Animator Controller ในการควบคุมแอนิเมชัน
Animator Controller เป็นเครื่องมือที่ใช้ในการจัดการและควบคุมลำดับการทำงานของแอนิเมชันใน Unity โดยเราสามารถเชื่อมโยงแอนิเมชันหลายแบบเข้าด้วยกัน และสร้างการเปลี่ยนผ่าน (Transitions) ระหว่างแอนิเมชันเหล่านั้นได้อย่างราบรื่น
ขั้นตอนการสร้าง Animator Controller
- ไปที่ Assets > คลิกขวา > Create > Animator Controller เพื่อสร้าง Animator Controller ใหม่
- ตั้งชื่อตามต้องการ และลากตัวละครที่ต้องการควบคุมแอนิเมชันไปยัง Hierarchy
- ใน Inspector ของตัวละคร ให้เพิ่มคอมโพเนนต์ Animator และนำ Animator Controller ที่สร้างไว้ไปใส่ในฟิลด์ Controller
- เปิด Animator Window โดยไปที่ Window > Animation > Animator
ใน Animator Window นี้ เราสามารถสร้างการเปลี่ยนผ่านแอนิเมชัน เช่น การเปลี่ยนจากการยืนไปเป็นการเดิน หรือจากการเดินไปเป็นการวิ่ง โดยการสร้างเงื่อนไข (Conditions) เช่น เมื่อผู้เล่นกดปุ่มเดินหรือวิ่ง
การสร้างการเปลี่ยนผ่านของแอนิเมชัน (Animation Transitions)
การเปลี่ยนแอนิเมชันจากหนึ่งไปยังอีกหนึ่ง เช่น จากการยืนไปเป็นการเดิน สามารถทำได้โดยการสร้าง Transition ซึ่งจะเชื่อมโยงแอนิเมชันที่แตกต่างกัน
ขั้นตอนการสร้าง Transition
- เลือกแอนิเมชันหลักใน Animator Window เช่น Idle (ท่ายืน)
- คลิกขวาแล้วเลือก Make Transition จากนั้นลากไปยังแอนิเมชันที่ต้องการเชื่อมต่อ เช่น Walk (ท่าเดิน)
- คลิกที่ลูกศรของ Transition และตั้งเงื่อนไข (Conditions) ใน Inspector เช่น การใช้ตัวแปรที่ชื่อว่า Speed เพื่อควบคุมว่าเมื่อใดจะเปลี่ยนแอนิเมชัน
การใช้ตัวแปรเพื่อควบคุม Transition ตัวแปรที่ใช้ใน Animator Controller ช่วยให้เราสามารถควบคุมการเปลี่ยนผ่านของแอนิเมชันได้อย่างยืดหยุ่น เช่น การใช้ตัวแปร Speed ในการเปลี่ยนจากท่ายืนเป็นท่าเดิน
ตัวอย่างการเพิ่มตัวแปร Speed
- เปิด Animator Window และไปที่แถบ Parameters
- คลิกปุ่ม + เพื่อเพิ่มตัวแปรใหม่ เลือก Float และตั้งชื่อตัวแปรว่า Speed
- ในการเปลี่ยนจากท่ายืนเป็นท่าเดิน ให้สร้างเงื่อนไขว่า Speed > 0.1 จะเปลี่ยนเป็นท่าเดิน
การใช้ Blend Trees เพื่อเชื่อมโยงแอนิเมชันหลายแบบ
Blend Trees เป็นเครื่องมือที่ช่วยให้เราสามารถเชื่อมโยงแอนิเมชันหลายแบบเข้าด้วยกันอย่างราบรื่น เช่น การเปลี่ยนจากท่าเดินไปเป็นท่าวิ่ง โดยขึ้นอยู่กับค่าของตัวแปรที่ใช้ควบคุมแอนิเมชัน เช่น ความเร็ว (Speed)
ขั้นตอนการสร้าง Blend Trees
- เปิด Animator Window คลิกขวาเลือก Create State > From New Blend Tree
- ดับเบิลคลิกที่ Blend Tree เพื่อเข้าไปยังหน้าต่างการตั้งค่า
- ใน Blend Tree ให้คลิก + Add Motion เพื่อเพิ่มแอนิเมชันต่าง ๆ เช่น ท่าเดิน (Walk) และท่าวิ่ง (Run)
- กำหนดตัวแปรควบคุม เช่น Speed โดยค่าความเร็วที่เพิ่มขึ้นจะทำให้แอนิเมชันเปลี่ยนจากเดินไปวิ่ง
ตัวอย่างโค้ดการควบคุม Blend Trees
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public Animator animator;
public float moveSpeed = 5f;
void Update()
{
float speed = Input.GetAxis("Vertical") * moveSpeed;
animator.SetFloat("Speed", Mathf.Abs(speed)); // ตั้งค่า Speed เพื่อควบคุม Blend Tree
// การเคลื่อนไหวของตัวละคร
transform.Translate(0, 0, speed * Time.deltaTime);
}
}
คำอธิบายโค้ด
- ตัวแปร Speed ใช้ควบคุมการเปลี่ยนแปลงระหว่างท่าเดินและท่าวิ่งใน Blend Tree โดยการตั้งค่าตามการเคลื่อนไหวของผู้เล่น
- ฟังก์ชัน SetFloat() ถูกใช้เพื่ออัปเดตค่าของตัวแปร Speed ใน Animator Controller
การควบคุมแอนิเมชันผ่านโค้ด C#
การควบคุมแอนิเมชันผ่านโค้ดช่วยให้เราสามารถสร้างเงื่อนไขที่ซับซ้อนมากขึ้นในการแสดงผลแอนิเมชัน เช่น การเปลี่ยนแอนิเมชันตามพฤติกรรมของผู้เล่น หรือการเปลี่ยนแปลงแอนิเมชันตามการโจมตี
ตัวอย่างโค้ดการควบคุมแอนิเมชันด้วยโค้ด C#
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public Animator animator;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
animator.SetTrigger("Jump"); // เรียกแอนิเมชันกระโดดเมื่อกดปุ่ม Space
}
if (Input.GetKeyDown(KeyCode.LeftShift))
{
animator.SetBool("isRunning", true); // เรียกแอนิเมชันท่าวิ่งเมื่อกดปุ่ม Shift
}
else if (Input.GetKeyUp(KeyCode.LeftShift))
{
animator.SetBool("isRunning", false); // กลับสู่ท่าเดินเมื่อปล่อยปุ่ม Shift
}
}
}
คำอธิบายโค้ด
- ฟังก์ชัน SetTrigger() ใช้เพื่อเรียกแอนิเมชันเมื่อเกิดเหตุการณ์เฉพาะ เช่น การกระโดด
- ฟังก์ชัน SetBool() ใช้เพื่อเปิดหรือปิดการแสดงผลแอนิเมชัน เช่น การวิ่งและการหยุดวิ่ง
การจัดการการเปลี่ยนผ่านของแอนิเมชันตามสถานะของเกม (Game States)
เรายังสามารถควบคุมแอนิเมชันตามสถานะของเกม เช่น เมื่อผู้เล่นตาย หรือตัวละครเข้าโหมดต่อสู้ โดยการใช้โค้ดเพื่อตรวจสอบสถานะของเกมและเปลี่ยนแปลงแอนิเมชันให้สอดคล้องกับเหตุการณ์นั้น ๆ
ตัวอย่างโค้ดการควบคุมแอนิเมชันตามสถานะของเกม
using UnityEngine;
public class PlayerHealth : MonoBehaviour
{
public Animator animator;
public int health = 100;
void Update()
{
if (health <= 0)
{
animator.SetTrigger("Die"); // เรียกแอนิเมชันตัวละครตายเมื่อพลังชีวิตหมด
}
}
public void TakeDamage(int damage)
{
health -= damage;
if (health > 0)
{
animator.SetTrigger("Hurt"); // แสดงแอนิเมชันเมื่อได้รับบาดเจ็บ
}
}
}
ในโค้ดนี้ เมื่อพลังชีวิตของผู้เล่นหมด ตัวละครจะเข้าสู่แอนิเมชันการตาย หากได้รับความเสียหายแต่ยังไม่ตาย ตัวละครจะแสดงแอนิเมชันบาดเจ็บ
บทที่ 6 นี้ช่วยให้นักเรียนได้เรียนรู้วิธีการสร้างแอนิเมชันขั้นสูงใน Unity โดยใช้ Animator Controller, Blend Trees, และการควบคุมแอนิเมชันผ่านโค้ด C# การเข้าใจวิธีการทำงานของแอนิเมชันจะช่วยให้ตัวละครและเกมมีความน่าสนใจและสมจริงมากขึ้น