1. 向量:不只是箭头,更是3D世界的“方向与力量”
很多刚接触Unity3D的朋友,一听到“向量”这个词,可能脑子里就浮现出高中数学课本里那些带箭头的线段,觉得既抽象又枯燥。但在Unity的世界里,向量(Vector)是你最亲密、最实用的伙伴,没有之一。它远不止是一个数学概念,而是你操控游戏世界中一切位置、移动、方向和力的核心工具。
你可以把向量想象成一个“指令包”。比如,你想让一个角色向前走,这个“向前走”的动作,本质上就是一个向量:它指明了移动的方向(比如Z轴正方向)和移动的力度或速度(向量的长度)。在Unity中,最常用的就是 Vector3,它用三个浮点数 (x, y, z) 来封装这个三维空间中的指令。
这里有一个新手容易混淆的关键点:Vector3 既能表示一个“点”(位置),也能表示一个“向量”(方向与大小)。它们的存储形式都是 (x, y, z),但意义不同。一个点描述的是空间中的一个绝对位置,比如 (2, 1, 5) 是世界中的某个坐标。而一个向量描述的是相对的位移,比如 (0, 0, 1) 表示“向Z轴正方向移动1个单位”。理解这个区别至关重要。如何从一个点得到向量呢?很简单,坐标点相减。如果你想知道从点A到点B该怎么走,计算 B - A 得到的向量,箭头就是从A指向B。反过来,A - B 的向量则指向从B到A的方向。我刚开始做项目时,经常搞反,导致物体朝相反方向飞出去,调试了半天才发现是向量方向算反了。
向量的“大小”或者说长度,在Unity里叫模(Magnitude)。计算方式就是勾股定理在三维空间的延伸:Mathf.Sqrt(x*x + y*y + z*z)。Unity提供了便捷的 vector.magnitude 属性来获取它。而单位向量(Normalized Vector) 是一个长度被缩放到1的特殊向量,它只纯粹地表示方向。获取单位向量的API是 vector.normalized。这个操作在游戏开发中极其高频,比如你想让一个物体以恒定速度朝某个方向移动,你需要先获取目标方向的单位向量,再乘以速度值。记住,直接使用 vector.normalized 会返回一个新的单位向量,而不会改变原向量;如果你想原地改变原向量为单位向量,则使用 vector.Normalize() 方法。
2. 向量运算的实战几何意义:点乘与叉乘
知道了向量的基础,我们来看看最核心的两种运算:点乘和叉乘。别被名字吓到,它们的几何意义非常直观,而且实战中用得非常多。
2.1 点乘:投影、夹角与前后判断
点乘的计算公式是各分量相乘再相加:A·B = Ax*Bx + Ay*By + Az*Bz。它的几何意义更关键:A·B 等于向量A的模乘以向量B的模,再乘以它们夹角的余弦值。即 A·B = |A| * |B| * Cos(θ)。
这个公式衍生出几个超级实用的变种:
- 计算投影长度:向量A在向量B方向上的投影长度 =
(A·B) / |B|。如果B已经是单位向量,那么投影长度直接就等于A·B。这在判断一个物体相对于另一个物体的“侧面偏移量”时很有用。 - 计算夹角:如果A和B都是单位向量,那么
A·B就直接等于Cos(θ)。用Mathf.Acos(Vector3.Dot(a.normalized, b.normalized))就能得到弧度制的夹角,再乘以Mathf.Rad2Deg就是角度。我常用这个来判断敌人是否在玩家的视野锥形范围内。 - 快速前后/左右判断:这是点乘在游戏AI中最经典的用法。假设你操控的角色面朝方向是
forward,另一个敌人相对于角色的方向向量是toEnemy。计算Vector3.Dot(forward, toEnemy.normalized):- 结果 约等于 1:说


450

被折叠的 条评论
为什么被折叠?



