Unitytwitterfacebookhatenabookmarklineというわけで、今回はタイトル通り「キャラクターを自動移動させる」な話題になります。キャラクターが勝手に動くシーンって、イベントのデモシーンとかでよくありますよね。到達すると、自動的に次のエリアに移動するゲームもあります。自作ゲームでも「カメラアングル切り替え時」や「ワープポイント」など、自動移動させたい場面がちらほらあるので、その実現方法について考えてみました。その場しのぎのコーディングを晒してもブログ的につまらないので、なるべく汎用的に作るよう心掛けていきます。遅延時間」のパラメータを持つ専用のクラスを作成します。delay;}クラスに属性「System.Serializable」を付けるとインスペクター上で編集できるようなので、指定しておきましょう。自動移動を制御するクラス「AutoMovementPoint」を作成し、先ほどの移動用パラメータクラス型のListを定義します。routes;}これでパラメータをインスペクター上で編集できるようになります。エディタ上で移動先を編集しやすくするスクリプトから位置を指定するのはアレなので、シーンビュー上の空オブジェクトの位置を移動先として使用します。空オブジェクトはシーンビュー上で選択しにくいです。OnDrawGizmos()を使い、DrawSphere()で球体を表示するようにしておきます。自分の場合、Gizmoを描画するための汎用クラスを作成し、描画が必要なオブジェクトに設定しています。}}色とか変えれてもしょうがない気もしますが、複数のオブジェクト位置を描画する場合に区別できるので、邪魔にはならないかと。実際に描画すると以下のような感じです。「自動移動」と言っても、キャラクターによって移動方法が異なります。プレイヤーキャラクターはCharacterMotorとPlatformInputControllerを使用しており、敵キャラクターはRigidBodyを使用しています。その差を吸収するために、自動移動の対象となるオブジェクト用にインタフェースを作成し、各キャラクターに対応した物理コンポーネントのvelocityに対するセッタを実装します。加えて自動移動の開始時と終了時に呼び出す関数も定義しておきます。これは自動移動中の移動入力を無効化したり、キャラクターに移動モーションを取らせたりするために使います。onMovementEnd();}Playerクラス側の実装例です。true;}上はCharacterMotor使用時の例ですが、RigidBodyの場合はrigidBody.velocityで良いかと思われます。対象のオブジェクトやキャラクターに応じて実装しましょう。普段はiTween愛好家ですが、連続でアニメーションを行う場合はDOTweenのSequenceが便利なので、今回はDOTweenを使用してみます。特筆すべきはdelayで、「数秒待ってから実行」が簡単に行えます。悲惨なことになり得ます。DOTweenのドキュメントを見た感じでは、RigidBodyがある場合に考慮してくれるようですが、CharacterControllerはノータッチなので考える必要があります。そもそもフォーラムでは「キャラクターの移動制御にトゥイーン系ライブラリを使うな」的なことがコメントで載っており、やや手段を間違えてしまった感があります。それを差し置いてもDOTweenのSequenceが便利なので、勢いで実装しちゃいます。実際に使用する場合はOnTriggerEnter()あたりで判定することになるかと思うので、そのあたりも併せて作ってしまいます。}}ポイントはDOTween.To()内の処理で、第2引数内でざっくりとvelocityっぽい値を計算し、その値をインタフェースを通して各キャラクターのvelocityにセットします。ここでいうvには「第1引数から第3引数への移動を補完するVector3型」が入ります。言い換えると「次に移動する場所」になるので、その値から移動前のキャラクター位置を減算し、Time.deltaTimeを掛けることで求めることができます。この計算結果だけではほとんど動かないため、適当に1000を掛けて動くレベルの値にしてしまいました。あとは移動先パラメータに合わせ、foreach等を使ってシーケンスを組み立てます。ループ処理で容易に組み立てられるのはDOTweenの長所ですね。本当は移動方法の定義やジャンプを入れたかったのですが、思った以上に実現が難しかったです。ポイント間の距離によって移動速度に違いが出るのも微妙な気がしてきましたが、今回はこれで妥協します。(小声あとがきそんなわけで、キャラクターの自動移動処理について考えてみました。ゲームに自然に搭載されている機能ほど見落としがちですが、こういったコーディングもサクッとできるようになりたいですね。ツイートこのブログを書いている人りべるんアザラシが大好きな山梨県産Webエンジニア。2019年3月よりフリーランスSEとして東京で活動中。