Unity3D面经以及我个人对游戏研发学习路径的一些理解

首先非常感谢我的游戏研发砸门人麦扣大神的学习指导和帮助。顺带一提,他是b站大佬M_Studio,同时也是Unity官方认证讲师。暗示到此,快去关注~


写在前面

大家好,我是文若。
我是2021应届生,已收到hr小姐姐的微信确认和意向书,同时也是我的已心仪offer,岗位是 U3D开发工程师。同时祝贺在我拿到Offer的同时我一起退伍的战友蒋同学和叶同学也成功考研上岸!

面试的整体过程比较注重考察计算机基础。所以这篇我的面经更加偏向应届生校招和找实习,可能不太适合大佬们。希望可以对学弟学妹们有所帮助~

备注: 我是线下面,1场笔试,3轮技术面,1轮hr面。

笔试

35-40道题(好像是37我忘了,我记得是a4纸一共5面),答题时间要求45分钟。我做题前拿手机卡了时间,花了49分钟。
笔试题我大概它们分为四个部分,C#语法基础计算机基础Unity基础以及个人规划之类的。具体的题目我忘了,不是按照我分类顺序排布的,但是我把能想起来的全部分类题目简化列举写在下面,这些题就不写答案了,统一整理在面试文档里。

c#基础

  1. list和ArrayList的区别?
  2. private,public,protected,internal的区别
  3. 说一说什么是观察者模式?
  4. 委托和事件的区别?
  5. 什么是虚函数?
  6. 谈一谈重载与重写的区别?
  7. string和stringbuilder的区别?
  8. 什么是值类型和引用类型?他们在内存中是如何产生与销毁的?
  9. ref参数和out参数的区别?

计算机基础

  1. 什么是对象池,对象池在游戏中的应用?
  2. 协同和线程的区别?
  3. 什么是点乘、什么是叉乘,他们的实际应用?
  4. 简述什么是GC?并讲讲它产生的原因以及如何避免?
  5. 三次握手与四次挥手?
  6. 四元数的作用以及相对欧拉角的优缺点?

Unity基础

  1. 场景中放置多个相机并同时处于活动状态会发生什么?
  2. 了解Lod吗,说说它的优缺点?
  3. 列举Unity脚本从唤醒到销毁的生命周期?
  4. Unity中collider和trigger的区别?
  5. 物体发生碰撞的必要条件?
  6. 如何安全的在不同工程间迁移assets数据?
  7. 什么是prefab?
  8. MinMaping的作用?
  9. 相机移动应该放在哪个函数里?
  10. 动态加载资源的方式有哪些,并说明他们的区别?
  11. 游戏动画有哪几种?说说他们的原理?
  12. unity里支持哪几种shader?
  13. 如何适配Ui在不同分辨率下能够保持同一位置?
  14. Ngui和UGUI的优缺点?
  15. 简述MeshRender中material和shader创建的material的区别?

个人规划

1.你的3-5年的规划是怎样的?
2.你自己更青睐的技术和想学习的技术?

技术一面

一面考察的核心主要还是以数据结构和算法为主,其实老师问了我很多问题,我忘了当时问我啥问题了,简单能想起来2-3个。但面试官呢是一个白色长T的小帅哥,用小是因为我觉得这位学长看起来年龄并不大,我猜是职场1-2年的那种。因为他茂密又乌黑的长发~确实很潇洒。

1.算法了解的多吗?说说你知道的排序算法?
这是他问我的第一个问题,也是一个开始埋雷的问题。这里千万只回答你最熟悉的那些排序算法,如果说了知道名字但不了解原理的请一定要说清楚自己不太会,并且告诉面试官你擅长的排序算法,这是因为因为接下来就会让你手撕排序。

2.详细讲一下快排吧?
果不其然,接着问题就让我来详细讲一下,注意是详细。快排算是面试中很高频的问题。我自认为我这一个问题回答的还算满意,因为面试官后来也没有追问我。首当其冲需要对快排原理的实现必须阐述清楚,可以按照关键词的思路来回答,标的hou piao定点、递归、然后还需要考虑到快排的时间复杂度,在算法中的应用,在现实中的应用。优点,相较于归并排序的区别,这里把归并放在一起来说是因为我对归排序很熟悉。如果不熟悉,就不要比较了。

3.关于GC垃圾回收
这个问题很简单,笔试也回答过了,但是简单些的,这次回答的时候回答的更加详细了一点。

