Механика веревки в Unity

Реализация механики веревки в Unity включает в себя использование физики, анимации и управления персонажем. В нашем примере подразумевается, что на уровне в разных местах развешены веревки, по которым можно подниматься или спускаться.

Ниже приведен пример скрипта на C# с комментариями, который позволяет персонажу перемещаться по веревке:

using UnityEngine;

public class RopeController : MonoBehaviour
{
    // Ссылка на CharacterController для управления перемещением персонажа
    private CharacterController characterController;

    // Параметры движения и веревки
    public float playerSpeed = 2.0f;
    public float ropeClimbSpeed = 5.0f;
    public float gravityValue = -9.81f;
    public LayerMask ropeLayer; // Слой, на котором находятся веревки

    // Флаг, показывающий, находится ли персонаж на веревке
    private bool isOnRope;

    // Переменные для управления анимацией веревки
    private Animator ropeAnimator;
    private static readonly int IsClimbing = Animator.StringToHash("isClimbing");

    void Start()
    {
        // Получаем ссылку на CharacterController компонент текущего объекта
        characterController = GetComponent<CharacterController>();

        // Получаем ссылку на компонент Animator
        ropeAnimator = GetComponent<Animator>();
    }

    void Update()
    {
        // Проверяем, находится ли персонаж на земле
        if (characterController.isGrounded)
        {
            isOnRope = false; // Если персонаж на земле, он не на веревке
        }

        // Обработка движения по горизонтали
        float horizontalInput = Input.GetAxis("Horizontal");
        Vector3 moveDirection = new Vector3(horizontalInput, 0, 0);

        // Если персонаж не на веревке, перемещаем его обычным образом
        if (!isOnRope)
        {
            characterController.Move(moveDirection * playerSpeed * Time.deltaTime);
        }
        else
        {
            // Если персонаж на веревке, управляем его вертикальным перемещением
            float verticalInput = Input.GetAxis("Vertical");
            Vector3 climbDirection = new Vector3(0, verticalInput, 0);
            characterController.Move(climbDirection * ropeClimbSpeed * Time.deltaTime);

            // Проигрываем анимацию веревки, если персонаж двигается по вертикали
            ropeAnimator.SetBool(IsClimbing, verticalInput != 0);
        }

        // Гравитация
        if (!characterController.isGrounded)
        {
            characterController.Move(new Vector3(0, gravityValue, 0) * Time.deltaTime);
        }

        // Проверяем, находится ли персонаж рядом с веревкой и позволяет ему подняться на нее
        CheckForRope();
    }

    void CheckForRope()
    {
        // Выпускаем луч из центра передней части персонажа
        Ray ray = new Ray(transform.position + new Vector3(0, 1, 0), transform.forward);
        RaycastHit hit;

        // Если луч сталкивается с объектом на слое веревок
        if (Physics.Raycast(ray, out hit, 1.5f, ropeLayer))
        {
            if (Input.GetKeyDown(KeyCode.E))
            {
                isOnRope = true; // Персонаж на веревке
                ropeAnimator.SetBool(IsClimbing, true); // Включаем анимацию веревки
            }
        }
        else
        {
            // Если персонаж не на веревке, выключаем анимацию веревки
            ropeAnimator.SetBool(IsClimbing, false);
        }
    }
}

Обратите внимание, что в данном примере мы предполагаем, что у вас есть анимация веревки, которую вы активируете с использованием параметра «isClimbing» в аниматоре. Также у вас должен быть слой для веревок (например, «Rope»), который вы указываете в переменной ropeLayer. Важно настроить анимацию веревки и ее слой в соответствии с вашим проектом.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

13 + 8 =

Прокрутить вверх