本来想写一个系列的,一半是抨击现在面试之水,要人之奸,用大哥的话说,要走新手是做螺丝钉和抹布用的。另一半是对出出学校的或者是自废武功转3d的朋友们提供一个比较有价值的参考。不过我时间实在仓促。没有保证,写一点算一点吧。
先识别一下,你到了公司会让你干什么:
1.UI(面试题会偏向NGUI等ui操作,会考到一些简单的排序算法,数据结构,问题处理思路等)
2.数据逻辑层(会考到数据结构的搭配,配置表的构造等)
3.游戏控制流程(会考到状态机的设计,与服务器协议的设计,以及少量lua或python脚本编写内容)
4.项目架构(主程内容。。你懂得。反正我还不够格面这个。。)

UI的没什么好说的,去了之后天天layout,毫无乐趣,但是吧,新手都得虐过一次,才可以。数据逻辑层,也就是统筹整个游戏的后台运算数据,依照网络模块给予的数据,维护整个数据基的稳定和swift。这个工作与unity基本无关,但是是必不可少的,一般简历上写过什么acm之类的,会让你搞这个吧。游戏控制流程,至此开始进入高级程序员的行列,你会接触很多unity相关的内容,比如技能释放,角色换装,角色状态控制等等有趣的内容,通常如果你不是自废武功转3d或者再原来公司本来就干这个,只是干腻了跳槽而已,是不会让新手干这个的。项目架构这个略掉,我没资格谈这个。

说道这里本来应该结束废话的,但是可能引导大家对UI有了新的看法)——它不值得去做。其实不是的,UI这东西虽然无聊,但是是新手接触引擎,熟悉代码的最佳通道,同时也是所有公司愿意开放给各位新手的一个免费培训通道吧,因为UI代码很不值钱,你走了谁都能接上,所以他们愿意用新手。

下面来谈谈,如果我时面试出卷子的那个【sb】,我会问什么。这些问题都是项目中坑过我,害过我,让我哭让我痛得问题。
UI方面:
1.你觉得为什么UI摄像机和场景摄像机能协同工作,而且工作的这么尽如人意呢?
答案:UI摄像机和场景摄像机分别属于两个渲染层(Layer),所以它们之间的渲染互不干扰。它们工作得尽如人意(没有发生先后错乱,UI永远位于场景之上层)的原因就是因为摄像机深度(depth)控制的好。

2.你觉得怎么防止UI控件被点穿(如何过滤掉点击事件)。
答案:使用一个可渲染的物体或者pannel,绑定boxcollider组件即可。如果你单用一个不可渲染的物体(这里点cao一下UIwiget),即使设定了大小和boxcollider,也是无法屏蔽的。(坑在这里)。
3.关于UIGrid问题
答案:我基本不会使用UIGrid,我会直接在代码里设置localpos等等。(这个控件是很坑的)。

4.你对UI功能模块之间相互通信有什么好看法。(或者问成Broadcast和sendMes的看法)
(这道题目是我被面的一道题目,相当精髓,后来问我这道题目的人成为了我得同事,多谢他不计较我当时回答的很操蛋,而且现在他仍旧如老师一般帮助我。)
答案:UI模块之间尽量解耦合,使用BroadCast机智或者delegate机智。由于Unity自身的BroadCast和SendMsg效率是很低的,(务必百度一下这俩的区别,都有,我懒得复制粘贴了。)所以推荐使用NGUI自带的那个消息机智。具体的使用方法,下载任何一款NGUI3.5左右的版本,都能清楚的看到。更或者自己实现一个msgerpool也可以,思路是使用泛型写法+字典+delegate,效率也很高。

5.众里寻他千百度,你怎么样能迅速找到某一个UI控件。
答案:分情况处理,这是一个优化策略的题目。首先如果这个控件我在awake的时候能知道,那么我会把它存成一个private变量,代码中使用的时候直接使用即可。如果不行,这个子物体是动态生成的(他可能有或者没有),那尽量使用FindChild,得到之后加以判断。如果不得不全局找一个东西(比如找到角色物体),才会用Find。

