TATIKUNLOG.

主にゲーム作りについて書き留めるブログ。

三人称視点で自由に歩き回るキャラを作った【Unity】


PR

Unity Japanの公式Youtubeチャンネルが最近活発になり、面白いTips動画を色々見ることができるようになりました。 その中でも、簡単に実践できて、かつ実用的であるチュートリアルを自分で実装してみるっていうのをやってみてました。 こんな感じに出来上がりました。

f:id:tat1kun:20210430205712g:plain:w320

StaterAssetを使ってみた例はこちら

tat1kun.hatenablog.com

はじめに

自由に走り回れる三人称視点のキャラクターを作る方法 - Cinemachine TIPS #1 - YouTube

上記動画を参考にシステムを作成しました。 最初は長々と説明をするつもりだったんですが、動画を見てもらった方が早い部分が多いことや、 色んな技術の組み合わせで作られているので、説明がゴチャゴチャしてしまう可能性があったため、この記事では詳しく説明を書くのは諦めました。

といっても、動画はサクッと見れるように作られていますが、色々飛ばされている部分があって、初学者向けというよりは、多少慣れてる人向けな印象を受けました。 なので、私が今回再現するにあたって使用した知識やアセット等を列挙しておきます。

必要なアセット、知識

『Cinemachine』に関する動画なので、Cinemachineに対する前提知識は必要ないものだとして、動画を再現しようとした場合、以下の知識があった方が良いと思いました。

3Dモデル

当たり前ですが、歩かせる3Dモデルが要ります。 動画で使われている3DモデルはKyle君ですね。

待機、歩行アニメーション

待機時、歩行時、走行時、をSpeedパラメータで分岐させ、アニメーションを遷移させています。

しかしKyle君にはアニメーションはついてないのでそのままでは動かせません。

動画ではどのアセットが使われているのかは分かりませんでした。私は便利なサイトから引っ張ってくれば良い思ったので、 Mixamo から3種類のアニメーションを持ってきました。

アニメーションそれぞれをHumanoid対応にし、Kyle君もHumanoidに設定して動かせるようにしました。

f:id:tat1kun:20210922024652p:plain:h300

※追記(2021/06/05)

動画内のディレクトリを確認したところ、下記のアニメーションパック内のものを使用しているっぽそうでした

Animation Controller

f:id:tat1kun:20210430211657p:plain

ブレンドツリーを作成して、Speedパラメータでアニメーションを切り替えて……とサクッとやっている部分ですね。見たまんまコピーで再現可能ですが、パラメータを設定する部分とか、アニメを切り替える条件のパラメータの値部分とかを調べないと分からなくなります。

NavMesh

恐らく動画では、ProBuilderでサクッと作ったStaticな地形に対してベイクを行っています。NavMeshでの設定部分は動画内では触れられていないので、再現したい場合は自分で調べて実装する必要があります。 ちなみに私の上の動画では、

  1. ProBuilderでCubeを加工して適当に地形を作る
  2. Cubeをstaticにする
  3. Unity上部のメニューからwindow>AI>Navigation>bakeで地形をベイク
  4. プレイヤー(動かすキャラ)にNav Mesh Agentコンポーネントを追加

の4手順のみで実装してます。

スクリプトに関して

下記スクリプトを動くキャラにアタッチします。

using UnityEngine;

public class Controller : MonoBehaviour
{
  Quaternion targetRotation;
  Animator animator;
  void Awake()
  {
    //初期化
    TryGetComponent(out animator);
    targetRotation = transform.rotation;
    Cursor.lockState = CursorLockMode.Locked; //マウスカーソルをロック
  }

  void Update()
  {
    //カメラの向きで補正した入力ベクトルの取得
    var horizontal = Input.GetAxis("Horizontal");
    var vertical = Input.GetAxis("Vertical");
    var horizontalRotation = Quaternion.AngleAxis(Camera.main.transform.eulerAngles.y,Vector3.up);
    var velocity =  horizontalRotation * new Vector3(horizontal, 0 ,vertical).normalized;
    
    //速度の取得
    var speed = Input.GetKey(KeyCode.LeftShift) ? 2 : 1;
    var rotationSpeed = 600 * Time.deltaTime;

    //移動方向を向く
    if(velocity.magnitude > 0.5f)
    {
      targetRotation = Quaternion.LookRotation(velocity, Vector3.up);
    }
    transform.rotation = Quaternion.RotateTowards(transform.rotation,targetRotation,rotationSpeed);

    //移動速度をAnimatorに反映
    animator.SetFloat("Speed", velocity.magnitude * speed, 0.1f, Time.deltaTime);
  }
}

動画内のコードを目コピして、再現しました。あんまりそのまんまのコードを記載するのは良くないですが。

そのうち Unity Learning Materials 辺りにコピペできるコードが貼られるような気がします。

終わりに

Unityに関する記事って、古かったり、微妙に欲しい情報が載ってなかったり、逆に情報量が多すぎたり……色々のパターンがあって、たくさん情報がネット上にあるように見えて、それを見極めるのが難しかったりします。こういうときに公式の動画って凄い助かるんですよね。この記事が公式動画を見るときの一助になれば幸いです。