甚麼是 UnityEvent

更新於 發佈於 閱讀時間約 3 分鐘

前情提要

這篇主要介紹的是 Unity 內建的 UnityEvent,原本是打算面向比較初階的教學,後來發現有些程式碼還是太不入門了(Lambda語句、泛型等),所以如果在閱讀時遇到看不懂的部分先在這邊說聲抱歉。

藏在 Unity 裡面

如果你今天正在製作 UI 遷移,你應該對下面這個東西不陌生:
Button Component
我們會把按鈕要做的功能塞到 OnClick 上面,像是頁面跳轉、彈出視窗等,但你有沒有想過這個 OnClick 到底是甚麼黑魔法?
Button metadata
查看 Button 可以發現 onClick 是一個 ButtonClickEvent ,它繼承了今天要講的主角 UnityEvent 。
要宣告 UnityEvent ,不要忘記將命名空間加入。
using UnityEngine.Events;

角色控制器

這裡有一個大家的好朋友,一個最基本的角色移動程式碼:
  • 定義了 speed ,移動速度
  • 在 Update() 內逐幀判斷鍵盤輸入
  • 鍵盤輸入方向鍵時讓 transform 朝輸入方向進行位移
  • 鍵盤輸入空白鍵讓 Player 執行 Attack()
這個程式碼有很多問題,像是按鍵是寫死的、沒有加速度等,除此之外,隨著遊戲開發, Update() 方法裡肯定不只是這短短的程式碼,像這樣的程式碼要怎麼用 UnityEvent 來魔改呢?

很笨的成績單

在我當兵新訓的時候,有個規定是打靶 6 發要中 4 發,滿靶的有手機玩,而沒達標的準備罰站。
於是,每次打完靶,你不只要大老遠從靶場走回來,當班長把成績掛上公告欄,你還得跟同袍們擠來擠去,看今晚究竟是吉是凶。大家同時擠在公告欄前面,人一多就吵吵鬧鬧,班長不開心了,把大家臭罵了一頓。
用 C# 寫起來就像這樣:
上述這個情況,有兩個問題點:
  • 每個人只需要知道 自己的 成績
  • 其實成績只跟 滿靶少於4發 的人有關係
這時候如果有個人負責看完之後, 廣播 滿靶跟未達標的阿兵哥就行了。
所以我們有了會主動通知的成績單:
有甚麼不一樣?
  • gradeEvent 可以讓所有阿兵哥透過 Subscribe() 訂閱
  • Publish() 裡面先判斷哪些成績符合需求,透過 Invoke() 廣播
  • 另外你會注意到 gradeEvent UnityEvent 使用了泛型,這讓我們可以定義這個事件廣播時傳出的參數類型
  • 在這個範例中傳出的類型是 號碼(int)狀態(Soldier.Status)

魔改控制器

我們不妨換個方向思考,把控制器給獨立出來!
然後就能讓 Player 來訂閱這個控制器的事件
有甚麼不一樣:
  • 控制器被分離了,這意味著我們可以隨時抽換控制器,也可以讓其他物件擁有、甚至操控這個控制器
  • Player 的 Update() 可以更專注於其他行為
但假設角色死了,總不能讓玩家繼續操控吧!所以有了下面的程式碼:
讓角色死亡時使用 RemoveListener() 來解除訂閱。

小結

這次大概用了兩個例子展示 UnityEvent 的使用方式:
  • AddListener 訂閱
  • Invoke 廣播
  • 不需要時 RemoveListener 解除訂閱
