Unityの継承を使ってキャラクター操作機能を拡張する

今回はUnityのJavascriptの継承を使って既存のキャラクター操作スクリプトを継承し、親クラスの機能はそのままに子クラスで新しく機能を取りつけたいと思います。

UnityのJavascrptの継承に関しては

UnityのJavaScriptでクラスの作成と継承、インタフェースの作成
UnityのJavaScriptでクラスやインタフェースの作成方法を学び、イベントの受け取りで実際に使用してみます

を参照してください。

Javascriptを使ってプログラミングしている方はあまりクラスを意識せず作成している方が多いと思います。

ですがデフォルトでMonoBehaviourクラスを継承して1つのスクリプトが作られています。

スポンサーリンク

UnityのJavaScriptで継承を行う方法

どんなスクリプトでも大元のMonoBehaviourクラスを継承して最低限の機能を保有しているわけですね。

さきほど記載したリンク先の記事にも書いてありますが、UnityのJavascriptで継承を行うには

とします。

Start関数やUpdate関数等もクラス内に記載するといつも通りのスクリプトが組めます。

クラスを使っていない時はMonoBehaviourクラスを自動で継承していますが、あえて記載するとしたら親クラスのところをMonobehaviourにします。

オブジェクト指向言語や継承について勉強したことがないと解りづらいかもしれませんが、親クラスを継承した子クラスは親クラスの機能をすべて持っている事になります。

つまり子クラスで親クラスを継承さえしていれば何も書かずともまったく同じ機能が子クラスで使えます。

さらに子クラスで新たに機能を追加していけるのでキャラクターの機能を拡張していく時に便利です。

文章だけだと解りづらいのでまずはキャラクター操作スクリプトParentMoveを作成し、キャラクターに取りつけます。

Animator等の設定はすでにされているとします。

Animatorに関しては

Unityのアニメーションの切り替えシステムとスクリプト
Unityのアニメーションを切り替える為のアニメーターの設定とアニメーションの遷移をさせるスクリプトの作成を行います

を参照してください。

親クラスであるキャラクター操作スクリプトParentMoveの作成

ParentMoveスクリプトは以下のように作成します。

移動キーが押された時にキャラクターをその方向に向かせ移動させる機能になります。

Unityの実行時からの経過時間を表示するShow関数を定義しています。

親クラスParentMoveを継承して子クラスChildMoveを作成

ParentMoveスクリプトを継承するクラスChildMoveクラスを作成します。

子クラスであるChildMoveは親クラスを継承する子クラスとして作成します。
(子クラス名はスクリプト名と同じ名前にする必要があります)

子クラスにも親クラスと同じShow関数を作成します。

Update関数内では親クラスのUpdate関数を

super.Update()

として呼び出し、その後処理を追加しています。

Pキーが押されたら親要素のShow関数を実行し、Cキーが押されたら子クラスのShow関数を実行しています。

親クラスを継承してみて面白いのは、親クラスであるParentMoveはクラス形式で作成していないスクリプトにもかかわらず子クラスで継承元として使用出来ている事です。

クラス形式で作成してこなかったスクリプトも継承出来るのでありがたいですね!

これで継承が完了です。

親クラスであるParentMoveでキャラクターを移動する機能を記述していますが、子クラスであるChildMoveでは移動処理は一切記述していません。

キャラクターにChildMoveを取りつけてください。

継承したキャラクター操作スクリプトChildMoveで動くかどうか確認

これでちゃんとキャラクターが動くのかどうかUnityを実行して試してみましょう。

キャラクター操作スクリプトを継承したクラスで動くかどうかの確認

↑のようにキャラクターが動きました。

PキーやCキーを押して親クラス、子クラスのShow関数が呼ばれるか確認してください。

親クラス、子クラスそれぞれのShow関数が呼ばれるかどうか確認

Unityの継承を利用してみて思う事

いやぁ継承は便利ですね!

継承を使う利点としては親クラスのプロパティや機能を持っている事です。

なのでただ歩かせるだけのキャラクター用に移動スクリプトを記述して、攻撃が出来るキャラクター用のスクリプトを移動スクリプトから継承し攻撃機能を拡張して作る。

といったように親の要素を継承し、かつ拡張していける所です。
子クラスでは親クラスと同じ関数名で処理を書いて親クラスの関数を上書き(厳密には親クラスの関数を呼べるので上書きではない)した処理が書けるのも便利ですね。

といいつつ、わたくし自身は継承を使っていないんですが・・・・(^_^;)
大規模なゲームとか作成するとなると後々便利になってくるんだと思います・・・・(-.-)