tonari note

オンラインゲームエンジニアの雑記

MonoBehaviourの抽象化

別にMonoBehaviourじゃなくてもいいのですが、ライブラリなどで提供されている既にあるクラスにインターフェイスのような抽象化を施したい時に、抽象クラスというものがあります。

// インターフェイス
public interface ILoader
{
 IEnumerator Load();
}

// Unityで使う場合はこっち
public abstract class Loader : MonoBehaviour, ILoader
{
 public abstract IEnumerator Load();
}

// 実際の実装
public class HogeLoader : Loader
{
 public IEnumerator Load()
 {
  //...
 }
}

なんか変なサンプルですけど……

これを

public class HogeLoader : MonoBehaviour, ILoader {}

にすると、Unityでは

// インターフェイスはComponentじゃないのでGetComponentできない
GetComponents<ILoader>();

// ので、仕方なく
GetComponents<MonoBehaviour>().Where(_=>(_ as ILoader) != null).Select(...)

みたいな状態になってるのを見たり。
抽象クラスの紹介でした。