6.你对遮挡关系有什么好的策略。
答案:这种问题的诞生是由于Ngui2采用了一种zorder+depth方式处理遮挡关系造成的,已经在ngui3里完全屏蔽掉了。只要维护depth即可。

7.你对屏幕适配有什么好主意。
答案:屏幕适配根本没有完美的解决方案,如果是全屏模块,那么锁定目标机型,将目标机型做成满屏,其他机型充满宽或高后留白(也叫留黑边)处理即可。如果是屏幕模块(比如战斗界面,主城界面等等,你会看到下边的场景那种),需要采用Anchor来解决。NGUI2 Anchor有独立的控件,NGUI3Anchor已经被搞到Wighet和Pannel中,这个自己下去好好研究研究吧。
UI的就这么多,如果问了,你回答的不错,想感谢我,请多来蛮牛看看~

数据逻辑层方面
1.请简述一下你对数据结构的选取有什么看法
答案:批量取,经常遍历的数据,会采取List来存储,经常查找的会采取字典存储。同时如果多个字段比较重要(比如一份配置表经常会id索引以及name索引),我会开辟多个字典进行存储,牺牲空间换取逆向查找效率。

2.请把这份配置文件解析成你想要的数据结构,给我看看
答案:这份配置文件如果是xml或者json,那么它肯定会被先转换成HashTable,然后你根据配置表的可能拥有的字段(比如有一个物体,它有“使用后增加体力”这个字段,有的没有,你要用ContainsKey来检测是否有字段),挨个拆出并且存入你想要的数据结构中,如果你想要的数据结构是字典,需要注意的是在加入key的时候,应该询问是否包含了这个key,如果包含,则修改,如果不包含,则添加,,大家智力都没有问题。。试一试就会很清楚。
如果这个配置文件为excell,那么它将会被转化成一个string数组,数组的每一个元素,都是一个字段数据,按照配置表的顺序挨个取出来存入你得数据结构中即可。

3.请简述一下C#中,结构体和class的用法
(再次鸣谢面试我得那位同事,容忍了我回答的很烂)
答案:如果你是自废武功,从C++转到C#,这俩东西会让你大跌眼镜。C++中结构体和类几乎没有区别。C#中,结构体属于对象,而类属于引用,结构体不需要new出来,类必须new出来。这是个巨大的坑。比如你搞了一个结构体链表:
List<structA> structtestlist = new List<structA>();
然后给这个链表中注入数据,注入数据之后,你想更改其中的一个链节,你是这么做得
structA structlink = structtestlist[2];
structlink.data = 3;
这样做,根本没有修改到structtestlist中得值!因为声明structlink那一句话,是个对象,并不是指向那个(链节)的“指针”!
但是如果是class,你这么做毫无烦恼。
这个东西建议大家试试。很坑比。

4.接受到网络发来的数据,你会怎么办
答案:着手做项目之前,会搞一个txt,客户端内部消息协议罗列到上边,这个消息协议是网络协议的处理映射。比如网络协议告诉我,“因为你刚才吃了一个药,吃成功了,现在你得给我刷新,让用户大大能够看到”,我就必须通知所牵连的模块:“你得数据被刷新了,再老地方重新取一次,刷新界面给用户大大看”。牵连到得模块,比如就是战斗UI,它要把血条给加上去,还有character信息的数据基,更改当前血量数据等等。这些模块收到协议之后,改变自己的值:比如UI就会从数据基里取,而数据基会从网络包或者配置表里取等等。

游戏控制流程:
1.你对资源加载有什么看法。
答案:首先资源加载这个东西,就是老大难,用户一遍遍的吐槽加载的慢,但是谁也不愿意让加载的少导致后边必须加载而变得卡顿。对于比较耗费的加载,属于IO操作,在游戏刚登陆的时候,进行初始化加载。强制加载一些重要模块,比如登陆窗口(用户输入用户名密码的地方)等等。选择性加载一些必要的模块:如果这人需要新手引导,则加载新手引导模块,否则不加载,反之亦然。这些用户一定会用(或者一定不用)的模块,在登陆时候处理好。对于应用模块:比如我打开一个很庞大的UI,这个怎么加载,如果这个模块很吸金,用户用得概率很大,那么必须在登陆时加载,否则那只能用户打开的时候加载了,加载的时候要转圈提示用户。。关于场景加载更加的莫衷一是。既然大家被面到这一步了,相信也不需要我废话了,一个程序有一个程序的活法不是吗?

