国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Unity基礎(chǔ) - 封裝一個好用的事件系統(tǒng)

這篇具有很好參考價值的文章主要介紹了Unity基礎(chǔ) - 封裝一個好用的事件系統(tǒng)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

簡介

在游戲開發(fā)過程中,我們會大量使用事件系統(tǒng)。很多時候,比起直接調(diào)用對象組件的方法,使用事件觸發(fā)將很大程度上降低系統(tǒng)的耦合度,從而實現(xiàn)更為優(yōu)雅的系統(tǒng)設(shè)計。

封裝一個好用的事件系統(tǒng)將對我們的開發(fā)起到很大的幫助。

本文將基于Unity提供的ScriptableObject和UnityEvent來封裝一個我們自己的事件系統(tǒng)。隨后,我們可以自定義事件,并在監(jiān)聽器監(jiān)聽到事件后執(zhí)行對應(yīng)的程序邏輯。

我們將基于一個實際的需求來更好地說明這個事件系統(tǒng)是如何進(jìn)行工作的。假設(shè)我們現(xiàn)在正在開發(fā)關(guān)卡選擇頁面,這個頁面上將出現(xiàn)數(shù)量不定的關(guān)卡按鈕(關(guān)卡數(shù)量隨著開發(fā)的進(jìn)行需要不斷增加),點擊關(guān)卡按鈕后,需要加載對應(yīng)關(guān)卡的Scene。這個需求適合用事件系統(tǒng)來解決。我們將在按鈕UI的組件上綁定"StartScene"的GameEvent,點擊按鈕后將觸發(fā)這個事件,然后由MapSelectManager上的GameEventListener進(jìn)行監(jiān)聽,并執(zhí)行加載關(guān)卡的邏輯。

正文

GameEvent類

GameEvent類將繼承ScriptableObject類,這樣做可以讓我們能夠在Unity中為每個自定義事件創(chuàng)建一個數(shù)據(jù)對象。ScriptableObject是全局的,在跨場景的需求中尤其好用。

Unity基礎(chǔ) - 封裝一個好用的事件系統(tǒng),unity,游戲引擎
代碼

[CreateAssetMenu(menuName = "Scriptable/GameEvent")]
public class GameEvent : ScriptableObject
{
    [HideInInspector] public List<GameEventListener> listeners = new List<GameEventListener>();
    
    // Raise event through different methods signatures
    public void Raise(Component sender, object data)
    {
        for (int i = 0; i < listeners.Count; i++)
        {
            listeners[i].OnEventRaised(sender, data);
        }
    }

    public void RegisterListener(GameEventListener listener)
    {
        if (!listeners.Contains(listener))
        {
            listeners.Add(listener);
        }
    }
    
    public void UnregisterListener(GameEventListener listener)
    {
        if (listeners.Contains(listener))
        {
            listeners.Remove(listener);
        }
    }
}

GameEvent負(fù)責(zé)做3件事:觸發(fā)事件、注冊監(jiān)聽器、取消注冊監(jiān)聽器。觸發(fā)事件時,所有注冊本事件的監(jiān)聽器都會調(diào)用OnEventRaised(sender, data)來響應(yīng)此事件。我們可以通過data參數(shù)來傳遞所需要的數(shù)據(jù),比如需要加載的關(guān)卡名稱。

GameEventListener類

GameEventListener負(fù)責(zé)監(jiān)聽GameEvent并執(zhí)行后續(xù)邏輯。

代碼

public class GameEventListener : MonoBehaviour
{
    public GameEvent gameEvent;

    public CustomGameEvent response;

    private void OnEnable()
    {
        gameEvent.RegisterListener(this);
    }

    private void OnDisable()
    {
        gameEvent.UnregisterListener(this);
    }

    public void OnEventRaised(Component sender, object data)
    {
        response.Invoke(sender, data);
    }
}

GameEventListener被Enable時在需要監(jiān)聽的GameEvent上進(jìn)行注冊,被Disable時取消注冊。GameEvent事件觸發(fā)時,OnEventRaised(Component sender, object data)被調(diào)用,執(zhí)行response.Invoke(sender, data)。response是外部傳入的,一個CustomGameEvent對象。

CustomGameEvent

它是Unity提供的UnityEvent的一個封裝,讓我們能將參數(shù)傳入UnityEvent。

代碼