4.了解抽象类吗,虚函数呢?
因为涉及到面向对象,继承多态这些也要一并回答了。但是这个问题的延伸问题我并没有回答好。在我回答玩

这个问题面试官继续 5.那你知道接口和抽象类的区别吗? (难度系数+=1)

从而对问题再次深化“6.在实际的开发中,你会在什么时候使用抽象,什么时候使用接口,为什么”(难度系数*=2)我并没有回答好,这个问题的答案是需要使用组合,因为在实际开发中,不能为了抽象而抽象,也不可能说是为了分离接口而接口。

7.客户端和服务器通信数据传输的粘包和分包问题了解吗?
了解。回到优化机制这些,仔细描述一下数据传输为什么会粘包分包就可以了

8.那你是怎么解决粘包分包问题的?
每条数据前面都加一个int32类型的数据来存储这条数据的长度,解析的时候也就是分包时逆向解析。因为int32始终占4个字节,不会超过66325。数值传输的时候int32够用。
虽然回答上来了,但是面试官还是会说实际的项目中已经不会这么复杂。有很多可以运用的插件很好的解决。

技术二面

二面更多的关于我自己制作的Demo上的考察,也就是简历上的项目考察。

值得一提的是:线下面相对远程面有绝对优势就是你可以大胆的向面试官展示自己的作品,面试官可以通过你的演示直观感受你的作品要比通过简历上的文字来感受你的作品的效果好很多很多。说白了就是不要逼逼,给我上代码。

所以如果是线下面试,我个人觉得最好还是提前准备好自己的作品,不管面试官有没有提及说“能否看看你的作品”,你都应该当面试官问及你简历中项目经验的时候主动告诉面试官“老师,我有demo,能否展示给您看。”
一定要相信自己,展示的举动也是你加分的点,这会给面试官一个很好的印象,也是在4面的时候你可以谈薪资的资本。

那么该怎么提前准备呢?

  1. 项目应该是自己最熟悉且动手操作非常熟悉的。
  2. Assets文件夹必须整理有序,该分类的就分类,inspector窗口也应是如此。
  3. 修改自己的代码规范,多添加注释,尤其是个别文件的文档注释。比如Manager,Controller,Base类等
  4. 最好是在可以版本管理的,可以看到历史提交

二面的面试官是个高大而虚胖的和蔼小哥。应该是比上一位面试官更加资深一点。虚胖是因为看起来确实不是strong…这里并没有冒犯的意思,我感觉他比上一位面试官内向,所以都是些直接切入实操的问题。他看过我的简历后:“你这个项目。。。只是些文字。。。嗯。。。”
你这么说我就明白了,我不慌:“老师,我带作品了,我可以坐到你旁边吗?”

于是我又开启了我的巴拉巴拉模式。但是这里需要注意一个点,**向面试官展示作品的时候该以什么样的形式呢?**我个人的建议是 直接用编辑器打开,让他可以直观的看到你项目中的层级结构。才不需要用什么ppt,根本没必要,因为你面的是技术岗,你要展现的是技术,不是作品汇报,也不是作品演示。

拖麦扣老师的福,当我打开编辑器,面试官的第一句话是:“这是你自己做的吗?还是你和别人合作的?”
哈哈,其实我当时听到这句话的时候我已经明白了这是老师间接对我的小赞可。

所以问题又来了如何向面试官介绍自己的项目? 简历上的文字描述面试官已经看过了,其实他一点也不在乎我写的我用了什么什么样的技术实现了怎么怎么样的功能,让他在意的是你这些技术是怎么怎么用的。显而易见,抱着“我是怎么怎么制作这一功能的范式” 向面试官介绍自己的项目。

比如我向面试官展示的是一个RPG游戏。当我在点击鼠标移动Player的时候,面试官就会问,你这个导航用什么插件做的? 老师我使用的是自带的NavMeshAgent,然后细化的点击给老师看。你是如何设置,以及地图烘焙这些的。

再比如,当我向面试官展示游戏数据的保存和加载功能时。他问我这个 数据保存和加载你是怎么实现的呢? 既然问到代码,有什么比给他看源码更直接的了,不要怂,show 大魔王 your bug!。

 public void SavePlayerData()
    {
     
        Save(GameManager.Instance.playerStats.characterData, "PlayerData");
    }

    public void LoadPlayerData()
    {
     
        Load(GameManager.Instance.playerStats.characterData, "PlayerData");
    }

    // 存储方法
    public void Save(Object data, string key)
    {
     
        var jsonData = JsonUtility.ToJson(data, true);
        PlayerPrefs.SetString(key, jsonData);
        PlayerPrefs.SetString(sceneName, SceneManager.GetActiveScene().name);
        PlayerPrefs.Save();
    }

    // 加载方法
    public void Load(Object data, string key)
    {
     
        if (PlayerPrefs.HasKey(key))
        {
     
            JsonUtility.FromJsonOverwrite(PlayerPrefs.GetString(key), data);
        }
    }

