如何使LookAt对齐transform.up向量而不是transform.forward?

问题描述 投票:2回答:1

问题是我不能制作一个使敌人旋转的脚本,以便“向上”指向玩家,(我的意思是它将通过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;

    }
}

所以我想要发生的是敌人将移动到玩家,但旋转部分不起作用,它只是在空中直接上升而不是跟随玩家。我可能只是愚蠢而错过了一些简单的事情......

c# unity3d rotation artificial-intelligence
1个回答
2
投票

通过使用

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不是你在Unity检查器中看到的围绕X轴的纯旋转。


这有点取决于你最终想要enemy旋转到底,但你可以简单地使用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应该只用于物理相关的东西。

© www.soinside.com 2019 - 2024. All rights reserved.