public class CustomGameEvent : UnityEvent<Component, object> { }

使用監(jiān)聽器并綁定對應(yīng)執(zhí)行邏輯

創(chuàng)建一個GameObject用于掛載GameEventListener。

Unity基礎(chǔ) - 封裝一個好用的事件系統(tǒng),unity,游戲引擎
將自定義創(chuàng)建的StartGameScene傳入GameEvent變量。Response也可以傳入外部腳本并調(diào)用腳本中的方法,需要注意的是調(diào)用的方法必須要能夠接收Component和object參數(shù)。

加載場景代碼

public class MapSelectionManager : MonoBehaviour
    {
        private IEnumerator OnStartGameCoroutine(string sceneName)
        {
            ...
        }

        public void LoadScene(Component sender, object data)
        {
            if (data is string sceneName)
            {
                StartCoroutine(OnStartGameCoroutine(sceneName));
            }
        }
    }

Unity基礎(chǔ) - 封裝一個好用的事件系統(tǒng),unity,游戲引擎

事件的觸發(fā)

假設(shè)我們使用MapItemController來負(fù)責(zé)關(guān)卡按鈕的邏輯,那么當(dāng)按下按鈕時,將調(diào)用StartGameScene()方法,隨后觸發(fā)onStartGameScene的Raise(Component sender, object data)方法,完成事件的觸發(fā)。

public class MapItemController: MonoBehaviour
{
	[SerializeField] private GameEvent onStartGameScene;
	
	public void StartGameScene()
    {	
    	string sceneName = GetSceneName(); // 偽代碼,獲取需要加載的場景名稱
   		onStartGameScene.Raise(this, sceneName);
    }

Unity基礎(chǔ) - 封裝一個好用的事件系統(tǒng),unity,游戲引擎
onStartGameScene變量中傳入的對象要與先前我們創(chuàng)建的GameEventListener中傳入的對象保持完全一致。

至此,我們就實現(xiàn)了一個松耦合的開始關(guān)卡的需求。

總結(jié)

我們基于ScriptableObject和UnityEvent封裝了一個自己的好用且便于理解的事件系統(tǒng)。

基于事件可以松耦合地實現(xiàn)各類游戲開發(fā)需求。文章來源地址http://www.zghlxwxcb.cn/news/detail-785433.html

到了這里,關(guān)于Unity基礎(chǔ) - 封裝一個好用的事件系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【Unity3D游戲魔坦之爭】游戲結(jié)束流程封裝實現(xiàn)【七】

    【Unity3D游戲魔坦之爭】游戲結(jié)束流程封裝實現(xiàn)【七】

    ?????個人主頁 :@元宇宙-秩沅 ????? hallo 歡迎 點贊?? 收藏? 留言?? 加關(guān)注?! ????? 本文由 秩沅 原創(chuàng) ????? 收錄于專欄 : unityUI專題篇 ??? ??????:步驟實現(xiàn) 1.坐標(biāo)三個轉(zhuǎn)化 2.GUI的原點和屏幕的原點 3.結(jié)構(gòu)體的特點回顧——涉及Rect_結(jié)構(gòu)體類型 4.血條的

    2024年02月11日
    瀏覽(52)
  • 【用unity實現(xiàn)100個游戲之18】從零開始制作一個類CSGO/CS2、CF第一人稱FPS射擊游戲——基礎(chǔ)篇2(附項目源碼)

    【用unity實現(xiàn)100個游戲之18】從零開始制作一個類CSGO/CS2、CF第一人稱FPS射擊游戲——基礎(chǔ)篇2(附項目源碼)

    本節(jié)就先實現(xiàn)添加武器,一些射擊基本功能實現(xiàn)。 這里我找了一個人的手臂和武器動畫素材 https://sketchfab.com/3d-models/cz-scorpion-evo3-a1-ultimate-fps-animations-f2bdfac775344004ad38d0318f0664a4 將他拖入到為攝像機的子集,然后調(diào)整到合適位置即可 你會發(fā)現(xiàn)手臂有一部分沒法正常顯示,那是因

    2024年04月10日
    瀏覽(29)
  • 【用unity實現(xiàn)100個游戲之18】從零開始制作一個類CSGO/CS2、CF第一人稱FPS射擊游戲——基礎(chǔ)篇4(附項目源碼,完結(jié))

