Unity中,区别LookAt与LookRotation

本文详细介绍了Unity3D中LookAt和LookRotation函数的使用,通过实例展示了如何使游戏对象正确朝向敌人。文章指出LookRotation直接使用敌人位置会导致错误的朝向,而应当使用(敌人位置 - 主角位置)作为参数,确保指向正确。附带了测试代码以验证原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

详细的资料可以看这个大佬总结的:参考资料

我这里直接用图结合着说:

首先呢,我们的主角要看向敌人,下图是还没看向之前:

使用LookAt函数看向敌人后,Z轴看向敌人(也是正面看向敌人)

而如果LookRotation的参数直接填敌人的位置,就会出现下面这种情况:

我们可以发现,主角现在看向的根本不是敌人。

在图上很明显,主角看的方向,与原点到敌人的方向相同:

所以要想主角看向敌人,则应该取黑色箭头的方向,即参数应该填:(敌人的位置-主角的位置),这里是向量的减法运算,结果方向指向被减向量方向!

下面是测试代码:

using UnityEngine;

/// <summary>
/// 
/// * Writer:June
/// *
/// * Data:2021.4.2
/// *
/// * Function:区别LookAt与LookRotation
/// *
/// * Remarks:
/// 
/// </summary>

public class LookTest : MonoBehaviour
{
    /// <summary>
    /// 敌人
    /// </summary>
    public Transform target;

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            transform.LookAt(target);
        }
        if (Input.GetKeyDown(KeyCode.S))
        {
            transform.rotation = Quaternion.LookRotation(target.position);
        }
        if (Input.GetKeyDown(KeyCode.D))
        {
            transform.rotation = Quaternion.LookRotation(target.position - transform.position);
        }
        //画原点与敌人之间的线
        Debug.DrawLine(Vector3.zero, target.position, Color.yellow);
        //画主角与敌人之间的线
        Debug.DrawLine(transform.position, target.position, Color.black);

    }
}

<think>好的,用户问的是UnityLookAt怎么不让人物乱转。首先,我需要回忆一下LookAt的基本用法。LookAt方法会让物体的Z轴指向目标,这通常会导致物体在旋转时可能会绕其他轴旋转,出现所谓的“乱转”现象。用户可能遇到了角色突然翻转或者不自然旋转的问题,需要找到解决方法。 接下来,我应该分析问题根源。当目标点在物体的正上方或正下方时,Unity的默认LookAt可能会导致物体绕X轴或Y轴翻转。这是因为LookAt会完全对齐物体的朝向,而忽略其他轴向的约束。用户可能需要保持物体的某些轴固定,比如让角色保持直立,只绕Y轴旋转。 然后,我需要考虑解决方案。常见的做法是限制旋转轴,例如只允许绕Y轴旋转。可以通过代码修改旋转,只保留Y轴的变化,或者使用Quaternion.LookRotation结合Vector3.ProjectOnPlane来投影方向到某个平面,避免上下翻转。此外,分解欧拉角也是一个方法,但需要注意万向锁问题。 还要注意Update和LateUpdate的使用时机。如果在Update中使用LookAt,而角色动画在LateUpdate中处理,可能会导致冲突,所以可能需要调整执行顺序或使用LateUpdate来应用旋转。 另外,用户可能需要平滑旋转,这时候可以用Quaternion.RotateTowards或Slerp进行插值,避免瞬间旋转造成的突兀感。 最后,要总结常见问题,比如万向锁、轴向约束和更新顺序,并给出示例代码,帮助用户理解具体实现。确保回答结构清晰,步骤明确,让用户能够一步步解决问题。</think>在Unity中,使用`Transform.LookAt()`时角色乱转是常见的轴向问题,以下分步骤说明解决方案: 1. **问题分析** - LookAt默认会使物体的Z轴指向目标 - 当目标点物体处于特殊相对位置时(如正上方/正下方) - 会导致绕多个轴旋转,产生"万向节死锁" 2. **核心解决方案** ```csharp // 只绕Y轴旋转的改进版LookAt Vector3 targetPos = target.position; targetPos.y = transform.position.y; // 锁定Y轴高度 transform.LookAt(targetPos); ``` 3. **进阶方案:使用四元数控制** ```csharp Vector3 direction = target.position - transform.position; direction.y = 0; // 投影到XZ平面 if(direction != Vector3.zero) { Quaternion targetRotation = Quaternion.LookRotation(direction); transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * rotateSpeed); } ``` 4. **轴向约束方法** ```csharp // 通过欧拉角固定不需要旋转的轴 Vector3 euler = transform.eulerAngles; transform.LookAt(target); transform.eulerAngles = new Vector3(euler.x, transform.eulerAngles.y, euler.z); ``` 5. **注意事项** - 避免在Update中直接调用,推荐在LateUpdate中使用 - 如需平滑旋转,配合使用`Quaternion.RotateTowards()` - 处理地面角色时,建议先将目标点投影到角色所在平面 6. **常见问题排查** - 检查父物体是否有旋转组件 - 确认模型导入设置中的轴向是否正确 - 使用Debug.DrawRay可视化当前朝向 通过以上方法,可以有效控制角色只进行需要的轴向旋转,避免出现突然翻转或异常旋转现象。实际使用时建议配合动画系统的Root Motion进行综合控制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值