Unity3D专访——真正的面试
只是我時間實在倉促。沒有保證。寫一點算一點吧。
先識別一下,你到了公司會讓你干什么:
1.UI(面試題會偏向NGUI等ui操作,會考到一些簡單的排序算法,數據結構。問題處理思路等)
2.數據邏輯層(會考到數據結構的搭配。配置表的構造等)
3.游戲控制流程(會考到狀態機的設計,與server協議的設計。以及少量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。client內部消息協議羅列到上邊,這個消息協議是網絡協議的處理映射。比方網絡協議告訴我,“由于你剛才吃了一個藥,吃成功了,如今你得給我刷新,讓用戶大大可以看到”,我就必須通知所牽連的模塊:“你得數據被刷新了。再老地方又一次取一次,刷新界面給用戶大大看”。牽連到得模塊,比方就是戰斗UI,它要把血條給加上去,還有character信息的數據基,更改當前血量數據等等。這些模塊收到協議之后,改變自己的值:比方UI就會從數據基里取。而數據基會從網絡包或者配置表里取等等。
游戲控制流程:
1.你對資源載入有什么看法。
答案:首先資源載入這個東西。就是老大難,用戶一遍遍的吐槽載入的慢,可是誰也不愿意讓載入的少導致后邊必須載入而變得卡頓。
對于比較耗費的載入。屬于IO操作,在游戲剛登陸的時候,進行初始化載入。
強制載入一些重要模塊,比方登陸窗體(用戶輸入usernamepassword的地方)等等。選擇性載入一些必要的模塊:假設這人須要新手引導,則載入新手引導模塊。否則不載入,反之亦然。這些用戶一定會用(或者一定不用)的模塊。在登陸時候處理好。對于應用模塊:比方我打開一個非常龐大的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不讓你搞。。
事實上還有神奇的第三種做法。這第三種做法。就不分享了。畢竟還沒有實驗。說出來怕坑殺大家。。
不定期會更新這個帖子,時而一個月,時而半年的。。
。
對不起,希望對大家有幫助
版權聲明:本文博主原創文章,博客,未經同意不得轉載。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Unity3D专访——真正的面试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前缀、中缀、后缀表达式(转载)
- 下一篇: ECharts+BaiduMap+HT