@Gera01
Unity, С# и больше ничего.

Как сделать так, чтобы анимация подстраивалась под точку?

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

Climb
using UnityEngine;

namespace Movement
{
    public class Climb : AdditionalMovement
    {
        [SerializeField, Header("Animation states at which you can jump")]
        private WorkingWithAnimation.CharacterAnimation[] _conditionToPlayAnimation;

        [SerializeField, Header("Jump settings:")]
        private float _climbSpeedByUp;

        [SerializeField]
        private float _climbSpeedByForward;

        [SerializeField]
        private float _waitBeforClimb;

        [SerializeField]
        private float _climbIterations;

        public ClimbCheacker ClimbCheacker;

        [SerializeField]
        private string _animationTrigger;


        public override System.Collections.IEnumerator Move()
        {
            if (ClimbCheacker.CanClimb())
            {
                if (_playerAnimation.SetTrigger(_animationTrigger, _conditionToPlayAnimation))
                {                    
                    float normalGravity = _moveLogic.Gravity;
                    float normalHeight = _controller.height;

                    _animationCondition.Condition = WorkingWithAnimation.CharacterAnimation.Climb;

                    _moveLogic.Gravity = 0;
                    _controller.height = 1;

                    yield return new WaitForSeconds(_waitBeforClimb);

                    for (int i = 0; i < _climbIterations; i++)
                    {
                        yield return new WaitForSeconds(0.1f);
                        _moveLogic.MoveDirection = (transform.up * _climbSpeedByUp) + (transform.forward * _climbSpeedByForward);
                        _controller.height += (normalHeight - 1) / _climbIterations;
                    }

                    yield return new WaitForSeconds(0.5f);
                    _moveLogic.Gravity = normalGravity;

                    yield return new WaitForSeconds(0.5f);
                    _controller.height = normalHeight;
                }
            }
        }
    }
}


ClimbCheacker
using UnityEngine;

public class ClimbCheacker : MonoBehaviour
{
    [SerializeField]
    private bool _obstacleForClimbing;

    [SerializeField]
    private GameObject _objectToClimb;

    private RaycastHit _hit;

    private void OnTriggerEnter(Collider other)
    {
        _obstacleForClimbing = true;
    }

    private void OnTriggerExit(Collider other)
    {   
        _obstacleForClimbing = false;
    }

    private void Update()
    {
        if (Physics.Raycast(transform.position, Vector3.down, out _hit, 3))
            _objectToClimb = _hit.transform.gameObject;
        else
            _objectToClimb = null;
    }

    public bool CanClimb()
    {
        return !_obstacleForClimbing && _objectToClimb != null;
    }

    public GameObject ObjectToClimb()
    {
        return _objectToClimb;
    }
}
  • Вопрос задан
  • 57 просмотров
Решения вопроса 1
@Ezekiel4
Охотник на пиратов и сборщик монолитов
Способ 1 (геморный):
Объединить все анимации в группы, в зависимости от того, сколько и какие детали персонажа будут задействованы для её исполнения. На аниматоре персонажа выделить по одному слою для каждого фрагмента тела с дублирующими схожее действие анимациями через стейт машину, затем, имея простое число как ключ от стейт машины, вы просто считаете высоту препятствия. Или заранее проставляете точки для её просчёта.
Например:
6340b815c74c7939656683.png
Это имеет смысл, если у вас реально большая игра. Примерно так и была реализована адаптивность анимаций в серии Assassin's Creed (точно Unity+, до неё хз), там более 800 фрагментов анимаций движения персонажа.

Способ 2 (простой):
Если у вас маленький или средний проект, не требующий идеального исполнения (хотя это тоже решаемо), воспользуйтесь возможностями дополнения Animation Rigging. Гайды по нему есть на всех языках в гугле.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы