1、在Unity里3个update(FixedUpdate、Update、LateUpdate)的用法和区别?
9ria游戏开发社区的黄祖祥的文章《关于Unity3D中的Update、LateUpdate、FiexdUpdate》:
http://bbs.9ria.com/thread-417976-1-1.html
这个在DC老湿的眼里可以算的上是标准答案了。
当然黄同学也是参考了,博客园的赵青青的两篇文章总结的http://www.cnblogs.com/zhaoqingqing/p/3454091.html
http://www.cnblogs.com/zhaoqingqing/p/3296086.html
正所谓前人摘树后人乘凉。
这两位同学的文章已经详尽讲解了三个update的区别用法。
如果非要让DC老湿概括简略的讲呢,就是:
Update()是每帧执行的函数,更新频率和设备的性能有关。
一般你要不停地计算不停地执行着什么的话,是写在Update里的。
FixedUpate()是固定时间间隔执行函数(可人为调整间隔时间),不受游戏帧率影响。
但如果你写的算法是要不断的处理Rigidbody(俗称刚体)以及物理运算神马的,那就最好写在FixedUpate,
LateUpdate()是在所有Update()函数执行完之后,执行。
正因为LateUpdate慢于update所以可以避免在update中因频繁的计算物体的位置方向选装导致的抖动问题。
原题2、Unity3d中的1单位是FBX文件中的1单位的几倍?
答:unity中的1单位是fbx文件中的1单位的100倍。
这题考你模型缩放的问题,建模软件、游戏引擎软件都有自己的单位比例,在建模软件(如max、maya)中制作模型时,
建议:如果我们想unity中使用1单位=1米的话,那在max和maya中制作的时候,单位就设置成1厘米,以此类推。
注意上面的只是建议(其实你不按套路出牌也没关系,fbx导出到unity里后,在里面也可以调整缩放比。)但毕竟是过来人的建议,
自己玩玩的话怎么来都没关系,但要是合作项目的话,还是要按照统一的规范,百利无一害。
原题3、为了减少性能开销,移动端实现实时阴影的方法是什么?
答:一般像COC的做法是直接用一个圆的黑的图做实时阴影,很多卡通类的游戏也都是这么做的,确实够简单粗暴。
如图1
但是如果要像Unity在PC端的点光或者方向光的产生的真实的实时光影的话,该如何做呢。
如图2
这个DC老湿网上查了查还是有很多的,就是利用Unity内置的Projector投影器。
随便贴一个雨松momo早前写的一篇文章吧《RenderTexture制作动态阴影四十八》
http://www.xuanyusong.com/archives/2132
还有新浪博客的一篇《Unity3D实时阴影——Projector投影器》
http://blog.sina.com.cn/s/blog_799860f90102vkp2.html
各位感兴趣的话可以研究研究。
答:这道就没什么好说的了,纯粹学校考试题。
那些个大学里的不在一线开发的所谓的学院派整天白拿国家发的工资,没事干吃饱了撑着搞的脑经急转弯罢了。
1个字节为8位
0.5个 字节为4位
所以512 * 512 * 0.5 = 131072 B
131072 / 1024 = 128 KB
128 / 1024 = 0.125MB
斯~~~~一个像素占4位,这张图一定非常小,因为我们一般知道的一张彩色的图是带RGBA四个通道的,
那么如果假设每个通道占4位,也就是一个像素占4*4,也就是16位,
那得出的这张图的大小为512 * 512 * 0.5 * 4 = 524288 B
524288 / 1024 = 512KB
斯~~~~~没理由啊,
唯一的解释是,我想,这应该是一张只带alpha通道的灰度图,
也就是一个像素,只包含一个通道的信息,那么就和我们的答案一模一样了。
大家都知道DC老湿有点死磕的精神,是个较真儿的人,这种品质,
在生活里被认为的是牛角尖,容易得罪人,
但在技术领域却被认为是美德,受人敬仰
DC老湿认为作为一个优秀的程序员或是优秀的工程师,
应该要能妥善的处理二者,不把工作带到生活中。
生活里积极阳光、与人为善,工作中亲身实践、据理力争
这是成为优秀甚至是卓越的基本,无论各行各业。
好了,回到正题。
为了证明我的推论,我做了如下的实验,用Ps,也就是Photoshop做了两张图,是用位图格式保存的,也就是.bmp格式
未标题-12 第一张图带RGBA四个通道
未标题-13 第二张图只带Alpha通道
看来和我想的没错,我们再通过十六进制编辑器来查看这两张图的信息
数字非常的接近了,毕竟自己对作图软件不熟,有些误差也很正常的嘛~
另外我上面讲到的RGBA4个通道,每个通道占4位,应该是传说中的RGBA4444格式~图片格式并非我的专长,有机会还是很愿意和大家一起探讨一起分享的。
游戏葡萄的《游戏开发如何选择和优化图像素材》里详细讲解了RGBA4444和RGBA8888,给出链接地址,感兴趣的朋友可以看看。
http://youxiputao.com/articles/1152
原题 5、Unity5.X版本中,如何添加GUI Text组件?是否有其他更好的方法代替它?(新手常见问题)
答:既然这道题是针对新手,DC老湿就不妨多啰嗦几句。
有两种方法添加GUI Text组件
1、选中要添加组件的载体——>Component——>Rendering——>GUI Text
【图3】
2、选中要添加组件的载体——>在其Inspector面板下点击Add Component——>GUI Text
【图4】
什么?你问我有否其他更好的方法代替它~
Absolutely!当然有~
可以用内置ugui
GUIText组件属于早期的Unity(4.6版本之前)没有内置的UI系统,只是一个独立用于绘制文本的组件。早就不推荐使用了。
Unity4.6版本发布的时候Unity才开始内置了自己的UI系统 ——UGUI
所以在此之前Unity的官方商店Asset Store盛行各种强大且好评如潮的gui的插件,
有大名鼎鼎的NGUI
(应用度最广、持续维护不断更新、基本成熟的UI插件)
【图5】
有惊鸿一瞥可惜昙花一现的DFGUI
(第一个也是目前为止唯一一个全面支持富文本richText的UI插件,1.x版本就已经相当成熟,
ngui到3.x版本还没有对富文本有非常好的解决方案,
之所以说DFGUI昙花一现,是由于也不知道什么原因,dfgui的作者已经不更新也不维护dfgui了,
作者的官网也关了,作者的其他插件也都从Asset Store上下架了,天妒英才,实在可惜。)
【图6】
【图7】
【图8】
还有已经退出历史舞台的EZGUI
(优胜劣汰,没什好说的。)
等等等等……
ugui 加 text用的内置的Text组件
【图9】
原题6、项目导入一张图集后,如何在Unity中使用?(变成一张张的小图)
答:这个题是UI的题目,同上。
三种方法,ngui、dfgui、ugui
NGUI和DFGUI,是要先把这整张图集切成一张张的小图,里有其各自的MakeAtlas做成一个Atlas图集预设,然后再其各自的Sprite(NGUI是UISprite,DFGUI是dfSprite里面去,Sprite.SpriteName得到你想要的单张小图)
而UGUI的做法,跟据宣雨松(雨松momo)的说法是,UGUI的原理是让开发者彻底模糊图集的概念,让开发者不要去关心自己的图集。做界面的时候用小图,而在最终打包的时候,unity才会把你的小图合并在一张大图集里面。这一切的一切都是自己动完成的,开发者不用过分在意。
详细的做法和操作步骤在这个链接里。
http://www.xuanyusong.com/archives/3304
原题7、当一个物体在视野内被其他物体遮挡,不希望对该物体进行渲染,可以通过哪一个模块实现?
答:可以通过遮挡剔除实现。
首先选中场景中的某个物体在其Inspector检视面板里,把Static勾上,
【图10】
然后点Bake就可以了
【图11】
【图12】
详细的操作9ria游戏开发者社区的极速武斗同学的《Unity3D大场景优化 遮挡剔除》已经写得非常详细清楚了。这里DC老湿也就不再多做重复。给出链接。
http://bbs.9ria.com/thread-216913-1-1.html
原题8、值类型和引用类型的区别?
答:
博客园的《值类型和引用类型,栈和堆的含义》http://www.cnblogs.com/tonney/archive/2011/04/28/2032205.html
这篇文章在DC老湿的眼里算的上是标准答案了。
网上搜到的无非内存分配空间,和你讲栈和你讲堆。
其实你可以这么理解,更加形象,
“你手里有份报纸很有趣,你朋友很想看,你复印了一份,给你朋友”这个就叫值类型的操作。
“你发现一个网址很有趣,你朋友很想看,你把这个网址,告诉你朋友”这个就叫引用类型的操作。
肿么样,生动不生动~
原题9、什么是泛型?请举一个通俗易懂的例子?
所以到了C#2.0时代,天空一声巨响,泛型闪亮登场。
泛型的横空出世,我们处理集合的时候,有了更多的选择,比如List<T>
这个T就是代表着泛型的意思。
如果你想处理的是一堆整数集合,就用List<int>
如果你想处理的是一堆字符串集合,就用List<string>
如果你想处理的是一堆浮点数集合,就用List<float>
如果你想处理的是一堆集合的集合,就用List<List<T>>
....
等等等,
你会发现出什么都清清爽爽、明明白白。
如果我说了这么多你还是不够明白的话,DC老湿就只能放大招了。我以前用武功举例过泛型
现在我用更加通俗易懂的举例
c#1.0时代 没有泛型的时候 代表:ArrayList 可以看成是 钢片铁片
c#2.0时代 的泛型,代表 : List<T> 可以看成是 瑞士军刀
你要瑞士军刀的可以根据要切的东西不同,换不同的刀具,
而铁片钢片虽然也可以 勉强切东西,但想要用的顺手就得要强制加工成特定的刀具。
再多啰嗦几句:
泛型的好处就是之一就是在编译时执行更多的检查,所以等到编译不再报错的时候,就极有可能已经得到了能正常工作的代码。
(这里的“编译时”指的是c#静态编译。“编译时”是一种比较通俗的讲法,业内的专业术语有静态编译AOT和动态编译JIT两种)
讲解了这么多,即使你明白了从ArrayList到List<T>的进步,也不过只是在泛型刚入门而已,想要精通,路才刚刚开始,由于篇幅有限,这里就不多啰嗦了,有机会我还是很愿意和大伙一起探讨分享所学的心得的。
另外贴上博客园Terry的一篇文章《深入foreach和for循环的区别》里面讲到了迭代器以及游标规则,相当深刻的剖析了二者的区别。推荐给大家。
http://www.cnblogs.com/Terry-greener/archive/2011/10/27/2226179.html
9ria游戏开发社区的黄祖祥的文章《关于Unity3D中的Update、LateUpdate、FiexdUpdate》:
http://bbs.9ria.com/thread-417976-1-1.html
这个在DC老湿的眼里可以算的上是标准答案了。
当然黄同学也是参考了,博客园的赵青青的两篇文章总结的http://www.cnblogs.com/zhaoqingqing/p/3454091.html
http://www.cnblogs.com/zhaoqingqing/p/3296086.html
正所谓前人摘树后人乘凉。
这两位同学的文章已经详尽讲解了三个update的区别用法。
如果非要让DC老湿概括简略的讲呢,就是:
Update()是每帧执行的函数,更新频率和设备的性能有关。
一般你要不停地计算不停地执行着什么的话,是写在Update里的。
FixedUpate()是固定时间间隔执行函数(可人为调整间隔时间),不受游戏帧率影响。
但如果你写的算法是要不断的处理Rigidbody(俗称刚体)以及物理运算神马的,那就最好写在FixedUpate,
LateUpdate()是在所有Update()函数执行完之后,执行。
正因为LateUpdate慢于update所以可以避免在update中因频繁的计算物体的位置方向选装导致的抖动问题。
原题2、Unity3d中的1单位是FBX文件中的1单位的几倍?
答:unity中的1单位是fbx文件中的1单位的100倍。
这题考你模型缩放的问题,建模软件、游戏引擎软件都有自己的单位比例,在建模软件(如max、maya)中制作模型时,
建议:如果我们想unity中使用1单位=1米的话,那在max和maya中制作的时候,单位就设置成1厘米,以此类推。
注意上面的只是建议(其实你不按套路出牌也没关系,fbx导出到unity里后,在里面也可以调整缩放比。)但毕竟是过来人的建议,
自己玩玩的话怎么来都没关系,但要是合作项目的话,还是要按照统一的规范,百利无一害。
原题3、为了减少性能开销,移动端实现实时阴影的方法是什么?
答:一般像COC的做法是直接用一个圆的黑的图做实时阴影,很多卡通类的游戏也都是这么做的,确实够简单粗暴。
如图1
但是如果要像Unity在PC端的点光或者方向光的产生的真实的实时光影的话,该如何做呢。
如图2
这个DC老湿网上查了查还是有很多的,就是利用Unity内置的Projector投影器。
随便贴一个雨松momo早前写的一篇文章吧《RenderTexture制作动态阴影四十八》
http://www.xuanyusong.com/archives/2132
还有新浪博客的一篇《Unity3D实时阴影——Projector投影器》
http://blog.sina.com.cn/s/blog_799860f90102vkp2.html
各位感兴趣的话可以研究研究。
原题 4、一张图片的像素格式为512*512,若每个像素占4位,存储这张图片的大小为多少KB/MB?
答:这道就没什么好说的了,纯粹学校考试题。
那些个大学里的不在一线开发的所谓的学院派整天白拿国家发的工资,没事干吃饱了撑着搞的脑经急转弯罢了。
1个字节为8位
0.5个 字节为4位
所以512 * 512 * 0.5 = 131072 B
131072 / 1024 = 128 KB
128 / 1024 = 0.125MB
斯~~~~一个像素占4位,这张图一定非常小,因为我们一般知道的一张彩色的图是带RGBA四个通道的,
那么如果假设每个通道占4位,也就是一个像素占4*4,也就是16位,
那得出的这张图的大小为512 * 512 * 0.5 * 4 = 524288 B
524288 / 1024 = 512KB
斯~~~~~没理由啊,
唯一的解释是,我想,这应该是一张只带alpha通道的灰度图,
也就是一个像素,只包含一个通道的信息,那么就和我们的答案一模一样了。
大家都知道DC老湿有点死磕的精神,是个较真儿的人,这种品质,
在生活里被认为的是牛角尖,容易得罪人,
但在技术领域却被认为是美德,受人敬仰
DC老湿认为作为一个优秀的程序员或是优秀的工程师,
应该要能妥善的处理二者,不把工作带到生活中。
生活里积极阳光、与人为善,工作中亲身实践、据理力争
这是成为优秀甚至是卓越的基本,无论各行各业。
好了,回到正题。
为了证明我的推论,我做了如下的实验,用Ps,也就是Photoshop做了两张图,是用位图格式保存的,也就是.bmp格式
未标题-12 第一张图带RGBA四个通道
未标题-13 第二张图只带Alpha通道
看来和我想的没错,我们再通过十六进制编辑器来查看这两张图的信息
数字非常的接近了,毕竟自己对作图软件不熟,有些误差也很正常的嘛~
另外我上面讲到的RGBA4个通道,每个通道占4位,应该是传说中的RGBA4444格式~图片格式并非我的专长,有机会还是很愿意和大家一起探讨一起分享的。
游戏葡萄的《游戏开发如何选择和优化图像素材》里详细讲解了RGBA4444和RGBA8888,给出链接地址,感兴趣的朋友可以看看。
http://youxiputao.com/articles/1152
原题 5、Unity5.X版本中,如何添加GUI Text组件?是否有其他更好的方法代替它?(新手常见问题)
答:既然这道题是针对新手,DC老湿就不妨多啰嗦几句。
有两种方法添加GUI Text组件
1、选中要添加组件的载体——>Component——>Rendering——>GUI Text
【图3】
2、选中要添加组件的载体——>在其Inspector面板下点击Add Component——>GUI Text
【图4】
什么?你问我有否其他更好的方法代替它~
Absolutely!当然有~
可以用内置ugui
GUIText组件属于早期的Unity(4.6版本之前)没有内置的UI系统,只是一个独立用于绘制文本的组件。早就不推荐使用了。
Unity4.6版本发布的时候Unity才开始内置了自己的UI系统 ——UGUI
所以在此之前Unity的官方商店Asset Store盛行各种强大且好评如潮的gui的插件,
有大名鼎鼎的NGUI
(应用度最广、持续维护不断更新、基本成熟的UI插件)
【图5】
有惊鸿一瞥可惜昙花一现的DFGUI
(第一个也是目前为止唯一一个全面支持富文本richText的UI插件,1.x版本就已经相当成熟,
ngui到3.x版本还没有对富文本有非常好的解决方案,
之所以说DFGUI昙花一现,是由于也不知道什么原因,dfgui的作者已经不更新也不维护dfgui了,
作者的官网也关了,作者的其他插件也都从Asset Store上下架了,天妒英才,实在可惜。)
【图6】
【图7】
【图8】
还有已经退出历史舞台的EZGUI
(优胜劣汰,没什好说的。)
等等等等……
ngui
加text
用的是其UILabel
组件
dfgui
加text
用的是其dfLabel
组件
ugui 加 text用的内置的Text组件
【图9】
原题6、项目导入一张图集后,如何在Unity中使用?(变成一张张的小图)
答:这个题是UI的题目,同上。
三种方法,ngui、dfgui、ugui
NGUI和DFGUI,是要先把这整张图集切成一张张的小图,里有其各自的MakeAtlas做成一个Atlas图集预设,然后再其各自的Sprite(NGUI是UISprite,DFGUI是dfSprite里面去,Sprite.SpriteName得到你想要的单张小图)
而UGUI的做法,跟据宣雨松(雨松momo)的说法是,UGUI的原理是让开发者彻底模糊图集的概念,让开发者不要去关心自己的图集。做界面的时候用小图,而在最终打包的时候,unity才会把你的小图合并在一张大图集里面。这一切的一切都是自己动完成的,开发者不用过分在意。
详细的做法和操作步骤在这个链接里。
http://www.xuanyusong.com/archives/3304
原题7、当一个物体在视野内被其他物体遮挡,不希望对该物体进行渲染,可以通过哪一个模块实现?
答:可以通过遮挡剔除实现。
首先选中场景中的某个物体在其Inspector检视面板里,把Static勾上,
【图10】
然后点Bake就可以了
【图11】
【图12】
详细的操作9ria游戏开发者社区的极速武斗同学的《Unity3D大场景优化 遮挡剔除》已经写得非常详细清楚了。这里DC老湿也就不再多做重复。给出链接。
http://bbs.9ria.com/thread-216913-1-1.html
原题8、值类型和引用类型的区别?
答:
博客园的《值类型和引用类型,栈和堆的含义》http://www.cnblogs.com/tonney/archive/2011/04/28/2032205.html
这篇文章在DC老湿的眼里算的上是标准答案了。
网上搜到的无非内存分配空间,和你讲栈和你讲堆。
其实你可以这么理解,更加形象,
“你手里有份报纸很有趣,你朋友很想看,你复印了一份,给你朋友”这个就叫值类型的操作。
“你发现一个网址很有趣,你朋友很想看,你把这个网址,告诉你朋友”这个就叫引用类型的操作。
肿么样,生动不生动~
原题9、什么是泛型?请举一个通俗易懂的例子?
答:
【图13
】是百度百科的解答。
我想对于这样的回答很多人初学的人的肯定是看的云里雾里的。
别担心。如果你是刚开始接触泛型,对其感到头痛是一件再正常不过的事情了。
伟大的德国日耳曼民族的哲学家黑格尔说过一句名言:存在即合理。
DC
老湿说:要知道什么是泛型,首先,有必要了解到底是存在什么问题,才导致了泛型的问世。
Unity3D
游戏引擎从最早的1.x
到现在的5.x
经历了无数个版本,修复了无数个bug
,不断的进步提升,不断的自我完善。
游戏引擎、软件有更新迭代。
编程语言尤其是像c#
这样的语言,更是如此。
早在C#1.0
时代我们处理集合的时候,往往用到的是ArrayList
。
我们不吹不黑的讲。
ArrayList
的好处是动态的,比较自由,可灵活设置数组的大小。
【图14
】
可是ArrayList
内部封装了一个Object
类型的数组,所以我什么类型的都能往同一个数组里面塞。那么出来混的总是要还的,当我们取数组元素的时候,由于不知道取出来的元素是什么类型,尤其是做些特殊处理的时候,就要一次次的强转。
所以到了C#2.0时代,天空一声巨响,泛型闪亮登场。
泛型的横空出世,我们处理集合的时候,有了更多的选择,比如List<T>
这个T就是代表着泛型的意思。
如果你想处理的是一堆整数集合,就用List<int>
如果你想处理的是一堆字符串集合,就用List<string>
如果你想处理的是一堆浮点数集合,就用List<float>
如果你想处理的是一堆集合的集合,就用List<List<T>>
....
等等等,
你会发现出什么都清清爽爽、明明白白。
如果我说了这么多你还是不够明白的话,DC老湿就只能放大招了。我以前用武功举例过泛型
现在我用更加通俗易懂的举例
c#1.0时代 没有泛型的时候 代表:ArrayList 可以看成是 钢片铁片
c#2.0时代 的泛型,代表 : List<T> 可以看成是 瑞士军刀
你要瑞士军刀的可以根据要切的东西不同,换不同的刀具,
而铁片钢片虽然也可以 勉强切东西,但想要用的顺手就得要强制加工成特定的刀具。
再多啰嗦几句:
泛型的好处就是之一就是在编译时执行更多的检查,所以等到编译不再报错的时候,就极有可能已经得到了能正常工作的代码。
(这里的“编译时”指的是c#静态编译。“编译时”是一种比较通俗的讲法,业内的专业术语有静态编译AOT和动态编译JIT两种)
讲解了这么多,即使你明白了从ArrayList到List<T>的进步,也不过只是在泛型刚入门而已,想要精通,路才刚刚开始,由于篇幅有限,这里就不多啰嗦了,有机会我还是很愿意和大伙一起探讨分享所学的心得的。
原题10、下列代码在运行中会发生什么问题?如何避免?
List<int> ls = newList<int>(new int[]{1,2,3,4,5});
foreach(int item in ls)
{
Console.WriteLine(item*item);
ls.Remove(item);
}
答:会报错咯~
话说,出题人还挺用心的,第9
题我们刚讲到用List<T>
泛型,第10
就出现了List<int>
。
那么学编程的人都知道foreach
和for
不一样,遍历的时候,是不能对集合内的成员随意删改的,这也是二者最大的区别之一。
要问如何避免,乖乖的用for
就好咯~
但又会有同学问:老湿,如果在上述代码里,我一定要装腔(bi
)用foreach
呢,咋整?
我会说:没问题,foreach
里面ls.Remove(item);
这句话肯定是要去掉了,你可以在foreach
遍历完之后,用List
的Clear()
或者RemoveAll()
等方法都可以。
再不济,还可以在最后一行写上ls = new List<int>(); //
╮(
╯▽╰)
╭
办法有的是,条条大路通罗马咯~
另外贴上博客园Terry的一篇文章《深入foreach和for循环的区别》里面讲到了迭代器以及游标规则,相当深刻的剖析了二者的区别。推荐给大家。
http://www.cnblogs.com/Terry-greener/archive/2011/10/27/2226179.html