While 函数检查动画是否正在运行导致 Unity 崩溃

问题描述 投票:0回答:1

我正在开发一款两人格斗游戏,其中一个玩家可以击中另一个玩家。所有命中都被标记为打击或抓取,当对手被抓取击中时,我希望对手在抓取动画播放期间跟随第一个玩家的位置(想想一个玩家跳跃的地震投掷)然后下来,另一个被迫跟随)。但是,当我尝试这样做时,Unity 崩溃了(如“动画停止运行,我无法与编辑器交互,并且我必须使用任务管理器关闭编辑器”崩溃)。如果抓取碰撞盒与玩家交互,被击中的玩家会调用以下代码:

int grabAnimation = opponent.GetComponent<CharacterController>().playerAnim.GetCurrentAnimatorStateInfo(0).shortNameHash;

            while (opponent.GetComponent<CharacterController>().playerAnim.GetCurrentAnimatorStateInfo(0).shortNameHash == grabAnimation)
            {
                transform.position = opponent.transform.position + new Vector3(3f * whichSide, 0, 0);
                stopMoving = true;
            }

            TakeDamage(damage);
            DealKnockback(angle, magnitude);
            hitstun = damage * 10;
            comboCounter++;

如果我将 while 循环替换为基于动画长度的 for 循环,则一切正常,所以我知道 while 循环才是问题所在。我可以将其切换为 for 循环,但如果动画被中断,我需要它停止,这可能是由许多不同的事情引起的。如果不需要向一堆不同的区域添加功能会更容易我可以解决这个问题。

此外,我可以在 while 循环中放入任何内容,它会崩溃,因为我之前注释掉了中间的所有内容,并且只是做了

Debug.Log("Test")
并且游戏停止运行。 (stopMoving 只是关闭玩家的移动控制,它不会将它们锁定在适当的位置,所以这不应该是一个问题)。

最后,调用此方法的 OnCollision 位于仅在执行攻击的玩家上激活的碰撞箱上,因此攻击玩家不应该也调用此方法。

如有任何帮助,我们将不胜感激。

c# unity-game-engine animation while-loop
1个回答
0
投票

我猜, while 循环会阻塞所有其他操作,因为没有脚本/组件并行运行。一旦 while 的条件成立,所有其他脚本、组件(Animator、动画等)将等待,直到 while 循环和具有此循环的方法完成。所以你有一个无限循环。

如果你想使用这个,我会把它变成一个协程,并在

yield return null
之后放一个
stopMoving = true;
,这会将控制权返回给Unity(阻止它阻塞主线程),以便其他脚本/组件正常运行。

© www.soinside.com 2019 - 2024. All rights reserved.