【敵の移動処理の作成2】目的地の設定とベクトルを用いた経路設計 | Unity入門の森 ゲームの作り方

【敵の移動処理の作成2】目的地の設定とベクトルを用いた経路設計

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


Unity入門の森オリジナル本格ゲーム制作講座はこちら
11種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

前回(第4回)では、敵の経路を作成しました。

前回の記事↓

【敵の移動処理の作成1】移動経路の構築とOnDrawGizmosによる移動経路の可視化
第4回である今回は前回作った敵の経路を作っていきます。タワーディフェンスは、敵の経路もレベルデザインの一つになります。最短距離で来る敵、あえて遠回りをする敵、思いもよらないルートを通る敵など同じHP、同じスピードの敵でも、経路によって難易度...

第5回である今回は、その経路に沿って実際に敵オブジェクトが移動する仕組みなどを作っていきます。

どんどんタワーディフェンスらしくなってきますね。


【Line登録者限定のプレゼントもあるよ!】

敵(Enemy)スクリプトの修正

では、早速修正を始めていきます。Enemyスクリプトをダブルクリックして、プログラムの編集をしていきます。

今は、このような状態になっていると思います。

今はまだ右に移動することしかできていませんね。

Routeの指定、スタート位置

このEnemyスクリプトに、前回作った 経路(Route) を指定できるようにします。

メンバ変数に public Route route; を追加します。

指定された route にはPointの配列(Point[])型のメンバ変数(配列)points が入っているんでした。

このpoints[0]がスタート地点になるので、Start関数でその場所に移動させてしまいます。

スクリプトの変更を保存をして、UnityEditorに戻ります。

今、シーンには3体のEnemyが置いてあると思います。 そのうちの1体、どれでも良いので選択して(例ではEnemyオブジェクトにしました)、Inspectorを見ると Route という項目が None(Route) になっていると思います。

外からRouteが指定できるようになっていて、かつ今は何も指定されていないので「None」と表示されています。

ではこのRouteに、前回作った Routeオブジェクト(Route,Route (1),Route (2),Route (3) の4つを作りましたね)をどれでも良いのでドラッグアンドロップして指定し、再生ボタンを押してみてください。

Routeを指定したEnemyオブジェクトは、再生と同時にStart地点へ移動し、そこから右へ移動開始するようになりましたね。

もちろん、これだけでは右にしか移動できないので、さらに修正をしていきます。

Route(Points)に沿った移動

route.points には、スタートからゴールまでの通過点(Point)が入っています。

スタート位置は route.points[0].transform.position でした、そこからどこに向かうかというと、次のポイントが入っている route.points[1].tarnsform.position に向かわないといけません。

この、route.points[0].transform.position から、route.points[1].tarnsform.position へと向かうベクトル(Vector3)を計算します。

急にベクトルが出てきて拒否反応が出てしまう方もおられるかもしれませんが、Unityを使う分にはほぼ必須な項目になりますし、使い方さえ覚えてしまえば意外となんとかなるのでやっていきましょう。

まず、ある地点(From)から、ある地点(To)移動するベクトルを求めるには、

var v = To – From;

2つのベクトルの引き算をするだけです。

いきなり多次元で考えるとややこしいので、1次元で考えます。

定規を想像してください。今、5cmの位置(From)に鉛筆の先端があります。 12cmの位置(To)まで移動したい(線を引きたい)です。  鉛筆をどの方向何cm移動させる必要があるでしょう。

繰り返しになりますが、ある地点(From)から、ある地点(To)移動するベクトルを求めるには、

var v = To – From;

でした。 Toは12cm,Fromは5cmです。 なので、v = 12-5 = +7cm ということになります。

この「+(方向)に、7cm(長さ)」がFromからToへと移動するベクトルなわけです。(1次元なので、方向は+かーのみ)

では、同じように今route.points[0].transform.position (From) から、route.points[1].tarnsform.position (To)へと向かうベクトル(Vector3)を計算するよう、修正をします。

今、 v = Vector3.Right; となっていますが、以下のように修正します。

スクリプトの保存をして、再生をしてみましょう。

1つ目のPoint (route.points[0]) から、2つ目のPoint (route.points[1]) へ移動するようになりました。

しかしまだ問題点が2つあります

  1. 移動速度が速くなってしまっている
  2. 曲がるべきところで曲がっていない

ですね。これらを順番に解決していきましょう。

続きを読む

このコンテンツはパスワードで保護されています。 コンテンツを読みたい方はUnity入門の森ショップ(https://unityforest.shop/)で講座閲覧権を取得してね。

おさらいと次回予告

今回は敵(Enemy)が作成した経路(Route)に従って移動するようになりました。

次回は、この敵を生成する仕組みを作っていきます。

次回の記事↓

敵の生成処理の作り方 ウェーブの作成とレベルデザインまで
前回(第5回)では、経路に沿って実際に敵オブジェクトが移動する仕組みなどを作りました。前回の記事↓今回は敵オブジェクトの作成を制御する仕組みを作っていきます。Waveの概念も入ってきてあなたのレベルデザインの見せ所になります。では、作ってい...


Unity入門の森オリジナル本格ゲーム制作講座はこちら
11種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

コメント

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