public enum EAlignAxis { X, Y, Z }
public Vector3 FinalDirectionMultiplier = Vector3.one;
public EAlignAxis AlignAxis = EAlignAxis.Z;
-
枚举定义:
定义了一个名为EAlignAxis
的枚举类型,它包含三个枚举值X
、Y
和Z
。用于指定后续要按照哪个轴向来对齐游戏对象的方向,方便代码以一种清晰、易读的方式区分不同的轴向选择情况。 -
变量声明:
声明了一个Vector3
类型的公共变量FinalDirectionMultiplier
,并初始化为Vector3.one
(即(1, 1, 1)
),这个变量的作用应该是对从摄像机获取的方向向量的每个分量(x
、y
、z
)进行缩放,以此来调整最终应用到游戏对象上的方向强度或者方向比例等情况。
另外还声明了一个 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
,它的各个分量(x
、y
、z
)是通过获取主摄像机(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
变量的值(也就是之前定义的枚举值 X
、Y
或 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; }