Unity面试和总结分析(四)


距离上次找工作过去了一年多,因为一些情况从公司离职了,又一次开始了找工作的路,想想一年多的开发,还是学习到了不少东西的,不过也因为使用了一年多的cocos2dx和C++,中间又在业余时间玩了一段时间的cocoscreator和TS,对unity和c#感觉有些生疏,正好借面试机会以再对unity熟悉一下。
这一个系列的更新还是会以面试题为核心,逐题做出答案,可以通过实现验证的题我都会尽量给出实现,实现可能会放到另一篇文章,某些仅有问答的题可能答案不正确,如果有什么错误,欢迎在评论讨论和指出。

1. 如何制作一个具有三百个物品的背包系统
  • 当我拿到一个需求的时候,首先要想一下,一个背包应该有哪些功能——物品的获得、物品的展示、物品的操作;
  • 下一步再考虑一下,物品的获得并不是什么太大的问题,物品的操作可能需要跟外界有一个或者几个具体的功能接口,这时候需要定义一个中间接口,将数据传出再进行处理。
    那么物品的展示又有哪些呢?第一个肯定是在背包里显示出来,一般情况下三百个物品肯定不可能同时显示在界面上,界面上同时展示的数量是有限的;而另一个就是物品被选中后的展示。
  • 所以分析以后可以知道,这个问题的核心难点应该在于怎么合理地展示背包中的物品。如果一口气生成三百个物品的对象,那么肯定会造成卡顿,所以这里需要一个回收机制——对象池就不错,将已经不在显示范围的物品图标回收回对象池里,然后从对象池里将要显示的图标显示出来并根据数据进行显示。考虑到这里,我第一反应就是cocos2dx里给出的tableview机制,那么只要依样画葫芦就好了。
  • cocos2dx里的tableview机制是一套抽象的接口,首先有一个dataSource,这是物品的展示列表,也就是这一题里的三百个物品,然后有几个用于更新当前显示的reloadData函数,这个函数会调用接口里的另一个函数tableCellAtIndex,通过调用它来获取每一个物品,在这个函数里我们需要实现物品的设置;然后在滑动的时候需要对当前显示的所有对象进行判断是否已经不被显示,然后将期回收,同时显示出新的一排。
  • 需要注意的是,这样一来就不能使用grid组件了,而是需要我们来维护一个显示的layout,好在物品显示图标大小都相同,可以简单地layout。
2. Transform.find和Gameobject.find有什么区别

直接从答案来说,有这么几个不同点:

  1. 从成员方法类型上就有差别:Gameobject.find是一个静态方法,而Transform.find是一个实例方法;
  2. 从返回类型上来说,Gameobject.find的返回值也是一个GameObject,而Transform.find的返回值是一个Transform;
  3. 无论是物体自身原因还是它父物体的原因,只要它在Hierarchy中的active是false,那么就无法使用GameObject.Find找到,使用任何寻找方式都无法获取一个active为false的GameObject;而无论物体的active状态是true还是false,都可以使用Transform来找到;
  4. 两种Find都支持使用路径查找,但是只有GameObject支持使用超过脚本所在位置的路径进行查找,Transform的Find仅支持从子物体开始的路径查找;

具体测试过程结果可以点击这里查看

3. 冒泡排序的原理

排序可以说是老生常谈的问题了,不过我这一次在面试中只做了口述,在口述过程中就出现了一些关键字表达不够明确的问题,所以特地也拿出来说一下。
注意我下文中进行加粗和斜体的关键字。
冒泡排序的基本原理:
对一组长度为n的需要排列的数据从第一个位置的数开始,依次跟它后一个位置的数进行给定大小顺序规则的比较,假设是排序结果要求升序,那么当当前位置的数据比后一个位置的数据更大时,将此两个数据互换位置,再将对比的位置后移一位;重复上面的比较,直到与这组数据的最后一个数字(也就是n-1)完成这样的一次比较,完成后对这个操作进行计数,i = 1;
然后回到第一个数,再次循环上面的过程,但是这一次循环的最后一个数据的下标为n-2的数
继续循环上面的过程,直到n == i,就完成了一个完整的冒泡排序。

一定要特别注意上面互换这个关键字。

4. 谈一谈对MVC框架的理解

这个——我感觉也是答得并不算太好,也是在具体回答的时候有一些关键字漏了,还是要加强表达能力啊,面试总是有点儿紧张,不过以前倒也写过实例,可以点击这里查看

5. 在UI中显示两个粒子特效,然后在它们中间放一个Sprite,怎么保证它们之间的层级正确

这里有一个小坑,只说了Sprite,没有说是使用Image还是三维空间中的SpriteRenderer,两种方式有不同的实现方法。
如果是SpriteRenderer,修改Spriterenderer和粒子特效中Order In Layer参数(在Inspector中是Orider In Layer,在代码中是sortingOrder),根据自己的需要调整层级,数字越大距离摄像机越近。
如果是Image,那么需要使用两个Canvas,两个canvas不能使用ScreenSpace-Overlay模式,然后将三个物体以Z轴的值按顺序摆放即可。
更详细的分析和测试可以看这里

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值