創作內容

20 GP

【筆記】Scriptable Object 2.5 -Coroutine Event

作者:樂小呈│2020-06-02 18:32:02│巴幣:40│人氣:613
Scriptable Object 2.5 -Coroutine, event

Scriptable Object
模組化的進階運用,模組化行為架構,搭配Coroutine及event


------------------------------------------------------------------------------

運用 Coroutine, C# event
在移動行為中觸發委派、在移動完畢後觸發委派


用於 EnemyData 實例化的物件、調用行為、傳入事件,以及物件池回收
public class EnemyObject : MonoBehaviour
{

    EnemyData enableData;
    public Action<EnemyObject> EnemyRecycleHandler; //物件池委派

    void ResetObject() { //實例化,參數,視覺  }
    void EnemyActive()
    {
        StartCoroutine(enableData.Movement(this, EnemyRecycleHandler));
        在移動完成時觸發物件池回收委派
    }
}
調用 EnemyData 的移動行為 Routine,並傳入 EnemyObject自身,及移動行為完成時執行的委派
(參考筆記 事件運用 建構、解構 & 一些細節


模組化架構的核心,行為架構將被組裝在這上面
public class EnemyData : ScriptableObject  
{
    //other variable...

    [Header("EnemyBehaviours")]
    [SerializeField] BaseEnemyMovement enemyMovement = null;
    [SerializeField] BaseEnemyAction movementAction = null;

    public IEnumerator Movement
        (EnemyObject movementObject, Action<EnemyObject> FinishHandler)
    {
        return enemyMovement.Movement
             (movementObject, movementAction.TriggerAction, FinishHandler);
    }
}
在Inspector變量 BaseEnemyMovement 中,組裝上不同的行為
(BaseEnemyMovement, BaseEnemyAction
回傳移動行為 Routine,再交給 EnemyObject傳入事件並調用


模組化的基本行為
public class BaseEnemyAction : ScriptableObject
{
    public virtual void TriggerAction(EnemyObject triggerEnemy){  }
}
//複寫範例省略


讓 Coroutine傳入 EnemyObject及 Function(Aciton),並做出移動行為和事件的觸發
public class BaseEnemyMovement : ScriptableObject
{
    public virtual IEnumerator Movement
            (EnemyObject movementObject, Action<EnemyObject>          
             MovementActionHandler,Action<EnemyObject> MovementFinishHandler) { }
}
覆寫移動行為,繼承自 BaseEnemyMovement,添加上移動模式以及委派的觸發
public class UpwardMovement : BaseEnemyMovement
{
    //other variable...

    public override IEnumerator Movement
            (EnemyObject movementObject, Action<EnemyObject>       
              MovementActionHandler,Action<EnemyObject> MovementFinishHandler)
    {
        while (time < duration)
        {
            //upwardMovement...
            
            //if trigger movement Action...
            MovementActionHandler?.Invoke(movementObject);

            yield return null;
        }

        MovementFinishHandler?.Invoke(movementObject);
    }
}


註,警告
ScriptableObject是直接對 Project裡的物件進行引用
如果 Action宣告在 ScriptableObject的 class中,註冊事件時不同物件都會註冊在同一個 Scriptable上
public class NewScriptableObject : ScriptableObject
{
    public Action ScriptableObjectEvent;
    public Action ScriptableObjectHandler;

    public void InvokeFunction() { //Actions Invoke }
}


這是在把專案的敵人、道具,用ScriptableObject重作了一次之後整理出的筆記
專案中差不多就是用這種方法達成模組化架構的

這種作法可能會造成可讀性上的問題
如果行為模式單一的話,還是建議只讓Scriptsable Object儲存數值就好
但如果沒個行為模式的差異都蠻大的話,用這種方式就OK

之後搭配Animation用也會再發筆記

引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4803340
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:Unity|筆記

留言共 10 篇留言

御安鴨·摸頭害鴨哭
我總有一天會看懂的

06-02 18:51

樂小呈
加油[e12]06-02 19:11
S彩S
omg 滿滿的英文(つд⊂)

06-02 19:16

樂小呈
我也ㄅ喜歡英文[e3]06-02 19:18
塵結
是一堆我看ㄅ懂的東西呢

06-02 19:51

樂小呈
窩也有一堆看不懂的東西[e3]06-02 19:58
蝦米coco
我竟然看的懂4/3好感動

06-02 23:42

樂小呈
大...大佬,竟然能看出連我都沒發現的部分[e28][e28]06-02 23:45
蝦米coco
C#基礎還蠻有用的

06-02 23:46

樂小呈
你的那些C#基礎好難QAQ06-02 23:48
蝦米coco
實作幾次會比較懂,還不懂的可能還沒學到學到了,之後在回去看因該會比較

06-02 23:51

樂小呈
豪,窩會努力的[e13]06-02 23:53
蝦米coco

06-02 23:51

蝦米coco
一起加油

06-02 23:57

樂小呈
一起加油![e12]06-03 00:00
像素學徒
每日回覆佬

06-03 13:46

樂小呈
ㄅ佬06-03 14:07
樂小呈
謝ㄊㄓ06-03 14:07
kiwi(薇薇安)
還是好多英文喔>.<

06-03 20:38

樂小呈
度的這也都是英文[e15]06-03 20:47
我要留言提醒:您尚未登入,請先登入再留言

20喜歡★angus945 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:【筆記】Scriptab... 後一篇:【專案】ACG Baha...

追蹤私訊切換新版閱覽

作品資料夾

sakata21大家
來看看孑寶吃阿嬤種得 美味瓜瓜 還有孑寶那 清澈且愚蠢的眼神~~看更多我要大聲說1小時前


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】