C# 尝试重复检查变量时出现StackOverflow错误

C# 尝试重复检查变量时出现StackOverflow错误,c#,stack-overflow,C#,Stack Overflow,嘿,在我开始之前,我想让大家知道我不仅是这个论坛的新手,而且是Unity和C#本身,所以如果有简单的解决方案或其他愚蠢的错误,我道歉 好的,所以基本上我想做的是,当我的玩家击中空间时,切换他们的重力,为了达到这个目的,我检查玩家的变换。位置。y,看它是否在指定的高度,如果不是,我增加力量 代码区域: private void ChangeGravity() { if (rb.position.y >= 10f) {

嘿,在我开始之前,我想让大家知道我不仅是这个论坛的新手,而且是Unity和C#本身,所以如果有简单的解决方案或其他愚蠢的错误,我道歉

好的,所以基本上我想做的是,当我的玩家击中空间时,切换他们的重力,为了达到这个目的,我检查玩家的变换。位置。y,看它是否在指定的高度,如果不是,我增加力量

代码区域:

private void ChangeGravity()
    {
            if (rb.position.y >= 10f)
            {
                SAF = false;
                rb.constraints = RigidbodyConstraints.FreezePositionY | RigidbodyConstraints.FreezePositionZ;  
            }
            else
            {
                rb.AddForce(0, VerticalForce * Time.deltaTime, 0);
                ChangeGravity();
            }
    }
为了澄清,SAF是一种预防措施,这样玩家就不会对空格键发垃圾邮件。 另外,VerticalForce=2f,通过测试,我确定if语句可能为真(此测试通过将y设置为10)

下面是错误:

StackOverflowException
UnityEngine.Rigidbody.AddForce (Vector3 force, ForceMode mode)
UnityEngine.Rigidbody.AddForce (Single x, Single y, Single z) (at C:/buildslave/unity/build/Runtime/Dynamics/ScriptBindings/Dynamics.bindings.cs:171)
PlayerMovement.ChangeGravity () (at Assets/Scripts/PlayerMovement.cs:21)
PlayerMovement.ChangeGravity () (at Assets/Scripts/PlayerMovement.cs:22)
(The final line repeats a bunch but I cut that out)
整个脚本:


编辑


我终于找到了一个非常有用的教程,如果没有你们,我将无法找到关于如何反转物体重力的教程,这使得这个问题变得过时,谢谢你们的时间,很抱歉我在提出这个问题之前没有找到这个教程。

你的方法不会返回,它会调用自身,然后再次调用自身

由于调用函数会在线程堆栈上分配一些内存,堆栈很快就会溢出,因为它的空间限制为几兆字节

在while循环中调用此方法,在满足条件时中断循环。因此,在循环的每次迭代中,方法都会返回,调用堆栈不会增长

   while (true)
   {
        if (rb.position.y >= 10f)
        {
            SAF = false;
            rb.constraints = RigidbodyConstraints.FreezePositionY | RigidbodyConstraints.FreezePositionZ;  
            break; //break the loop since condition is met
        }
        else
        {
            rb.AddForce(0, VerticalForce * Time.deltaTime, 0);
            continue; //the condition is not met, so the loop goes on
        }
    }

你已经改变了重力();调用自身…因此stackoverflow并非意外。是的,就像我说过的,我反复运行函数,直到语句it trued这里没有问题:您知道您正在递归调用ChnageGravity()但是你会惊讶于它会溢出吗?但最终它不应该调用自己,因为上面的语句将是truewell堆栈不是无限的!如果你能提供一个更好的例子,那么stackoverflow异常应该已经消失了,因为这个方法现在不是递归的,对吧?这只是同一个递归方法的不同版本。如果不满足条件,它将变为无穷大,而不是抛出堆栈溢出。我们回到原点,这个循环实际上是无穷大的,而我之前没有,为了确保这一点,我将数字减少为if 2,这意味着如果施加任何力,它将破裂,而不会。@SelmanGenç区别在于调用堆栈不会增长。它可以永远迭代而不会出现堆栈溢出。在您的版本中,由于该方法以递归方式调用自身,如果不满足条件,它将在几十次之后(通常在调试器中观察到)命中stackoverflow异常。