【敵の移動処理の作成1】移動経路の構築とOnDrawGizmosによる移動経路の可視化

unity タワーディフェンスゲームの作り方

Unityの本格ゲーム制作講座はこちら
【30日間の全額返金保証付き】

第4回である今回は前回作った敵の経路を作っていきます。

タワーディフェンスは、敵の経路もレベルデザインの一つになります。

最短距離で来る敵、あえて遠回りをする敵、思いもよらないルートを通る敵など同じHP、同じスピードの敵でも、経路によって難易度を上下させることが出来ます。

経路も色々作り方はありますが、通過点(Point)と、通過点(Point)と通過点(Point)を繋いだ経路(Route)を作っていきます。

前回の記事↓

敵オブジェクトの作成・パラメータ設定・敵処理のプロトタイプの作成
タワーディフェンス講座の第3回では敵オブジェクトを作っていきます。 今回からスクリプトも書いていきます。 前回の記事↓ 敵オブジェクトの作成 まず、空の敵オブジェクトを作ります。 Hierarchyビューで 右...

通過点(Point)の作成

まず、通過点を置くための親オブジェクトをHierarchyに作ります。

名前は 「Points」とし、Transform の Position は X,Y,Z ともに 0 にしておきます。(Transform の … から Reset を選んでも良いです)

次にPoints の子要素として 通過点を示す空オブジェクトを作ります。

空のオブジェクトを作るショートカットとして「CTRL+SHIFT+N」を以前紹介しましたが、他オブジェクトの子要素として空のオブジェクトを追加する場合は「SHIFT+ALT+N」となりますので注意してください。(または、Points を右クリック→CreateEmptyを選んだ場合は、Pointsの子要素として空オブジェクトが生成されます)

名前はPointとしておきましょう。

このPointが敵の通過点を表すため、位置を細かく調整することになります。ここでは、ひとまずxの値を-4.72にしました。

しかし、このままだとPointがどこにあるか分かりづらいので、アイコンを付けます。

Inspectorビューのオブジェクト名の左に▼があると思います。

ここをクリックするとシーン上でのIconが指定できるので、見やすいものを選びましょう。

アイコンを指定すると、Sceneビューでそのアイコンが表示されるようになります(なお、ゲーム画面には全く影響が出ない、まったく開発専用の機能です)

Point スクリプトの追加

次にPointオブジェクトを選択し、Inspectorビューで Add Componentを選択し、New scriptとしてPoint スクリプトを追加します。

そのまま Point スクリプトを修正していきます。

ただ、Pointはただの通過点を表すので、特にゲーム中の処理としてはなにもしません。

そのため、最初から書いてある、 Start() と Update() は消してしまい、その代わりEditor上での操作をやりやすくするためにOnDrawGizmosという関数を追加し、中に処理を書き、ファイルを保存してください。

このOnDrawGizmosGizmosというのは、Sceneビューでだけ表示される矢印や、カメラアイコンなどの事です。

ここに処理を書くことで、Sceneビューでの表示をカスタマイズすることが出来ます。

今回は

UnityEditor.Handles.Label( 表示位置 , 表示する文字列 );

というUnityEditor用に用意されている、指定した場所に文字列を表示するメソッドを使用しています。

表示位置には transform.position を指定しているので、そのオブジェクトの位置そのものを指定し、表示する文字列には name を指定しました。 これは、オブジェクトの名前が入っているメンバ変数です。 今回の例ですと「Point」という名前にしたので、Sceneビューに「Point」と表示されるようになっていると思います。

ただ、見慣れない #if UNITY_EDITOR ~ #endif という2行がありますね。

これはざっくり言うと、「UnityEditor上でだけ有効にしてね」という書き方です。

これが無くてもUnityEditor上では動くのですが、もしWebGLやAndroidで動かしてみたい! というときにエラーになってしまうため、一応入れています。

では配置してきましょう

作ったPointオブジェクトCTRL+Dで複製して、配置していきます。その際にオブジェクト名は適宜分かりやすいものにしていきます。

敵は画面外からやってくるので、画面外にスタート地点を作ります。

今回は「Start1」と「Start2」という名前にしました。

そして、ゴール地点も作ります。名前は「Goal」とでもしましょう。硬そうな壁に囲まれているところに配置します。

このままでは、スタートとゴールしかありませんので、途中の通過点も追加していきます。

ここも後からでも変更できますので、とりあえず以下のようにしておくと良いと思います。

ところで。これは、シーン画面ではアイコンも、オブジェクト名も表示されていますが、ゲーム画面では何も表示されないため(されては困る)、ゴールがプレイヤーから見えていません。

HierarchyビューのGoal オブジェクトAssets/Images/tile_flag をドラッグアンドドロップして旗の画像を立てておきましょう。(また、Transform を Reset して、親オブジェクトの真ん中に表示されるように修正しておきましょう)

Route(経路)作成

次に、このPointとPointを繋いでいくRoute(経路)オブジェクトを作ります。

まず、Routeを置くための親オブジェクトとして Routesオブジェクト を空オブジェクトで作成します。(CTRL+SHIFT+N→名前をRoutesに→TransformをReset)

さらに、その子要素にRouteオブジェクトを空オブジェクトで作ります。(CTRL+ALT_N→名前をRouteに→TransformをReset)

Route スクリプトの追加

新規スクリプトとしてRoute スクリプトを追加しましょう(Add ComponentNew Scripts → 名前は Route Create And Add)

そのまま Route スクリプトを修正していきます(この一連の流れはパターンとして覚えておいても良いぐらいによく出てきます)

下記コードのように、最初から書いてある Start()Update() 関数は消してしまい、メンバ変数として Pointの配列 points を追加します。

 

Route(経路)は複数のPoint(通過点)から作られます。スクリプトで、複数のオブジェクトを管理するには、配列や、List(リスト)を使いますが、今回は途中で増えたり減ったりしないので、配列(Point[])にしました。

ファイルの保存(CTRL+S)を忘れずにした後、UnityEditorに戻りInscpectorビューを見ると、Route スクリプトがこのように変化していると思います。

Fold(折り畳み)されている場合は▶をクリックしてみてください

このように、Inspector上で、Pointを複数指定できるようになっています。

では、Start1 から Goal まで 通過するPointを指定していきます。

この順番になるように、RouteスクリプトのPointsにPointをドラッグアンドドロップしていきます。

これで1つ敵の進軍Routeが出来上がりました。

OnDrawGizmosの追加

このように、PointをドラッグしてRouteを作る際に、どのPointがどこにあるのかわかりやすくするようにPointスクリプトにはOnDrawGizmosに、オブジェクト名を表示するように修正をしていたわけです。

が、それでも後からRouteオブジェクトを見て、すぐにどの経路を通るのかちょっと分かりづらいですね。

そこで、RouteスクリプトにもOnDrawGizmosSelected という関数に制作の補助となるような処理を追加していきます。

Selected と付いているこの関数は「選択」されている時だけ表示されるGizmoを指定できます。

何をしているかというと、処理8行目9行目で、points配列のindex番目の位置(transform.position)と、index+1番目の位置をそれぞれfrom と to に入れて、10行目 Gizmos.DrawLine(from,to); で、Gizmoとして直線を描画しています。

この直線を描画する処理を囲む 7行目の for文は、変数indexをpoints配列の数-1まで繰り返すようにしています。

なぜー1か。というと、その中の

今回の例だと、

points 中身
[0] Start1
[1] Point
[2] Point(2)
[3] Point(5)
[4] Point(6)
[5] Goal

という状態なので、indexが0の時は、from は points[0]、to は points[1] となるので Start1 と Point の位置がそれぞれfrom と to に入る事になり、その間に直線が引かれているわけです。

ここでindexの値と、その時のfrom,toの中身を表にしてみると

index from to
0 Start1 Point
1 Point Point(2)
2 Point(2) Point(5)
3 Point(5) Point(6)
4 Point(6) Goal
5 Goal ×

このようになります。  index が 5まで行ってしまうと、fromにGoalの位置が入るのは良いんですが、toには入れるものがありませんね。(配列範囲外。という例外エラーというものが発生してしまいます。)

これを回避するために、-1をしているというわけです。


さて。スクリプトの保存をしたら、UnityEditor上で、Routeオブジェクトを選択してみてください。以下のように、直線が引かれて経路が分かりやすくなったのではないでしょうか。(OnDrawGizmosSelectedに処理を書いたので、選択してない状態では線は描画されません)

Routeを増やす

では、Routeを増やしていきましょう。

今度は以下のような経路を指定したいと思います。

今回は、後半は先ほど作ったRouteオブジェクトと一緒なので、RouteオブジェクトをCTRL+D で複製して修正するのが簡単です。複製し Route (1) オブジェクトが作成されたら、Pointを登録していきます。

同じ要領で、あと二つ追加で下図Routeを追加します。なお、pointsを1から作り直したい場合はSizeに一度0を入れて下さい。

 

以上、四つのRouteを作りました。

おさらいと次回予告

今回は敵の通過点(Point)とPointを組み合わせた経路(Route)を作りました。

次回は、この作った経路に沿って敵が移動するように前回作った敵オブジェクトを修正していきます。

次回の記事↓

【敵の移動処理の作成2】目的地の設定とベクトルを用いた経路設計
前回(第4回)では、敵の経路を作成しました。 前回の記事↓ 第5回である今回は、その経路に沿って実際に敵オブジェクトが移動する仕組みなどを作っていきます。 どんどんタワーディフェンスらしくなってきますね。 敵(E...

Unityの本格ゲーム制作講座はこちら
【30日間の全額返金保証付き】
【必見】無料資料請求でスクエアエニックスのゲーム開発の企画動画が見れる学校アリ
令和時代のゲームクリエイターになるための必須スキルがUnity。未経験からでもUnityを学んでオリジナルゲーム制作&ゲーム会社就職が可能なゲーム専門学校・プログラミングスクールの情報をオンライン&対面形式に分けてまとめました。 無料資料請求でスクエアエニックスのゲーム開発企画の動画もらえるので見てみるといいですよ。
unity タワーディフェンスゲームの作り方
unity入門の森 ゲームの作り方

コメント

  1. サウスケイ より:

    Pointを配置するためには、座標を入力しないといけないのですか?

    • ばこ より:

      ??
      座標入力でもオブジェクトをシーン画面に置いてドラッグで動かして配置しても大丈夫ですよ。

タイトルとURLをコピーしました