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

基本說明 (參考筆記 ScriptableObject 1.基本 物件池、模組化、繼承及覆寫

實作後確定會造成可讀性、架構上的問題,不建議用這種做法 7/25

運用 Coroutine

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

EnemyData enableData;

void ResetObject() { //實例化,參數,視覺  }
void EnemyActive()
{
    StartCoroutine(enableData.Movement(this.transform));
}

} 調用 EnemyData 的移動行為,並傳入 GameObject的Transform

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

[Header("EnemyBehaviours")]
[SerializeField] BaseEnemyMovement enemyMovement = null;
public IEnumerator Movement(Transform movementTrans)
{
    return enemyMovement.Movement(movementTrans);
}

} 在Inspector變量 BaseEnemyMovement 中,組裝上不同的行為 (BaseEnemyMovement 回傳移動行為 Routine,再交給 EnemyObject 調用

模組化的移動行為,建立一個空的行為給子腳本覆寫,讓 Coroutine傳入 Transform並做出移動行為 public class BaseEnemyMovement : ScriptableObject { public virtual IEnumerator Movement(Transform movementTrans) { } } 覆寫移動行為,繼承自 BaseEnemyMovement public class RightMovement : BaseEnemyMovement { public override IEnumerator Movement(Transform movementTrans) {
while (true) { movementTrans.position += Vector3.right * Time.deltaTime; //持續向右移動 yield return null; } } } public class LeftMovement : BaseEnemyMovement { public override IEnumerator Movement(Transform movementTrans) {
while (true) { movementTrans.position += Vector3.left * Time.deltaTime; //持續向左移動 yield return null; } } }

註 Transform(class)的call type為reference,傳入後也是直接引用傳入的 Transform,所以寫在 ScirptableObject裡的 Coroutine也能夠控制Transform (參考筆記 call Sype 0 - value、class