週刊SleepNel新聞

SleepNel所属のぽうひろが日々の個人開発で気になったことを綴ります。

Unity C# 楽して大量生産?!継承を使ってみよう!

こんばんは、ぽうひろです。

みなさん、同じようなScriptを作る時、どうやって作っているでしょう?
コピペで作ってしまいがちですよね。

ここは「継承」を使って楽しましょう!

例えば、速さだけが違うキャラクターを2種類作るとしましょう。
まずは1つ目のキャラのScriptをNormalScriptという名前で普通に作ってみます。
Update()内でMoveというメソッドを呼び出しています。

using UnityEngine;
using System.Collections;

public class NormalScript : MonoBehaviour {

	// Update is called once per frame
	void Update () {
		Move ();
	}

	protected virtual void Move(){
		transform.localPosition = new Vector3 (
			transform.localPosition.x + 0.1f,
			transform.localPosition.y,
			transform.localPosition.z);
	}
}

Move()にvirtualという言葉が付いていますが、後述します。
さて、ここで速度を速くしたScriptを作るために「継承」を使って新しいScriptを作ります。
クラス定義の クラス名 : 継承するクラス名 を指定すれば継承できます。

using UnityEngine;
using System.Collections;

public class FastScript : NormalScript {

}

NormalScriptを継承先に指定している以外は何も書いていませんね。
f:id:pouhiroshi:20160806210845p:plain:w300
Cube1(左)にNormalScript、Cube2(右)にFastScriptが追加してあります。
これで実行してみるとこうなります!
f:id:pouhiroshi:20160806213014g:plain:w350
何も書いてないCube2も動いていますね!これが継承の威力です!(大げさ)
正確に言うと、NormalScriptに書かれているメソッドを、継承することによってそのまま利用できるということです。
次に、FastScriptの方で早く動くようにMove()を変えてみましょう。これをメソッドのオーバーライド(上書き)と言います。
メソッドを継承するには、継承元のメソッドにvirtual、継承する側のメソッドでoverrideをつけることでそのメソッドのプログラムを上書きすることが可能になります。

using UnityEngine;
using System.Collections;

public class FastScript : NormalScript {

	protected override void Move(){
		transform.localPosition = new Vector3 (
			transform.localPosition.x + 1f, //プラスする数値を1fに
			transform.localPosition.y,
			transform.localPosition.z);
	}
}

実行結果はこちら!
f:id:pouhiroshi:20160806212908g:plain:w350
Cube2だけ早く動くようになりました!

今回の例では、メソッドが1つしかないためありがたみがあまりありませんが、もっといろいろなキャラクターの動きが出てくると、コピペだけで作っていると、どんどんプログラムがごちゃごちゃしてきますし、同じような修正を膨大な箇所で修正する必要が出てきます。

もし似たようなプログラムをたくさんの種類で作ることがわかっている場合は、ぜひ継承を視野に入れて作っておきたいところです。

それではまた!