2017-07-08 588 views
0

我正在尝试做一个旋转的大炮,它可以前后旋转。 我想限制旋转从-55到55(我的意思是transform.position.z),但我不能让它工作。Unity 2D - 旋转物体并限制旋转

就目前我的代码是:

public class Cannon : MonoBehaviour 
{ 
    bool hit = false; 

    void Update() 
    { 
     float angle = transform.rotation.z; 
     if (angle > -55 & angle < 55 & !hit) 
     { 
      transform.Rotate(Vector3.back * Time.deltaTime); 
     } 

     if (angle <= -55) 
     { 
      transform.Rotate(Vector3.back * Time.deltaTime); 
      hit = true; 
     } 
     if (angle >= 55) 
     { 
      transform.Rotate(Vector3.forward * Time.deltaTime); 
      hit = true; 
     } 
    } 
} 

唯一觉得工作是我的开始旋转对象所做的第一旋转,所以它只是旋转回来,不停止,它似乎是无视“角度”

我也试图把最后2如果语句,内第一个,但仍然无法正常工作。

我想让它旋转直到它碰到-55,然后开始旋转直到碰到+55并重复这个。

+0

我注意到你有一些好的回答您的问题,但作为接受你没有标明任何人。如果答案合法地帮助了您,请考虑这样做(通过点击答案旁边的勾号)。它奖励那些帮助你的人,同时增加你的声望,并且使其他有类似问题的用户更容易找到好的答案 –

回答

0

您需要做的第一件事是使用Euler Angles而不是Quarternions来查找以度为单位的旋转。

然后,由于它不报告负角度,而是报告从0到360的角度,所以每当大于180时需要减去360以获得负角度等效值。

从那里,你可以申请测试,以保持它的界限:

public class Cannon : MonoBehaviour { 

    public float direction = 1f; // initial direction 
    public float speed = 20f; // speed of rotation 

    void Update() 
    { 
     float angle = transform.eulerAngles.z; 
     if (angle > 180f) angle -= 360f; 

     if ((angle < -55f) || (angle > 55f)) direction *= -1f; // reverse direction (toggles between 1 & -1) 

     transform.Rotate (0, 0, speed * direction * Time.deltaTime); 
    } 
}