Kamera Orang Ketiga dalam Unity

Kamera orang ketiga adalah jenis kamera yang ditempatkan di belakang pemain, biasanya sedikit digeser ke samping, memberikan representasi visual dari level permainan dan pemain itu sendiri.

Untuk membuat kamera Third-Person Shooter (TPS) di Unity kita akan menggunakan kombinasi gerakan pemain biasa dan tampilan orang ketiga.

Sharp Coder Pemutar video

Langkah 1: Buat Pengontrol Pemain

Pertama, kita akan membuat pengontrol Player yang akan menangani rotasi dan pergerakan:

  • Buat Objek Game baru (Objek Game -> Buat Kosong) dan beri nama "Player"
  • Buat Kapsul baru (Objek Game -> Objek 3D -> Kapsul) dan pindahkan ke dalam Objek "Player"
  • Lepaskan komponen Capsule Collider dari Capsule dan ubah posisinya menjadi (0, 1, 0)
  • Buat GameObject baru dan beri nama "CameraParent" dan pindahkan ke dalam Object "Player", ubah posisinya menjadi (0, 1.64, 0)
  • Pindahkan Kamera Utama di dalam Objek "CameraParent" dan pindahkan ke belakang Player (Dalam kasus saya, saya memindahkannya ke posisi ini: (0.5, 0.6, -2.9))

Kamera Orang Ketiga dalam Unity

  • Buat Script baru, beri nama SC_TPSController, dan tempelkan kode di bawah ini ke dalamnya:

SC_TPSController.cs

using UnityEngine;

[RequireComponent(typeof(CharacterController))]

public class SC_TPSController : MonoBehaviour
{
    public float speed = 7.5f;
    public float jumpSpeed = 8.0f;
    public float gravity = 20.0f;
    public Transform playerCameraParent;
    public float lookSpeed = 2.0f;
    public float lookXLimit = 60.0f;

    CharacterController characterController;
    Vector3 moveDirection = Vector3.zero;
    Vector2 rotation = Vector2.zero;

    [HideInInspector]
    public bool canMove = true;

    void Start()
    {
        characterController = GetComponent<CharacterController>();
        rotation.y = transform.eulerAngles.y;
    }

    void Update()
    {
        if (characterController.isGrounded)
        {
            // We are grounded, so recalculate move direction based on axes
            Vector3 forward = transform.TransformDirection(Vector3.forward);
            Vector3 right = transform.TransformDirection(Vector3.right);
            float curSpeedX = canMove ? speed * Input.GetAxis("Vertical") : 0;
            float curSpeedY = canMove ? speed * Input.GetAxis("Horizontal") : 0;
            moveDirection = (forward * curSpeedX) + (right * curSpeedY);

            if (Input.GetButton("Jump") && canMove)
            {
                moveDirection.y = jumpSpeed;
            }
        }

        // Apply gravity. Gravity is multiplied by deltaTime twice (once here, and once below
        // when the moveDirection is multiplied by deltaTime). This is because gravity should be applied
        // as an acceleration (ms^-2)
        moveDirection.y -= gravity * Time.deltaTime;

        // Move the controller
        characterController.Move(moveDirection * Time.deltaTime);

        // Player and Camera rotation
        if (canMove)
        {
            rotation.y += Input.GetAxis("Mouse X") * lookSpeed;
            rotation.x += -Input.GetAxis("Mouse Y") * lookSpeed;
            rotation.x = Mathf.Clamp(rotation.x, -lookXLimit, lookXLimit);
            playerCameraParent.localRotation = Quaternion.Euler(rotation.x, 0, 0);
            transform.eulerAngles = new Vector2(0, rotation.y);
        }
    }
}
  • Lampirkan skrip SC_TPSController ke objek "Player" (Anda akan melihat bahwa ia juga menambahkan komponen lain yang disebut Pengontrol Karakter. Ubah nilai tengahnya menjadi (0, 1, 0))
  • Tetapkan Objek "CameraParent" ke variabel "Player Camera Parent"

Langkah 2: Tambahkan Deteksi Tabrakan Kamera

Deteksi tabrakan Kamera akan terdiri dari skrip yang akan memeriksa apakah ada sesuatu antara Kamera dan Pemutar, dan secara otomatis akan mendekatkan Kamera, sehingga mencegah Kamera memotong objek.

  • Buat script baru, beri nama SC_CameraCollision lalu paste kode di bawah ini di dalamnya:

SC_CameraCollision.cs

using UnityEngine;

public class SC_CameraCollision : MonoBehaviour
{
    public Transform referenceTransform;
    public float collisionOffset = 0.3f; //To prevent Camera from clipping through Objects
    public float cameraSpeed = 15f; //How fast the Camera should snap into position if there are no obstacles

    Vector3 defaultPos;
    Vector3 directionNormalized;
    Transform parentTransform;
    float defaultDistance;

    // Start is called before the first frame update
    void Start()
    {
        defaultPos = transform.localPosition;
        directionNormalized = defaultPos.normalized;
        parentTransform = transform.parent;
        defaultDistance = Vector3.Distance(defaultPos, Vector3.zero);

        //Lock cursor
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;
    }

    // LateUpdate is called after Update
    void LateUpdate()
    {
        Vector3 currentPos = defaultPos;
        RaycastHit hit;
        Vector3 dirTmp = parentTransform.TransformPoint(defaultPos) - referenceTransform.position;
        if (Physics.SphereCast(referenceTransform.position, collisionOffset, dirTmp, out hit, defaultDistance))
        {
            currentPos = (directionNormalized * (hit.distance - collisionOffset));

            transform.localPosition = currentPos;
        }
        else
        {
            transform.localPosition = Vector3.Lerp(transform.localPosition, currentPos, Time.deltaTime * cameraSpeed);
        }
    }
}
  • Lampirkan skrip SC_CameraCollision ke Kamera Utama
  • Tetapkan Objek "CameraParent" ke variabel "Reference Transform"
  • Sesuaikan nilai "Collision Offset" dan "Camera Speed" jika Kamera menembus dinding

Kamera TPS sekarang sudah siap, tekan Mainkan untuk mengujinya.

Sumber
📁TPSCamera.unitypackage172.07 KB
Artikel yang Disarankan
Menerapkan Sistem Parkour di Unity
Menambahkan Crouching ke FPS Player di Unity
Pengontrol FPS Persatuan
Menambahkan Efek Kepala Terombang-ambing ke Kamera di Unity
Menciptakan Pergerakan Pemain dalam Kesatuan
Tutorial Pengontrol Worm 3D untuk Unity
Pengendali Pesawat Luar Angkasa di Unity