Unityに関連する記事です

 以下の内容で順番に実装を進めていきます。

発展9 −エネミーの移動方法に合わせた移動処理の実装 
17.EnemyController スクリプトを修正し、エネミーの種類に応じた移動方法を作成し、制御を追加する  篠梢福
18.EnemyController スクリプトを修正し、エネミーの種類に応じた移動方法を作成し、制御を追加する◆ 室惺圈



 新しい学習内容は、以下の通りです。

 ・DOTweenの補間機能と実装例ァ DOLocalMoveX メソッド、SetLoops メソッド、SetEase メソッドー



17.EnemyController スクリプトを修正し、エネミーの種類に応じた移動方法を作成し、制御を追加する  歡梢福

1.設計


 エネミーの移動ですが、現在はボスは一定地点で停止、それ以外のエネミーは直進してくるようになっています。
エネミーの移動方法の情報が EnemyData クラスに設定されましたので、この moveType 変数に合わせて移動方法を変更するようにします。

 まずは最初に直進する移動用のメソッドを作成し、MoveType.Staright のエネミーの移動を実行できるようにします。
またこの手順の実装に合わせて、Update メソッドにて実行していた移動の処理は削除します。

 これから数種類のエネミーの移動方法を EnemyController スクリプトに実装していきますが、途中で処理を別のスクリプトに記述変更します。
その前提で処理を記述していきます。


2.EnemyController スクリプトを修正し、MoveType.Staright の場合の移動処理を追加する


 MoveType 型によって移動方法を変更するにはどのようにすればいいでしょうか。

 この型を評価し、EnemyData クラスの moveType 変数の値を確認することで、このエネミーの移動方法がわかりますので、
移動方法を確認するためのメソッドを用意し、その中でエネミーの moveType 変数を確認し、MoveType.Staright の場合だけ
直進の処理を実行する、というロジックにすればよさそうです。

 直進の処理はすでに Update メソッド内にありますが、この処理は削除しますので、DOTween のメソッドを利用して移動を実装してみましょう。
ゲーム画面の上方向から下方向への直進ですので、Y 軸の情報だけを制御すればエネミーを直進移動させることが可能です。
以上のことから、手順25で学習した DOLocalMoveY メソッドが利用できると思いますので、復習を含めて実装をしてください。

 DOTween では処理を行う際の時間を設定しますので、こちらにも EnemyData クラスに追加した moveDuration 変数を利用するようにします。
moveDuration 変数の時間をかけて目標地点まで移動する処理になりますので、数字が小さいほど早く移動して拠点に到達するようになります。

 この移動方法の確認と移動の処理はエネミーが最初に行う設定の1つになりますでの、SetUpEnemy メソッド内に処理を追加するロジックで考えてください。


EnemyController.cs


 スクリプトを修正したらセーブします。


3.ゲームを実行して動作を確認する


 処理の実装が完成したので、ゲームを実行して制御を確認します。

 EnemyDataSO スクリプタブル・オブジェクトの EnemyData クラス内の MoveType 変数に
Straight を設定しているエネミーの場合のみ、直進移動を行うようになっていれば制御成功です。


<実装動画>
動画ファイルへのリンク


 以上で実装完了です。 


18.EnemyController スクリプトを修正し、エネミーの種類に応じた移動方法を作成し、制御を追加する◆ 室惺圈

1.設計


 続いて、次は別の移動処理を追加して、同じように MoveType 型によって分岐して自動的に移動方法を設定し、実行できるようにします。

 考え方は先ほどの直進処理の場合と同じです。MoveType 型による分岐を追加し、移動用のメソッドを考えていきましょう。


2.EnemyController スクリプトを修正し、MoveType.Meandering の場合の移動処理を追加する


 すでに作成してある MoveType 型による分岐を行うメソッド内に、新しく MoveType.Meandering の場合の分岐を追加し、
その分岐内で、蛇行するような移動の処理を記述して移動を行うようにします。

 蛇行移動も DOTween の機能を利用することで実装できます。
DOLocalMoveY メソッドはそのまま利用し、それに追加して、左右に行ったり来たりさせて、ループするような処理を考えてみてください。

 左右の移動には DOLocalMoveX メソッド、ループ処理には SetLoops メソッドを利用しましょう。
左右の移動幅をエネミーごとに変化させたい場合には、Random.Range メソッドも活用するといいでしょう。


EnemyController.cs


 スクリプトを修正したらセーブします。


3.<DOTweenの補間機能と実装例ァ DOLocalMoveX メソッド、SetLoops メソッド、SetEase メソッドー>


 新しいDOTweenの処理を実装していますので、各メソッドの説明をします。



  // 左右方向の移動をループ処理することで行ったり来たりさせる。左右の移動幅はランダム、移動間隔は等速
  transform.DOLocalMoveX(transform.position.x + Random.Range(200.0f, 400.0f), 1f).SetLoops(-1, LoopType.Yoyo).SetEase(Ease.Linear);

 今回の処理は、複数のメソッドをつなげて1行で記述している処理になります。
ピリオドの位置までが1つの処理になっており、合計で3つの DOTween のメソッドが実行されています

 このようにピリオドを利用して、前のメソッドの処理に続けて次のメソッドの処理を書くと、前のメソッドの処理を受けて次のメソッドの処理が実行されます。