2.请给我设计一个状态机,完成一个简单的xxxx情景。
答:状态机并不是单纯的switch结构,如果你是新手,你说switch我可以容忍,如果你干了好些年2Dx,然后想自废武功搞U3d了,再说switch就直接pass了。可以去搜一下相关资料,水不是很深,但篇幅有限。大概意思就是,每个对象都维护自己的状态机,状态机的状态改变,靠状态触发器。所有的状态(不是状态机。。状态机是一个主管它负责调度各种状态,状态是各种。。。状态。。哎不可言传啊。。),都会重写begin,excute,end这三个函数,本来敲了一大堆。。发现说也说不清楚,大家自己去看看吧还是。毕竟这只提供一种面试方式而已。。

3.角色换装,技能释放你会怎么做。
角色换装这个,各有各的活法,尸块换装,纸娃娃贴图等,这个莫衷一是,可以自己百度去,找一个自己喜欢的实现一下试试吧。技能释放水是很深的,这个能答就答,答不上来也不丢人。估计被面这些的,肯定都比我强,也就不需要我比比什么的了。。

4.动态更新有什么看法。
答:这个题牵扯到assetbundle问题。其中assetbundle面对资源的处理方法是截然不同的。比如对于prefab,可以很好的搞上去,对于二进制文件,也能搞得不错,但是对于代码这个东西,往往是大家争论的焦点——毕竟代码这个东西,iosAppStore是肯定不让你搞得,因为unity本身也不受苹果待见,所以它怕被秒杀,也不给用户提供更新脚本的功能。这就导致比如你更新了一个prefab,没法使用它上边挂的脚本!那更新有个jb用。。。提供一下解决代码更新的一点看法,现在我再尝试搞这一块,一孔之见,轻喷
安卓上可以使用unityreflaction机制进行编译后代码的动态更新,这个广大google开发者肯定是知道的。但是问题就是,这种机制会导致很庞大的开发成本——从代码层面完全跟ios搞了个大分支,如果是想跨平台的,这恐怕是不可取的吧。。
第二就是可以采用lua脚本无缝编写方法,因为unity脚本并不是真正的脚本,真正脚本的威力是它可以动态编译到宿主上,这点太牛逼了。lua就是这种牛逼脚本。所以你可以无缝换lua。。。这个没问题。所以立项就应该想好是lua还是什么的。。别回来做了一半,想改lua了,那就sb了。。
这两种机制在App Store上肯定是不让你搞的,第一种,越狱平台也不让搞,因为unity不让你搞。。
其实还有神秘的第三种做法,这第三种做法,就不分享了,毕竟还没有实验,说出来怕坑杀大家。。

原文地址:http://www.cnblogs.com/android-blogs/p/6344067.html

转载于:https://www.cnblogs.com/AaronBlogs/p/7110239.html

