2D вращение и обнаружение столкновений в Unity3d с C # Script - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть игровой объект, желтый кружок, который показан на на этой картинке как мой объект игрока, а красный - это дочерний объект моего игрока.

Затем, если я нажму клавишу пробела один раз, она будет вращаться на -90 градусов , как это

Проблема заключается в том, что когда я дважды нажимаю клавишу пробела, мой игрок вращается идеально, но он застревает и продолжает вибрировать, ударяя розовый блок. Мой вопрос, как я могу изменить свой сценарий, чтобы игрок узнал если он только может вращаться один раз и не позволяет игроку вращаться снова, если я нажму клавишу пробела, потому что розовый блок будет препятствовать его вращению.

Вот мой скрипт ротатора игрока.

public GameObject objToRotate;
 private bool rotating = false;
 // Use this for initialization
 void Start () {
     
 }
 
 // Update is called once per frame
 void Update () {
     if (Input.GetKeyDown (KeyCode.Space)) 
     {
         StartRotation ();
     }
     
     
 }
 private IEnumerator Rotate(Vector3 angles, float duration)
 {
     rotating = true;
     Quaternion startRotation = objToRotate.transform.rotation;
     Quaternion endRotation = Quaternion.Euler (angles) * startRotation;
     for (float t = 0; t < duration; t += Time.deltaTime) {
         objToRotate.transform.rotation = Quaternion.Lerp (startRotation, endRotation, t / duration);
         yield return null;
     }
     objToRotate.transform.rotation = endRotation;
     rotating = false;
 }
 public void StartRotation()
 {
     if (!rotating)
         StartCoroutine (Rotate (new Vector3 (0, 0, -90), 1.1f));
 }

Извините, если я плохо знаю английский. Все комментарии и помощь очень ценятся.

1 Ответ

0 голосов
/ 19 ноября 2018

Если вы хотите, чтобы ваша сопрограмма запускалась только один раз, вы можете изменить ее следующим образом

public GameObject objToRotate;
private bool rotating = false;
// Use this for initialization
void Start()
{

}

// Update is called once per frame
void Update()
{
    if (Input.GetKeyDown(KeyCode.Space) && !rotating)
    {
        StartRotation();
    }


}
private IEnumerator Rotate(Vector3 angles, float duration)
{
    rotating = true;
    Quaternion startRotation = objToRotate.transform.rotation;
    Quaternion endRotation = Quaternion.Euler(angles) * startRotation;
    for (float t = 0; t < duration; t += Time.deltaTime)
    {
        objToRotate.transform.rotation = Quaternion.Lerp(startRotation, endRotation, t / duration);
        yield return null;
    }
    objToRotate.transform.rotation = endRotation;

}
public void StartRotation()
{
    if (!rotating)
        StartCoroutine(Rotate(new Vector3(0, 0, -90), 1.1f));
}
...