上面的角色控制器也還有很多值得修正的地方,就先匆匆帶過了,如果對事件有興趣,可以往 C# 原生的事件系統研究,雖然使用上沒有 UnityEvent 那麼簡單,但效能跟擴充性都強了點。
avatar-img
6會員
10內容數
只要10分鐘!
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
你可能也想看
Google News 追蹤
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇內容,將會講解什麼是「switch」,以及與「switch」相關的知識。包括switch的簡介、switch、break。
Thumbnail
這篇內容,將會講解什麼是腳本函式,以及與腳本函式相關的知識。包括腳本的簡介、使用函式(或全域變數)的注意事項、定義全域變數、定義函式、什麼是宣告、局部變數的應用。
Thumbnail
這篇內容,將會講解什麼是函式,以及與函式相關的知識。包括函式的簡介、Runtime Function、自訂函式、Script Function 腳本函式、Method 方法。
Thumbnail
這篇內容,將會講解什麼是變數範圍,以及與變數範圍相關的知識。包括變數範圍的簡介、實體變數、全域變數、局部變數、常數。
Thumbnail
這篇內容,將透過實戰教學,介紹GameMaker中的Event。包括Event的簡介、Create的講解、Step的講解、Events的基本操作。
Thumbnail
剩下兩週上課囉,大家加油!! 在一開始我們在課程完成了椅子(角色的移動嘛),但遠遠的看著他移動好像缺少了一些遊戲體驗 嗎?>< 這週我們就來改變遊戲的視角吧~~ 來看一下兩個版本的比較~~ 原本WASD AD控制Y軸旋轉(轉頭),後來改成WASD控制平移座標,把旋轉特別移出來到滑鼠上,
Thumbnail
上次我們完成用Unity 建完一張椅子,還有學習基本變數的應用,那我們就繼續寫更多的腳本來讓物體有更多的ㄅㄧㄢ #一般不會用Unity來建模啦,主要還是要靠其他3D軟體導入 ●Gravity Scale 重力預設為1,是造成物體下墜的主因,可以先調到0。 (Unity有支援負
Thumbnail
完成了Debug.log()的測試,接著還是要跟各位簡單講一下C#的一些規則,之後看程式會(比較)看得懂。 又講到變數? 在Unity中,變數是重要的工具,用來儲存和管理資料。讓開發者能夠靈活調整遊戲的行為和性能,減少代碼的重複性,使得遊戲開發更加高效和簡潔。透過使用變數,開發者可以輕鬆修改資料
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
哈囉~很久沒跟各位自我介紹一下了~ 大家好~我是爺恩 我是一名圖文插畫家,有追蹤我一段時間的應該有發現爺恩這個品牌經營了好像.....快五年了(汗)時間過得真快!隨著時間過去,創作這件事好像變得更忙碌了,也很開心跟很多厲害的創作者以及廠商互相合作幫忙,還有最重要的是大家的支持與陪伴🥹。  
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇內容,將會講解什麼是「switch」,以及與「switch」相關的知識。包括switch的簡介、switch、break。
Thumbnail
這篇內容,將會講解什麼是腳本函式,以及與腳本函式相關的知識。包括腳本的簡介、使用函式(或全域變數)的注意事項、定義全域變數、定義函式、什麼是宣告、局部變數的應用。
Thumbnail
這篇內容,將會講解什麼是函式,以及與函式相關的知識。包括函式的簡介、Runtime Function、自訂函式、Script Function 腳本函式、Method 方法。
Thumbnail
這篇內容,將會講解什麼是變數範圍,以及與變數範圍相關的知識。包括變數範圍的簡介、實體變數、全域變數、局部變數、常數。
Thumbnail
這篇內容,將透過實戰教學,介紹GameMaker中的Event。包括Event的簡介、Create的講解、Step的講解、Events的基本操作。
Thumbnail
剩下兩週上課囉,大家加油!! 在一開始我們在課程完成了椅子(角色的移動嘛),但遠遠的看著他移動好像缺少了一些遊戲體驗 嗎?>< 這週我們就來改變遊戲的視角吧~~ 來看一下兩個版本的比較~~ 原本WASD AD控制Y軸旋轉(轉頭),後來改成WASD控制平移座標,把旋轉特別移出來到滑鼠上,
Thumbnail
上次我們完成用Unity 建完一張椅子,還有學習基本變數的應用,那我們就繼續寫更多的腳本來讓物體有更多的ㄅㄧㄢ #一般不會用Unity來建模啦,主要還是要靠其他3D軟體導入 ●Gravity Scale 重力預設為1,是造成物體下墜的主因,可以先調到0。 (Unity有支援負
Thumbnail
完成了Debug.log()的測試,接著還是要跟各位簡單講一下C#的一些規則,之後看程式會(比較)看得懂。 又講到變數? 在Unity中,變數是重要的工具,用來儲存和管理資料。讓開發者能夠靈活調整遊戲的行為和性能,減少代碼的重複性,使得遊戲開發更加高效和簡潔。透過使用變數,開發者可以輕鬆修改資料