กล้องติดตามผู้เล่นแบบ 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

  1. สร้างกล้อง (Main Camera): ใน Hierarchy, คลิกขวา -> Camera. หรือใช้ Main Camera ที่มีอยู่แล้วก็ได้
  2. สร้าง Script:
    • ใน Project window, คลิกขวา -> Create -> C# Script ตั้งชื่อว่า ThirdPersonCamera (ชื่อต้องตรงกับชื่อ Class ในโค้ด)
    • คัดลอกโค้ดด้านบนไปวางใน Script นี้
  3. แนบ Script เข้ากับกล้อง: ลาก Script ThirdPersonCamera ไปวางบน GameObject ของกล้อง (Main Camera) ใน Hierarchy หรือ Inspector
  4. กำหนด Target:
    • เลือก GameObject ของกล้องใน Hierarchy
    • ใน Inspector คุณจะเห็น Component ThirdPersonCamera
    • ลาก GameObject ของผู้เล่น ของคุณ (เช่น “Player” หรือ “Capsule” ที่คุณกำลังควบคุม) ไปใส่ในช่อง Target ของ Script ThirdPersonCamera
  5. ปรับค่า Offset:
    • ใน Inspector ตรง Component ThirdPersonCamera คุณจะเห็นช่อง Offset และ Smooth Speed
    • ลองปรับค่า Offset เช่น X: 0, Y: 2, Z: -5 (กล้องจะอยู่สูง 2 หน่วย และถอยหลังไป 5 หน่วยจากผู้เล่น)
    • ปรับค่า Smooth Speed เพื่อให้ได้ความนุ่มนวลที่คุณต้องการ (ค่าเริ่มต้น 0.125 มักจะใช้ได้ดี)
    • ลองติ๊ก/ไม่ติ๊ก Look At Target เพื่อดูความแตกต่าง
  6. ทดสอบ: รันเกมและลองควบคุมผู้เล่น กล้องควรจะติดตามผู้เล่นไปเรื่อย ๆ อย่างนุ่มนวล

ข้อแนะนำเพิ่มเติม:

  • ป้องกันการตัดผ่านวัตถุ: โค้ดนี้เป็นเพียงพื้นฐาน หากกล้องไปติดกับกำแพงหรือวัตถุอื่น ๆ คุณอาจต้องเพิ่มระบบ Collision Detection ให้กับกล้อง เพื่อไม่ให้กล้องตัดผ่านวัตถุต่าง ๆ ในฉาก
  • การหมุนกล้องด้วยเมาส์: หากต้องการให้ผู้เล่นสามารถหมุนกล้องรอบตัวผู้เล่นได้ด้วยเมาส์ จะต้องเพิ่มโค้ดสำหรับการรับ Input จากเมาส์เพื่อปรับ offset หรือ transform.position/transform.rotation ของกล้องให้สัมพันธ์กับการหมุนของผู้เล่น (หรือมองว่าเป็น Camera Rig)
  • Parenting: อีกวิธีหนึ่งที่ง่ายกว่าสำหรับกล้องพื้นฐานคือการทำให้กล้องเป็น ลูก (child) ของผู้เล่นโดยตรง แล้วปรับตำแหน่งและ Rotation ของกล้องลูกนั้น แต่ข้อเสียคือกล้องจะเคลื่อนที่อย่าง “แข็ง” ไปพร้อมกับผู้เล่น ไม่มีความนุ่มนวล

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

ตั้งค่าความเป็นส่วนตัว

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

ยอมรับทั้งหมด
จัดการความเป็นส่วนตัว
  • เปิดใช้งานตลอด

บันทึกการตั้งค่า