小屋創作

日誌2020-06-02 18:32

【筆記】Scriptable Object 2.5 -Coroutine Event

作者:樂小呈

Scriptable Object 2.5 -Coroutine, event

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

接續筆記 Scriptable Object 2 -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/creationCategory.php?owner=angus945&c=450267

20

10

LINE 分享

相關創作

台灣獨立遊戲《人造機械之翼》參展CooMIC²,體驗JRPG風格的浪漫飛行冒險

Unity 現學現賣紀錄 - 2024.4

Unity Localization Smart String 不會自動刷新這回事

留言

開啟 APP

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

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