嘿,在我开始之前,我想让每个人都知道我不仅是这个论坛的新手,而是Unity和C#本身,所以如果有一个简单的解决方案或其他愚蠢的错误,我道歉。
好吧基本上我正在尝试做的是当他们击中太空时切换我的玩家的重力,为了实现这一点我正在检查玩家transform.position.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)
整个剧本:The Script
编辑
我终于找到了一个非常有用的教程,如果没有你们如何反转物体的重力,我不会发现这个问题已经过时了,谢谢你的时间对不起我在提出问题之前没有找到这个。
你的方法不会返回,它会调用自己,然后再调用自己。
由于调用函数会在线程的堆栈上分配一些内存,因此堆栈很快就会溢出,因为它的空间限制为几兆字节。
在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
}
}