C# Animator.GetFloat返回错误的值

C# Animator.GetFloat返回错误的值,c#,unity3d,animator,C#,Unity3d,Animator,我有一个与一堆AI僵尸的水平,现在已经足够好了,但如果实例化一个相同类型的新预制僵尸,新僵尸将采取相同的行动,并在动画师中设置相同的参数,虽然这是问题发生的地方 这些实例化的AI调用Animator.GetFloat函数传递与其他非实例化AI相同的东西,但这一次它似乎总是返回0,我一辈子都不明白为什么 这里的图片一显示了我目前正在使用这个动画,并将这个参数设置为1,使用动画曲线,这正是我想要的 然后,代码中出现了问题。调用似乎返回了错误的值 更新:有时第一个繁殖的僵尸将能够获得该值。idk为

我有一个与一堆AI僵尸的水平,现在已经足够好了,但如果实例化一个相同类型的新预制僵尸,新僵尸将采取相同的行动,并在动画师中设置相同的参数,虽然这是问题发生的地方

这些实例化的AI调用Animator.GetFloat函数传递与其他非实例化AI相同的东西,但这一次它似乎总是返回
0
,我一辈子都不明白为什么

这里的图片一显示了我目前正在使用这个动画,并将这个参数设置为
1
,使用动画曲线,这正是我想要的

然后,代码中出现了问题。调用似乎返回了错误的值

更新:有时第一个繁殖的僵尸将能够获得该值。idk为什么

这是当前输入到参数代码中的内容,这是到散列的转换

我的类,它控制在播放动画师变量和使用碰撞器碰撞玩家时输出的伤害

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;
        }
    }
}
公共类AIDamageTrigger:monobhavior
{
//检验变量
[序列化字段]字符串_参数=”;
[SerializeField]int_bloodParticlesBurstAmount=10;
[SerializeField]浮动_损坏金额=0.1f;
[SerializeField]bool_doDamageSound=true;
[SerializeField]bool_doPainSound=true;
//私有变量
AIStateMachine _stateMachine=null;
动画师_Animator=null;
int_参数hash=-1;
GameSceneManager\u GameSceneManager=null;
private bool_firstContact=假;
// ------------------------------------------------------------
//名称:Start
//Desc:在对象启动时调用以初始化脚本。
// ------------------------------------------------------------
void Start()
{
//缓存状态机和动画师引用
_stateMachine=transform.root.getComponentChildren();
如果(_stateMachine!=null)
_animator=\u stateMachine.animator;
//生成参数散列,以便从动画师处更有效地查找参数
_parameterHash=Animator.StringToHash(_参数);
_gameSceneManager=gameSceneManager.instance;
}
无效对撞机(对撞机列)
{
如果(!\u动画师)
返回;
//调试----------------------
int leftHandHash=Animator.StringToHash(“LeftHand”);
int rightHandHash=Animator.StringToHash(“右手”);
int mouthash=Animator.StringToHash(“嘴”);
float left=\u animator.GetFloat(leftHandHash);
float right=_animator.GetFloat(rightHandHash);
float mouth=\u animator.GetFloat(mouthash);
//Debug.Log(this.gameObject.transform.parent.transform.parent.transform.parent.transform.transform.parent.transform.parent.name+“:”+左);
//Debug.Log(this.gameObject.transform.parent.transform.parent.transform.parent.transform.transform.parent.transform.parent.name+”:“+右键);
//Debug.Log(this.gameObject.transform.parent.transform.parent.transform.parent.transform.transform.parent.transform.parent.name+“:”+mouth);
//----------------------------
if(col.gameObject.CompareTag(“Player”)&&&&u animator.GetFloat(_参数hash)>0.9f)
_第一次接触=正确;
}
// -------------------------------------------------------------
//姓名:OnTriggerStay
//由Unity调用此触发器触发的每个固定更新
//正在与另一个人联系。
// -------------------------------------------------------------
void OnTriggerStay(对撞机列)
{
//如果我们没有动画师回来
如果(!\u动画师)
返回;
int leftHandHash=Animator.StringToHash(“LeftHand”);
int rightHandHash=Animator.StringToHash(“右手”);
int mouthash=Animator.StringToHash(“嘴”);
float left=\u animator.GetFloat(leftHandHash);
float right=_animator.GetFloat(rightHandHash);
float mouth=\u animator.GetFloat(mouthash);
_animator.Update(0);
//如果这是玩家对象并且我们的参数设置为伤害
if(col.gameObject.CompareTag(“Player”)&&&&u animator.GetFloat(_参数hash)>0.9f)
{
if(GameSceneManager.instance&&GameSceneManager.instance.bloodParticles)
{
ParticleSystem=GameSceneManager.instance.bloodParticles;
//临时代码
system.transform.position=transform.position;
system.transform.rotation=Camera.main.transform.rotation;
var设置=system.main;
settings.simulationSpace=ParticleSystemSimulationSpace.World;
系统发射(_bloodParticlesBurstAmount);
}
如果(_gameSceneManager!=null)
{
PlayerInfo info=\u gameSceneManager.GetPlayerInfo(col.GetInstanceID());
if(info!=null&&info.characterManager!=null)
{
信息.字符管理器.接受损害(_damageAmount,_doDamageSound&&u firstContact,_doPainSound);
}
}
_第一次接触=错误;
}
}
}

问题出在您的变量
Animator\u Animator

您正在执行
\u animator=\u stateMachine.animator_animator = gameObject.GetComponent<Animator>();