这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
跟随青训营老师简单了解3D开发,记录笔记如下:
3D实体搭建
3D实体的绘制: 关注的就是材质,颜色,纹理。
3D实体的位姿态,在unity中,多数情况下时先缩放,再旋转,最后平移。
预制体: 将游戏对象保存在工程中,在需要的时候创建出来,这就是预制体。
相机,光照,游戏盒
相机:
- clear Flag
- 背景颜色
- Culling mark
- 投影
两种投影:
透视投影:近大远小
正交投影:远近平面一样大
光照:
- 类型:点光源,平行光,聚光灯,面积光
- 颜色
- 强度
- 阴影类型
天空盒
-
概念:游戏中的天空盒是一个包裹整个场景的立方体,可以很好地渲染并展示整个场景环境。
-
学习配置天空盒:
-
相机的清除标志设为“天空盒”。
-
窗口-渲染-照明-环境-天空盒材质设置。
控制与碰撞
实时游戏时序
3D 实时游戏的执行时序
-
实时游戏的运行帧
-
帧率60可以流畅运行,帧率30差强人意,帧率20及以下会感受到明显卡顿
-
帧率60意味着每一帧运行时间16.67毫秒
-
一帧内,需要执行物理计算(含运动学与动力学计算、碰撞检测)、用户输入检测、游戏逻辑执行、渲染画面,如果时间还有富余,停顿到16.67毫秒。
-
游戏中的实体有静态的实体,也有动态的实体。对于动态的实体,我们需要为其设置刚体属性、碰撞/触发属性或执行脚本。
-
游戏的优化主要是减少物理、逻辑或渲染中的运算量。例如减少无意义的碰撞检测,用更少的计算量达到相同的执行目标,在用户感知不到差异的前提下尽可能裁剪渲染。
刚体组件 RigidBody
- 概念:刚体是指在运动中和受力作用后,形状和大小不变,而且内部各点的相对位置不变的物体。现实生活中,刚体受力后,运动状态会发生改变(牛顿第一定律);相互作用的两个物体之间的作用力和反作用力总是大小相等,方向相反(牛顿第三定律)。
- 但是在 3D 游戏中,刚体的性质遵守游戏设定的规则而不是牛顿定律。例如悬浮在空中的踏板、空气墙、无论多大的力都推不动的石子、不受重力作用的裙子。
- RigidBody 组件中的 Use Gravity:顾名思义,指示当前刚体是否受重力作用。
- RigidBody 组件中的 isKinematic:是否受脚本规则影响运动而非受牛顿定律控制运动状态。
- RigidBody 组件中的 Constraints:是否在某个坐标轴上冻结位移状态或旋转状态。
碰撞盒组件 Colider
-
碰撞盒之间进行碰撞检测,当碰撞盒A与碰撞盒B碰撞时,会调用碰撞盒A所在对象的 OnCollisionEnter 方法,并将碰撞盒B作为参数传入;同时也会调用碰撞盒B所在对象的 OnCollisionEnter 方法,并将碰撞盒A作为参数传入。
-
如果将碰撞盒的 Trigger 勾选,那么这个碰撞盒会成为触发器,不会碰撞其他碰撞盒或给其他碰撞盒施加力,会穿过其他碰撞盒,仅检测是否与其他碰撞盒重合,触发的事件为 OnTriggerEnter 。
-
可以通过配置图层 Layer 与 物理规则 Physics 来指定哪些实体之间会进行碰撞检测,减少碰撞检测次数。
-
菜单栏中执行 Edit > Project Settings > Tags and Layers 命令可以设置项目中的Tags或Layers。
-
菜单栏中执行 Edit > Project Settings > Physics 命令可以设置项目中不同Layers之间的碰撞规则。
-
可以选中 GameObject 设置其 Tag 和 Layer。