在這裡我將演示如何創建代表、 事件和Singletons 在一起工作。本教程為 Unity3D 編寫。
我想知道這為什麼?
作為一個年輕的自學程序員,我經常發現自己寫tons 和布爾的語句,以確定是否發生了某些event 或action 。我聽這些events 事件通過Coroutines 協同程序和其他方法來返回值。如果你發現自己這做得一樣好,停下來 !
歡迎光臨Events事件......
介紹
最近,我一直要改善我的 C# 編程技能,以及發現自己缺乏知識,了解Events事件基礎。所以,雖然通過許多教程在 MSDN 和其他博客上看著,發現了大多數的教程要復雜和茂盛用令人費解的代碼不相關的核心概念。我不希望這發生在你身上 !
這樣說過我會試著解釋Events 事件和在項目中如何使用它們的基礎......
Singleton?
如果你不知道什麼Singleton,。單身人士是不能 — 或重復的腳本。嗯......。
我推薦使用Singleton不需要復制多次在game中的東西。如Inventory System庫存系統。通常情況下,玩家只需要一個庫存,我們只想要一個。當我們調用它時,我們想要確保它不會得到復制。
有許多方法可以創建Singletons,但這種方法經常使用,因為它很簡單......
// This class sits on my camera and handles all the clicks I send with a Raycast public class Clicker : MonoBehaviour { // Singleton private static Clicker instance; // Construct private Clicker() {} // Instance public static Clicker Instance { get { if (instance == null) instance = GameObject.FindObjectOfType(typeof(Clicker)) as Clicker; return instance; } // Do something here, make sure this is public so we can access it through our Instance. public void DoSomething() { } ...
在這裡,'Clicker’ '類附加到我的Camera上。此類處理點擊 在3D 空間Raycast 的 。
若要從另一個腳本訪問我 'DoSomething’ 的方法,我只能...
Clicker.Instance.DoSomething();
這消除了需要使用大量的靜態方法和變量的調用,再加上只給了我們一個實例 !
委托和事件?
委托可以看作是對對象的引用指針。當它被調用時,它會通知所有引用該委托的方法。
所以,第一件事......
定義一個委托和獲取調用時它觸發的方法......
public class Clicker : MonoBehaviour { // Event Handler public delegate void OnClickEvent(GameObject g); public event OnClickEvent OnClick;
代理調用 'OnClickEvent' 通過一個‘GameObject’,我們可以使用來定義它來自什麼游戲物體。然後,我們定義了 'event’ OnClick 獲取調用時調用的委托。
現在,在相同的腳本中,我們需要調用委托,並將其傳遞我們的游戲對象。通過 Raycast......
public class Clicker : MonoBehaviour { // Event Handler public delegate void OnClickEvent(GameObject g); public event OnClickEvent OnClick; // Handle our Ray and Hit void Update () { // Ray Ray ray = Camera.mainCamera.ScreenPointToRay(Input.mousePosition); // Raycast Hit RaycastHit hit; if (Physics.Raycast(ray, out hit, 100)) { // If we click it if (Input.GetMouseButtonUp(0)) { // Notify of the event! OnClick(hit.transform.gameObject); } } } }
如你所見的,如果Ray 已聯系 ,我們左鼠標單擊對象,我們調用該事件並傳遞游戲物體。
我們必須做的最後一件事是從我們正在聽call 的其他腳本引用委托。為此我創建了一個名為 GoldPile 類。
public class GoldPile : MonoBehaviour { // Awake void Awake () { // Start the event listener Clicker.Instance.OnClick += OnClick; } // The event that gets called void OnClick(GameObject g) { // If g is THIS gameObject if (g == gameObject) { Debug.Log("Hide and give us money!"); // Hide gameObject.active = false; } } }
在我們的 Awake() 方法中,我們定義我們listening 的事件並分配一個獲取調用 OnClick 的本地方法。'OnClick' 不需要我們委托方法相同,但它可以。
注:在以前的帖子我們添加一個單例到我們Clicker 類。這使我們能夠使用 Clicker.Instance
正如你所看到的我們還創建了傳遞我們點擊我們游戲的 OnClick() 方法。
注:如果您必須使用 if (g == gameObject),否則,它將隱藏該方法以及場景中的其他實例...這就是為什麼我們通過GameObject 供參考 !
現在你有空,如果需要將此方法添加到您的游戲中的任何其他腳本。別忘了定義的方法,並在你的 Awake() 委派。
Yes, best way is to use OnEnable/OnDisable:
void OnEnable
{
Clicker.Instance.OnClick += OnClick;
}
void OnDisable
{
Clicker.Instance.OnClick -= OnClick;
}