บทที่ 5: การสร้าง AI ตัวละครในเกม
AI หรือปัญญาประดิษฐ์ในเกมเป็นระบบที่ทำให้ตัวละครที่ไม่ได้ควบคุมโดยผู้เล่น (Non-Player Characters: NPCs) มีพฤติกรรมที่ดูเหมือนมีชีวิตจริง ตัวละครเหล่านี้สามารถทำงานได้หลากหลาย เช่น การไล่ตามผู้เล่น การเดินลาดตระเวนในพื้นที่ หรือการโต้ตอบกับสิ่งแวดล้อมในเกม การสร้าง AI ตัวละครจะช่วยเพิ่มความสนุกและท้าทายให้กับเกมได้มากขึ้น
ในบทนี้เราจะเรียนรู้วิธีการสร้าง AI เบื้องต้น เช่น การเดินลาดตระเวน การไล่ตามผู้เล่น และการทำงานกับ NavMesh เพื่อให้ตัวละครสามารถเคลื่อนไหวได้อย่างอัตโนมัติในเกม 3D
การใช้ NavMesh สำหรับการเคลื่อนไหวของ AI
NavMesh (Navigation Mesh) เป็นระบบที่ใช้เพื่อทำให้ AI ในเกมสามารถเคลื่อนไหวไปยังตำแหน่งต่าง ๆ ในฉากได้ โดยไม่ชนกับสิ่งกีดขวาง เช่น กำแพงหรือวัตถุอื่น ๆ การใช้ NavMesh จะช่วยให้การเคลื่อนไหวของตัวละครดูสมจริงและเป็นธรรมชาติมากขึ้น
ขั้นตอนการตั้งค่า NavMesh
- สร้างพื้นดินหรือพื้นที่ในฉากที่ตัวละคร AI จะเคลื่อนไหว
- เลือกวัตถุที่เป็นพื้นดินใน Hierarchy แล้วไปที่ Inspector
- คลิกที่ Navigation และเลือก Bake เพื่อให้ Unity สร้าง NavMesh บนพื้นผิวที่เลือกไว้
- เพิ่ม NavMesh Agent ให้กับตัวละคร AI โดยเลือกตัวละครใน Hierarchy ไปที่ Inspector > Add Component และพิมพ์ค้นหา NavMesh Agent
เมื่อทำตามขั้นตอนข้างต้นแล้ว ตัวละคร AI จะสามารถใช้ NavMesh ในการเคลื่อนที่ไปตามเส้นทางที่กำหนดไว้ในฉากได้
การเขียนโค้ดเพื่อควบคุมการเคลื่อนไหวของ AI ด้วย NavMesh
เมื่อเราเพิ่ม NavMesh Agent ให้กับตัวละคร AI แล้ว ขั้นตอนต่อไปคือการเขียนโค้ด C# เพื่อควบคุมการเคลื่อนไหวของ AI ให้ไปยังตำแหน่งเป้าหมายที่กำหนดไว้ เช่น การให้ตัวละครเดินไปตามจุดต่าง ๆ ในฉาก
ตัวอย่างโค้ดการเดินทางไปยังจุดเป้าหมาย
using UnityEngine;
using UnityEngine.AI;
public class AINavigation : MonoBehaviour
{
public Transform target; // ตำแหน่งเป้าหมายที่ AI จะเดินไป
private NavMeshAgent agent;
void Start()
{
agent = GetComponent(); // เข้าถึงคอมโพเนนต์ NavMesh Agent
agent.SetDestination(target.position); // ตั้งตำแหน่งเป้าหมาย
}
}
คำอธิบายโค้ด
- ตัวแปร target คือจุดที่เราต้องการให้ AI เคลื่อนที่ไป
- ฟังก์ชัน SetDestination() จะบอกให้ AI เดินไปยังตำแหน่งของ target
การเดินลาดตระเวน (Patrolling)
หนึ่งในพฤติกรรมของ AI ที่พบได้บ่อยในเกมคือการเดินลาดตระเวนตามเส้นทางที่กำหนด ซึ่ง AI จะเคลื่อนไหวไปมาระหว่างจุดต่าง ๆ ในฉาก เราสามารถกำหนดพฤติกรรมนี้ได้โดยใช้ Waypoints หรือจุดหมายปลายทางต่าง ๆ ที่กำหนดให้ AI เดินไปถึงก่อนที่จะย้ายไปจุดต่อไป
ตัวอย่างโค้ดการเดินลาดตระเวน
using UnityEngine;
using UnityEngine.AI;
public class AIPatrol : MonoBehaviour
{
public Transform[] waypoints; // จุดหมายปลายทางที่ AI จะเดินไป
private NavMeshAgent agent;
private int currentWaypointIndex = 0;
void Start()
{
agent = GetComponent();
agent.SetDestination(waypoints[currentWaypointIndex].position);
}
void Update()
{
// ตรวจสอบว่า AI มาถึงจุดหมายหรือยัง
if (!agent.pathPending && agent.remainingDistance < 0.5f)
{
GoToNextWaypoint();
}
}
void GoToNextWaypoint()
{
// ย้ายไปยังจุดหมายปลายทางถัดไป
currentWaypointIndex = (currentWaypointIndex + 1) % waypoints.Length;
agent.SetDestination(waypoints[currentWaypointIndex].position);
}
}
คำอธิบายโค้ด
- ตัวแปร waypoints เป็นอาร์เรย์ที่เก็บจุดหมายปลายทางหลายจุดที่ AI จะเดินไป
- ฟังก์ชัน GoToNextWaypoint() จะทำให้ AI เคลื่อนไปยังจุดถัดไปในอาร์เรย์อย่างต่อเนื่อง เมื่อ AI ไปถึงจุดหนึ่งแล้ว จะเคลื่อนที่ไปยังจุดต่อไปเรื่อย ๆ
การไล่ตามผู้เล่น (Chasing Player)
อีกหนึ่งพฤติกรรมที่ใช้บ่อยในเกมคือการที่ศัตรูไล่ตามผู้เล่น (Chase) โดยเราจะทำให้ AI ตรวจจับว่าผู้เล่นอยู่ใกล้พอที่จะไล่ตามหรือไม่ และให้ AI เคลื่อนที่ไปยังตำแหน่งของผู้เล่นเมื่อผู้เล่นเข้ามาในระยะที่กำหนด
ตัวอย่างโค้ดการไล่ตามผู้เล่น
using UnityEngine;
using UnityEngine.AI;
public class AIChase : MonoBehaviour
{
public Transform player; // ตำแหน่งของผู้เล่น
public float chaseRange = 10f; // ระยะการตรวจจับผู้เล่น
private NavMeshAgent agent;
private bool isChasing = false;
void Start()
{
agent = GetComponent();
}
void Update()
{
float distanceToPlayer = Vector3.Distance(player.position, transform.position);
// หากผู้เล่นอยู่ในระยะตรวจจับ ให้ AI ไล่ตามผู้เล่น
if (distanceToPlayer < chaseRange)
{
isChasing = true;
agent.SetDestination(player.position);
}
else
{
isChasing = false;
agent.ResetPath(); // หยุดไล่ตามเมื่อผู้เล่นออกนอกระยะ
}
}
}
คำอธิบายโค้ด
- ตัวแปร chaseRange ใช้กำหนดระยะที่ AI จะเริ่มไล่ตามผู้เล่น
- ฟังก์ชัน Vector3.Distance() คำนวณระยะห่างระหว่างตัวละคร AI และผู้เล่น หากผู้เล่นอยู่ในระยะที่กำหนด AI จะเริ่มไล่ตามผู้เล่น
การเพิ่มพฤติกรรมอื่น ๆ ให้กับ AI
นอกจากการเดินลาดตระเวนและการไล่ตามผู้เล่นแล้ว เรายังสามารถเพิ่มพฤติกรรมอื่น ๆ ให้กับ AI ได้ เช่น การโจมตีเมื่อผู้เล่นอยู่ใกล้ การซ่อนตัว หรือการป้องกันตัวเอง ซึ่งการพัฒนา AI ที่มีพฤติกรรมหลากหลายจะทำให้เกมดูน่าสนใจและท้าทายมากขึ้น
ตัวอย่างโค้ด AI โจมตีเมื่อผู้เล่นเข้าใกล้
using UnityEngine;
public class AIAttack : MonoBehaviour
{
public Transform player;
public float attackRange = 2f;
public float attackCooldown = 1f;
private float nextAttackTime = 0f;
void Update()
{
float distanceToPlayer = Vector3.Distance(player.position, transform.position);
if (distanceToPlayer < attackRange && Time.time >= nextAttackTime)
{
AttackPlayer();
nextAttackTime = Time.time + attackCooldown; // ตั้งเวลาสำหรับการโจมตีครั้งถัดไป
}
}
void AttackPlayer()
{
Debug.Log("AI โจมตีผู้เล่น!");
// เพิ่มโค้ดสำหรับการลดพลังชีวิตของผู้เล่นที่นี่
}
}
คำอธิบายโค้ด
- AI จะโจมตีผู้เล่นเมื่อผู้เล่นอยู่ในระยะที่กำหนด (attackRange) และตั้งเวลาสำหรับการโจมตีครั้งถัดไปโดยใช้ attackCooldown
บทที่ 5 นี้ช่วยให้นักเรียนได้เรียนรู้วิธีการสร้าง AI ตัวละครในเกม ไม่ว่าจะเป็นการเดินลาดตระเวน การไล่ตามผู้เล่น หรือการโจมตีเมื่ออยู่ในระยะ การเพิ่ม AI ในเกมจะช่วยให้เกมมีความสมจริงและท้าทายมากขึ้น