循环冻结游戏 - 还有什么可以旋转对象吗?

时间:2018-03-28 17:49:34

标签: c# unity3d crash transform freeze

我正在尝试为TBS游戏创建一个旋转光源,它将在转弯结束时旋转。为此,我使用过活动;我有两个脚本,一个推进转向:

public delegate void Time(int t);
public static event Time Time_Change;
public int t = 1;

void Update()
{
    if (Input.GetKeyDown(KeyCode.Return))
    {
        t = t + 1;
        if (t > 8) { t = 1; }
        Debug.Log(t);
        if (Time_Change != null)
        {
            Time_Change(t);
        }
    }

(有八个日/夜阶段)和一个接收信号并移动它附着的光线:

public int angle = 85;

void Start () {
    Time_Controller.Time_Change += Move_Lights;
}


void Move_Lights(int t)
{

//phase detection, set angle variable

if (t % 2 == 0)
    {    
        //----------------------------------------       
        while (transform.eulerAngles.x != angle)
        {
            transform.Rotate(Vector3.right * Time.deltaTime, Space.World);
        }
        //----------------------------------------
    }
}

问题在于,当我运行游戏并按回车键时,Everything冻结,关闭Unity的唯一方法是通过任务管理器(在游戏冻结时也会显示Unity的CPU使用率飙升)。我通过消除过程,(一切正常,没有它)跟踪故障线为

while (transform.eulerAngles.x != angle)
{
    transform.Rotate(Vector3.right * Time.deltaTime, Space.World);
}

如上所述。我该怎么办?我已经尝试了各种旋转光源的方法,但还有什么东西可以防止碰撞。

提前致谢。

2 个答案:

答案 0 :(得分:1)

我建议在这里使用协程。

void Move_Lights(int t)
{
    //phase detection, set angle variable

    if (t % 2 == 0)
    {    
        StartCoroutine(RotateLight());
    }
}

IEnumerable RotateLight()
{
    while (transform.eulerAngles.x != angle)
    {
        transform.Rotate(Vector3.right * Time.deltaTime, Space.World);
        yield return null;
    }
    yield break;
}

答案 1 :(得分:1)

你的游戏冻结了,因为它与你的不平等陷入无限循环。 while循环仅在变换的float值等于angle时退出,由于float的精度,它实际上永远不会成立。当使用与浮点数的等式时,你应该对你的比较施加一个容差。如果您正在寻找一个精确的角度,这当然不是您想要使用的方法。

// while the transforms angle is not within .5f of the desired...
while (Mathf.abs(transform.eulerAngles.x-angle) > .5f)
{
    transform.Rotate(Vector3.right * Time.deltaTime, Space.World);
    yield return null;
}