見出し画像

[unity][C#Script]トライ! ターゲットを向いたまま全方向歩行アニメーションさせてみる。

 3Dアクションゲームを作るとき、敵のほうを向いたまま移動するというのはよくある実装です。あるいはツインスティックシューター(シューティングゲーム)を作るときにも役立ちそうです。今回はそれを試したときのスクリプトをピックアップしたノートです。
 とりあえず、実装結果の動画は以下のようになります。ツインスティックシューターをイメージしています。

1.アセットの紹介

(1) メインキャラクターの女の子は、Sabao3179さんのアセットです。P03 Tenebroさん以外にも何人かいます。いい感じのデフォルメで扱いやすいのでついつい全員揃えてしまいました。おすすめです。

(2) 4方向アニメーションは、Toon Soldiersから採用しています。
 試していませんが、今回のような場合はLow Poly Soldiersのほうがより適しているかもしれません。

2.参考にする過去の記事

以下のノートのプレイヤー移動コンポーネントで新しい使ったSimple Animationを流用しました。今回はその差分となるところだけノートにしています。プレイヤーの移動に関しては、zennで書いた「新しい」INPUTSYSTEMによるコントローラの統合の記事も参考になると思います。

3.アニメーションクリップについて

ProjectのAssets -> Toon_Soldiersの、ToonSoldiers_2 -> Animation -> Infantry -> movement にある以下の4つのアニメーションをそれぞれ使いました。
・MOVEF: infantry_combat_walk
・MOVER: infantry_combat_walk_right
・MOVEL: infantry_combat_walk_left
・MOVEB: infantry_combat_walk_back
※Infantryは歩兵という意味のようです。

4.スクリプト

1) 移動方向により歩行アニメーション

移動スクリプトに、移動方向に応じて歩行アニメーションを切り替える処理を入れてみました。自分が向いている方向と移動方向の角度差をもとめ、それをもとにアニメーションを着入り変えています。
・speed(float型)は移動速度です。
・移動したい方向はmoveSpeed(Vector3型)です。
・SimpleAnimationのコンポーネントは_simpleAnimationです。

if (speed >= 0.1f)
{
      // 向いている方向
      float angleY = transform.eulerAngles.y;
      // 進みたい方向
      float angleY2 = (Mathf.Atan2(moveSpeed.x, moveSpeed.z) * Mathf.Rad2Deg);

      // 向いている方向と進みたい方向の差を得る
      angleY2 -= angleY;

      // 0度を下回る場合は補正
      if ( angleY2 < 0f )
      {
           angleY2 += 360f;
      }

      // -360度を下回る場合があるのでもういちど補正
      if (angleY2 < 0f)
      {
           angleY2 += 360f;
      }

      // 正面方向に動くときは WALKF
      if (angleY2 <= 60f || angleY2 > 300f)
      {
           _simpleAnimation.CrossFade("WALKF", 0.2f);
      }
      else
      {
           // 右方向に動くときは WALKR
           if (angleY2 > 60f && angleY2 <=120f)
           {
                 _simpleAnimation.CrossFade("WALKR", 0.2f);
           }
           else
           {
                 // 左方向に動くときは WALKL
                 if (angleY2 > 240f && angleY2 <= 300f)
                 {
                      _simpleAnimation.CrossFade("WALKL", 0.2f);
                 }
                 else
                 {
                      // どれでもないときは後退。WALKB
                      _simpleAnimation.CrossFade("WALKB", 0.2f);
                 }
           }
      }
 }

2) ロックオンしたターゲットのほうを向く

ロックオンしたターゲットの方向を向かせるには、 Quaternion.LookRotationが適していそうです。

// targetはロックオン対象のGameObject
transform.rotation = Quaternion.LookRotation( target.transform.position
                                              - transform.position );

5. 技術的な補足

今回はわかりやすさを優先してif文にて実装しました。
Lowpoly Soldiers というアセットには、8方向のモーションがあるようなので、こちらを使う場合は向きに以下のようにするとよいかもしれませんね。
・angleY2に22.5fを加算
・360を超えた場合はそこから360を減算(あるいは0にしてもよい)
・angleY2を45で割り、整数値(int型)にする。
・switch文で処理する

 今回は以上となります。自分で処理を書けるかたも多いとは思いますが、もしかしたらどなたかの参考になるかもと思いノートにまとめました。

ではまた。ゲーム制作者魂がともにあらんことを。(k1t)

ex.関係ありそうな記事



この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?