Head Bobbing-effect toevoegen aan de camera in eenheid

Het hoofddobberende effect wordt veel gebruikt in First-Person Shooter-spellen en speelt een sleutelrol bij het vergroten van de onderdompeling van de speler.

In deze tutorial laat ik zien hoe je een head-bobbing-effect kunt creëren in Unity.

Stap 1: Stel de spelercontroller in

Eerst moeten we een spelercontroller maken:

  • Maak een nieuw spelobject (Spelobject -> Leeg maken) en geef het een naam "Player"
  • Maak een nieuwe capsule (Spelobject -> 3D-object -> Capsule) en verplaats deze binnen het "Player"-object
  • Verwijder de Capsule Collider-component uit de Capsule en verander de positie in (0, 1, 0)
  • Verplaats de hoofdcamera binnen het "Player"-object en verander de positie ervan in (0, 1.64, 0)
  • Maak een nieuw script, noem het "SC_CharacterController" en plak de onderstaande code erin:

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);
        }
    }
}
  • Voeg het SC_CharacterController-script toe aan het "Player"-object (u zult merken dat het ook een andere component heeft toegevoegd, genaamd Character Controller. Wijzig de middelste waarde in (0, 1, 0))
  • Wijs de hoofdcamera toe aan de spelercameravariabele in SC_CharacterController

De spelercontroller is nu klaar:

Stap 2: Voeg het hoofddobbereffect toe

Head Bobbing Effect wordt gedaan met behulp van een script en werkt door de camera op en neer te bewegen wanneer de speler beweegt.

  • Maak een nieuw script, noem het SC_HeadBobber en plak de onderstaande code erin:

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);
        }
    }
}
  • Voeg het SC_HeadBobber-script toe aan de hoofdcamera
  • Wijs het SC_CharacterController-script toe aan de variabele "Controller".

Druk ten slotte op Afspelen om het te testen. Het bewegen van de camera moet worden geactiveerd wanneer de speler beweegt.

Voorgestelde artikelen
Hurken toevoegen aan FPS-speler in Unity
Karaktercontroller Hoe u de mogelijkheid kunt toevoegen om starre lichamen in eenheid te duwen
Ondersteuning voor dubbele sprongen toegevoegd aan een 2D-platformgame-personagecontroller in Unity
Spelersbeweging in eenheid creëren
Ondersteuning voor bewegende platforms toevoegen aan de karaktercontroller in Unity
Ruimteschipcontroller in eenheid
Derdepersoonscamera in eenheid