1. 程式人生 > 實用技巧 >總結Unity 初學者容易犯的編譯與執行時錯誤(第二部分)

總結Unity 初學者容易犯的編譯與執行時錯誤(第二部分)

本人在做線上與線下Unity教學中,經常遇到一些常見的疑問,為了更好的快速進行答覆,我平時注意收集了一些典型
的錯誤與疑問,且附有個人解答,供大家交流之用。不足之處,請大家指明。
如果後期總結的易錯誤點,量比較大時我會進行分類處理,更加方便大家查詢。


1: Ngui 和 UGUI 用法是一樣的麼?現在遊戲公司還在用NGUI 還是用Unity內建的UI系統?

答: 如果你是Unity學習者,建議你NGUI/uGUI都學習,因為目前舊專案一般都用NGUI, 現在立項的公司很多考慮用uGUI ,畢竟第1是官方技術且是開源的技術,而是後繼會不斷髮展,有潛力。

2: unity3d的 Terrain上無法烘焙樹木的陰影,該如何解決?

答:Detail meshes 本身不參與烘焙過程,但是其會對地形的lightmap進行取樣。所以,需要對原生的lightmap進行修改,新增陰影。

3: uGUI 中 slider和scorllbar這麼相似,分別用在那些地方啊?

答:解釋如下: Slider 控制元件適合做專案中的“音量調節”、“生命數值”顯示等方面,注重數值展示方面。ScrollBar 控制元件一般不建議單獨使用,屬於“基礎性”控制元件,適合與其他控制元件組合成功能更加強大的“複合控制元件”,例如我在視訊中講解的“ScrollRect”控制元件。(作為使用者選擇部分)

4: unity做個專案,安裝在手機上執行一會卡死,都不知道從哪裡入手找bug,求各位大神幫忙。。。

答:你自己開發一個移動裝置上的找Bug的機制: 如下操作: 第1: 使用Application.persistentDataPath 作為儲存資料的路徑。 自己寫一個除錯類 (例如: Debuger.cs) 第2:把需要在程式中切入的除錯程式碼,最終寫入txt 檔案(或者XML檔案) 第3: 在手機宕機後,沒有關係。重新進入後,進入自己開發的一個專門顯示txt 或者XML 中內容的頁面,檢視程式執行到哪裡,最終找到原因。
這種機制原理,適用於所有的移動平臺的除錯。

5 this.gameObject.transform.position= new Vector3(1F, 2F, 3F); 老師,gameObject和transform,position都是屬性,他們之間怎麼能引用呢,不是應該通過物件和類來引用的嗎?

答:transform 是GameObject 的屬性。 而GameObject是不能直接應用 transform 的,沒有這個靜態屬性。(Unity規定)。 所以我們通過this.gameObject. 。 獲得這個指令碼所在物件(返回GameObject).然後再獲取transform。

6: uGUI 中 老師,我怎麼拉不動那中心點,總是拉著整個button或text?

答:你拉不動那個中心點,原因是Unity快捷欄中的“Center”在起作用,它保證中線點就一直在控制元件的中心位置。 所以請把“Center”點選改為“Pivot”就可以移動控制元件中心點了。

7: C# 有高內聚低耦合的概念嗎?

答:"高內聚低耦合"是開發中的一個重要設計與開發原則,C#作為國際上最流行的開發語言之一,當然具備。 本質上其實與語言無關,這是一種開發的宗旨、思想。

8: unity5 可以使用visualstudio 開發程式碼,哪可以使用Eclipse開發嗎?

答:目前Unity 不支援Eclipse 作為程式碼編輯器外掛開發專案。

9: 陣列定義好長度之後,想要改變長度怎麼辦?

答:陣列的特點就是,一點定義了長度,就不能更改。如果你要用可變長陣列,就學習“Unity程式設計基礎篇”,裡面講解了ArrayList集合。它的長度是可變的集合。其本質內部實現也是用陣列,進行多個數組相互倒換實現的。

10: 旋轉的區域性座標系與世界座標系的區別是什麼?

答:區域性座標旋轉是指以父物體為參考,進行旋轉。而世界座標系以“座標陀螺”來進行旋轉。類似的情況例如:東、南、西、北、是世界座標系。而前、後、左、右是區域性座標系

11: uGUI 怎麼改變Canvas的螢幕大小?

答:兩種方法:1:可以推進攝像機,如果是2D開發,則把攝像機的Size 設定的更小些。 2:可以使用程式碼方式對Canvas 的Scele 做縮放處理。

12: 怎樣儲存遊戲進度? Save 和 Load功能?

答:儲存遊戲的進度本質就是資料持久化技術的應用。例如我視訊中說的Unity提供的Playerfab 。可以把當前玩家的位置資訊、狀態(分數、血量、**)等儲存且持久化即可。如果是複雜的大量資料儲存,建議用XML作物件與XML的序列化。具體可以看看我下月發行的《Unity3d/2d 遊戲開發零基礎到精通》的,“資料持久化”章節有詳細論述。

13: 請問:我想通過指令碼實現自定義換膚,如何實現比較好?如何利用Sprite Pakcer打包?

答:

//動態追加控制元件 GameObject GoCloneObject = newGameObject("Button"); //新增精靈(外觀處理) Image p_w_picpath= GoCloneObject.AddComponent<Image>(); Button btn =GoCloneObject.AddComponent<Button>(); p_w_picpath.overrideSprite=Resources.Load("Textures/Sprites/Emoticon - Frown", typeof(Sprite))as Sprite;

