Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> unity的 斷言 Unity 5.1 Assertion Library

unity的 斷言 Unity 5.1 Assertion Library

編輯:關於Android編程

當你建立Unity 的手機游戲你最可能渴望設置Script Call Optimization為Fast But No Exceptions,只要你相信你能做到。

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);
        }
    }

    // ...
}

 

好了,就這樣簡單的任務代碼 漂亮很多。也許是另一種方式嗎?

 


Asserts(斷言)的救援!

如果你是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 error message

正如你所看到的我使用 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 是要自己控制的!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved