2013年2月3日日曜日

Unityで初めてのAIキャラクター(4.デリゲートの使い方)


さて、前回記事に引き続き、敵キャラの動きを直していくのだが、ちょっとだけデリゲートに関するお勉強が必要。

関連記事


では例のごとく、Unity Gemsからの翻訳をどうぞ!


November 22, 2012

デリゲートの使い方


FSMチュートリアルに深入りしてデリゲートやクロージャに怯えてPCのない山小屋に閉じこもる前に、シンプルなデリゲートのサンプルを紹介したい。

もしC または C++ の経験があれば、関数ポインタまたはC++のファンクタと比較する必要がある。覚えるべきは:
void Afunction(){
    //内容はここに
}
void (*fct)(int);
fct = &Afunction;
デリゲートは何かと似通ってるが、より簡単だ。

これからコードを修正してデリゲートを使用できるようにする。最初にデリゲートを宣言して、デリゲートのインスタンスを作成して最終的に関数を割り当てる。それでようやくデリゲートを使用できるようになる。
delegate void DelFunc();
DelFunc _delegate;
_delegate = Afunction;

static void Afunction(){

}
void Update(){
   _delegate();
}
これが基本的な宣言方法でインターネットで見つかるチュートリアルに載っている大部分はここまでであり、リスクをとってこれ以上載せることはしないが、我々はもう少し深入りしたい。static 関数が非staticメンバにアクセス出来ないことは知っていると思う。では今回のNPCキャラクターでシーンに多数ある場合はどうしたらいいのだろうと思うかもしれないけど、同じように動作出来るのだ。
float variable;
delegate void DelFunc();
DelFunc _delegate;
_delegate = this.Afunction; //このポインタに注目できてますか?

void Afunction(){
    variable = variable +10;
}
デリゲートを使用する目的そのものは使用できることだけでなく、柔軟性を持たせることだ。目標はひとつの関数が他の複数の関数からコール出来ることだ。次の例をみてほしい:

デリゲートの短いコードサンプル(クリックして展開)

スクリプトをシーンのオブジェクトにアタッチしてコンソールをみてほしい。エディタをみてみてposには [SerializeField] 属性があるが、インスペクタ上にプライベート変数が表示される。

押されたボタンに応じて、デリゲートに関数が割り当てされる。関数のシグニチャはデリゲートのシグニチャと互いに一致する必要があるため、デリゲートが二つ必要だ。ただしbooleanを使用してupdateで使用される方を判定する。

さらに引数を使用することも可能であり、適切なシグニチャを戻り値とするデリゲートを作成して関数を同じシグニチャで渡します。Actionおよび関数についてはFSMチュートリアルで詳細な説明があるのでここでは説明を省略する。

それではAiScriptを修正してデリゲートを含めよう。マイナーチェンジが必要だ:

AiScriptデリゲートの短いコード(クリックして展開)

Updateは短くなりbooleanチェックをかなり外した。boolean型のdel変数によりどの種類のデリゲートが使用されるべきか判定し、(シンプルかコルーチンか)、isCoroutingにより一回のみコールされることが保証される。そうするとその二つをセットしてでりは実行したいアクションに依存する。

キャラクターは巡回する分には十分だが、まだプレイヤーとの関わり合いがない。次にプレイヤーと相互作用させる方法を見ていく。
------

次回に続くぜ!


関連記事


0 件のコメント:

コメントを投稿

ブックマークに追加

このエントリーをはてなブックマークに追加

自己紹介

自分の写真
Unity3D公式マニュアル翻訳やってる人がスマホ(iPhone, Android)のゲーム開発しています。気軽に面白く初心者が遊べる内容がモットー。Blogでは開発情報をひたすら、Twitterではゲーム作成の過程で参考にしている情報を中心につぶやきます

ページビューの合計

過去7日間の人気投稿