    【用unity實現(xiàn)100個游戲之18】從零開始制作一個類CSGO/CS2、CF第一人稱FPS射擊游戲——基礎(chǔ)篇4(附項目源碼,完結(jié))

    免責(zé)聲明:因為文章附帶 源碼 ,所以我上鎖了,整理不易,但是推薦大家自己手動跟敲代碼理解更加深入

    2024年02月04日
    瀏覽(88)
  • 【Unity3D游戲魔坦之爭】敵方邏輯封裝實現(xiàn)【六】

    【Unity3D游戲魔坦之爭】敵方邏輯封裝實現(xiàn)【六】

    ?????個人主頁 :@元宇宙-秩沅 ????? hallo 歡迎 點贊?? 收藏? 留言?? 加關(guān)注?! ????? 本文由 秩沅 原創(chuàng) ????? 收錄于專欄 : unityUI專題篇 ??? ??????:步驟實現(xiàn) 1.炮臺的行為邏輯封裝:旋轉(zhuǎn),觸發(fā)檢測,發(fā)射炮彈及特效 2.檢測玩家后自動瞄準(zhǔn)攻擊 3.玩家扣

    2024年02月11日
    瀏覽(28)
  • Unity實現(xiàn)一個3D塔防游戲

    Unity是一款游戲引擎,可以用來開發(fā)各種類型的游戲。在這篇文章中,我們將使用Unity來創(chuàng)建一個3D塔防游戲。本文將從游戲設(shè)計開始,一步一步地講解如何實現(xiàn)一個基本的塔防游戲。 對啦!這里有個游戲開發(fā)交流小組里面聚集了一幫熱愛學(xué)習(xí)游戲的零基礎(chǔ)小白,也有一些正在

    2023年04月26日
    瀏覽(21)
  • 【Unity】給游戲添加一個背景圖

    【Unity】給游戲添加一個背景圖

    一、選擇一張高清背景圖jpg,拖到Unity的Project面板下,設(shè)置Texture Type為Sprite。 二、在場景中創(chuàng)建一個空物體并命名為background,點擊add component添加一個sprite renderer組件,設(shè)置Sprite為想要的背景圖片,把Layer設(shè)置為新圖層Background。 三、設(shè)置相機的Clear Flags為Depth only,Culling Mas

    2024年02月11日
    瀏覽(88)
  • 【Unity】Unity開發(fā)學(xué)習(xí)和項目實踐02——創(chuàng)建第一個Unity項目和游戲物體

    【Unity】Unity開發(fā)學(xué)習(xí)和項目實踐02——創(chuàng)建第一個Unity項目和游戲物體

    創(chuàng)建第1個Unity項目 打開Unity hub,點擊新項目 以下有四處地方需要注意選擇: 1.Unity編輯器版本 2.項目模板 3.項目名稱 4.項目保存位置 點擊創(chuàng)建項目 ok,進(jìn)入編輯器了 把編輯器界面布局稍微改一下,改成2by3 點擊Edit 點擊 project settings,這是對我們所創(chuàng)建工程的設(shè)置 此外還有對

    2024年01月25日
    瀏覽(95)
  • 【Unity】教你如何使用Unity制作一個簡單的跑酷游戲

    【Unity】教你如何使用Unity制作一個簡單的跑酷游戲

    其實用Unity制作游戲并不難,如果你想學(xué)習(xí),那我就建議你想從制作一個簡單的跑酷游戲來找到興趣,因為如果你一開始就一直學(xué)習(xí)一些沒什么必要的語法,這樣就會讓你一開始就失去了信心,失去了學(xué)習(xí)Unity的動力,所以如果你先學(xué)習(xí)如何制作一個簡單的跑酷地圖,然后你就

    2024年02月21日
    瀏覽(19)
  • 初識Unity(十步做好你的第一個unity小游戲)

    初識Unity(十步做好你的第一個unity小游戲)

    一、unity的整體認(rèn)識 1、創(chuàng)建項目工程文件以及unity布局介紹 (1)打開unityhub,新建項目工程(Project)選擇保存路徑。 (2)unity的多種布局(窗口的排列)。 認(rèn)識了tall布局下各個view的功能,四個開發(fā)視圖(Scene,Project,Hierarchy,Inspector)以及一個game視圖。 Scene(場景)視圖

    2024年01月24日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包