上面这段源码就是我向面试官展示的代码,当我展示给面试官的时候,我该如何快速的告诉他有效的信息点。从这段简短的保存和加载代码你要让面试官清晰的感受到:

  1. Instance单例模式
  2. 数值ScriptableObject
  3. PlayerPrefs
  4. JsonUtility
  5. 代码规范,功能隔离。

其实面试官人很友好,问了很多我的具体实现,就将自己的实践就好了。

当面试官看到你的bug该怎么办? 不要慌,首先要不是礼貌尴尬的微笑,没有什么事十全十美的。然后告诉老师。“这是我目前遇到的一个比较尴尬的bug,还没能来得及处理,因为xxx产生了xxx这一效果,所以我猜测可能是xxx的原因造成的。” 具体问题具体分析。

不管自己的项目有多菜,再不自信也要实时求是。因为你的能力就隐藏在你的代码和你的展示之间。

技术三面

二面面试官走了以后,我以为是技术面结束了,因为之前的面试基本都是三面以内结束的(包括了hr面)。没想到…真正的大魔王才迎面走来…

三面技术官(CTO)是大佬中的大佬,佬中佬。吓得我字都打错了,是技术三面面试官。人高,体壮。一看就像打架很厉害的。。走路霸王色霸气,一副黑框眼镜陪衬黑色短袖彰显着威严。这就是大佬吗…

吓得我又忘记佬中佬问我什么问题了…我仔细回一下,时间线有点错乱…不好意思…

1. 平时都玩什么类型游戏? 2048可以吗…当然开个玩笑,手游,端游,steam。。游戏类型的话模拟经营,moba,rpg,顺便举下例子。

2.steam都玩些什么游戏?
人类一败涂地,啊我特别喜欢死亡细胞。同时我也在blibli关注了Stan李昂,她会经常发布一些最新的游戏动态。我想象着原来不是问技术啊舒服了,技术问题就来了。

3.你觉得做这些游戏,你对哪一方面比较感兴趣?
敌人的AI

4.那你会怎么去实现敌人的AI?你如战斗啊这些?
…有限状态机?我回答了一下ai都实现敌人哪些状态…

5.我看你这里说用过这个,那你是怎么写的呢?你用过哪些?
抽象类,if-else,枚举…

6.那你为什么要用switch,干嘛不用if-else?
…其实我也很难回答,因为if-else代码量太臃肿,switch代码映射关系很清晰…

7.你觉得你做Unity最拿手的三个是哪方面?
…(内心独白:等等我怎么这么菜,我好像没有什么拿手的)…老师我感觉我好像没有拿手的,我感觉都不精…

8.没关系,大胆的说把
UI,状态机,场景…

9.UI其实用处不大,很简单,我们的XX系统你倒是比较合适,那你对网络通信这块了解多吗?
不多…TCP吗?

10.不是,我是说PB,你后面可以多了解一下
好的老师。

11.那你是想做Unity哪一个方面,或者你觉得你来了喜欢去做哪一个方面?
这个问题是坑,还好我遇到过。老师,这个不是我想和我喜欢能决定的,我更多的希望是我在不偏移我自身规划的大方向基础上,公司要我做啥我就做啥。

12.嗯很好,那我再问下你,如果一个常规任务你在做,还有一个需要你花大量时间去攻坚的任务,你会怎么去平衡你自己的时间呢?
老师,这个看任务的优先级,假如我的常规任务很简单,且攻坚任务不紧促的情况下,那我肯定是先把简单任务干掉。但是攻坚任务很紧急的话,这个也要考虑自身的能力先衡量到底能不能真正的解决,先给定一个预期时间去攻克吗,如果到时间了还没有,立马请教大佬帮我解决。尽量不影响任务的进程而造成不必要的麻烦。

