在Unity中使物体根据主相机朝向来调转朝向的方法

public enum EAlignAxis { X, Y, Z }
public Vector3 FinalDirectionMultiplier = Vector3.one;
public EAlignAxis AlignAxis = EAlignAxis.Z;
  • 枚举定义
    定义了一个名为 EAlignAxis 的枚举类型,它包含三个枚举值 XY 和 Z。用于指定后续要按照哪个轴向来对齐游戏对象的方向,方便代码以一种清晰、易读的方式区分不同的轴向选择情况。

  • 变量声明
    声明了一个 Vector3 类型的公共变量 FinalDirectionMultiplier,并初始化为 Vector3.one(即 (1, 1, 1)),这个变量的作用应该是对从摄像机获取的方向向量的每个分量(xyz)进行缩放,以此来调整最终应用到游戏对象上的方向强度或者方向比例等情况。

另外还声明了一个 EAlignAxis 类型的公共变量 AlignAxis,初始值设为 EAlignAxis.Z,用于确定按照哪个轴向来对齐游戏对象的方向,默认为 Z 轴方向对齐。

void Update()
{
    if (!gameObject ||!Camera.main) return;

在 Update 函数开头进行了两个条件判断。!gameObject 用于检查当前脚本所附着的游戏对象是否存在(如果游戏对象被销毁等情况会导致 gameObject 为 null),!Camera.main 则是检查是否能获取到场景中的主摄像机(如果场景中没有设置主摄像机或者设置有误等情况会导致 Camera.main 为 null),只要这两个条件中有一个不满足(也就是对应的对象为 null),就直接使用 return 语句结束本次 Update 函数的执行,避免后续代码出现空引用异常。

Vector3 ForwardVector = new Vector3() {
    x = Camera.main.transform.forward.x * FinalDirectionMultiplier.x, 
    y = Camera.main.transform.forward.y * FinalDirectionMultiplier.y,
    z = Camera.main.transform.forward.z * FinalDirectionMultiplier.z
};

创建了一个新的 Vector3 类型的变量 ForwardVector,它的各个分量(xyz)是通过获取主摄像机(Camera.main)的 transform(变换组件,包含了位置、旋转、缩放等信息)的 forward(代表摄像机正前方的方向向量)向量的对应分量,并乘以 FinalDirectionMultiplier 变量的相应分量来得到的。简单来说,就是基于主摄像机的朝向,结合方向乘数来构建一个新的方向向量,这个向量后续会用于设置游戏对象的方向。

if (ForwardVector.Equals(Vector3.zero)) return;

判断构建出来的 ForwardVector 是否是零向量(即 (0, 0, 0)),如果是零向量,意味着根据当前设置得到的方向是无效的(可能是摄像机朝向与乘数共同作用导致的结果),同样使用 return 语句结束本次 Update 函数执行,防止进行后续不合理的方向设置操作。

switch (AlignAxis)
{
    case EAlignAxis.X:
        gameObject.transform.right = ForwardVector;
        break;
    case EAlignAxis.Y:
        gameObject.transform.up = ForwardVector;
        break;
    case EAlignAxis.Z:
        gameObject.transform.forward = ForwardVector;
        break;
    default:
        break;
}

通过 switch 语句根据 AlignAxis 变量的值(也就是之前定义的枚举值 XY 或 Z)来决定如何设置游戏对象的方向。

当 AlignAxis 的值为 EAlignAxis.X 时,将游戏对象的 transform.right(代表游戏对象自身的右方向向量)设置为 ForwardVector,也就是让游戏对象的右方向与前面构建出来的基于摄像机朝向和乘数的方向向量对齐。

当 AlignAxis 的值为 EAlignAxis.Y 时,把游戏对象的 transform.up(代表游戏对象自身的上方向向量)设置为 ForwardVector,使游戏对象的上方向与该方向向量对齐。

当 AlignAxis 的值为 EAlignAxis.Z 时,将游戏对象的 transform.forward(代表游戏对象自身的前方向向量)设置为 ForwardVector,让游戏对象的前方向与构建的方向向量对齐,这也是默认的对齐轴向设置情况。

总体代码如下

  • public enum EAlignAxis { X, Y, Z }
            public Vector3 FinalDirectionMultiplier = Vector3.one;
            public EAlignAxis AlignAxis = EAlignAxis.Z;
    
            void Update()
            {
                if (!gameObject || !Camera.main) return;
                Vector3 ForwardVector = new Vector3() {
                   x = Camera.main.transform.forward.x * FinalDirectionMultiplier.x, 
                   y = Camera.main.transform.forward.y * FinalDirectionMultiplier.y,
                   z = Camera.main.transform.forward.z * FinalDirectionMultiplier.z
                };
    
                if (ForwardVector.Equals(Vector3.zero)) return;
    
                switch (AlignAxis)
                {
                    case EAlignAxis.X:
                        gameObject.transform.right = ForwardVector;
                        break;
                    case EAlignAxis.Y:
                        gameObject.transform.up = ForwardVector;
                        break;
                    case EAlignAxis.Z:
                        gameObject.transform.forward = ForwardVector;
                        break;
                    default:
                        break;
                }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值