1. 程式人生 > >unity3D的面試題

unity3D的面試題

本帖最後由 天之道 於 2016-1-17 23:35 編輯 

DC老溼被泡菜同學以專欄作家的身份邀請做本期的問答嘉賓,倍感榮幸,
下面我們就開始吧。

曾經,
路人甲問:Java和JavaScript有什麼區別?
路人乙答:就相當於雷鋒和雷鋒塔的區別一樣,╮(╯▽╰)╭

當然我們的第一個問題不會這麼無聊,不然好學的大夥兒們要拍磚了。
言歸正傳。


原題: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
各位感興趣的話可以研究研究。





原題
 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
(優勝劣汰,沒什好說的。)
等等等等……



nguitext用的是其UILabel元件 dfguitext用的是其dfLabel元件

uguitext用的內建的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> 那麼學程式設計的人都知道foreachfor不一樣,遍歷的時候,是不能對集合內的成員隨意刪改的,這也是二者最大的區別之一。 要問如何避免,乖乖的用for就好咯~

但又會有同學問:老溼,如果在上述程式碼裡,我一定要裝腔(bi)用foreach呢,咋整? 我會說:沒問題,foreach裡面ls.Remove(item);這句話肯定是要去掉了,你可以在foreach遍歷完之後,用ListClear() 或者RemoveAll() 等方法都可以。 再不濟,還可以在最後一行寫上ls = new List<int>(); //(╯▽╰) 辦法有的是,條條大路通羅馬咯~
另外貼上部落格園Terry的一篇文章《深入foreach和for迴圈的區別》裡面講到了迭代器以及遊標規則,相當深刻的剖析了二者的區別。推薦給大家。
http://www.cnblogs.com/Terry-greener/archive/2011/10/27/2226179.html

相關推薦

Unity3D試題整合

bundle 遮擋 常用 喚醒 pytho ram forward 字符串處理 同時 第一部分 1. 請簡述值類型與引用類型的區別答:區別:1.值類型存儲在內存棧中,引用類型數據存儲在內存堆中,而內存單元中存放的是堆中存放的地址。2.值類型存取快,引用類型存取慢。3.值類型

unity3d 試題

程式@成都:  09:39:02 1.多個camera與depth有關, 2,prefab預定製,我的理解就是,它已經是物件了(包含了各種指令碼,模型,資源關係的集合),但是如果你在場景中不引用它,它是不會佔用記憶體的,因此在移動裝置上不能直接引用(也就是不能直接託在給指令碼的),可以採用resouces.

Unity3D實習生試題總結-程式語言相關

程式語言相關 什麼是面向物件 面向物件三大特性 封裝:把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏。 繼承:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件。 多型:指一個類例項的相同方法在不同情形有不同

Unity3D實習生試題總結-編程語言相關

value spa 逆轉 無需 自己 傳統 有一個 不用 nbsp 編程語言相關 什麽是面向對象 面向對象三大特性 封裝:把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。 繼承:它可以使用現有類的所有功能,並在無需重

[Unity3D]上海某大型遊戲公司的基礎試題

分享上海某大型遊戲公司的一個基礎測試題!1.Unity中碰撞器(Collider)和觸發器(Trigger)的區別?碰撞器(Collider)有碰撞效果,IsTrigger=false,可以呼叫OnCollisionEnter/Stay/Exit函式觸發器(Trigger)沒

unity3D試題

本帖最後由 天之道 於 2016-1-17 23:35 編輯  DC老溼被泡菜同學以專欄作家的身份邀請做本期的問答嘉賓,倍感榮幸, 下面我們就開始吧。 曾經, 路人甲問:Java和JavaScript有什麼區別? 路人乙答:就相當於雷鋒和雷鋒塔的區別一樣,╮(╯▽╰)╭ 當然我們的

unity3d出鏡率最高的試題

一.什麼是渲染管道? 是指在顯示器上為了顯示出影象而經過的一系列必要操作。 渲染管道中的很多步驟,都要將幾何物體從一個座標系中變換到另一個座標系中去。 主要步驟有: 本地座標->檢視座標->背面裁剪->光照->裁剪->投影->檢視變換-&

[Unity3D]藍港試題

