編輯:關於android開發
Fast But No Exceptions是隱藏在Edit -> Project Settings -> Player menu (Other Settings/Optimization section)。通過選擇此選項您的代碼將會去除異常處理代碼,而得到更好的性能。通過啟用此選項 你將帶著很大風險。從現在起,任何異常會使你的游戲立即崩潰,你甚至不知道原因是什麼。
你可能想要啟用 Fast But No Exceptions選項,只有當你確信你的游戲不會拋出一個單一的異常。此外,如果你不是唯一的人在該項目中工作,風險就更大。
不要假設任何事情
不要假設你的腳本設置正確。要做一個悲觀主義者,無時無刻都在想的最壞的情況。讓我們以這個腳本為例:
public class Plane : MonoBehaviour { public Airport airport; void Update() { if (Vector3.Distance(airport.transform.position, transform.position) < 1000) { Land(); } } // ... }
這是一個非常基本的例子,關於如何與機場飛機進行交互。我想你已經知道要說什麼。此代碼如果沒有Airport將會中斷。這是,我們假設在場景工作的人會仔細,連接對象之間的所有引用的情況。但它不是那麼容易,因為他們不連接的所有引用Unity不會給任何人的任何錯誤或警告,除非他們運行Scene,看到的異常。
好吧,我們試著讓這個腳本更有自我意識。我們希望它有點毛病時發出聲音。為了做到這一點,我將使用 MonoBehaviour.OnValidate() 消息。
OnValidate() 被調用的情形是:
? 在 編輯器不需要進入play 模式
? 任何腳本值更改時
? 場景scene 加載時
因此,該腳本可能現在看起來像這樣:
public class Plane : MonoBehaviour { public Airport airport; void OnValidate() { if (airport == null) { Debug.LogError("Airport is set to null", this); } } void Update() { if (Vector3.Distance(airport.transform.position, transform.position) < 1000) { Land(); } } // ... }
這將打印錯誤消息到控制台,playing你的游戲在編輯器中,並在大多數情況下,這將是足夠了。然而,你也可能想要在運行時 檢查是否airport為 null (OnValidate()函數僅在編輯器中工作) 。
public class Plane : MonoBehaviour { public Airport airport; void OnValidate() { CommonValidate(); } void Update() { CommonValidate(); if (Vector3.Distance(airport.transform.position, transform.position) < 1000) { Land(); } } void CommonValidate() { if (airport == null) { Debug.LogError("Airport is set to null", this); } } // ... }
好吧,你現在肯定在你的游戲中不拋出 任何異常, 使所有的驗證過程造成一些 (小,但仍) 開銷。如何擺脫它? 也許預處理器將幫助嗎?
public class Plane : MonoBehaviour { public Airport airport; void OnValidate() { CommonValidate(); } void Update() { #if UNITY_EDITOR CommonValidate(); #endif if (Vector3.Distance(airport.transform.position, transform.position) < 1000) { Land(); } } void CommonValidate() { if (airport == null) { Debug.LogError("Airport is set to null", this); } } // ... }
好了,就這樣簡單的任務代碼 漂亮很多。也許是另一種方式嗎?
如果你是Unity 5.1 (或以上) 用戶,那麼你可以利用新的assertion library。它是真的很容易使用和內 Assert 類可能找到所有需要的函數。讓我們使用它而不是簡單的 null 檢查。
public class Plane : MonoBehaviour { public Airport airport; void OnValidate() { Assert.IsNotNull(airport); } void Update() { Assert.IsNotNull(airport); if (Vector3.Distance(airport.transform.position, transform.position) < 1000) { Land(); } } // ... }
正如你所看到的我使用 Assert.IsNotNull()。該函數告訴我期待值不為 null,如果它為 null,那麼我想知道這件事。
Asserts 有手動檢查的一些優勢:
? 簡單易讀的代碼
? 錯誤消息是 干淨和 可讀性強的 assert 錯誤消息
? 默認情況下斷言在 non-development模式 (你不需要使用預處理器), building 游戲時就扒掉。
如果你想要 將asserts 列入您的build (斷言不是由 默認的異常) 然後你需要做的一切是在腳本定義的符號,可以發現在Edit -> Project Settings -> Player的 Script Define Symbols 菜單中定義 UNITY_ASSERTIONS。斷言不中斷執行;資產將只打印錯誤和會繼續執行。如果你想要它只是作為exceptions(中斷執行),請確保從您的代碼將 Assert.raiseExceptions 設置為 true。
記住,asserts 可能 在任意位置上使用您的代碼 (它不一定要在Update ),但它是一個好的習慣,要盡可能檢查盡可能多的事情之前執行的實際的代碼。快速失敗,安全!
。。。。
assert可以實現“三步一崗五步一哨”可以說是保證代碼正確性(安全編程)的最有力工具。在用c++寫程序的時候assert語句總是要占整個程序的大部分篇幅。
但是轉到unityc#,一開始沒找到assert,忍受了很長一段時間,今天好好google了一下,終於找到了。
從unity5.1才引入的,參考:http://answers.unity3d.com/questions/19122/assert-function.html
下面是assert文檔:http://docs.unity3d.com/ScriptReference/Assertions.Assert.html
但文檔中建議不直接使用assert,而是使用MustExtensions,它是assert的一個可讀性更好的封裝。
MustExtensions文檔:http://docs.unity3d.com/ScriptReference/Assertions.Must.MustExtensions.html
比如有一個變量n,我要斷言:
(1) 斷言n==0,可寫成:
n.MustBeEqual(0,"nmust be zero!");
或
(n == 0).MustBeTrue ("n must be zero!");
(2) 斷言n>0,可寫成:
(n>0).MustBeTrue ("n must greater than zero!");
在使用Must前需要using UnityEngine.Assertions.Must;
斷言和Debug的區別:
比較明顯的是:
Unity對斷言增加和封裝了很多判斷函數!
unity在發布的時候分為:release build 和 debug 前者發布 會自動移除掉斷言的, 但是Log 是要自己控制的!
Android ViewPager 重復數據問題的解決方法,androidviewpager最近在做的新聞客戶端用到了ViewPager,Android Studio如今
Android進程絕殺技--forceStop一.概述 1.1 引言 話說Android開源系統擁有著App不計其數,百家爭鳴,都想在這“大爭之世”尋得系統存活的一席之地
RxAndroid使用方法介紹 熟悉RxAndroid的使用方法. 要點包含: (1) 鏈式表達式的使用方式. (2) Lambda的應用. (3) Rx處理網絡請求
【Android】常見問題解答,android這裡匯總了用C#和VS2015開發Android App時一些常見的最基本的問題及解決辦法,以後有新的問題時都在這裡一並回答
Android——eclipse下運行android項目報錯 Conve