面试精粹


Unity3D 游戏同步浅析(一):游戏模式

根据游戏中玩家之间的互动方式,可以将多人交互类型的游戏大体上分为两个类别,分别为MO与MMO这两种典型的模式,它们有着完全不同的侧重点和技术架构。 多人在线游戏(Multiplayer Online)指的是少量玩家聚集在一起的竞技游戏。它的侧重点是实时对战的战斗乐趣,因此游戏追求 […]


Unity3D 动画事件(二):基于时间的事件

另一种常见的事件是逻辑型事件。虽然它也与动画的状态紧密相关,但这些事件中包含着逻辑处理。例如,角色在攻击动作的过程中触发伤害。或者在攻击出拳的动作过程中向前移动,遇到敌人就停止移动。这些事件与逻辑紧密相关,已经不仅取决于美术的表现效果,更多是数值与逻辑的合理性。 对于这种事件,采 […]


Unity3D 动画事件(一):动画触发

对于显示型事件,比如播放声音或特效,通常采用基于动画的事件。尤其是当动作之间存在复杂的混合时,这种事件编辑方式尤为重要。例如,开枪动画与行走动画进行混合,以求达到边跑边开枪的动画效果。在开枪时要播放弹壳四散的特效,跑步时要播放脚步声,由于开枪动作与跑步动作的时长不同,为了使两者融 […]


Unity3D 时间计量方式(三):间隔时间

有了上面的概念,间隔时间就好理解很多。间隔时间的计算方法为两帧之间的差时。它也会用在很多场景中,例如:在计算距离时,我们通常会用间隔时间与速度相乘,这样得到的结果就是每秒的位移,而不是每帧的位移。 理想情况下,帧率不会发生改变,也是就说逻辑计算的频率是固定的。如果游戏时间线缩放变 […]


Unity3D 时间计量方式(二):游戏时间线

游戏时间线(Game TimeLine)是应用更广泛的时间计量方式。它以游戏世界的时间流逝速度为标准度量时间。很多情况下,它与真实时间线不同。例如,当游戏呼出暂停菜单时,真实时间仍然在流逝,而游戏时间却应该停止。又比如,在回放战斗录像时,我们希望快进整个战斗过程,这时游戏时间就要 […]


Unity3D 时间计量方式(一):真实时间线

为了方便理解和说明,我们会将游戏中的时间想象成一条沿着X轴正向的射线,这被称为时间线(TimeLine)。游戏的时间为沿着射线不断向正方向扩充的矩形区域。射线的原点与矩形的起始点为相对的零点。 具体到真实时间线,它的起点为一个逻辑上的零点,它可以是设备的开机时间,也可以是游戏开始 […]


Unity3D 游戏循环分析(五):追赶模式

这种模式可以更好的处理掉帧引发的逻辑问题。大体思路是,当出现掉帧时,只运行逻辑,不绘制画面,用节省下来的时间追赶落后的帧。这种策略会降低图形绘制的频率,但可以保证逻辑的执行。 具体说来,每次Render执行之前,要保证累计运行时长到达阈值。如果出现卡顿,后面的帧会多次执行Upda […]


Unity3D 游戏循环分析(四):固定帧率模式

一般说来,我们有个期望的帧率,如果每帧的运行时长短,那么帧率就会超过预定的标准,因此我们通常会在循环的末尾加入延期等待。假定我有个Sleep函数可以阻塞线程执行,那么这个模式的代码结构如下:

在这种结构中,帧率不会 […]


Unity3D 游戏循环分析(三):设计循环

了解Unity自带的生命周期函数之后,再看看游戏循环应该如何设计。游戏归根结底是由交互序列组成的。因此它必然会有一个基础的结构:

从这个层面看,游戏循环由三部分组成,分别是 非阻塞的用户输入 更新游戏逻辑状态 渲染 […]


Unity3D 游戏循环分析(二):重写模版脚本

在实际项目中,我会通过更改代码的模板文件,来优化生命周期函数的使用方式。在Unity的安装目录中,有创建代码的模版文件。通过自定义这个文件,可以更改创建默认文件的内容。文件目录为: Windows: Unity安装目录/Editor/Data/Resources/ScriptTe […]


Unity3D UGUI事件分发(三):类图

相关实现类有好多,大体分两部分,一部分是功能类,一部分是编辑器类。 功能类按照上一小结的事件体系可以清晰的找到重要的基类,他们的UML图如下: 这个图只是和点击相关的部分,当然还有很多其他的功能例如拖拽,滑动等等。不过如果能找到这些重点,其他逻辑相信大家可以结合代码自行推导。 另 […]


Unity3D UGUI事件分发(二):实现分析

在Unity3d中,功能模块的每个部分都有对应的实现类。 监测器(Monitor)对应类为EventSystem。它重写了MonoBehavior的Update方法,会在每一帧更新挂载在同一个GameObject上的采集器组件状态,并判断是否应该激活派发器,如果是,则去调用各个派 […]


Unity3D UGUI事件分发(一):事件体系

事件体系的基础是设计模式中的观察者模式,因此按照标准的Subject和Observer来解读没有任何问题。但在这里,我更希望以功能为导向,将事件体系划分成更易于理解的模块。按我的划分方式,事件体系由四部分组成,分别是: 监测器 采集器 派发器 响应器 这四个模块大致的依赖关系如下 […]