所面临的挑战
在撰写本指南时,有 4.500万注册团结3D开发者它比其他任何视频游戏开发软件都更受欢迎. 它可以制作手机游戏,也可以制作增强现实和虚拟现实游戏. 爱好者和专业人士都可以访问它, 因此,在面试过程中,你可以期待各种水平的开发人员. 然而, 这只是战斗的一半, 因为在团结3D开发平台中有广泛的技能集. 本指南不仅将帮助您识别和雇用团结3D开发人员, 但这也将帮助你确保游戏引擎开发者能够完美地满足你的项目需求.
团结3D是目前最流行的游戏开发软件
按要求缩小候选人范围
团结是非常多样化的, 因此,作为一名团结3D游戏开发者意味着你必须拥有广泛的主题经验. 这是一个关键点, 因为你的面试对象可能是顶级团结3D游戏开发专家, 但仍然不适合你的需求,因为他们的技能可能不一致.
理想情况下,你需要一个“以前做过”的候选人。. 例如,如果你正在制作一款3D主机游戏,他就应该在此之前发行主机游戏. 另外, 应聘者可能是优秀的2D手机开发者, 虽然他有可能很快掌握3D技术,但这不是我们讨论的重点. 更进一步说, 即使他在你所瞄准的特定平台上有经验, 你可能想把注意力更集中在他完成的任务上,并将它们与你需要的任务进行比较. 团结3D开发者发行了一款大型3D手机游戏,这听起来可能令人印象深刻, 但如果他的经验仅仅是游戏的UI/UX, 他可能无法帮助你为即将问世的游戏创造AI或游戏逻辑.
因此, 你必须明确自己的目标平台, 以及你需要什么样的技能. 在你开始找工作之前,这里有一些问题需要在心里回答.
问:你们将支持哪些平台?
团结3D支持 广泛的平台,包括手机、主机、Web、PC、Mac、VR、AR等.
而团结能够轻松地将游戏部署到各个平台上, 应聘者必须在你想要的平台上发行过至少一款游戏, 因为在开发过程中,每个平台都有自己的细微差别. 例如, 由于HTML5画布的安全限制,WebGL目标不支持一些库和特性.
问:这个项目是2D还是3D的?
而团结3D最初只支持3D和带有第三方插件的2D, 它现在原生支持2D项目. 许多开发者在这两方面都有经验, 但有些人可能更倾向于这两种环境中的一种, 因为它们都有各自的技术障碍. 例如, 3D开发可能需要更广泛的摄像头, 照明, 纹理, 和模型, 而2D开发可能更关注精灵, 动画, 和渐变.
问:这是一个现有的项目还是一个新项目,使用的是哪种语言?
如果你正在处理一个现有的项目, 你需要弄清楚面试者是否精通团结Script或c#, 因为团结3D支持两种语言,而你的源代码通常使用一种语言. 测试他们的c#或团结Script编程技能是很重要的, 除了本文件中列出的问题之外.
问:该项目将与后端服务器集成吗?
申请人是否有使用团结3D的经验 使其
类,或者有使用RESTful API处理自定义后端的经验? 验证申请人使用后端服务经验的一个示例问题可以是:“您如何从团结3D访问RESTful API ??“可能的解决方案包括使用团结 WWW
类, HttpWebRequest
,或使用团结3D的资源存储和下载 最好的HTTP. 的 最好的HTTP 要花钱,但在很多情况下,这是值得的 WWW
类缺少一些特性和 HttpWebRequest
不是所有平台都支持.
问:这个项目会有单人AI吗?
评估某人AI能力的范围不在本指南的讨论范围之内. 然而, 一个好的起点可能是问他们如何在网格上的两个方格之间导航. 解决方案应该包括它们递归地检查相邻的方块,同时跟踪它们已经访问过的位置,直到到达目的地. 接下来的问题可能是如何确保解找到最短距离. 在这种情况下, 它们将需要跟踪递归过程中行进的距离,并忽略任何超过找到的最小距离的路线.
问:面试者会负责UI/UX吗?
团结3D中有各种各样的UI工具. 问题是,他们对哪一个最有经验,他们更喜欢哪一个? 被采访者应该知道每一个的优点和缺点, 并且能够描述为什么他们更喜欢其中一个.
最新的团结版本5提供了自己的UI uGUI
, 但在目前的形式下,它有一定的局限性,并且缺少许多可以被认为是标准的组件, 比如下拉菜单. 其他常用的UI平台有 同时
和 2 dtoolkit
. 同时
可能是最受欢迎的选择吗, 因为它支持开箱即用的小部件的数量, 但它可能很复杂. 总之,团结是原生的 uGUI
是否应该使用,只要它的基本特征涵盖了项目的需要. 如果没有,那么 同时
值得考虑. 另外, 如果受访者选择了不同的工具集, 然后他们应该能够给出合理的理由.
技术问题
问:请解释什么是预制件,什么时候使用.
预制件是一个模板 GameObject
. 它包含对象本身,以及附加到它的子对象和行为. 预制件很有用,因为它们可以重复使用, 如果你对预制件做了改动, 它将更新项目中的所有实例. 例如,在游戏《欧博体育app下载》中,可以将预制件用于小行星. 开发者可以通过参考预制构件在太空中生成多个相同的小行星. 晚些时候, 如果美工想要改变游戏中所有小行星的颜色, 这就像在单个预制件中改变一个纹理一样简单.
对于任何关卡的团结3D开发者来说,这应该是一个直截了当的问题, 但这也引出了一些更具挑战性的问题.
问:在游戏《欧博体育app下载》中,当一颗小行星爆炸时,它会被三个更小的小行星所取代. 为这个事件实例化三个预制件的缺点是什么?
在团结运行时中实例化预制件在CPU上是非常昂贵的. 在CPU广泛的游戏或贫乏的计算机系统, 当实例化发生时,你会看到帧率明显下降. 因此, 在行动中间实例化预制件通常是糟糕的设计, 当小行星爆炸时,玩家将经历一个障碍或延迟.
问:解释如何减轻实例化预制件的性能限制.
前面提到的减少延迟的一个可接受的做法是创建对象池. 对象池是在使用前实例化的对象数组. 当有大量的项目需要使用时,这一点尤其有用, 比如我们例子中的小行星. 脚本可以加载所需数量的对象,并在数组中存储对每个对象的引用. 当小行星生成时,它们将从阵列中移除,并在场景中可见. 当小行星爆炸时,它们将从场景中删除,并存储在阵列中以供重复使用.
另一种解决方案是在场景中加载对象. 当需要使用的对象数量很少时,此解决方案通常效果最好, 这样可以方便地管理场景中的资源. 一个很好的例子就是每次玩家的飞船爆炸时都会出现粒子爆炸. 对象池在这里没有意义, 考虑到在场景中只需要一个这样的预制件, 假设你的飞船只能爆炸一次. 但是您还希望避免在运行时实例化效果, 因为它可能会在死亡序列中延迟或卡住. 因此,在这种情况下,在场景中保留一个引用可能是最好的选择.
问:请解释使用对象池的缺点,以及如何减轻它们?
对象池出现的问题是,每个对象都需要存储在内存中. 这在诸如移动设备之类的低内存设备上可能是一个问题, 因为您可能无法在分配的内存中存储对可能生成的所有内容的引用.
缓解这个问题需要在内存崩溃和CPU延迟之间取得平衡. 首先也是最重要的, 应该使用编译时宏来确保优化和裁减只影响低端机器, 在高端机器上,对象池仍然被充分利用. 在低端机器上, 应该谨慎使用对象池和缓存,因为只有高频选项应该放在池中, 并且尽可能少地使用物体以获得更好的体验. 低频对象可能需要在运行时启动, 在低端设备上造成偶尔的延迟, 或者,可能需要做出设计决策,为低端机器移除这些对象. 例如,粒子效果和爆炸可能需要从低端体验中移除. 没有粒子的流畅游戏比有粒子的滞后游戏更受欢迎. 缓存的资源应该在不再使用时立即清除. 有些机器提供低内存警告,这有助于确定何时需要清除缓存.
问:谈谈你将如何组织《欧博体育app下载》游戏的职业?
这是一个非常广泛的问题,有许多可以接受的答案. 这个问题的重点是关注开发人员何时选择使用组合而不是继承. 如果他们回答得不够充分, 你可能需要把他们引向正确的方向, 或者直接要求他们描述在团结环境中组合与继承的优缺点.
首先,继承意味着一个类扩展另一个类. 一个例子是一个类 橙色 可以扩展父类 水果. 类 水果 会定义诸如种子类型之类的属性吗. 橙色 属性继承自 水果 类,所以它也有种子,但它也扩展了 水果 类的附加属性,如具有剥离.
另一方面,组合用于组合多个类. 在 橙色 在上面的例子中,没有 水果 class. 我们可以开一节课 种子 另一个是 皮. 的 橙色 然后存储对 种子 类和 皮 类,因此它将由这些类组成.
团结广泛使用合成, 因为它的基础依赖于实体组件或实体行为体系结构模式. 在这方面,场景中的一切都被认为是一个 GameObject
,或实体. 每一个 GameObject
包含定义它的行为或组件的列表,根据定义,这是组合.
因此,回到最初的小行星问题. 受访者应该以一种利用实体行为模型的方式构建他们的类. 在游戏《欧博体育app下载》中,有两种类型的敌人,小行星和外星飞船. 下面我们将通过比较使用继承和组合的实现,看看如何将这些敌人类型分解为类.
继承
在继承设置中,很可能需要三个类. 我们将调用的基类 敌人,然后是我们将调用的两个派生类 小行星 和 AlienShip. 基类将处理两个类共享的所有功能 小行星 和 AlienShip 比如追踪生命值. 派生类将添加额外的功能. 例如,派生的 AlienShip 能处理飞船的飞行和射击功能吗.
作文
在组合设置中,我们很可能会以相同的方式开始 敌人 处理生命值的类. 但我没有扩展它, 我们将使用团结的实体行为模型为其添加额外的行为(类),从而添加我们所寻求的功能. 要创建外星飞船,我们可以创建一个处理移动的类(MovementBehavior),另一个负责射击(ShootingBehavior). 然后我们将这三个类连接起来, 敌人, MovementBehavior, ShootingBehavior 到一个 GameObject
创造外星飞船.
乍一看,继承似乎更直观, 但随着游戏设计的复杂性和新功能的增加, 它变得非常难以管理,因为每次更改都可能更改所有派生类. 作文, 另一方面, 是非常灵活的,并允许开发人员创建新的功能, 或者在这种情况下是敌人, 只需添加和删除行为. 也就是说,这两种设置都是适合的,具体取决于场景. 在面试过程中,关键是要确保被面试者知道这两种选择都存在, 并且可以解释为什么他们会选择其中之一.
问:解释什么是抽签召唤.
Draw Calls是处理器在渲染场景时需要改变材质的次数. 如果一个场景中有100个物体, 每个都有独特的材料, 然后会有100次抽签. 然而, 如果每个对象使用相同的材料或精灵表, 然后,所有100个对象都可以在一个draw调用中绘制.
问:如何减少抽取呼叫?
Draw调用可以通过批处理图像来使用相同的材质或精灵表. 例如,在一款2D游戏中,我们可以让一个角色的头部、身体和腿部都有精灵. 每个精灵都是独一无二的,因此需要三次绘制调用来渲染角色. 为了减少这种情况, 我们可以将这三个精灵组合成一个单一的精灵表, 然后绘制调用将减少到一个,因为所有三个部分可以一次绘制.
一个好的后续问题是,角色拿起一件斗篷,它出现在头部上方,但在身体后面. 斗篷和角色在不同的精灵表上. 在两个精灵表上渲染角色和斗篷需要多少次绘制调用? 答案是3. 即使涉及到两个精灵表,z轴顺序也会导致三个开关发生. 首先,角色精灵表用于绘制头部. 然后,使用披风精灵表绘制披风. 最后,使用角色精灵表绘制身体和腿. 身体和腿不能与头部同时绘制,因为斗篷出现在它们之间.
问:你如何发现内存泄漏?
这个问题的关键是确保开发人员了解剖析器的来龙去脉,并经常使用它们. 该分析器有一个内存部分,允许您对存储在内存中的所有内容进行详细快照. 然后,您可以搜索该列表并查找需要清理的任何内容. 向项添加名称有助于在列表中区分它们.
Summary
我们只是抓住了成为顶级团结3D开发人员所需知识的冰山一角. 我们希望本指南中的问题和答案能够帮助您找到适合您项目的理想开发人员, 不仅仅是寻找顶级的团结3D开发者, 但是要为您的特定需求找到最好的开发人员.