Цель: Быстрый отчет о моем прогрессе с системой захвата уступа.
Следующее действие заключается в том, чтобы игрок схватился за уступ, активировал метод, который воспроизводит анимацию, и заморозил игрока в воздухе, как будто он висит на уступе. Опять же, это только обновление моего прогресса. Я планирую доработать анимацию и исправить еще несколько ошибок с захватом уступа. Но я хотел сделать обновление на сегодня.
Настройка сцены
Простая установка сцены У меня здесь куча платформ разной длины и высоты. Движение игрока будет ограничено осями 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; } } } }
В заключение, вот как я реализовал систему захвата уступа. Тем не менее, я планирую полировать движения и анимацию в будущем.