Unity'de Üçüncü Şahıs Kamera

Üçüncü şahıs kamera, oyuncunun arkasına yerleştirilen ve genellikle hafifçe yana kaydırılan, oyun seviyesinin ve oyuncunun kendisinin görsel bir temsilini veren bir kamera türüdür.

Unity modunda bir Üçüncü Şahıs Nişancı (TPS) kamerası oluşturmak için normal oyuncu hareketi ile üçüncü şahıs görüşünün bir kombinasyonunu kullanacağız.

Sharp Coder Video oynatıcı

Adım 1: Oynatıcı Denetleyicisini Oluşturun

İlk olarak, döndürme ve hareketi yönetecek bir Oyuncu denetleyicisi oluşturacağız:

  • Yeni bir Oyun Nesnesi oluşturun (Oyun Nesnesi -> Boş Oluştur) ve onu adlandırın "Player"
  • Yeni bir Kapsül oluşturun (Oyun Nesnesi -> 3D Nesne -> Kapsül) ve onu "Player" Nesnesinin içine taşıyın
  • Kapsül Çarpıştırıcısı bileşenini Kapsül'den kaldırın ve konumunu (0, 1, 0) olarak değiştirin
  • Yeni bir GameObject oluşturun ve onu "CameraParent" olarak adlandırın ve "Player" Nesnesinin içine taşıyın, konumunu (0, 1.64, 0) olarak değiştirin
  • Ana Kamerayı "CameraParent" Nesnesinin içine taşıyın ve Oynatıcının arkasına taşıyın (Benim durumumda onu şu konuma taşıdım: (0,5, 0,6, -2,9))

Unity'de Üçüncü Kişi Kamera

  • yeni bir Komut Dosyası oluşturun, onu SC_TPSController olarak adlandırın ve içine aşağıdaki kodu yapıştırın:

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);
        }
    }
}
  • SC_TPSController betiğini "Player" nesnesine ekleyin (Karakter Denetleyicisi adında başka bir bileşen de eklediğini fark edeceksiniz. Merkezi değerini (0, 1, 0) olarak değiştirin)
  • "CameraParent" Nesnesini "Player Camera Parent" değişkenine atayın

2. Adım: Kamera Çarpışma Algılama Ekleme

Kamera çarpışma tespiti, Kamera ile Oynatıcı arasında herhangi bir şey olup olmadığını kontrol edecek ve Kamerayı otomatik olarak yaklaştıracak, böylece Kameranın nesnelerin arasından geçmesini önleyecek bir komut dosyasından oluşacaktır.

  • Yeni bir komut dosyası oluşturun, SC_CameraCollision olarak adlandırın ve içine aşağıdaki kodu yapıştırın:

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);
        }
    }
}
  • SC_CameraCollision komut dosyasını Ana Kameraya ekleyin
  • "CameraParent" Nesnesini "Reference Transform" değişkenine atayın
  • Kameranın duvarların arasından geçmesi durumunda "Collision Offset" ve "Camera Speed" değerlerinde ince ayar yapın

TPS Kamera artık hazırdır, test etmek için Oynat'a basın.

Kaynak
TPSCamera.unitypackage172.07 KB