看了大佬的event教學與筆記,讓我熊熊燃起興趣,想好好究研究一下
我不能講出甚麼大道理,而且可能會用錯一堆專業用詞之類的,還請見諒。
簡單說一下event system使用方式:
建議服用這影片:
首先,創個單例物件,所謂的單例物件大概就是整個場景裡面只會有一個特定的class存在,例如一個scene裡面只有一個gameManager類別。且單例物件通常都會定義一個自己的static instance讓其他物件可以輕鬆抓取。
再來,在單例物件裡規劃有哪些event 與 呼叫event的公開方法。
第三,實作方法並給event訂閱
以上說起來好像很簡單,但像我這種新手就很容易搞混在這種掛來掛去的奇妙關係中。
所以搭配上方的影片內容,我做了個整理: (字醜請見諒
)
簡單說DoorTrigger是附加在一個有碰撞器的物件上,用來檢測玩家物件是否靠近了,是就呼叫開房的方法。玩家遠離就呼叫關門的方法。
而DoorController就是把這些關門、開門方法實作的主角!!
我寫"參數要一致"的意思是:
OnDoorOpen當初是宣告成 event Action<int>
所以DoorController實作方法的傳入參數就得跟他一樣。 ((除非是多載(? 我還沒試過事件多載
錯誤訊息如下:
看了以上基本知識,想出個小練習題目給大家
用上面學到的event的方法做個打擊判斷:
規則: 星星到圈圈裡時按下space就得分! 用滑鼠也可以,只是滑鼠的判斷要用到ray比較麻煩。
我的做法:(歡迎提供建議!)
單例物件:
每個星星物件都有的腳本:
再來是超陽春星星產生器:
在來是判斷的主角! 圈圈的控制腳本:
我用一個清單紀錄在圈圈裡的星星id,當星星離開即刪除該星星id
明明有個OnTriggerStay2D方法,何苦這要自己紀錄呢?
如果真的成了,那程式碼又能更短的說....
心得:
在真正開始認識event system之前,我最常也可以說是唯一會用到的委託方法大概就是SceneManager LoadScene的時候了。
參考
還記得我年初做的音樂打擊遊戲嗎?
我是在每個打擊點物件上放一個用Ray偵測是否按到此物件的腳本,感覺想法跟此次實作差不了太多。
不過event可以直接回傳被互動的物件的資訊,而我之前的作法則是把所有點到的"物件本身"都蒐集起來,才再其中找出我要的資訊。
[腦動大開]
感覺使用event是個擴充性很強的一個做法,像是若我想幫角色增加一個暫時性的回血BUFF,是不是就可以在event掛上回血的方法呢?!
雜談:明明要大考了我還在這裡玩Unity
然後如果我沒有怠惰的話....想做個可愛紓壓的像素走路模擬遊戲XD