Unityだけではないと思うのですが、コードを書いているときに同じような処理を書く必要が出てくる場合があります。
何も考えずに、コードをコピーすればこの問題は解決するのですが、将来的には負債を残すことになります。
時間的な成約がなにもないのであれば速やかに共通化し同じコードを使い回すように設計すれば、今後のもし変更が入ったときに対応が簡単になります。
共通化のメリット
共通化することはメリットしかありません。
同じコードを書く必要がなくなりますし、修正をしようとしても一箇所だけです。
- 修正が一箇所だけなので楽
- 同じ処理を記述しなくても良い
メソッド化
クラス内に複数同じ処理があるのであれば、それをメソッド化して使いまわします。
個人的に2つ以上同じような処理を記載するとなった場合メソッド化したほうが良いです。
[c]
private void CommonHoge()
{
// 何かしらの処理
}
private void Hoge()
{
// 各メソッドで使い回す
CommonHoge();
}
[/c]
Baseクラス作成
似たような機能を作るときにはBaseクラスを作り、共通化できる処理を記述すれば使いまわして利用できるようになります。
[c]
public class BaseClass
{
protected void CommonHoge()
{
Debug.Log("共通化");
}
}
public class AClass : BaseClass
{
private void Start()
{
CommonHoge();
}
}
<h2>インターフェイス</h2>
Interfaceを使ってクラスの処理を共通化することもできます。
Interfaceは特定に挙動を保証する仕組みで、interfaceで定義されたメソッドなどを継承元のクラスに記載をします。
[c]
public interface IInterfaceClass
{
void GetNumber();
}
public class AInterfaceClass : MonoBehaviour, IInterfaceClass
{
private int number = 10;
public void GetNumber()
{
Debug.Log(number);
}
}
public class BInterfaceClass : MonoBehaviour, IInterfaceClass
{
private int number = 5;
public void GetNumber()
{
Debug.Log(number);
}
}
[/c]
Interfaceで定義されているメソッドは継承先のクラスにかかわらず呼び出すことができます。
[c]
private void Start()
{
AInterfaceClass aInterface = new AInterfaceClass();
BInterfaceClass bInterface = new BInterfaceClass();
var list = new List<IInterfaceClass>();
list.Add(aInterface);
list.Add(bInterface);
foreach(var obj in _list)
{
obj.GetNumber();
}
}
[/c]
ユーティリティクラスを作成
横断的に利用する場合、staticなクラスを一つ用意し、その中に共通な処理を記載します。
[c]
public static class Utility
{
public static void SetDebugLog(int num)
{
Debug.Log(num);
}
}
[/c]
色々なところから呼び出せます。
[c]
void Start()
{
Utility.SetDebugLog(10);
}
[/c]
staticなクラスはオブジェクト指向と相反するなど利用に否定的な見方があるかもしれませんが、適切に利用すれば同じ記述を使い回さずにすみます。