Unity'de Kameraya Kafa Sallama Efekti Ekleme

Kafa sallama efekti, First-Person Shooter oyunlarında yaygın olarak kullanılır ve oyuncunun oyunun içine girmesini arttırmada önemli bir rol oynar.

Bu derste Unity'de nasıl kafa sallama efekti oluşturulacağını göstereceğim.

Adım 1: Oynatıcı Denetleyicisini Ayarlayın

Öncelikle bir oynatıcı denetleyicisi oluşturmamız gerekiyor:

  • 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
  • Ana Kamerayı "Player" Nesnesinin içine taşıyın ve konumunu (0, 1,64, 0) olarak değiştirin
  • yeni bir komut dosyası oluşturun, onu "SC_CharacterController" olarak adlandırın ve içine aşağıdaki kodu yapıştırın:

SC_CharacterController.cs

using UnityEngine;

[RequireComponent(typeof(CharacterController))]

public class SC_CharacterController : MonoBehaviour
{
    public float speed = 7.5f;
    public float jumpSpeed = 8.0f;
    public float gravity = 20.0f;
    public Camera playerCamera;
    public float lookSpeed = 2.0f;
    public float lookXLimit = 45.0f;

    CharacterController characterController;
    [HideInInspector]
    public 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);
            playerCamera.transform.localRotation = Quaternion.Euler(rotation.x, 0, 0);
            transform.eulerAngles = new Vector2(0, rotation.y);
        }
    }
}
  • SC_CharacterController 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)
  • Ana Kamerayı SC_CharacterController'daki Oyuncu Kamerası değişkenine atayın

Oynatıcı denetleyicisi artık hazır:

Adım 2: Kafa Sallama Efekti Ekleyin

Kafa Sallama Efekti bir komut dosyası yardımıyla yapılır ve oyuncu hareket ederken Kameranın Yukarı ve Aşağı hareket ettirilmesiyle çalışır.

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

SC_HeadBobber.cs

using UnityEngine;

public class SC_HeadBobber : MonoBehaviour
{
    public float walkingBobbingSpeed = 14f;
    public float bobbingAmount = 0.05f;
    public SC_CharacterController controller;

    float defaultPosY = 0;
    float timer = 0;

    // Start is called before the first frame update
    void Start()
    {
        defaultPosY = transform.localPosition.y;
    }

    // Update is called once per frame
    void Update()
    {
        if(Mathf.Abs(controller.moveDirection.x) > 0.1f || Mathf.Abs(controller.moveDirection.z) > 0.1f)
        {
            //Player is moving
            timer += Time.deltaTime * walkingBobbingSpeed;
            transform.localPosition = new Vector3(transform.localPosition.x, defaultPosY + Mathf.Sin(timer) * bobbingAmount, transform.localPosition.z);
        }
        else
        {
            //Idle
            timer = 0;
            transform.localPosition = new Vector3(transform.localPosition.x, Mathf.Lerp(transform.localPosition.y, defaultPosY, Time.deltaTime * walkingBobbingSpeed), transform.localPosition.z);
        }
    }
}
  • SC_HeadBobber komut dosyasını Ana Kameraya ekleyin
  • SC_CharacterController komut dosyasını "Controller" değişkenine atayın

Son olarak, test etmek için Oynat tuşuna basın, oyuncu hareketinde Kamera sallanması etkinleştirilmelidir.

Kaynak
📁HeadBobbing.unitypackage5.09 KB
Önerilen Makaleler
Unity'de 2D Platformer Karakter Denetleyicisine Double Jump Desteği Ekleme
Unity'de FPS Player'a Çömelme Ekleme
Unity'de Üçüncü Şahıs Kamera
Unity için Helikopter Kontrolörü
Unity'de Vinç Kontrolü Nasıl Yapılır
Unity için Araç Kontrol Cihazı
Karakter Denetleyicisi Birlik İçinde Sert Cisimleri İtme Yeteneği Nasıl Eklenir