1,如何避免點擊UI按鈕時穿透,同時觸發了相同位置場景模型的點擊事件的情況?(NGUI)
1,如何避免點擊UI按鈕時穿透,同時觸發了相同位置場景模型的點擊事件的情況?(NGUI 判斷 是否點擊到UI)
答:1,通過射線分層處理,顯示層分為不同的Layer,用UICamera發射一條射線並腳本里設置他的響應事件的層。
2,在高版本的NGUI中,UICamera中有一個變量isOverUI,這個值為真時表示點擊到了UI,反之就是沒有。
2,切換場景時,如何讓背景音樂持續播放,而不是重新播放?
答:1,使用DontDestroyOnLoad()方法掛載一個音樂組件,當然這個方法也可以保存一些全局游戲腳本。
但是使用時避免重復調用,可以用判斷的方式來調用或者銷毀但是不是很好,最好的方式是寫個
靜態全局的單例類,在游戲初首次進入時綁定這個腳本,這樣這個方法永遠只會走一遍。
public static Global instance; static Global() { GameObject go = new GameObject("Globa"); DontDestroyOnLoad(go); instance = go.AddComponent<Global>(); } public void DoSomeThings() { Debug.Log("DoSomeThings"); } void Star() { Debug.Log("Start"); }
3,如何實現游戲存檔和讀檔的功能?
答:1,Unity提供了一個用於本地持久化保存與讀取的類——PlayerPrefs。工作原理非常簡單,以鍵值對
的形式將數據保存在文件中,然后程序可以根據這個名稱取出上次保存的數值。
PlayerPrefs類支持3中數據類型的保存和讀取,浮點型,整形,和字符串型。
分別對應的函數為:這些函數的用法基本一致使用Set進行保存,使用Get進行讀取
SetInt();保存整型數據;
GetInt();讀取整形數據;
SetFloat();保存浮點型數據;
GetFlost();讀取浮點型數據;
SetString();保存字符串型數據;
GetString();讀取字符串型數據;
2,XML,sql,txt等配置文件都可以實現存讀等功能,PlayerPrefs自帶的類只能實現簡單的存取功能。
XML存檔參考http://blog.sina.com.cn/s/blog_471132920101d3kh.html。
4,什么是協同程序?請舉一個游戲中應用協程的例子。
答:Unity的協程系統是基於C#的一個簡單而強大的接口 ,IEnumerator,它允許你為自己的集合類型編寫枚舉器。
1,所謂協同,就是在主程序運行的時間同時開啟另外一段邏輯處理,來協同當前程序的執行,
當你在StartCoroutine的函數體里處理一段代碼時,利用yield語句等待執行結果,這期間不影響主程
序的繼續執行,可以協同工作。
2,在游戲中游戲開始前的倒計時就可以用到協同程序,網絡游戲的加載進度,游戲中的順序控制等。
下面舉個計時的例子,方法的狀態被存儲了,這使得方法中定義的這些變量都會保存它們的值,即使是在不同的幀中
IEnumerator CountSeconds() { int seconds = 0; while(true) { for(float timer = 0; timer < 1; timer += Time.deltaTime) Yield return 0; seconds++; Debug.Log(seconds +" seconds have passed since the Coroutine started."); } }
5,什么是游戲框架?使用框架的好處是什么?
答:1,游戲框架是比較上層的封裝,是一套快速搭建游戲的代碼結構。
2,使用游戲框架開發能節約工程時間,易維護,易擴展,易閱讀開發,可復用。
選擇框架和使用框架是控制框架的基礎。
6,如何在Unity中播放視頻?
答:1,首先下載安裝Quicktime ,U3D承認的視格式為.mov, .mpg, .mpeg, .mp4, .avi, .asf格式。
2,創建一個對象,使用對象拖拽的形式為Mov Texture對象賦值,之后就可以在腳本中使用它了。
<span style="color:#0000ff;">public class Test: MonoBehaviour { //電影紋理 public MovieTexture movTexture; void Start() { //設置當前對象的主紋理為電影紋理 renderer.material.mainTexture = movTexture; //設置電影紋理播放模式為循環 movTexture.loop = true; } void OnGUI() { if(GUILayout.Button("播放/繼續")) { //播放/繼續播放視頻 if(!movTexture.isPlaying) { </span><span style="color:#ff0000;"> movTexture.Play();</span><span style="color:#0000ff;"> } } if(GUILayout.Button("暫停播放")) { //暫停播放 </span><span style="color:#ff0000;"> movTexture.Pause();</span><span style="color:#0000ff;"> } if(GUILayout.Button("停止播放")) { //停止播放 </span><span style="color:#ff0000;">movTexture.Stop();</span><span style="color:#0000ff;"> } } }</span>
3,另一種是看MOMO帖子學來的,用GUI的方式,直接調用DrawTexture()。程序參考MOMO帖子
http://www.xuanyusong.com/archives/1019
7,跑酷游戲的無盡關卡是如何生成的?
答:設計多種場景塊,加載到對象池,對象緩存復用,根據游戲內容制定隨即組合的規則,然后根據規則
調用不同的場景塊。例如有的場景是特定場景。用量化的方法定義難度。
8,如何增強ARPG Action Role Playing Game 游戲的打擊感?
答:1,從美術資源上看,不管是2D還是3D角色的動作流暢度跟動畫的合理性都能提高游戲的打擊感。
2,游戲中角色的技能或者特定動作加上拖尾效果,多一些技能特效,畫面扭曲效果。被打擊方的狀態控制。
3,相機,也就是主視角可以增加震動效果,鏡頭的一些特效,例如主角的健康狀態顯示等。
4,音效的增加,音效是非常非常重要的一個選項。
5,設備上的體現,理由手機或者游戲手柄的震動。
9,游戲慢鏡頭回放功能的實現思路?如足球游戲中的精彩鏡頭回放。
答:1,直接錄屏將整個動畫保存出mp4格式進行壓縮,如果是PC端的話找一些錄屏插件,移動端也有插件不過好像
都不支持視頻保存,記錄回放插件EzReplayManager,EveryPlay等移動端插件都比較好用
2,狀態記錄同步,記錄每一幀所有角色狀態,包括位置,旋轉等,這種方式代碼比較容易實現,
文件量會比較大,3分鍾視頻,一秒鍾30幀,需要36030 = 5400幀如果每個角色每一幀都進行
記錄至少要3M以上,如果角色少做一些簡單的優化比如,只有發生修改的時候才記錄會明顯的
降低文件量,但是對於移動端流量還是很有壓力。
10,LOD技術是什么?優缺點是?
答:1,LOD是Levels of Detail的簡稱,譯為多細節層次。LOD技術指根據物體模型的節點在顯示環境中所處的位置
和重要度,決定物體渲染的資源分配,降低非重要物體的面數和細節度,從而獲得高效率的渲染運算。
一個有關於LOD的插件Mesh Baker LOD 1.4
2,LOD的優點可以根據距離動態地選折渲染不同細節的模型
3,LOD缺點增加游戲容量不同細節的模型要准備多個,同時增加美術的工作量
