Arn*_*123 5 c# animation unity-game-engine
我试图让敌人攻击玩家,敌人通过动画进行攻击,但是我必须阻止动画在其他人处于活动状态时启动的方法不起作用。问题是我的方法不起作用。更具体地说,它基本上不做任何类似评论的事情。如果您需要任何代码,我应该能够提供。
这是代码:
IEnumerator PlayAnim(Animator anim, string booleanName)
{
anim.SetBool(booleanName, true);
yield return new WaitForSeconds(anim.GetCurrentAnimatorStateInfo(0).length + anim.GetCurrentAnimatorStateInfo(0).normalizedTime); // I checked and got a value for that number so it should be paused
anim.SetBool(booleanName, false);
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我在它的开头和结尾放置了一个调试,当我运行代码时,它们在同一秒运行,所以我知道它不起作用。
它的调用方式如下:
public void AttackPlayer(GameObject playerPos, Animator anim, NavMeshAgent agent, GameObject self, bool MultiAttack, float inRange, float inView, float AttackRange, bool isBlocking, bool HasSeenPLayer)
{
if (MultiAttack)
{
MultAttack(playerPos, anim, agent, self, inRange, inView);
}
else
{
anim.SetBool("Attack2", false);
anim.SetBool("Attack3", false);
StartCoroutine(PlayAnim(anim, "Attack"));
}
if (!PlayerPos.FindPlayerPos(AttackRange, playerPos.transform, inView, self, HasSeenPLayer))
{
anim.SetBool("Attack", false);
anim.SetBool("Attack2", false);
anim.SetBool("Attack3", false);
state = State.Chase;
}
}
public void MultAttack(GameObject playerPos, Animator anim, NavMeshAgent agent, GameObject self, float inRange, float inView)
{
if (random == 0) random = Random.Range(1, 5);
if (random == 1)
{
StartCoroutine(PlayAnim(anim, "Attack"));
random = 0;
return;
}
if (random == 2)
{
if (HasParameter("Attack2", anim))
{
StartCoroutine(PlayAnim(anim, "Attack2"));
random = 0;
return;
}
StartCoroutine(PlayAnim(anim, "Attack"));
random = 0;
return;
}
if (random == 3)
{
if (alk != null)
{
alk.particle.gameObject.SetActive(true);
alk.particle.Play();
}
StartCoroutine(AlkAnim(anim, "Attack3"));
random = 0;
return;
}
if (random == 4)
{
BlockPlayer(playerPos, anim, agent, inRange, inView, self);
random = 0;
return;
}
StartCoroutine(PlayAnim(anim, "Attack"));
random = 0;
return;
}
IEnumerator AlkAnim(Animator anim, string booleanName)
{
anim.SetBool(booleanName, true);
yield return new WaitForSeconds(anim.GetCurrentAnimatorStateInfo(0).length + anim.GetCurrentAnimatorStateInfo(0).normalizedTime);
anim.SetBool(booleanName, false);
if (alk != null)
{
alk.particle.Stop();
alk.particle.gameObject.SetActive(false);
random = 0;
}
}
public static bool HasParameter(string paramName, Animator animator)
{
foreach (AnimatorControllerParameter param in animator.parameters)
{
if (param.name == paramName)
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
void Start()
{
StartCoroutine(GetGood());
}
IEnumerator GetGood()
{
TtF.ChoseChasingWhatStateToAttackPlayer(agent, Player_pos.player, self, anim, MultiAttack, inRange, inView, AttackRange, isBlocking, hasSeenPlayer);
yield return new WaitForSeconds(0.5f);
StartCoroutine(GetGood());
}
Run Code Online (Sandbox Code Playgroud)
我认为你的第一种方法理论上可行。唯一的“问题”是,即使您已经在动画器组件中设置了标志,动画器也是帧内最后执行的事情之一(请参阅事件执行顺序)。所以我认为你只需要给它时间来实际切换状态。
yield return new WaitForEndOfFrame ();例如,您可以尝试在开始等待当前状态的长度之前首先使用 a 。
另一种方法可能是Animator Events。您可以将此类事件放置在动画的最后,然后简单地让它调用专用方法。
| 归档时间: |
|
| 查看次数: |
229 次 |
| 最近记录: |