6. 依存性を注入する
クラスを分割して依存の方向を設計するときに問題になるのが、依存するクラスのインスタンスをどうやって取得するか?ということです。要するに、必要な別のクラスにどうやってアクセスするのか、ということです。
最も良い方法は、必要なクラスのフィールドを定義し、[SerializeField] 属性をつけてインスペクターから注入してやることです。こうすることで、実際にどのインスタンスを使用するかを知る必要がありません。必要ならテスト用のインスタンスを渡すことだってできます。つまり、疎結合になるのです。
csharp
// ✅ Good: [SerializeField] でインスペクターから注入
public class GameLoop : MonoBehaviour
{
// どのインスタンスを使うかはインスペクターで設定する
[SerializeField] PlayerMover playerMover;
[SerializeField] EnemySpawner enemySpawner;
void Start()
{
enemySpawner.OnEnemyDefeated += HandleEnemyDefeated;
}
void HandleEnemyDefeated()
{
}
}
// → GameLoopはインスペクターで設定されたインスタンスを使うだけ
// → どのオブジェクトが注入されるかはGameLoop自身の知ったことではないこのように、どのインスタンスに依存するかという依存性の問題の解決を外部に任せ、外部から注入してもらう手法を依存性注入(DI)といいます。