Adăugarea efectului de balansare a capului la cameră în Unity

Efectul de balansare a capului este utilizat pe scară largă în jocurile cu împușcături la persoana întâi și joacă un rol cheie în creșterea imersiunii jucătorului.

În acest tutorial, voi arăta cum să creez un efect de balansare a capului în Unity.

Pasul 1: Configurați controlerul playerului

Mai întâi, trebuie să creăm un controler de jucător:

  • Creați un nou obiect de joc (Obiect de joc -> Creați gol) și denumiți-l "Player"
  • Creați o nouă capsulă (Obiect de joc -> Obiect 3D -> Capsulă) și mutați-o în interiorul obiectului "Player"
  • Scoateți componenta Capsule Collider din Capsule și schimbați-i poziția în (0, 1, 0)
  • Mutați camera principală în interiorul obiectului "Player" și schimbați-i poziția la (0, 1.64, 0)
  • Creați un nou script, numiți-l "SC_CharacterController" și inserați codul de mai jos în interiorul acestuia:

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);
        }
    }
}
  • Atașați scriptul SC_CharacterController la obiectul "Player" (Veți observa că a adăugat și o altă componentă numită Character Controller. Schimbați-i valoarea centrală la (0, 1, 0))
  • Atribuiți Camera principală variabilei Camera Player în SC_CharacterController

Controlerul Player este acum gata:

Pasul 2: Adăugați efectul de balansare a capului

Efectul Head Bobbing se realizează cu ajutorul unui script și funcționează prin mișcarea camerei în sus și în jos atunci când jucătorul se mișcă.

  • Creați un nou script, numiți-l SC_HeadBobber și inserați codul de mai jos în interiorul acestuia:

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);
        }
    }
}
  • Atașați scriptul SC_HeadBobber la camera principală
  • Atribuiți scriptul SC_CharacterController variabilei "Controller"

În cele din urmă, apăsați Play pentru a-l testa, rularea camerei ar trebui să fie activată la mișcarea jucătorului.