Unity:プレイヤーキャラクターが近づくと追いかけてきて一定距離で停止する敵キャラクター

今回は、LookAt() 関数 と Distance() 関数を使ってプレイヤーキャラクターが近づくと追いかけてきて、一定の距離で停止する敵キャラクターオブジェクトの処理を試してみました。

シーンの作成

まず、プロジェクトにアセットストアから Standard Assets をダウンロードしてインポートします。

Standard Assets の Prototyping に含まれる床のプレハブオブジェクト FloorPrototype64x01x64 を配置。プレイヤーキャラクターとして Standard Assets の Characters に含まれる ThirdPersonController を配置しました。

ThirdPersonController に標準で設定されているマテリアルはグレーですが、以前アセットストアで公開されていたSample Assets (beta) for Unity 4.6 に含まれていたカラーマテリアルに差し替えました。

敵キャラクターはプリミティブの Capsle と Cube を組み合わせて作成。

Main Camera には Standard Assets の Utility に含まれる SmoothFollow スクリプトをアタッチ。カメラターゲットはプレイヤーキャラクターの ThirdPersonController の子階層にEmptyオブジェクトを追加して設定しました。

[Game]ビューでこのように見下ろした感じになるようカメラを設定。

敵キャラクターがプレイヤーキャラクターの方向に向かせる処理

[Project]ウィンドウ > [Create] > C# Script を選択。作成したスクリプト名を ApproachTarget に変更。このようなコードを書きました。

特定のオブジェクトの方向を向かせる関数 LookAt() を使用しています。

Transform-LookAt – Unity スクリプトリファレンス

スクリプトを保存して敵キャラクターにアタッチ。Target フィールドにプレイヤーキャラクターの ThirdPersonController を割り当てます。

シーンを再生すると、プレイヤーキャラクターの座標に向かってお辞儀をしてしまいます。うーん困った。

ということで、スクリプト ApproachTarget を修正してXとY座標は自分自身の座標を参照し、Y座標だけターゲットオブジェクトを参照する処理を追加します。

シーンを再生して動作を確認。これでOKです。

プレイヤーキャラクターと敵キャラクターの距離によって移動停止する処理

次に敵キャラクターがプレイヤーキャラクターに近づく処理を追加します。プレイヤーキャラクターが敵キャラクターに一定距離に近づくとプレイヤーキャラクター方向に移動。一定距離近づくと停止するようにしました。

一定距離の判定を行うために2点間の距離を測る関数 Distance() を使用しています。

Vector3-Distance – Unity スクリプトリファレンス

ApproachTarget スクリプトコンポーネントのパラメータ設定

編集したスクリプト ApproachTarget を保存し、アタッチした敵キャラクターの[Inspector]ウインドウでコンポーネントのパラメータをこのように設定しました。

敵キャラクターオブジェクトをプレハブに変換

敵キャラクターオブジェクトをプレハブに変換して複数配置。Standard Assets の Prototyping に含まれるプレハブオブジェクト JoinOuterPrototype02x06x02 を組み合わせてステージの壁を作りました。

WebGLビルド

今回の内容をWebGLでビルドしてみました。画像クリックでファイルがダウンロード、再生されます。(ダウンロードサイズ:約23MB)

  • キャラクター移動:前 W、左 A、後 S、右 Dキー
  • 歩く:左:Shiftキー + 移動キー
  • ジャンプ:Spaceキー
  • しゃがみ:Cキー

今回紹介した方法の問題点

今回作成したシーンでは、敵キャラクターの制御に当たり判定を組み込んでいないので障害物のすり抜けてしまい、高低差に追従していません。

キャラクターを追従して接近する一番簡単な方法は Rigidbody と NavMesh Agent コンポーネントを使用する方法ですが、今回の方法を改造する方法でもう少し考えてみたいと思います。

参考Webサイト

Unityでオブジェクトを指定の方向に向ける – Qiita

Unityで主人公キャラが近づいてきたら追いかける敵キャラを作る _ Unityを使った3Dゲームの作り方(かめくめ)