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
MovementActionHandler,Action
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