Как заставить вращение объекта соответствовать вращению игрока

#c# #unity3d

Вопрос:

Я создаю игру Unity, в которой вы можете использовать свое воображение, чтобы вызывать вещи. Первое, что вы получаете, — это пушка, но у меня возникают проблемы с тем, чтобы пушка смотрела туда, куда смотрит игрок. Мне просто нужно изменить вращение z, чтобы соответствовать игрокам, но по какой-то причине, когда я это делаю, вращение x меняется на 180. Вот мой код

 if (Input.GetKeyDown("k"))
    {
        Vector3 playerPos = transform.position;
        Vector3 playerDirection = transform.forward;
        Quaternion playerRotation = transform.rotation;
        float spawnDistance = 10;

        smoke.transform.position = playerPos   playerDirection * spawnDistance;
        smoke.Play();
        StartCoroutine(SpawnCannon(1));

        IEnumerator SpawnCannon(float waitTime)
        {
            yield return new WaitForSeconds(waitTime);
            cannon.transform.position = smoke.transform.position;
            cannon.transform.rotation = new Quaternion(-90,0,playerDirection.z,0);
        }
        
      
    }
 

Комментарии:

1. а) Quaternion != углы Эйлера … четыре компонента Quaternion перемещения между -1 и 1 и не могут быть просто использованы как углы Эйлера … так что, вероятно, это должно быть cannon.transform.rotation = Quaternion.Euler(-90,0,playerDirection.z); НО б) transform.forward возвращает нормализованное Vector3 направление , которое не является вращением … и в) то, что вы видите в Инспекторе, — это локальное вращение относительно родительского элемента в представлении Эйлера .. что говорит против cannon.transform.rotation = transform.rotation; ?

2. Спасибо, что объяснили это. Теперь я думаю, что смогу решить эту проблему самостоятельно.

Ответ №1:

есть ли у пушки жесткое тело? Если это произойдет, то заморозьте вращение канона по оси x. Но если у него нет твердого тела, добавьте его и заморозьте вращение canon по оси x. и эта строка кода здесь: Quaternion playerRotation = transform.rotation; , вы можете заменить ее следующим : Quaternion playerRotation = transform.rotation.[AXIS HERE]; . Замените [ОСЬ ЗДЕСЬ] осью, по которой вы хотите, чтобы canon вращался, если вы хотите, чтобы canon вращался по оси z, вы бы заменили [ОСЬ ЗДЕСЬ] на z. Надеюсь, это немного поможет! 😀

Комментарии:

1. Это разумный способ сделать это. Но вместо этого я просто установил вектор движения пушек на вектор движения игроков.