Как заставить LookAt выровнять вектор transform.up вместо transform.forward?

#c# #unity3d #rotation #artificial-intelligence

#c# #unity3d #вращение #искусственный интеллект

Вопрос:

Проблема в том, что я не могу создать сценарий, который заставляет врага вращаться так, чтобы «up» указывало на игрока (я имею в виду, чтобы он пришел к игроку с transform.up), И я пока не нашел никакого рабочего решения (из того, что я могу сказать)

Я пытаюсь создать небольшую 2D-игру, только для моих друзей. То, что я пробовал, это заставить врага смотреть на игрока, а затем установить вращение «z» таким же, как вращение «x», и после этого сбросить вращение «x» и «y» (так, чтобы «вверх» указывало на игрока). Но враг просто идет прямо вверх.

 using UnityEngine;
public class Enemy : MonoBehaviour
{
    public Transform Player;  // The Transform of the Player that you can controll
    public float MoveSpeed = 4; // How fast the enemy should go
    void FixedUpdate()
    {
        transform.LookAt(Player);
        transform.rotation = Quaternion.Euler(transform.rotation.x, 0, transform.rotation.x);
        transform.rotation = Quaternion.Euler(0, 0, transform.rotation.z);
        transform.position  = transform.up * MoveSpeed * Time.deltaTime;

    }
}
 

Итак, я хочу, чтобы враг переместился к игроку, но часть вращения не работает, и он просто поднимается прямо в воздух вместо того, чтобы следовать за игроком. Возможно, я просто глуп и пропустил что-то простое…

Ответ №1:

Используя

 transform.rotation = Quaternion.Euler(transform.rotation.x, 0, transform.rotation.x);
transform.rotation = Quaternion.Euler(0, 0, transform.rotation.z);
 

оба раза вы перезаписываете вращение новыми значениями, дополнительно смешивая Euler ( Vector3 ) с Quaternion полями… transform.rotation.x это не чистое вращение вокруг X оси, которое вы видите в инспекторе Unity.


Это немного зависит от того, как именно вы хотите enemy повернуть в конце, но вы могли бы просто использовать Transform.RotateAround like

 transform.LookAt(Player);
transform.RotateAround(transform.position, transform.right, 90);
 

LookAt по умолчанию это приводит к такому повороту, который transform.forward указывает на цель, transform.right остается направленным вправо (ish) и transform.up остается направленным вверх (ish). Итак, все, что вам нужно сделать, это повернуть вокруг этой локальной оси X transform.right точно 90° так, чтобы теперь transform.forward вместо этого указывать вниз и transform.up указывать на цель.

что приводит к

введите описание изображения здесь


Если вы также хотите изменить другую ось, вы все равно можете дополнительно повернуть ее вокруг локальной transform.up оси, например. перевернуть forward вектор «вверх»:

 transform.LookAt(Player);
transform.RotateAround(transform.position, transform.right, 90);
transform.RotateAround(transform.position, transform.up, 180);
 

Есть ли на самом деле особая причина, по которой вы делаете это в FixedUpdate , а не в Update ? FixedUpdate должен использоваться только для материалов, связанных с физикой.