Цель: Быстрый отчет о моем прогрессе с системой захвата уступа.

Следующее действие заключается в том, чтобы игрок схватился за уступ, активировал метод, который воспроизводит анимацию, и заморозил игрока в воздухе, как будто он висит на уступе. Опять же, это только обновление моего прогресса. Я планирую доработать анимацию и исправить еще несколько ошибок с захватом уступа. Но я хотел сделать обновление на сегодня.

Настройка сцены

Простая установка сцены У меня здесь куча платформ разной длины и высоты. Движение игрока будет ограничено осями x и y, используя компонент управления игроком для обработки всей физики и столкновений.

Сам плеер является моделью из GameDevHQ Filebase. Родительский объект player будет содержать все скрипты, обрабатывающие логику и движение. Дочерними элементами являются визуальные эффекты, виртуальная камера и коллайдер для обнаружения уступов, прикрепленных к игроку.

Префаб обнаружения уступов (платформа и игрок)

Что касается уступа, у меня есть префаб, который я могу прикрепить к любому уступу, который обнаруживает, когда игрок входит в его область с помощью коллайдера уступа, и вызывает метод, запускающий анимацию подвешивания и физику игрока, чтобы позволить игроку схватиться за край. Кроме того, прилагается скрипт проверки уступов, который обрабатывает логику, когда объект входит в триггер.

Для игрока я прикрепил еще один триггер-коллайдер над головой игрока.

Скрипт проверки уступов

Этот скрипт определяет, когда игрок входит в триггер. Это вызовет метод в сценарии проигрывателя, чтобы заморозить проигрыватель и уведомить сценарий аниматора о начале анимации зависания.

public class LedgeChecker : MonoBehaviour
{
    private Player _player;
    [SerializeField] float _snapPositionX,_snapPositionY,_snapPositionZ;
    private Vector3 _snapPosition;

    private void Start()
    {
        _snapPosition = new Vector3(_snapPositionX, _snapPositionY, _snapPositionZ);
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.transform.CompareTag("LedgeChecker")) 
        {
            Debug.Log("Check1");
            _player = FindObjectOfType<Player>();
            if(_player != null) 
            {
                Debug.Log("LEDGE");
                _player.transform.position = _snapPosition;
                _player.FreezePlayer();
                _player.Is_Hanging = true;
            }
        }
    }

    private void OnTriggerExit(Collider other)
    {
        if (other.transform.CompareTag("LedgeChecker"))
        {
            Debug.Log("Check1");
            _player = FindObjectOfType<Player>();
            if (_player != null)
            {
                Debug.Log("LEDGE");
                _player.FreezePlayer();
                _player.Is_Hanging = false;
            }
        }
    }
}

В заключение, вот как я реализовал систему захвата уступа. Тем не менее, я планирую полировать движения и анимацию в будущем.