【中級者向けUnity講座】RPG編 part1 『キャラを歩かせる』


はじめに

皆様こんにちは。
個人でゲーム制作をしております、kenと申します。
この講座では、実際にゲームを作りながら「こういう事をするなら、こういう風にすると良いと思うよ。詳しくは自分で調べてね。」という感じで、ゲームの作り方、Unityの機能やアセット等を軽く紹介して行きます。

今回は、Unityでキャラクターを歩かせる方法をいくつか紹介します。
私は、キャラが動いているのを見るとテンション上がるので、大体ここから作り始めます。

キャラを歩かせよう!

1口にキャラを歩かせるといっても、いろんなことをしなければいけません。だいたい以下の手順が必要です。

1.キャラクターをシーンに配置してセットアップする
2.プレイヤーからの入力を受け取る
3.キャラクターを移動させる
4.キャラクターの移動に合わせてアニメーションを再生する
5.カメラも動かす

今回は3のキャラクターを移動させる方法を3つ紹介します。

Character Controller

これが1番シンプルで扱いやすいです。登れない角度の設定や登れる段差の設定が出来ます。スクリプトから移動させる方法にSimpleMoveとMoveという関数があり、SimpleMoveは重力が自動で付きますが、ジャンプが出来ません。Moveは重力が無いので独自に実装する必要が有りますが、ジャンプの実装が可能です。

Character Controllerの欠点は、物理演算の影響を受けない事と設置判定の精度が甘い事などが有ります。それらの問題を解決したい場合は、後述するPhysicsを使いましょう。

Character Controllerについて詳しく知りたい方には以下の記事がオススメです。
Unityの便利機能を使いこなそう #2 CharacterControllerでプレイヤーの移動とジャンプを実装しよう【マリオ風、バイオハザード風、フォートナイト風】
キャラクターコントローラーを使う人型3Dモデルをジャンプさせる(その1:重力を加える)

【Unity】CharacterControllerで当たり判定ができないときの対処法

【Unity】CharacterController使用時に地形の傾斜に応じてキャラクターを滑らせる方法
Character Controllerの罠

Physics + Collider

物理演算を使いたい場合は、これを使いましょう。1番自由度が高いですが、自由度が高いという事はバグも生み出し易いという事です。ちょっと凝ったことをしたい場合は、バグとの戦いになる事を覚悟して使いましょう。

Physics + Colliderについて詳しく知りたい方には以下の記事がオススメです。
【Unity】 Rigidbodyの移動方法
【Unity】Rigidbody や Collider の設定により変化する、当たり判定の性質 前編
【Unity】Rigidbody や Collider の設定により変化する、当たり判定の性質 後編

NavMesh

NavMeshを使うと経路探索AIが簡単に実装出来ます。経路探索のためのシステムですが、Move関数があるので他の2つと同じような使い方もできます。
欠点は宙に浮くことが考慮されていない為、ジャンプの実装が難しいことです。が、OffMeshLinkという機能を使えばそれっぽい感じには出来ます。

NavMeshについて詳しく知りたい方には以下の記事がオススメです。
NavMeshを使ってみる その1
NavMeshを使ってみる その2
UnityのNavMeshComponentsアセットの使い方とゲーム中にNavMeshのベイクをする
NavMeshAgentでよい感じにキャラクターを歩かせる
Unityのナビゲーション機能でOffMeshLinkを使って移動
【Unity】NavMeshとRigidbodyを連携して動かす

まとめ

物理演算を使いたければPhysics + Collider、経路探索を使いたければNavMesh、簡単な動きだけならCharacter Controllerを使うのがよさそうです。
また、どれか一つに絞る必要はなく、自キャラの移動はCharacter Controllerで敵キャラはNavMeshを使うなど、複数のいいとこどりをすることも可能です。とりあえず全部触ってみてそれぞれの特性を知っておくのがいいと思います。

私は今回はNavMeshを使って自キャラが自動で障害物をよけて進むようなシステムにしようと思っています。具体的な実装はまた今度記事にします。

次回は、2のプレイヤーからの入力を受け取るをやっていこうと思います。
次回→【中級者向けUnity講座】RPG編 part2 『プレイヤーからの入力を受け取る』