1. 請簡述值型別與引用型別的區別 答:區別: 1.值型別儲存在記憶體棧中,引用型別資料儲存在記憶體堆中,而記憶體單元中存放的是堆中存放的地址。 2.值型別存取快,引用型別存取慢。 3.值型別表示實際資料,引用型別表示指向儲存在記憶體堆中的資料的指標和引用。 4.棧的記憶體

sql 試題

試題 null cheng sel rom 姓名 缺少 學生 sid s:學生表 學生ID姓名k:課程表課程ID課程名稱 c:成績表成績ID學生ID課程ID成績1、查 各門課程中缺少考試成績的學生select a.sname,a.kname from (select *

試題-Java基礎-集合和數組

eset ria design iter 什麽 code zab 索引 鍵值對存儲 1.Java集合類框架的基本接口有哪些? 集合類接口指定了一組叫做元素的對象。集合類接口的每一種具體的實現類都可以選擇以它自己的方式對元素進行保存和排序。有的集合類允許重復的鍵,有些不允

java 多線程試題

obj 高級 註意 執行 本地線程 java 多線程 也不會 以及 native 0、Java中多線程同步是什麽? 在多線程程序下,同步能控制對共享資源的訪問。如果沒有同步,當一個Java線程在修改一個共享變量時,另外一個線程正在使用或者更新同一個變量,這樣容易導致程序出現

java基礎試題

ray 插入時間 相對 避免死鎖 會計 monitor 復雜 自動 計算 1.什麽是Java虛擬機?為什麽Java被稱作是“平臺無關的編程語言”? Java虛擬機是一個可以執行Java字節碼的虛擬機進程。Java源文件被編譯成能被Java虛擬機執行的字節碼文件。 Java被

js試題,關於變量提升,作用域,全局變量

fine log js面試 提升 per nbsp lin undefine 變量 /**********seperate line************/ var a = 10; function test() {   a = 100;   cons

企業Shell試題14:開發腳本入侵檢測與報警案例

開發腳本入侵檢測與報警案例、md5sum指紋、 面試及實戰考試題:監控web站點目錄(/var/html/www)下所有文件是否被惡意篡改(文件內容被改了),如果有就打印改動的文件名(發郵件),定時任務每3分鐘執行一次。1.1問題分析1)首先要說明的是,思考過程的積累比實際代碼開發的能力積累更重

試題9:數組堆化、堆的插入、堆的刪除、堆排序

art 面試 rewind 刪除 test from minimum 面試題 排序 參考:白話經典算法系列之七 堆與堆排序 1 #include <iostream> 2 #include <climits> 3 #include <v

.NET試題系列[17] - 多線程概念(2)

nbsp 靜態方法 工作方法 顯式 進程和線程 優先 輸入參數 間隔 聲明變量 線程概念 線程和進程的區別 進程是應用程序的一個實例要使用的資源的一個集合。進程通過虛擬內存地址空間進行隔離,確保各個進程之間不會相互影響。同一個進程中的各個線程之間共享

《劍指offer》試題39 二叉樹的深度(java)

設計模式 博客 rgs 歷史 存在 復制 pri 取值 今天 摘要: 今天翻到了《劍指offer》面試題39,題目二中的解法二是在函數的參數列表中通過指針的方式進行傳值,而java是沒有指針的,所以函數要進行改造。然而我翻了下別人的java版本(我就想看看有什麽高大上的改造

試題22:有序數組生成BST

++ root pre sum col push_back div fin += 對於一個含有n個數的有序數組1~N,能夠產生多少種不同結果的二叉搜素樹BST? 如何生成這些不同結構的BST? 1 class Solution { 2 public: 3

劍指Offer試題15(Java版):鏈表中倒數第K個結點

head 計數器 easy sta 相同 ret white style 輸出 題目: 輸入一個鏈表。輸出該鏈表中倒數第k哥結點。 為了符合大多數人的習慣,本題從1開始計數。即鏈表的尾結點是倒數第1個結點。 比如一個鏈表有6個結點。從頭結點開始它們的值依次是1。2。

【轉】典型的JavaScript試題

() cee not spa tro cnblogs and enc 分配 問題1: 作用域(Scope) 1 (function() { 2 "use strict"; 3 var a = b = 5; 4 })(); 5 console.log(b); 控