Animator.GetFloat возвращает неверное значение единицы - PullRequest
0 голосов
/ 07 января 2020

У меня есть уровень с кучей искусственных зомби, и на данный момент это работает достаточно хорошо, но если создать экземпляр нового сборного зомба ie того же типа, новый зомб ie будет действовать так же и устанавливать параметры в аниматор тот же, хотя и здесь возникает проблема ...

Эти экземпляры ИИ по какой-либо причине вызывают функцию Animator.GetFloat, передавая то же самое, что и другие не-экземпляры ИИ, но на этот раз это всегда будет казаться return 0 и я не могу понять, почему.

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

Picture 1

Проблема возникает в коде. где вызов, кажется, возвращает неправильное значение

Picture 2

ОБНОВЛЕНИЕ: Иногда первый порожденный зомб ie сможет получить это значение. IDK почему

Это то, что в настоящее время вводится в коде параметра и это преобразование в га sh

Conversion from inspector string to hash

Inspector View

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

public class AIDamageTrigger : MonoBehaviour 
{
    // Inspector Variables
    [SerializeField] string         _parameter = "";
    [SerializeField] int            _bloodParticlesBurstAmount  =   10;
    [SerializeField] float          _damageAmount               =   0.1f;
    [SerializeField] bool           _doDamageSound              =   true;
    [SerializeField] bool           _doPainSound                =   true;

    // Private Variables
    AIStateMachine      _stateMachine       = null;
    Animator            _animator           = null;
    int                 _parameterHash      = -1;
    GameSceneManager    _gameSceneManager   = null;
    private bool        _firstContact       = false;        

    // ------------------------------------------------------------
    // Name :   Start
    // Desc :   Called on object start-up to initialize the script.
    // ------------------------------------------------------------
    void Start()
    {
        // Cache state machine and animator references
        _stateMachine = transform.root.GetComponentInChildren<AIStateMachine> ();

        if (_stateMachine != null)
            _animator = _stateMachine.animator;

        // Generate parameter hash for more efficient parameter lookups from the animator
        _parameterHash = Animator.StringToHash (_parameter); 

        _gameSceneManager = GameSceneManager.instance;
    }

    void OnTriggerEnter( Collider col )
    {
        if (!_animator) 
            return;

        //Debug----------------------
        int leftHandHash = Animator.StringToHash("LeftHand");
        int rightHandHash = Animator.StringToHash("RightHand");
        int mouthHash = Animator.StringToHash("Mouth");
        float left = _animator.GetFloat(leftHandHash);
        float right = _animator.GetFloat(rightHandHash);
        float mouth = _animator.GetFloat(mouthHash);
        //Debug.Log(this.gameObject.transform.parent.transform.parent.transform.parent.transform.parent.transform.transform.parent.parent.transform.parent.transform.parent.transform.parent.name + " : " + left);
        //Debug.Log(this.gameObject.transform.parent.transform.parent.transform.parent.transform.parent.transform.transform.parent.parent.transform.parent.transform.parent.transform.parent.name + " : " + right);
        //Debug.Log(this.gameObject.transform.parent.transform.parent.transform.parent.transform.parent.transform.transform.parent.parent.transform.parent.transform.parent.transform.parent.name + " : " + mouth);
        //----------------------------

        if (col.gameObject.CompareTag ("Player") && _animator.GetFloat(_parameterHash) >0.9f)
             _firstContact = true;
    }

    // -------------------------------------------------------------
    // Name :   OnTriggerStay
    // Desc :   Called by Unity each fixed update that THIS trigger
    //          is in contact with another.
    // -------------------------------------------------------------
    void OnTriggerStay( Collider col )
    {
        // If we don't have an animator return
        if (!_animator)
            return;

        int leftHandHash = Animator.StringToHash("LeftHand");
        int rightHandHash = Animator.StringToHash("RightHand");
        int mouthHash = Animator.StringToHash("Mouth");
        float left = _animator.GetFloat(leftHandHash);
        float right = _animator.GetFloat(rightHandHash);
        float mouth = _animator.GetFloat(mouthHash);

        _animator.Update(0);
        // If this is the player object and our parameter is set for damage
        if (col.gameObject.CompareTag ("Player") && _animator.GetFloat(_parameterHash) >0.9f)
        {
            if (GameSceneManager.instance && GameSceneManager.instance.bloodParticles) 
            {
                ParticleSystem system = GameSceneManager.instance.bloodParticles;

                // Temporary Code
                system.transform.position = transform.position;
                system.transform.rotation = Camera.main.transform.rotation;

                var settings = system.main;
                settings.simulationSpace = ParticleSystemSimulationSpace.World;
                system.Emit (_bloodParticlesBurstAmount);
            }

            if (_gameSceneManager!=null)
            {
                PlayerInfo info = _gameSceneManager.GetPlayerInfo( col.GetInstanceID() );
                if (info!=null && info.characterManager!=null)
                {
                    info.characterManager.TakeDamage( _damageAmount, _doDamageSound && _firstContact, _doPainSound );
                }
            }

            _firstContact = false;
        }
    }
}

1 Ответ

0 голосов
/ 10 января 2020

Проблема в вашей переменной Animator _animator;

Вы делаете _animator = _stateMachine.animator;, и ВСЕ ваши зомби получают один и тот же аниматор, почему вы не используете это:

_animator = gameObject.GetComponent<Animator>();

Таким образом, каждый зомб ie получает доступ к своему аниматору.

...