第3章:游戏对象基础

好,咱们今天来聊聊Unity里最核心的东西——游戏对象。说白了,你在Unity编辑器里看到的每一个东西,几乎都是GameObject。不管是主角、敌人、灯光,还是空荡荡的节点,它们本质上都是同一个东西:GameObject。

我记得刚入行那会儿,有个同事问我:“为什么Unity里啥都是GameObject?那它们有什么区别?”我当时也懵了一下。后来才明白,GameObject本身就是一个容器,它本身啥也不干,真正让它“活起来”的,是挂载在它身上的组件。

3.1 游戏对象(GameObject)的概念

GameObject,你可以把它想象成一个空盒子。这个盒子本身没有颜色、没有形状、不会动、不会发光。但你可以往里面塞东西——塞一个Mesh Renderer,它就能显示模型;塞一个Rigidbody,它就有了物理效果;塞一个脚本,它就有了自己的行为逻辑。

核心理解:GameObject = 空容器 + 组件 = 功能实体

每个GameObject都有一个Transform组件,这是它自带的,删不掉。为什么?因为一个物体必须存在于场景的某个位置,必须有旋转和缩放。Transform就是干这个的。

我建议你养成一个习惯:在Hierarchy面板里,给每个GameObject起个有意义的名字。别用“Cube (1)”这种名字,项目大了你根本找不到。我在项目里见过一个场景,里面有50多个“Sphere (23)”,那叫一个酸爽。

3.2 创建基本几何体

Unity内置了几种基本几何体,也叫Primitive。它们非常适合做原型、测试碰撞、或者当占位符。

创建方式很简单:
右键Hierarchy面板 → 3D Object → 选择你想要的几何体

常用的有这么几种:

几何体 用途 个人经验
Cube 墙壁、箱子、建筑原型 我经常用Cube搭场景白模,快速验证关卡布局
Sphere 弹丸、球体碰撞体、装饰 注意Sphere的碰撞体是球形的,做角色碰撞不太合适
Plane 地面、墙面、UI背景 Plane只有一面渲染,从背面看是透明的
Capsule 角色碰撞体、柱子 做FPS角色时,Capsule是最常用的碰撞体形状
Cylinder 柱子、管道、装饰 圆柱体的碰撞体是胶囊体形状,注意这个区别

小技巧:按住Ctrl键拖动创建好的几何体,可以快速复制。我开发时经常用这个功能快速搭建测试场景。

3.3 变换组件(Transform)详解

Transform组件是每个GameObject的标配。它控制三个核心属性:位置(Position)、旋转(Rotation)、缩放(Scale)。

3.3.1 位置(Position)

位置就是物体在三维空间中的坐标。Unity使用左手坐标系:

  • X轴:左右方向
  • Y轴:上下方向
  • Z轴:前后方向

你可以在Inspector面板里直接修改Position的数值,也可以拖拽场景里的箭头(移动工具)来调整。

嗯,这里要注意:Position的值是相对于父对象的。如果一个Cube的父对象在(5,0,0),而Cube自己的Position是(2,0,0),那么它在世界空间中的实际位置是(7,0,0)。

我曾经在项目里遇到过一个bug:一个角色怎么都跑不到目标点。查了半天,发现它的父对象位置一直在变,而角色用的是局部坐标。说白了,就是没搞清楚局部坐标和世界坐标的区别。

3.3.2 旋转(Rotation)

旋转控制物体的朝向。Unity使用欧拉角(Euler Angles)来表示:

  • X轴旋转:俯仰(Pitch)
  • Y轴旋转:偏航(Yaw)
  • Z轴旋转:翻滚(Roll)

你可以在Inspector里直接输入角度值,或者使用旋转工具(快捷键E)在场景里拖拽。

避坑指南:我曾经在做一个炮塔旋转功能时,直接修改了Transform的欧拉角,结果出现了万向锁(Gimbal Lock)——炮塔在某个角度突然卡住,旋转方向完全乱套。后来改用Quaternion(四元数)才解决。

记住:在代码里操作旋转时,尽量用Quaternion,别直接改eulerAngles。

3.3.3 缩放(Scale)

缩放控制物体的大小。默认是(1,1,1),也就是原始大小。

  • 大于1:放大
  • 小于1:缩小
  • 负数:翻转(镜像)

你想想看,如果Scale的X设为-1,物体会左右翻转。这个技巧在做对称物体时特别有用——你只需要做一半模型,另一半用负缩放镜像就行。

我建议你在做UI时,尽量用RectTransform(UI专用的变换组件),而不是普通Transform。因为UI的缩放逻辑和3D物体不太一样,用错了会出现奇怪的拉伸。

3.4 实战小练习

光说不练假把式。咱们来个小练习:

  1. 创建一个Cube,命名为“Player”
  2. 把它的Position设为(0, 1, 0),让它悬空
  3. 把Scale设为(2, 1, 1),让它变扁变宽
  4. 创建一个Plane,命名为“Ground”,放在(0, 0, 0)
  5. 把Player放在Ground上方,调整位置让它们刚好接触

做完这个,你就掌握了GameObject和Transform的基本操作。是不是很简单?

我的习惯:每次创建新物体,我都会先重置Transform(右键Transform组件 → Reset)。这样能确保物体从原点开始,避免后面出现奇怪的偏移。

3.5 本章小结

GameObject是Unity世界的基石。它本身是个空壳子,但挂上不同的组件,就能变成任何东西。Transform是它的身份证,决定了它在世界中的位置、朝向和大小。

下一章我们会聊组件系统——怎么给GameObject添加功能,让它们真正“动起来”。到时候你会发现,理解了GameObject和Transform,后面的东西学起来就顺多了。

嗯,今天就到这儿。去动手试试吧,光看是学不会的。