Unity3D面试——真实的面试,unity3d面试相关推荐

  1. 面试季:如何在面试中介绍自己的项目经验

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来源:https://dwz.cn/2PrmlZCX 现在已经是7月份,一些互联网大厂已经开始 ...

  2. 算法与面试之-如何准备算法面试

    主要介绍算法面试的一些问题.以及如何准备算法面试 算法面试不仅仅是正确的回答问题 对于面试中遇到的大多数问题,都能有一个合理的思考路径 什么是算法面试? 让大家在面对面试中的算法问题时,有一个合理的思 ...

  3. 【面试福利篇】英文面试的相关资料

    要求做英文面试的单位越来越多了.应聘外企,自然主要是英文面试:应聘国内的企业,面试进行到一半的时候,好多也会突然冒出些英文面试来.因此,对于英文面试,我们不能等闲待之.下面是一些英文面试的对话实例. ...

  4. 面试官是怎样高效面试的(面试官的“套路”

    大家好,我是若川.持续组织了6个月源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步.同时极力推荐订阅我写的<学习源码整体架构系列& ...

  5. 【测试招聘】资深面试官的测试工程师面试心得

    [转载]读后能产生强烈的共鸣,值得收藏! 所有团队的招聘,基本上都是要找最"合适"的人,而不是技术最强的人,或者最优秀的人.技术最强的人不一定合适,原因有很多, 1. 岗位一定的情 ...

  6. 后端开发面试自我介绍_java开发面试评语

    自我评价或是自我介绍(我是Java程序员) 你这里介绍的就挺好啊. 有个条理就行 我前段时间也总参加面试,也是做J2EE,我说下我自我介绍的思路: 1. 先介绍基本情况,哪里人,什么学校毕业在什么公司 ...

  7. 作为面试官,我是如何面试嵌入式工程师的?

    关注.星标公众号,直达精彩内容 来源:网络素材 作者:王科岩 提起面试大家都不会陌生,我们有时是参加面试,有时也需要面试别人,那么什么样的面试是一次高效有价值的面试呢?我在最近2年的面试中总结了以下几 ...

  8. 技术面试(上):面试官篇

    作为一个技术团队管理者,面试是一项必不可少的工作:作为一个上班族,被面试也是必然会一而再再而三经历的事情. 不过在我的经验中,很多人(包括曾经的自己)不太会面试这件事,或者说不太重视这件事.面试官认为 ...

  9. 找工作再也不愁之面试技巧全覆盖-这样面试保证拿Offer

    来来来,给俏如来扎起.感谢老铁们对俏如来的支持,2021一路有你,2022我们继续加油!你的肯定是我最大的动力 博主在参加博客之星评比,点击链接 , https://bbs.csdn.net/topi ...

  10. 面试不失败-揭秘IT面试各个环节成功的内幕

    面试是通过书面或面谈的形式来考察一个人的工作能力与否,物以类聚,通过面试可以初步判断应聘者是否可以融入自己的团队.这也是我们每一个人在走上工作岗位的时候必经的一道程序,那么,从事IT行业的人员在面试的 ...

最新文章

  1. Java“拍了拍”你,面试其实没那么难...
  2. 从科学简历看研究方法——爱因斯坦探索性的演绎法
  3. ssm框架app管理平台_后端程序员跨平台应用的前端框架uni-app初探
  4. Spring Cloud教程– Spring Cloud Config Server简介
  5. C#LeetCode刷题之#387-字符串中的第一个唯一字符(First Unique Character in a String)
  6. oracle查询属主下对象,SQL优化
  7. 5双机配置_CentOS 7 高可用双机热备实现
  8. eclipse集成testng插件
  9. java swing弹出输入框_JavaSwing文本框输入中文弹出输入窗口
  10. hnu rounting 解题报告
  11. 2019年下半年教师资格中学《综合素质》真题与参考答案
  12. 龙芯cpu linux恢复密码,中标麒麟(龙芯CPU)--忘记root密码怎么修改?
  13. PostgreSQL - 学习/实践
  14. 服务器空文件夹无法删除怎么办,空的文件夹无法删除怎么办 空的文件夹无法删除的原因【图文】...
  15. 电信增值短信平台软件模块清单(sp专用)
  16. 不靠谱的Access 轻松破解密码
  17. 集合2:方法和运算符—适用set/frozenset(上)
  18. 聚观早报 | iPhone接口将与安卓统一;《三体》动画定档12月3日
  19. 使用ICAP原语实现SPI-Multiboot加载
  20. post和get方式在http请求中的区别

热门文章

  1. java 9对象_java(9)类和对象
  2. python十进制小数转二进制_python十进制和二进制的转换方法(含浮点数)
  3. 图像降噪算法——DnCNN / FFDNet / CBDNet / RIDNet / PMRID / SID
  4. 【杂谈】有三AI知识星球一周年了!为什么公众号+星球才是完整的?
  5. 【文本信息抽取与结构化】目前NLP领域最有应用价值的子任务之一
  6. 2022-2028年中国医疗器械行业战略运营模式与典型案例分析报告
  7. 给 DataGrid 的删除信息添加提示
  8. vue-cli3.0 Typescript 项目集成环信WebIM 群组聊天
  9. php学习---环境搭建安装 编译器的安装
  10. svn 没有绿色小勾