我正在尝试为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);
}
如上所述。我该怎么办?我已经尝试了各种旋转光源的方法,但还有什么东西可以防止碰撞。
提前致谢。
答案 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;
}