我正在做一个2D视频游戏项目,但是我在角色的攻击上有一个奇怪的错误。我已经使用Unity很短的时间了...
当我按下攻击按钮时,播放一个动画,并将一个布尔变量设置为true,当攻击动画结束时,它有一个事件到位,调用一个函数将布尔变量改回false。
添加到玩家游戏对象的主脚本(MonoBehaviour):
void Update(){
if (Input.GetKey(script_buttons.button_attack))
{
gun_attacking = false;
player_animator.Play("gun_attack");
}
}
武器攻击动画结束时调用的事件:
void foot_gun_attack()
{
attack_script.gun_attacking = false;
}
它工作正常,但如果我快速按下攻击按钮,有些时候变量永远不会变成假,游戏就会疯狂。
在动画中使用事件本身是不可靠的吗?为什么它失败了,并且没有再次将布尔变量更改为false?
我已经通过在动画中添加状态机行为脚本部分修复了这个问题,在上述脚本中,我将OnStateExit函数中的变量更改为false。这样就可以了,无论您按下按钮的速度有多快,攻击都不会错过,这个问题迫使我同时拥有动画事件和状态机行为脚本。如果我删除事件,变量就不会变为false。如果我删除状态机行为,变量确实会变为false,但偶尔会失败。
状态机行为脚本:
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
attack_script.gun_attacking = false;
}
唯一不失败的方法是在两个地方都设置变量为false,我认为这很疯狂,不应该是正常的行为。动画事件应该足够并且工作正常,但是为什么它不能正常工作呢?我不想限制按钮点击或者添加超时,或者这是唯一的方法吗?
也许是我的错误或统一的问题,有人知道发生了什么事?
1条答案
按热度按时间6l7fqoea1#
原因可能是动画永远不会结束并进入另一个状态
第一种方法是当动画开始时调用你想要的函数,但是在协程中,它等待动画时间,然后将bool返回为false。
或者继续使用您自己的方法,但在动画前后的过渡中检查并更改此配置。
请特别尝试以下两个复选框