この記述方法をメソッド・チェーンといいます。

 今回の場合、transform に対して DOLocalMoveX メソッドが最初に実行されて、その処理結果を利用して、次の SetLoops メソッドが実行されます。
さらに ピリオドで次のメソッドが続いていますので、その2つの処理結果を受けて、最後に SetEase メソッドが実行されるようになっています。

 プログラムは上から下に実行されていきますが、1行に書かれた処理の場合は、手前(左側)より、ピリオド単位で区切って実行されることになります。
これは他の処理と同様です。しっかりと処理の順番を追えるように、読み解いてみましょう。


1.DOLocalMoveX (float endValue, float duration)

 まずは最初は DOLocalMoveXメソッドです。
この処理は DOLocalMoveY メソッドと同じ引数を持っていますが、対象となる軸が X 軸の移動処理になっています。

  transform.DOLocalMoveX(transform.position.x + Random.Range(200.0f, 400.0f), 1f)

 第1引数には目標とする位置情報を float 型で指定します。
今回は transform.position.x + Random.Range(200.0f, 400.0f) で指定していますので、 X 軸のみに対して、ランダムな値を加算した結果を目標値の情報を与えられています。

 第2引数には第1引数の目標位置に到達するまでにかかる時間です。float 型で指定します。
今回は 1.0f を指定していますので、1 秒をかけて X 軸方向に移動を行うようにしています。


2.SetLoops(int loops, LoopType loopType)

 SetLoopsメソッドは、他のDO〜メソッドの後に実行できるメソッドです。この命令単体で実行することはできません

 transform.DOLocalMoveX(transform.position.x + Random.Range(200.0f, 400.0f), 1f).SetLoops(-1, LoopType.Yoyo)

 一緒に命令をしているメソッドに対してループ処理を付与することが出来ます。
今回の処理では、transform.DOLocalMoveX メソッドに対して、ループ処理を行っています。(SetEaseメソッドもSetLoopsメソッドと同じで単体では動かないメソッドです)

 第1引数はループ処理を行う回数です。int型で設定します。今回のように -1 を指定すると、それは無限ループになります。(ループが終了しません)
このような場合は明示的に処理を停止させないと無限にループを繰り返します。

 第2引数ではループさせるタイプをLoopTypeというenum型から選択します。LoopType.Yoyo の場合は、A => B , B => Aという形式で、目標値から再度、スタート地点に対して戻る形でループを繰り返します。
他にもLoopTypeがありますので調べてみてください。この処理によって、左右方向に行ったり来たりして、それを無限にループします。


3.SetEase(EaseType easeType)

 SetEase メソッドも他の DOTween のメソッドに付随する処理です。このように DOTween では DOTween のメソッド同士を1つの処理の塊として続けて処理を行うことができます。
処理を続ける場合には、前のメソッドの後にピリオド(ドット)を書くことで、次のメソッドを書くことが可能です。(最初に説明した、メソッド・チェーンの記述方法です)

  transform.DOLocalMoveX(transform.position.x + Random.Range(200.0f, 400.0f), 1f).SetLoops(-1, LoopType.Yoyo).SetEase(Ease.Linear);

 SetEase メソッドでは Ease というアニメーションさせる際のパターンを変更することができます。Ease は enum で設定されており、Ease.タイプ の書式で記述します。
非常に多くの種類があります。今回は最も一般的は Ease.Linear を使用しています。

 今回は、DOLocalMoveX メソッドが実行されてゲームオブジェクトが X 軸方向への移動を実行している部分に、この SetEase メソッドが実行されますので
移動する際の補間処理に対して、どのようなタイプのアニメーションのパターンを設定して移動を行わせるかを指定しています

 移動する際に Linear を指定すると、スタート地点から目標地点まで到達するまでの移動速度を等速に指定することが出来ます。
そのため、初速で早くなったり、終了間際に遅くなったり、といったような移動の補間処理ではなくなり、最初から目標地点につくまでを等速で移動します。


 
 以上が今回実装している、DOTweenでの処理になります。最初にスタートとなる現在値から右方向への移動を行い、
その後、ループ処理によって、右方向の地点から左方向のスタートした X の位置まで戻っていく処理になっています。
これはループ処理の指定方法を Yoyo に指定しているためです。

 回数無制限のループ処理が行われているので、エネミーを左右方向に対して行ったり来たりさせて、それを無制限のループ回転の処理を行わせる処理になっています。
また Ease.Linear を指定することで、左右に移動する際には等速で移動を行うようにしています。(移動の途中で速度が変わらない)


4.ゲームを実行して動作を確認する

 処理の実装が完成したので、ゲームを実行して制御を確認します。

 EnemyDataSO スクリプタブル・オブジェクトの EnemyData クラス内の MoveType 変数に
Meandering を設定しているエネミーの場合には、蛇行しながら移動を行うようになっていれば制御成功です。
蛇行する際の左右の幅はランダムですので、左右の幅が広いエネミーほど素早く動くことになります。

 直進移動のエネミーとしっかりと分岐が行われていることを確認してください。


<実装動画>
動画ファイルへのリンク


 以上でこの手順は終了です。

 次は 発展10 −エネミーの移動方法に合わせた移動処理の実装◆ です。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます