Unityを使った3Dゲームの作り方(かめくめ)Unityを使った3Dゲームの作り方(かめくめ)ゲーム開発エンジンUnityを使った3Dゲームの制作に参考になる情報を公開しています。27今回は主人公キャラが敵キャラに近づいたら敵キャラが主人公に近づいてくるようにしたいと思います。前回、敵キャラクターが見回りをするというスクリプトを組みました。Unityで敵キャラが見回りをするように動き回るプログラムUnityのゲームで作った敵キャラクターが見回りをするように、ランダムに設定した位置に移動させる機能を作成します。12:20まずはスクリプトをどうやって組むか考えてみます。敵キャラクターに『主人公キャラクターが近づいてきた』、というのがわからなければいけません。これにはコライダ(接触判定に使う)を使います。敵が持つコライダと主人公キャラのコライダが接触していたら近づいているとします。コライダの範囲が主人公キャラを検知できる範囲になりますね。次に敵キャラが主人公キャラクターを追いかける。いうのは敵キャラが移動する目的地を主人公キャラクターの位置に変更すればいいような気がします。目的地(主人公キャラ)は動くので常に監視し変更しなければいけません。敵キャラの検知範囲から主人公が外れた場合は敵キャラはまた見回りに戻る為、新しい目的地を設定するようにします。スポンサーリンク敵キャラが主人公キャラを検知する範囲を作成するまずは敵キャラにコライダを設定します。Areaという空のオブジェクトを作ります。Triggerにチェックを入れてください。Colliderの方がいいです)。コライダの範囲を修正します。Triggerにチェックを入れるとスクリプト上で接触の検知は出来ますが、物体としては当たらないようになります。Triggerにチェックを入れると侵入可能となり、木をすり抜けていきます。上のような検知範囲を設定してみました。広く設定されているように見えますが、実際は足音が確実に聞こえる距離までいかないと相手は気づきません。ゲームオブジェクトにタグを設定する次に検知範囲に入って来たものが主人公キャラクターであるという判別が必要です。その為に主人公キャラクターにタグを設定します。タグはそのオブジェクトがどういう種類に属するかを判別する為のもので、自分で作成する事も出来ます。主人公キャラにPlayerという元々あるタグを設定してみます。Tagで追加してください。タグを追加したので、SearchAreaオブジェクトにSearchCharacterスクリプトを追加し「masasi」君を検知出来るようにします。サーチエリア(コライダ)に主人公が進入したか調べるスクリプトSearchCharacterスクリプトはその名の通り検知するスクリプトです。OnTriggerStayメソッドはスクリプトが設定されているオブジェクトのコライダが他のコライダと接触中に実行されるメソッドです。そこで接触したコライダが何だったかをタグを使って判定します。{}}}Startメソッドで自身の親に取り付けているMoveEnemyスクリプトを取得します。OnTriggerStayメソッドでは引数colに接触した他のコライダが設定されるようになります。接触した他のコライダのタグがPlayerの時に敵キャラが主人公を追いかけるようにすればいいという事になります。接触したのがPlayerタグが設定されたゲームオブジェクトのコライダだった時で、敵キャラであるゾンビの状態が追いかける状態でなければ追いかける状態にします。col.transform);}}とします。MoveEnemyスクリプトのGetStateメソッドとSetStateメソッドは後で作るのでここでは置いておいて、SetStateでは第1引数にEnemyState.Chaseという列挙型を渡し、第2引数にcol.transformで接触したオブジェクトのTransformを渡しています。敵キャラが今どの状態にあるのか?という状態変数stateを宣言し、その状態を表すのに列挙型を使いますが、列挙型は普通の変数とは少し扱いが変わります。宣言した項目以外の選択をしないようにする事が出来ます。{Walk,Wait,Chase};と宣言し、これを変数などに入れて使います。C#だと整数型を指定する事が出来るみたいなんですが、JavaScriptだとどうやればいいかわかりませんでした・・。型を割り当てない時はint型の数値が割り当てられwalkには0、waitには1と順番に数値が割り当てられます。{Debug.Log("chase");}}↑のようにするとwalkwaitchaseという文字が表示されます。State内の状態にそれぞれ値を設定する事も出来ます。{Debug.Log("chase");}}↑も同じようにwalkwaitchaseという文字が表示されます。宣言された値以外をstateに入れるとエラーになるので、特定の値しか入れたくない場合は列挙型が活躍します。敵キャラクター操作スクリプトのMoveEnemyに状態を表す列挙型と敵キャラクターの状態を取得するGetStateメソッドと状態変更をするSetStateメソッドを定義します。state;}}第1引数で受け取った文字列で分岐させています。それぞれの分岐処理で状態の変化等をしています。stateに入れている「EnemyState.名前」は列挙型のEnemyStateで宣言されていなければエラーになります。フィールド宣言とStartメソッド内の追加と変更フィールド宣言にEnemyStateフィールドとStartメソッド内でSetStateメソッドを呼び出し状態を初期化する処理を入れます。playerTransform;敵の状態を表すEnemyState型のstateと追いかける状態になった時に追いかけるキャラクターのTransformを入れておくplayerTransformを宣言します。(EnemyState.Walk);}状態によって処理を分岐させる次にMoveEnemyスクリプトのUpdateメソッド内の処理を状態によって変更します。Time.deltaTime);}目的地まで歩く処理とキャラクターを追いかける処理は目的地を指定すれば同じ処理を記述する事になるので、追いかける状態である時だけ目的地を再設定し、実際に移動させる処理は同じ処理をしています。目的地に着いたら、待ち状態に変更します。待ち状態である時は一定時間その場で待ち、指定時間を超えたら巡回状態(EnemyState.Walk)に変更します。state;}}となります。主人公を検知するスクリプトSearchCharacterに追記MoveEnemy内のスクリプトの記述が終わったので、SearchCharacterに戻ります。現時点では敵がキャラクターを追いかける状態になったらそのまま一生追い続けます。(^_^;)そこでSearchAreaに設定したコライダからキャラクターが出ていったら敵キャラクターを待ち状態に変更するようにします。OnTriggerExitメソッドを追記します。{Debug.Log("見失う");moveEnemy.SetState(MoveEnemy.EnemyState.Wait);}}}OnTriggerExitはオブジェクトが接触状態から抜けた時に呼ばれるメソッドなので、その時のオブジェクトのタグがPlayerであったら、敵キャラの状態を待機状態に変更しています。これで追いかける処理と検知範囲外に出たら見失って一定時間待機し、再度見回りに戻るというスクリプトが出来ました。簡単なAIではありますが、結構使えると思います。簡単に敵キャラの移動処理を作るなら敵キャラをUnityのナビゲーション機能を使って移動させるUnityのナビゲーション機能を使って敵キャラクターを移動させます。ナビゲーション機能はあらかじめBakeされたフィールドを移動出来る機能です。21:14を使うと移動処理が簡単になります。ナビゲーション機能を追加した後にUnityで主人公が敵から隠れた時は追いかけないようにするUnityのゲームで主人公キャラが壁等で見えない状態で敵の検知エリアに入っても敵は主人公を追いかけないようにします。23:08の機能を追加するとよりリアルな敵の動きが表現出来ます。スクリプトがバラバラで解り辛かったので、修正を入れました。オーバーロード機能は使う必要がなくなったので削除しました。(^_^;)次回は敵キャラを最初から配置しておくのではなく自動で増やせるようにしたいと思います。06:042日ほど前からとても分かりやすかったのでこちらのサイトでUnityの勉強をさせていただいておりますドが付くほどの初心者です。書いてありますがフィールド宣言がどこの事なのか分かりません...(._.)教えていただけると幸いです。22:42こんにちは(^^)/C#のフィールドやメソッド等についてはhttps://gametukurikata.com/csharp/classこちらに記事にしておりますので、そちらも参照してください。プログラミングに関しては非常に多く説明をする必要が出てくるので、大まかなスクリプトの構造についてお話させて頂きます(個人的な解釈なので正しいとは言えません)。C#はオブジェクト指向プログラミング言語で物に対してプログラミングをしていきます。物に対してプログラミングをするというのは、そのスクリプトで実行するものはその物(オブジェクト)毎にプログラミングをしていくという感じになります。人間オブジェクトをプログラミングしようと思ったら、オブジェクトをクラスという形で作成します。{}上のHumanが人間オブジェクトを表すクラスです。人間は性別や年齢、身長等のデータを持っているので、これを保持しておく為に用意するのがフィールドで、大体はクラスのブロックの最初の方に記述します。height;}人間は話したり喋ったりといった動作を行う事が出来るのでその動作を記述します。これがメソッドになり、通常はフィールドの宣言の後に記述していきます。