13.好的,你有什么问题想问我的吗?
接着差不多问了两个技术上的问题,一个是我需要明白我自己在团队中的定位角色,我被安排做什么,这个大佬前面已经讲过了,所以就不需要问了。因为他在面的过程中来逐渐判断你适合做什么,学习什么速度更快,也告诉了我说你看来比较适合xx系统。只要你觉得和自己合适就问关于作为我们面试者需要问我做这样工作我需要去学习哪些相关的知识
此外,还有一个问题可问也可不问,就是关于面试官对你的评价。为什么这么说,我个人其实觉得大可不必。这个看三轮面试和你笔试的结果你自身对自身的满意程度。要结合实际,心里有数就不问,心里不确定去问,不存在什么自信不自信的关系。大胆的问,一般来说,思路足够清晰的情况下,这个问题确实没什么必要,我看很多面经大家都要问评价,我觉得这个对于我们这种应届生来说不太合适,因为确实没经验,在一个从和面试官的交流之间是能感受到他对你满意或者不满意的态度的。真诚的眼睛是心灵窗户的窗户。对自身水平有一个清醒地认识也是面试能否面的满意的一个客观条件。

终结者hr面

关于hr面我不想说的过多,无非就是聊天,面我的hr是一位长者,确实是我见过的最好的hr了。特别和蔼可亲,我运气真的很不错,同时也觉得特别幸运。谈吐间就会很自然的放松下来,无非就是关于薪资,以及你的三观,抗压这几个大的方面。

但还是要有些注意的:

  1. 请你时刻保持自信
  2. 不做多余的解释,没有过多的理由。
  3. 请尊重你的面试官,说话看着他的眼睛。

还有一些必须注意的:

  • 公司的福利体系
  • 是否包食宿
  • 五险一金交多较少
  • 落户指标

如果hr问到有什么要问他的,大概是下面这些:

  • 我希望了解公司的发展方向,一直做轻度游戏,中度游戏还是重度游戏?
  • 我希望了解公司的团队文化
  • 我希望了解工资的涨薪是多久涨一次

最后切记,起身向你的面试官表示感谢,大家都是打工人都不容易,能面你的时间长短也代表着对你的重视程度,不感觉过如何,他们都应该是你取经拿offer的成长阶段。

写在最后

四轮面试其实让我感觉非常轻松,也非常开心。都是轻松的氛围,这种氛围也是一个公司文化的映射。最后收到的offer薪资,发展方向方面都很满意。在此,对我的面试官们表示感谢!

下面补充几个我想到的问题,想到我就加进来更新,大家也可以一起来完善这篇文章,给更多的学弟学妹们做参考和借鉴,真心希望我的文章可以帮助到还在面试中的或者即将面试学弟学妹们!

关于期望薪资写多少:
这个要先参考一下岗位的薪资区间,假如10-15k。你面试之前你自身把握超过50%,那就写14k,如果你非常自信,写15k,低于50%,同一写13k。不能再低了,因为根据你的面试结果,你再来定降多少。关于这个期望薪资,感谢慕课网运营白白学姐的细心讲解,她在我面试之前关于hr面给我讲了很多。非常感谢。

如何学习游戏研发(仅个人观点)

这是很多人都困扰的问题,其实大家都明白,只有两个字,自学。那到底怎么系统的自学,始终没有一个标准的答案。因为目前很多的大学并没开设专门的游戏专业,包括像我们软工,虽说是科班,但是和unity相关的都不学,游戏最重要的还是图形学,那问题来了,我前面为什么没有问我图形学呢?你看我的笔试题数,40-数目剩下的基本都是图形学相关,我明确的表示了我不会,面试官和没有问我。我在面试一开始我就已经说明了,老师,关乎图形学还有shader这方面的我没有接触过。

每个人的学习方法都不一样,总有合适和不合适的,但是面试却是一样的,那么面试游戏研发岗需要哪些知识储备呢?(我就我个人观点来罗列,可能比较适合计算机的学弟学妹们)

  • 计算机基础(编译原理、操作系统、图形学、计算机网络)
  • 至少深学一门编程语言,和C有关的,c++,c#或者c。
  • 引擎我就不说了,我用的是Unity,包括了常用api。
  • 数据结合和算法,算法分析
  • 3D数学,线性代数这一块的。

关于面试的高频考点

  1. 向量、点乘,叉乘
  2. MonoBehaviour等常用api、组件、生命周期
  3. 抽象类、接口
  4. 动态数组、栈、堆
  5. GC
  6. 资源分配
  7. 线程、协程

你可能感兴趣的:(游戏研发相关(Unity3D),游戏研发,面经)