甚麼是 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
這篇文章將會介紹官方設置好的偵測玩家輸入,在撰寫遊戲程式的時候肯定需要偵測玩家輸入,其實並不需要自行撰寫程式來監控玩家操作,而是直接調閱官方的資料庫即可。
Thumbnail
這篇文章將會介紹官方設置好的偵測玩家輸入,在撰寫遊戲程式的時候肯定需要偵測玩家輸入,其實並不需要自行撰寫程式來監控玩家操作,而是直接調閱官方的資料庫即可。
Thumbnail
全新版本的《三便士歌劇》如何不落入「復刻經典」的巢臼,反而利用華麗的秀場視覺,引導觀眾在晚期資本主義的消費愉悅之中,而能驚覺「批判」本身亦可能被收編——而當絞繩升起,這場關於如何生存的黑色遊戲,又將帶領新時代的我們走向何種後現代的自我解構?
Thumbnail
全新版本的《三便士歌劇》如何不落入「復刻經典」的巢臼,反而利用華麗的秀場視覺,引導觀眾在晚期資本主義的消費愉悅之中,而能驚覺「批判」本身亦可能被收編——而當絞繩升起,這場關於如何生存的黑色遊戲,又將帶領新時代的我們走向何種後現代的自我解構?
Thumbnail
這篇文章將會講述 Unity Event 的介紹及基礎使用方法。
Thumbnail
這篇文章將會講述 Unity Event 的介紹及基礎使用方法。
Thumbnail
UnityEvent 簡單介紹。
Thumbnail
UnityEvent 簡單介紹。
Thumbnail
這篇文章將會介紹 Unity Input System,這是一個適用於不同平台切換的官方系統,用於玩家按鍵輸入與不同控制器的操作。
Thumbnail
這篇文章將會介紹 Unity Input System,這是一個適用於不同平台切換的官方系統,用於玩家按鍵輸入與不同控制器的操作。
Thumbnail
這篇文章將會介紹 Unity Animatior Edit 參數控制的方法,藉由連結程式腳本和動畫編輯器,讓動畫更靈活的運作。
Thumbnail
這篇文章將會介紹 Unity Animatior Edit 參數控制的方法,藉由連結程式腳本和動畫編輯器,讓動畫更靈活的運作。
Thumbnail
若說易卜生的《玩偶之家》為 19 世紀的女性,開啟了一扇離家的窄門,那麼《海妲.蓋柏樂》展現的便是門後的窒息世界。本篇文章由劇場演員 Amily 執筆,同為熟稔文本的演員,亦是深刻體察制度縫隙的當代女性,此文所看見的不僅僅是崩壞前夕的最後發聲,更是女人被迫置於冷酷的制度之下,步步陷入無以言說的困境。
Thumbnail
若說易卜生的《玩偶之家》為 19 世紀的女性,開啟了一扇離家的窄門,那麼《海妲.蓋柏樂》展現的便是門後的窒息世界。本篇文章由劇場演員 Amily 執筆,同為熟稔文本的演員,亦是深刻體察制度縫隙的當代女性,此文所看見的不僅僅是崩壞前夕的最後發聲,更是女人被迫置於冷酷的制度之下,步步陷入無以言說的困境。
Thumbnail
長期以來,西方美學以《維特魯威人》式的幾何比例定義「完美身體」,這種視覺標準無形中成為殖民擴張與種族分類的暴力工具。本文透過分析奈及利亞編舞家庫德斯.奧尼奎庫的舞作《轉轉生》,探討當代非洲舞蹈如何跳脫「標本式」的文化觀看。
Thumbnail
長期以來,西方美學以《維特魯威人》式的幾何比例定義「完美身體」,這種視覺標準無形中成為殖民擴張與種族分類的暴力工具。本文透過分析奈及利亞編舞家庫德斯.奧尼奎庫的舞作《轉轉生》,探討當代非洲舞蹈如何跳脫「標本式」的文化觀看。
Thumbnail
這篇文章將會講述如何使用程式腳本讀取 Input System 的玩家輸入。
Thumbnail
這篇文章將會講述如何使用程式腳本讀取 Input System 的玩家輸入。
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)和程
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News