[Unity] [C#] クラス定義を複数ソースに分割する
UnityでC#のクラスを定義するとき、通常はひとつのソースファイル内で完結するのが普通でしょう。
しかし、そのクラスの定義が数千行になった場合はソースファイルを編集するのが大変になります。
また、複数人でひとつのクラスを実装するとき、ファイルが同一だと競合を起こしてしまいます。
SVNやGITなどのバージョン管理ツールを用いればマージである程度回避できますが、このマージ機能もあまり信用できるものではありません。
このような場合、ひとつのクラス定義を複数のソースファイルに分割できれば問題を解消できます。
C#で以下のクラスを定義していたとします。
Blinker.cs
using UnityEngine; using System.Collections; // クラス public class Blinker : MonoBehaviour { public float interval; public bool showOnDisable; private IEnumerator blink; // メソッド void Start() { blink = Blink(); StartCoroutine(blink); } // メソッド private void OnDisable() { StopCoroutine(blink); if ( showOnDisable && renderer != null ) { renderer.enabled = true; } } // メソッド IEnumerator Blink() { while ( true ) { // オブジェクトの表示状態を反転させる if ( renderer != null ) { renderer.enabled = !renderer.enabled; } // 指定周期だけ待機 yield return new WaitForSeconds(interval); } } }
Blinker.csにはBlinkerクラスが定義されています。
このクラス内にはメソッドが3つ定義されています。
このクラス定義を分割するにはpartialキーワードをclassの前に付けます。
// クラス public partial class Blinker : MonoBehaviour { ・・・
これで以下のようにソースファイル分割できるようになります。
Blinker.cs
using UnityEngine; using System.Collections; // クラス public partial class Blinker : MonoBehaviour { public float interval; public bool showOnDisable; private IEnumerator blink; // メソッド void Start() { blink = Blink(); StartCoroutine(blink); } // メソッド private void OnDisable() { StopCoroutine(blink); if ( showOnDisable && renderer != null ) { renderer.enabled = true; } } }
BlinkRoutine.cs
using UnityEngine; using System.Collections; // クラス public partial class Blinker : MonoBehaviour { // メソッド IEnumerator Blink() { while ( true ) { // オブジェクトの表示状態を反転させる if ( renderer != null ) { renderer.enabled = !renderer.enabled; } // 指定周期だけ待機 yield return new WaitForSeconds(interval); } } }
Blink()を別ファイルに分割できました。
別ファイルに定義したフィールドやメソッドは問題なく使えます。
また、上記BlinkクラスはMonoBehaviourを継承していますが、複数ファイルに分割する場合はどれかひとつだけ継承元を書いていればよいです。
したがって、以下のように片方の継承元を省略できます。
Blinker.cs
// クラス public partial class Blinker : MonoBehaviour { ・・・
BlinkRoutine.cs
// クラス public partial class Blinker { ・・・
もちろん、各ファイルで異なったクラスから継承してしまうとコンパイルエラーとなります。
ぜひソース分割の機能を使ってソースファイルの管理を楽にしてみてはいかがでしょうか。