הוספת אפקט ניפוח ראש למצלמה באחדות

אפקט Head bobbing נמצא בשימוש נרחב במשחקי יריות בגוף ראשון וממלא תפקיד מפתח בהגברת הטבילה של השחקנים.

במדריך זה, אני אראה כיצד ליצור אפקט הטיפת ראש ב-Unity.

שלב 1: הגדר את בקר הנגן

ראשית, עלינו ליצור בקר נגן:

  • צור אובייקט משחק חדש (Game Object -> Create Empty) ותן לו שם "Player"
  • צור קפסולה חדשה (אובייקט משחק -> אובייקט תלת מימדי -> קפסולה) והזז אותה בתוך האובייקט "Player"
  • הסר את רכיב Capsule Collider מהקפסולה ושנה את מיקומו ל- (0, 1, 0)
  • הזז את המצלמה הראשית בתוך האובייקט "Player" ושנה את מיקומו ל- (0, 1.64, 0)
  • צור סקריפט חדש, שם לו "SC_CharacterController" והדבק בתוכו את הקוד למטה:

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 לאובייקט "Player" (תבחין שהוא הוסיף גם רכיב נוסף בשם Character Controller. שנה את הערך המרכזי שלו ל- (0, 1, 0))
  • הקצה את המצלמה הראשית למשתנה Player Camera ב-SC_CharacterController

בקר הנגן מוכן כעת:

שלב 2: הוסף את אפקט תנועות הראש

Head Bobbing Effect נעשה בעזרת תסריט ופועל על ידי הזזת המצלמה למעלה ולמטה כאשר הנגן זז.

  • צור סקריפט חדש, שם לו SC_HeadBobber והדבק בתוכו את הקוד למטה:

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 למצלמה הראשית
  • הקצה סקריפט SC_CharacterController למשתנה "Controller"

לבסוף, הקש על Play כדי לבדוק זאת, יש להפעיל את תנועות המצלמה בתנועת שחקן.

מָקוֹר
HeadBobbing.unitypackage5.09 KB