Google

2011年10月20日木曜日

他のMonoBehaviour派生クラスへアクセス

オブジェクトの探し方ができたところでプロパティの続き。
以前の回で書いたGetComponent()を使うとスクリプトにもアクセスできます。

そこで今回は自作スクリプトのメソッドを呼び出してみましょう。
要はMonoBehaviour派生クラス同士のメンバアクセスです。
これは開発を始めると常に行うことになるはずで、今回は実行時に生成破棄等の変更がない場合の方法を書いてみます。

では以前使用したC#スクリプト2個を再利用して実験です。
以下が再利用クラス。

  • BaseScript
  • InheritScript

これに仮想関数Func()を追加し、派生側でオーバーライドしときます。
ついでに以前のStart()を外します。
以下のコードは2つ分がくっついてるので、分けて実装してください。
 

余談ですが、StartやUpdate等はあくまでUnityFWが制御するものなので、自前での呼び出しは自己責任で。
逆にクラスに書かなければ何も起きません。

さらに呼び出しテスト用C#スクリプトを1つ作成します。
こちらはTargetScriptとしました。

このクラスの役目はbaseObjとinheritanceのFunc関数を呼び出すだけです。
が、それでは説明にならないのでコードを簡単に解説。

まず、自作スクリプトがProjectビューの中にあるのなら、上記のようにそのままスクリプトクラスの変数を宣言可能です。
自作スクリプトは基本的にMonoBehaviour継承。
MonoBehaviour派生クラスは、GUIの操作によってGameObjectに紐付けされます。
従って、スクリプトにアクセスする場合は、GameObjectを検索等で見つけ出し、紐付けされたスクリプトインスタンスを取り出して関数呼び出し、という形になります。
なお、GetComponent("")の形式はComponent型を返すので、上記コードではダウンキャストして型変換を行なっています。


で、作成したら、UnityGUI上でメニューから「GameObject」→「Create Empty」を選び、3つオブジェクトを作成してください。
それぞれ以下のように命名と紐付けをしましょう。
  • GameObjet1 (BaseScriptに紐付け)
  • GameObjet2 (inheritanceScriptに紐付け)
  • GameObjet3 (TargetScriptに紐付け)
こんな状態にしましょう
しかし上記の紐付け状態だと、コンソールに赤い文字でエラーが出てしまいます。
すぐにはでなくても実行時にはエラーになります。
これはTargetScriptのメンバ変数x2の中身が無いのにメソッド呼び出しをしようとしているために出ている訳です。
そこでGameObject3を選択し、前回の記事で書いたドラッグ&ドロップで以下の紐付けをしてください。
  • baseObj (GameObject1)
  • inheritance (GameObject2)
これで実行前にメンバが確定され、エラーが消えます。
さて、実行するとどうなるでしょうか。


はい、アクセスできていました。
継承構造にも注目しておいてください。
基底クラスを紐付けした方はちゃんと基底クラスのメソッドが呼ばれています。

0 件のコメント:

コメントを投稿