إضافة تأثير تمايل الرأس إلى الكاميرا في Unity

يُستخدم تأثير تمايل الرأس على نطاق واسع في ألعاب التصويب من منظور الشخص الأول ويلعب دورًا رئيسيًا في زيادة انغماس اللاعب.

في هذا البرنامج التعليمي، سأوضح كيفية إنشاء تأثير تمايل الرأس في Unity.

الخطوة 1: إعداد وحدة تحكم المشغل

أولا، نحن بحاجة إلى إنشاء وحدة تحكم لاعب:

  • قم بإنشاء كائن لعبة جديد (كائن اللعبة -> إنشاء فارغ) وقم بتسميته "Player"
  • قم بإنشاء كبسولة جديدة (كائن اللعبة -> كائن ثلاثي الأبعاد -> كبسولة) وحركها داخل الكائن "Player"
  • قم بإزالة مكون مصادم الكبسولة من الكبسولة وقم بتغيير موضعه إلى (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: إضافة تأثير تمايل الرأس

يتم تنفيذ تأثير تمايل الرأس بمساعدة برنامج نصي ويعمل عن طريق تحريك الكاميرا لأعلى ولأسفل عندما يتحرك اللاعب.

  • قم بإنشاء برنامج نصي جديد، وقم بتسميته 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 لاختبار ذلك، ويجب تفعيل تمايل الكاميرا عند حركة اللاعب.