一家动漫公司,好像是去年开的游戏业务,做的是一款上线 steam 的 3d rpg 游戏。

一面(1h)

1.写出你知道的生命周期函数和使用场景

+ Awake(): 对象被实例化之后调用,不论对象是否处于 Active 状态且脚本是否被激活,只调用一次,用于进行变量的初始化工作
+ OnEnable(): 在 Awake() 之后调用,每一次脚本被激活就会调用一次,通常用在一个GameObject会被取消激活并且每次激活都要进行初始化等操作时,且在里面初始化的东西可以在热重载中保留。与之相对的还有 OnDisEnable() 
+ Start(): 在 Awake() 和 OnEnable() 之后调用,要求对象被设置为Active且脚本被激活,只调用一次
+ Update(): 在Start之后调用, 需要对象被设置为Active以及脚本被激活, 每次渲染(一帧)调用一次,用于改变状态
+ LateUpdate(): 在每一帧渲染之后调用, 如果有多个脚本,则会在执行完所有脚本的 Update 之后才会调用, 常常用来处理摄像机跟随、相机控制和其他需要在对象位置被更新后执行的任务
+ FixedUpdate(): 和 Update() 类似,但是是间隔固定的时间步长调用一次,适用于不想受到帧率波动影响的操作

2.给了两个 C# 代码,问输出

这个题当时答错了,主要是考第一帧的时候,会不会调用 Start 的问题,注意空引用

3.层级检测
位运算

4.设计题, 如何检测 3d 人物前方半径为 5、张角为 120 度范围内的敌人,给出伪代码,详细到 api 即可。
直接用球形碰撞检测,然后获取到每一个敌人的位置,再利用两个向量判断是否在指定区域内

5.射线检测,忘了题目是啥

6.ugui 题

7.ugui 题

ugui 用的不多,不怎么熟,乱答的

8.设计题,由同一个 prefab 实例化出来的小球,发生碰撞后发出声音,需要添加哪些组件,以及如何实现
首先要进行碰撞检测,要发生碰撞,要求两个小球都有 Collider 组件,至少有一个有 Rigidbody 刚体组件,发生碰撞后会返回一个回调函数(OnCollisionEnter), 检测到碰撞之后发出声音,使用 AudioSource 播放 AudioClip 。

9.第八题的扩展
(a). 如果两个小球, 要求只能发出一个声音如何解决
(b). 有成千上万个小球,每两个小球碰撞都发出一次声音。

(a). 只给其中一个小球添加声音组件
(b). 因为有很多小球实例,可以直接给预制件添加组件或者使用 [RequireComponent] 自动给小球添加组件,又因为同一时刻只能发出一次声音,所以考虑创建一个 int 变量维护小球当前时刻发生了多少次碰撞,考虑对这个数据进行数据重用,数据重用有两种方案,首先是使用静态变量进行全局访问,其次是使用单例模式,只创建一个实例进行维护。

10.设计题,3d 人物,设计移动残影,并给出性能分析
没遇到过,想了一个暴力方法,序列化一个 count 变量固定残影的数量,然后维护一个 Vector3[] , 然后每次更新都将当前人物的位置加入到数组中,类似于滑动窗口的方式来固定维护,然后每次更新就对这个数组里的每个位置都显示人物,因为是残影,可以考虑从后往前降低 alpha 通道的值来使得人物变得逐渐透明,又因为考虑到更新速度太快可能会导致残影效果不明显,所以还可以序列化一个 deltaTime 变量,只有当当前的 FixedUpdate 方法与上一次记录位置的 FixedUpdate 的间隔时间达到 deltaTime 之后才记录新的残影位置(Update 的话可以考虑维护帧数量,但是这样会受到帧率波动的影响)。

二面(1.5h)

全程拷打项目,直接打开项目让你讲,然后讲的过程中对针对你的设计进行一些提问,问你为什么这么做以及有没有更好的办法。开始的时候很紧张说不出来,好在面试官很好,对引导性地进行提示,后面就顺很多了。

oc

最后接了这个 off,一方面是主程感觉人很好,面试的时候学到了很多东西,印象分加了很多。另一方面是下学期还有课,可能偶尔还得回一下学校,这个公司正好在武汉,方便一点。还有一点原因是听说这家公司的几个创始人是以前迪士尼的,参与了疯狂动物城、冰雪奇缘、超能陆战队等动漫的制作(我以前很喜欢疯狂动物城),所以比较好奇,想去看看。

目前的打算是边在这里实习,等三月份开始投暑期实习,下一站想去上海或者深圳。