以上程式碼可以實現動態生成控制元件,且自定義“換膚”。UGUI 中嚴格來說,我們不需要“Sprite Pakcer打包 ”

14: 用vs2013開啟建立的C#指令碼,除錯的時候顯示:無法直接啟動帶有類庫輸出型別的專案,請在此解決方案中新增一個引用庫專案的可執行專案。將這個可執行專案設定為啟動專案!我已經設定了那個啟動專案,但是還是除錯錯誤?

答:是這樣的。 VS只是我們寫程式碼的工具,提供了類方法提示、方法高亮顯示等功能。但是指令碼的執行,還是需要執行Unity的Play 按鈕的。

15: 老師我的VS 是Blend forstudio2013,在unity編輯器設定為VS開啟C#指令碼時,報錯開啟的不是有效的專案,這該怎麼辦啊

答:建議使用VS 2013(官方預設的是MonoDevelop)。你說的VS 版本可能不相容。

16: 老師,我在unity5.0裡面,想播放動畫,this.animation.play ();這樣不行~

答:API 有所更改。this.GetComponent<Animation>().Play();更多Unity5.0 內容API更新請首先看我部落格:http://liuguozhu.blog.51cto.com/9142031/1631190 &nbsp; 。

17: text.rectTransform.rect.Set(0, 0, 417, 2*(j * 52.5f + 300));為什麼沒有效果呢?如果要設定text的hright屬性要怎麼辦?

答:這樣定義:txt_Obj.rectTransform.sizeDelta = newVector2(200, 200);//改變寬度與高度。

18: 老師,我問一個問題,我在game檢視16:10 Portrait(10:16)的檢視下運行遊戲,場景裡的物體運動都是正常的但是當我把game檢視切換到free aspect的時候,場景裡的運動物體就都有了“殘影”,就像是螢幕沒有重新整理一樣,這個是什麼問題呢,我的攝像機用的是正交模式就像是螢幕不重新整理了,每一幀都停留到了螢幕上?

答:

1: 這種情況,先考慮在你角色的背後,加一個背景貼圖。

2: ngui的圖集打的不能太大。

19: 老師,Unity中“預載入”什麼意思,如何實現?

答:“預載入”一般分為兩種情況:

第1種情況: 轉換場景的時候,我們可以使用非同步場景載入的技術,來實現。目的是給玩家一個顯示畫面,在系統後臺載入場景資料,等載入完畢,顯示整個場景。程式碼舉例如下:

public class ScenesLoading : MonoBehaviour{

public Slider Sli_Progressbar; //呼叫進度條

private AsyncOperation async; //非同步物件

private float curProgress; //當前進度

void Start ()

{

StartCoroutine(loadScene());

}

//非同步讀取場景

IEnumerator loadScene()

{

//async =Application.LoadLevelAsync(ConvertNames.SceneNames[GlobalParameterManager.LoadingScenesName]);

async =Application.LoadLevelAsync(ConvertNames.GetInstance().ScenesToName(GlobalParameterManager.LoadingScenesName));

curProgress = async.progress;

yield return async;

}

void Update()

{

if (curProgress <= 1)

{

curProgress += 0.01f;

}

Sli_Progressbar.value =curProgress;

}

}

第2種情況:

在同一場景中實現“預載入”。

如果一個場景非常龐大,勢必要進行優化。優化最簡單的思路可以如下:

1> 遮擋剔除。

2> LOD 層級細節。

3> “層消隱”處理

如果以上步驟還不明顯的話,可以人為的把整個大場景,劃分為幾個部分,當“角色”(主角)要進入一塊“區域”的時候,可以提前3-20秒進行場景的載入,當“角色”離開這片區域時,我們則可以銷燬這片“區域”,以節省計算機或者移動端裝置的內容空間。 這就是“預載入”技術。核心程式碼如下:

void Start()

{

//啟動載入大型建築模型

StartCoroutine("LoadBigBuilding");

}

//本場景進入若干秒後,啟動“預載入”大型場景

IEnumerator LoadBigBuilding()

{

yield return newWaitForSeconds(intLoadTime);

GameObjectgoBuilding_A=Resources.Load("Prefabs/Scenes_A") as GameObject;

GameObject goCloneBuildingA =GameObject.Instantiate(goBuilding_A, Vector3.zero, Quaternion.identity) asGameObject;

}

20: 劉老師,There are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene.控制檯的訊息怎麼刪除,不出現這個

答: 這個警告資訊告訴我們,場景中存在了2個“音訊監聽器”,這是Unity不允許的。 解決方法很簡單,你只需要把其中一個攝像機的監聽給禁止即可。例如下圖:

wKioL1XpZsSTgNibAAJYqdf6RjI654.jpg

21:角色控制器能不能觸發OnTriggerEnter等方法?

答:角色控制器(CharacterController)不能應用OnTriggerEnter 等方法,如果需要檢測CC(CharacterController),需要對方通過名稱或者Tag來觸發檢測。如果需要CC給剛體施加“力”,可以用 OnControllerColliderHit() 方法實現。

(關於其他更多的初學者常見Unity疑問與解答,後面還會繼續總結,敬請期待.)


轉載於:https://blog.51cto.com/liuguozhu/1691362