У меня есть уровень с кучей искусственных зомби, и на данный момент это работает достаточно хорошо, но если создать экземпляр нового сборного зомба ie того же типа, новый зомб ie будет действовать так же и устанавливать параметры в аниматор тот же, хотя и здесь возникает проблема ...
Эти экземпляры ИИ по какой-либо причине вызывают функцию Animator.GetFloat
, передавая то же самое, что и другие не-экземпляры ИИ, но на этот раз это всегда будет казаться return 0
и я не могу понять, почему.
На этом рисунке показано, что я сейчас использую эту анимацию, и для этого параметра установлено значение 1
с использованием кривых анимации, и это именно то, что я хочу.
![Picture 1](https://i.stack.imgur.com/dN6b3.jpg)
Проблема возникает в коде. где вызов, кажется, возвращает неправильное значение
![Picture 2](https://i.stack.imgur.com/enu5r.png)
ОБНОВЛЕНИЕ: Иногда первый порожденный зомб ie сможет получить это значение. IDK почему
Это то, что в настоящее время вводится в коде параметра и это преобразование в га sh
![Conversion from inspector string to hash](https://i.stack.imgur.com/GAU8U.png)
![Inspector View](https://i.stack.imgur.com/biD3v.png)
Мой класс, который контролирует урон, который будет выводиться при воспроизведении переменной аниматора и попадании игрока в коллайдер.
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;
}
}
}