c# - 陷入无限循环,不知道如何逃脱(团结)
问题描述
我目前正在开发 Unity,代码似乎陷入了无限循环
void Start()
{
button = false;
x = 50;
y = 50;
}
void Update()
{
transform.RotateAround(Vector3.zero, Vector3.back, x * Time.deltaTime);
if (Input.GetButtonUp("Jump"))
{
if (button == false)
{
button = true;
}
else
{
button = false;
}
}
while (button == true)
{
Vector3 pivotPosition = GameObject.Find("fire").transform.position;
transform.RotateAround(pivotPosition, Vector3.back, y * Time.deltaTime);
x = 0;
y = 50;
}
while (button == false)
{
Vector3 pivotPosition = GameObject.Find("ice").transform.position;
transform.RotateAround(pivotPosition, Vector3.back, x * Time.deltaTime);
x = 50;
y = 0;
}
}
}
该代码是关于更改对象的枢轴,使其有点像游戏中的冰与火之舞。问题似乎是while循环,它创建了一个无限循环,阻止我启动代码。如果你知道如何解决这个问题,请帮助我......
解决方案
您的代码会将 Y 设置为 50 并重复(数千次)将 Y 设置为 50,直到代码的某些部分更新“按钮”,在这种情况下,它将 Y 设置为 0 并将 X 设置为 5 万次,直到再次更改按钮之后它将最终退出该方法。您需要在您的问题中更明确地说明如何/何时更改按钮,但您需要为您的 while 循环制定更好的退出条件。如果您想在没有无限循环的情况下进行测试,您可以执行类似的操作
if (Input.GetButtonUp("Jump"))
button = !button
if (button)
{
Vector3 pivotPosition = GameObject.Find("fire").transform.position;
transform.RotateAround(pivotPosition, Vector3.back, y * Time.deltaTime);
x = 0;
y = 50;
}
else
{
Vector3 pivotPosition = GameObject.Find("ice").transform.position;
transform.RotateAround(pivotPosition, Vector3.back, x * Time.deltaTime);
x = 50;
y = 0;
}
如果您确实希望该代码继续运行,直到按钮再次受到影响,您可以执行类似的操作
public async Task StartSpinVector(){
if (button)
while(button)
{
Vector3 pivotPosition = GameObject.Find("fire").transform.position;
transform.RotateAround(pivotPosition, Vector3.back, y * Time.deltaTime);
x = 0;
y = 50;
await Task.Delay(50);//so we don't go nuts, wait 50 ms before repeating
}
else
while(!button)
{
Vector3 pivotPosition = GameObject.Find("ice").transform.position;
transform.RotateAround(pivotPosition, Vector3.back, x * Time.deltaTime);
x = 50;
y = 0;
await Task.Delay(50);//so we don't go nuts, wait 50 ms before repeating
}
}
然后在你的主更新代码中,调用(但不要等待)这个方法,这样你的更新就不会变得绝对疯狂
private Task updateLoopTask;
void Update(){
...
updateLoopTask = StartSpinVector();//save the task in case we want to await it later or something
}
或者您可能想做其他事情,如果您详细说明您的问题,我们可以做出更具体的答案
推荐阅读
- oracle-apex - Oracle APEX:查询 APEX_COLLECTION 时未找到数据
- android - WRAP_CONTENT 不适用于动态创建的视图
- google-app-engine - 来自服务帐户 OIDC 令牌的 IAP:401 Unauthorized
- forms - 聚合物重置参数格式不起作用
- c# - 如何创建 ShareFileClient 而不指定它的大小以便能够将数据流式传输到它?
- linux-mint - 为什么 Vivaldi 在 LinuxMint 20 XFCE 上比 Remmina VNC 歪?
- postman - 使用 newman 在 htmlextra 报告中进行多次迭代
- javascript - 禁用行选择,只允许在 PrimeNG 的 Mutliselect 中选择复选框
- python - 如何使用 matplotlib 绘制具有颜色渐变长度的 3d 箭袋图?给出错误“ValueError: object too deep for desired array”
- c++ - 尽管引用未定义(缺少`extern“C”`),为什么可以链接静态库?