3D Transform.LookAt
基本用法
在Unity中,每个游戏对象都有一个Transform
组件,这个组件管理着对象的位置、旋转和缩放。Transform.LookAt
方法可以修改对象的旋转,使其朝向特定的目标。
方法的基本形式是:
public void LookAt(Transform target, Vector3 worldUp = Vector3.up);
public void LookAt(Vector3 worldPosition, Vector3 worldUp = Vector3.up);
target
:这是一个Transform对象,游戏对象将会朝向这个对象。worldPosition
:这是一个世界坐标的点,游戏对象将会朝向这个点。worldUp
:这是一个向量,用于定义向上的方向。默认值是Vector3.up
,即(0, 1, 0)。
应用示例
-
摄像机跟踪:使摄像机始终朝向主角。可以在摄像机的更新函数中调用
LookAt
,将摄像机的Transform
朝向主角的Transform
。void Update() { camera.transform.LookAt(player.transform); }
-
自动瞄准:在射击游戏中,可以用
LookAt
方法帮助玩家或AI自动瞄准敌人。void Update() { gun.transform.LookAt(enemy.transform.position); }
-
面向观众的展示:在做展示类应用时,可能需要某个对象总是面向用户,特别是在VR或AR应用中。
void Update() { displayObject.transform.LookAt(Camera.main.transform); }
注意事项
- 当目标和对象在同一位置时,
LookAt
可能不会正确工作。 - 高频率更新
LookAt
可能会导致性能问题,尤其是在移动设备上。 - 在使用
LookAt
时,确保“向上”向量符合世界坐标系统。
2D
1. Z轴旋转
在Unity中,Transform.LookAt
方法是设计用于3D环境的,因此直接在2D项目中使用它可能不会得到预期的效果,主要是因为它会考虑所有三个维度的旋转。然而,可以通过一些方法来模拟类似于 LookAt
的行为,专门用于2D环境。
对于2D游戏,通常的需求是让一个对象(如角色或物体)朝向另一个对象或某个点,但仅仅是在2D平面上进行旋转。这可以通过计算两点间的角度,然后设置对象的旋转来实现。
以下是一个示例
using UnityEngine;
public class LookAt2D : MonoBehaviour
{
public Transform target;
void Update()
{
Vector3 targetDir = target.position - transform.position;
float angle = Mathf.Atan2(targetDir.y, targetDir.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle - 90));
}
}
这里的关键步骤解释如下:
- 计算方向:
target.position - transform.position
得到从当前对象指向目标的向量。 - 计算角度:使用
Mathf.Atan2
函数根据X和Y的差值计算出角度,这个函数返回的是弧度,转换为度需要乘以Mathf.Rad2Deg
。 - 应用旋转:将计算出的角度应用到对象的旋转中。注意旋转的Z轴因为2D的特性,所以X和Y轴是0。此处
90
是因为Unity中Sprite默认是朝上的,如果你的Sprite是朝右的,则不需要这个调整。
2. Y轴翻转
此处的作用是将物体在y轴上翻转,朝向物体。上述z轴,只是改变视觉上我们角度问题
bool isFlipped = false;
public void LookAtPlayer()
{
Vector3 flipped = transform.localScale;
flipped.z *= -1f;
if (transform.position.x > player.position.x && isFlipped)
{
transform.localScale = flipped;
transform.Rotate(0f, 180f, 0f);
isFlipped = false;
}
else if (transform.position.x < player.position.x && !isFlipped)
{
transform.localScale = flipped;
transform.Rotate(0f, 180f, 0f);
isFlipped = true;
}
}
- 面向控制:该方法使对象能够根据玩家位置动态改变朝向,对于追逐、逃跑或面对面的游戏交互尤为重要。
- 视觉连贯性:保持角色朝向正确,增强玩家的沉浸感和游戏体验。
- 简化动画:通过翻转而不是使用不同的动画来处理不同方向,可以减少资源使用和简化开发过程。