Как заставить LookAt выровнять вектор transform.up вместо transform.forward? - PullRequest
2 голосов
/ 15 апреля 2019

Проблема в том, что я не могу сделать сценарий, который заставляет врага вращаться так, чтобы «вверх» указывал на игрока, (под этим я подразумеваю, что он придет к игроку с помощью 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 Ответ

2 голосов
/ 15 апреля 2019

При использовании

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

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


От того, насколько именно вы хотите * 1017, зависит немного* повернут в конце, но вы можете просто использовать Transform.RotateAround как

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 указывает на цель.

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

enter image description here


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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...