2014-09-27 49 views
4

大多數統一教程建議使用更新功能內的鼠標事件,像這樣:團結全球鼠標事件

function Update() { 

    if (UnityEngine.Input.GetMouseButton(1)) { 

    } 

} 

這令我真的很低效雖然,類似於JS在AS或setInterval的使用的onEnterFrame給力整個應用程序 - 我真的更喜歡使用基於事件的系統。

OnMouseDown()方法很有用,但只有在MouseDown位於對象上時纔會觸發,而不是場景中的任何位置。

所以,這裏的問題是:在Unity中是否有MouseEvent用於檢測鼠標按鈕是否全局關閉,或者更新解決方案是推薦的選項?

+2

這不是非常低效。實際上任何事件驅動的輸入系統都會在幕後完成,所以事件驅動的方法可能會帶來更多的開銷。 – LearnCocos2D 2014-09-27 14:11:38

回答

4

這令我真的,雖然效率不高,類似於JS使用 的onEnterFrame在AS或setInterval的整個應用 力量 - 我真的很喜歡使用基於事件的系統。

正如評論中指出的那樣,這並不是必要的低效率。每個基於事件的系統都可能使用類似於後臺的輪詢例程,並以給定的頻率進行更新。

在許多遊戲引擎/框架中,您將找到一個基於輪詢的輸入處理方法。我認爲這與輸入更新頻率與幀率/更新環路頻率直接相關的事實有關。事實上,以比遊戲循環更高或更低的頻率來聽輸入是沒有什麼意義的。

所以這裏的問題:是否有統一的MouseEvent檢測 如果鼠標按鍵時全球範圍內,或者是更新的解決方案的 推薦的選項?

沒有沒有。順便說一句,如果你想你可以在單個類中包裝鼠標輸入檢測,並暴露其他類可以註冊的事件。 喜歡的東西:

public class MouseInputHandler : MonoBehavior 
{ 
    public event Action<Vector2> MousePressed; 
    public event Action<Vector2> MouseMoved; 
    ... 

    void Update() 
    { 
    if (Input.GetMouseButton(0)) 
    { 
     MousePressed(Input.mousePosition); 
     ... 
    } 
    } 

} 
1

陳述一樣,你可以使用它沒有重大關切,團結會「做它的魔力」內部爲在輪詢事件方面設定的處理能力高的代碼執行你。畢竟這就是現代遊戲引擎的美麗。您通常不必繞着常見的功能(例如鼠標點擊檢測)進行黑客攻擊。

但是,如果你不想使用主Update(),你可以創建一個CoRoutine,如果你對此感覺更舒服,只要記住Unity協程既不是多線程的,所以最後無論如何,一切都需要等待。