กล้องติดตามผู้เล่นแบบ Third-person ใน Unity Game 3D
Code สำหรับกล้องติดตามผู้เล่นแบบ Third-person ใน Unity พร้อมคำอธิบายและวิธีการตั้งค่า

โค้ดกล้องติดตาม Player แบบ Third-person
C#
using UnityEngine;
public class ThirdPersonCamera : MonoBehaviour
{
public Transform target; // ผู้เล่นที่เราต้องการให้กล้องติดตาม
public Vector3 offset = new Vector3(0f, 2f, -5f); // ตำแหน่งออฟเซ็ตของกล้องจากผู้เล่น (x, y, z)
public float smoothSpeed = 0.125f; // ความเร็วในการเคลื่อนที่ของกล้อง (ยิ่งน้อยยิ่งนุ่มนวล)
public bool lookAtTarget = true; // ให้กล้องหันหน้าไปหาผู้เล่นโดยตรงหรือไม่
void FixedUpdate() // ใช้ FixedUpdate สำหรับการเคลื่อนที่ของกล้องที่อิงกับ Rigidbody (ถ้า Player มี Rigidbody)
{
if (target == null)
{
Debug.LogWarning("Camera target is not set! Please assign a target in the Inspector.");
return;
}
// คำนวณตำแหน่งที่ต้องการของกล้อง
// เราจะใช้ transform.position ของ target เพื่อให้กล้องติดตามการเคลื่อนที่ของผู้เล่น
// และเพิ่ม offset เข้าไป
Vector3 desiredPosition = target.position + offset;
// ใช้ Vector3.Lerp เพื่อเคลื่อนกล้องจากตำแหน่งปัจจุบันไปยังตำแหน่งที่ต้องการอย่างนุ่มนวล
// Lerp (Linear Interpolation) จะสร้างการเปลี่ยนผ่านที่ราบรื่น
Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed);
transform.position = smoothedPosition;
// ถ้าตั้งค่าให้กล้องหันหน้าเข้าหาผู้เล่น
if (lookAtTarget)
{
// ใช้ transform.LookAt เพื่อให้กล้องหันหน้าไปยังผู้เล่น
transform.LookAt(target);
}
}
}
คำอธิบายโค้ด
public Transform target;
: นี่คือตัวแปรที่เราจะลาก GameObject ของผู้เล่นมาใส่ใน Inspector เพื่อให้กล้องรู้ว่าจะติดตามใครpublic Vector3 offset;
: เป็นค่า Vector3 ที่ใช้อธิบายว่ากล้องควรจะอยู่ห่างจากผู้เล่นเท่าไหร่ในแต่ละแกน (X, Y, Z)- X: ด้านข้างของผู้เล่น
- Y: ความสูงเหนือผู้เล่น (ค่าบวกคือสูงขึ้น)
- Z: ระยะห่างจากด้านหลังผู้เล่น (ค่าลบคือถอยหลัง)
public float smoothSpeed;
: ควบคุมความเร็วในการเคลื่อนที่ของกล้อง ยิ่งค่านี้เข้าใกล้ 0 มากเท่าไหร่ กล้องก็จะยิ่งเคลื่อนที่อย่างนุ่มนวลและช้าลงเท่านั้น (แนะนำให้ใช้ค่าเล็ก ๆ เช่น0.125f
หรือ0.05f
)public bool lookAtTarget;
: เป็น Checkbox ใน Inspector ที่ให้คุณเลือกว่าจะให้กล้องหันหน้าไปทางผู้เล่นเสมอหรือไม่FixedUpdate()
: เราใช้FixedUpdate()
แทนUpdate()
เนื่องจากFixedUpdate()
ถูกเรียกใช้ที่ช่วงเวลาคงที่ (Fixed Timestep) ซึ่งเหมาะสำหรับการเคลื่อนที่ของกล้องที่เกี่ยวข้องกับวัตถุที่มี Rigidbody อย่างผู้เล่น ทำให้การเคลื่อนที่ของกล้องราบรื่นขึ้นและสอดคล้องกับการเคลื่อนที่ของผู้เล่นที่เป็นฟิสิกส์
วิธีการตั้งค่าใน Unity Editor
- สร้างกล้อง (Main Camera): ใน Hierarchy, คลิกขวา -> Camera. หรือใช้
Main Camera
ที่มีอยู่แล้วก็ได้ - สร้าง Script:
- ใน Project window, คลิกขวา -> Create -> C# Script ตั้งชื่อว่า
ThirdPersonCamera
(ชื่อต้องตรงกับชื่อ Class ในโค้ด) - คัดลอกโค้ดด้านบนไปวางใน Script นี้
- ใน Project window, คลิกขวา -> Create -> C# Script ตั้งชื่อว่า
- แนบ Script เข้ากับกล้อง: ลาก Script
ThirdPersonCamera
ไปวางบน GameObject ของกล้อง (Main Camera) ใน Hierarchy หรือ Inspector - กำหนด Target:
- เลือก GameObject ของกล้องใน Hierarchy
- ใน Inspector คุณจะเห็น Component
ThirdPersonCamera
- ลาก GameObject ของผู้เล่น ของคุณ (เช่น “Player” หรือ “Capsule” ที่คุณกำลังควบคุม) ไปใส่ในช่อง Target ของ Script
ThirdPersonCamera
- ปรับค่า Offset:
- ใน Inspector ตรง Component
ThirdPersonCamera
คุณจะเห็นช่อง Offset และ Smooth Speed - ลองปรับค่า Offset เช่น
X: 0, Y: 2, Z: -5
(กล้องจะอยู่สูง 2 หน่วย และถอยหลังไป 5 หน่วยจากผู้เล่น) - ปรับค่า Smooth Speed เพื่อให้ได้ความนุ่มนวลที่คุณต้องการ (ค่าเริ่มต้น
0.125
มักจะใช้ได้ดี) - ลองติ๊ก/ไม่ติ๊ก Look At Target เพื่อดูความแตกต่าง
- ใน Inspector ตรง Component
- ทดสอบ: รันเกมและลองควบคุมผู้เล่น กล้องควรจะติดตามผู้เล่นไปเรื่อย ๆ อย่างนุ่มนวล
ข้อแนะนำเพิ่มเติม:
- ป้องกันการตัดผ่านวัตถุ: โค้ดนี้เป็นเพียงพื้นฐาน หากกล้องไปติดกับกำแพงหรือวัตถุอื่น ๆ คุณอาจต้องเพิ่มระบบ Collision Detection ให้กับกล้อง เพื่อไม่ให้กล้องตัดผ่านวัตถุต่าง ๆ ในฉาก
- การหมุนกล้องด้วยเมาส์: หากต้องการให้ผู้เล่นสามารถหมุนกล้องรอบตัวผู้เล่นได้ด้วยเมาส์ จะต้องเพิ่มโค้ดสำหรับการรับ Input จากเมาส์เพื่อปรับ
offset
หรือtransform.position
/transform.rotation
ของกล้องให้สัมพันธ์กับการหมุนของผู้เล่น (หรือมองว่าเป็น Camera Rig) - Parenting: อีกวิธีหนึ่งที่ง่ายกว่าสำหรับกล้องพื้นฐานคือการทำให้กล้องเป็น ลูก (child) ของผู้เล่นโดยตรง แล้วปรับตำแหน่งและ Rotation ของกล้องลูกนั้น แต่ข้อเสียคือกล้องจะเคลื่อนที่อย่าง “แข็ง” ไปพร้อมกับผู้เล่น ไม่มีความนุ่มนวล