#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
должен использоваться только для материалов, связанных с физикой.