甚麼是 UnityEvent

更新 發佈閱讀 4 分鐘

前情提要

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

藏在 Unity 裡面

如果你今天正在製作 UI 遷移,你應該對下面這個東西不陌生:

vocus|新世代的創作平台

我們會把按鈕要做的功能塞到 OnClick 上面,像是頁面跳轉、彈出視窗等,但你有沒有想過這個 OnClick 到底是甚麼黑魔法?

vocus|新世代的創作平台

查看 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
#Jaku的沙龍
6會員
10內容數
只要10分鐘!
#Jaku的沙龍的其他內容
2023/09/05
UPM 插件管理、匯入、打包
Thumbnail
2023/09/05
UPM 插件管理、匯入、打包
Thumbnail
2023/08/15
在其他語言會時常使用正規表達式來幫字串進行 Filter,在遊戲製作裡面比較遇不到處理使用者的字串輸入、資料庫查詢結果的情況,但在編輯程式碼,有搜尋(Ctrl+F)、取代(Ctrl+H)需求時使用 Regex 也能提升工作效率。
Thumbnail
2023/08/15
在其他語言會時常使用正規表達式來幫字串進行 Filter,在遊戲製作裡面比較遇不到處理使用者的字串輸入、資料庫查詢結果的情況,但在編輯程式碼,有搜尋(Ctrl+F)、取代(Ctrl+H)需求時使用 Regex 也能提升工作效率。
Thumbnail
2023/08/06
微軟想把 VS 的一些編輯功能在 VS Code 上實作, Unity 也在幾天前推出了基於 C# Dev Kit 的插件,因為新舊版本並不相容,這邊說明兩種(OmniSharp、Roslyn Analyzers)開發環境設置。
Thumbnail
2023/08/06
微軟想把 VS 的一些編輯功能在 VS Code 上實作, Unity 也在幾天前推出了基於 C# Dev Kit 的插件,因為新舊版本並不相容,這邊說明兩種(OmniSharp、Roslyn Analyzers)開發環境設置。
Thumbnail
看更多
你可能也想看
Thumbnail
這篇文章將會介紹官方設置好的偵測玩家輸入,在撰寫遊戲程式的時候肯定需要偵測玩家輸入,其實並不需要自行撰寫程式來監控玩家操作,而是直接調閱官方的資料庫即可。
Thumbnail
這篇文章將會介紹官方設置好的偵測玩家輸入,在撰寫遊戲程式的時候肯定需要偵測玩家輸入,其實並不需要自行撰寫程式來監控玩家操作,而是直接調閱官方的資料庫即可。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
這篇文章將會介紹 Unity Animatior Edit 參數控制的方法,藉由連結程式腳本和動畫編輯器,讓動畫更靈活的運作。
Thumbnail
這篇文章將會介紹 Unity Animatior Edit 參數控制的方法,藉由連結程式腳本和動畫編輯器,讓動畫更靈活的運作。
Thumbnail
新版Input System 要先來調整設定: (如果日後發現移動不了,可能是這邊有出問題,可以把這邊視為一個檢查點) 下載Input System 在script中的寫法: (這邊的功能是讀取移動的值而已,主要目的是讓unity讀到movement,絕對不是托篇幅的拉🥺) using
Thumbnail
新版Input System 要先來調整設定: (如果日後發現移動不了,可能是這邊有出問題,可以把這邊視為一個檢查點) 下載Input System 在script中的寫法: (這邊的功能是讀取移動的值而已,主要目的是讓unity讀到movement,絕對不是托篇幅的拉🥺) using
Thumbnail
前言   這篇文章將會講述碰撞事件的撰寫,跟碰撞事件有關的函式共有六種,分別為 OnCollisionEnter/Stay/Exit 和 OnTriggerEnter / Stay /Exit ,本篇文章將會講述通用的邏輯。 Collider | 碰撞體   在之前我從組件(Component)和程
Thumbnail
前言   這篇文章將會講述碰撞事件的撰寫,跟碰撞事件有關的函式共有六種,分別為 OnCollisionEnter/Stay/Exit 和 OnTriggerEnter / Stay /Exit ,本篇文章將會講述通用的邏輯。 Collider | 碰撞體   在之前我從組件(Component)和程
Thumbnail
這篇文章將會講述 Unity Event 的介紹及基礎使用方法。
Thumbnail
這篇文章將會講述 Unity Event 的介紹及基礎使用方法。
Thumbnail
UnityEvent 簡單介紹。
Thumbnail
UnityEvent 簡單介紹。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
這篇文章將會講述如何使用程式腳本讀取 Input System 的玩家輸入。
Thumbnail
這篇文章將會講述如何使用程式腳本讀取 Input System 的玩家輸入。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這篇文章將會介紹 Unity Input System,這是一個適用於不同平台切換的官方系統,用於玩家按鍵輸入與不同控制器的操作。
Thumbnail
這篇文章將會介紹 Unity Input System,這是一個適用於不同平台切換的官方系統,用於玩家按鍵輸入與不同控制器的操作。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News