c# - Animator.GetFloat 返回错误的值统一
问题描述
我有一个包含一堆 AI 僵尸的关卡,目前运行良好,但是如果实例化一个相同类型的新预制僵尸,新僵尸将表现相同并在动画师中设置相同的参数,尽管这就是问题所在发生...
这些实例化的 AI 出于某种原因调用与Animator.GetFloat
其他非实例化 AI 传递相同内容的函数,但这次它似乎总是会返回0
,而对于我的生活,我无法弄清楚为什么。
这里的图一显示我目前正在使用这个动画,并将这个参数设置为1
使用动画曲线,这正是我想要的。
然后问题出现在代码中。调用似乎返回错误值的地方
更新:有时第一个生成的僵尸将能够获得该值。想知道为什么
这是当前在参数代码中输入的内容,这是到哈希的转换
当播放动画变量并且玩家被对撞机击中时,我的类控制要输出的伤害。
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;
}
}
}
解决方案
问题出在你的变量上Animator _animator;
你正在做_animator = _stateMachine.animator;
,你所有的僵尸都有相同的动画师,为什么你不使用这个:
_animator = gameObject.GetComponent<Animator>();
所以每个僵尸都可以访问它的动画师。
推荐阅读
- python - django core.mail.send_mail 工作正常,但 EmailMessage.send 失败
- python-3.x - 使用 try | 创建一个 continue 循环 Python3
- datepicker - 需要在 Angular 6 中找到最佳日期和时间选择器
- javascript - 尝试通过聚合从 Mongo DB 获取数据
- ios - 如何将数据从 UITextField 推送到 Firebase 存储
- javascript - 为什么没有定义 myXMLHttpRequest()
- java - 无法从 Android 应用程序连接到本地 IP
- r - 目前是否可以在 data.table 中移动可变数量的行?
- node.js - 创建 AWS Lambda 函数以从 IAM 获取用户
- sql - SQL 查找前 8 小时内工作的总标记小时数