今回はUnityのStarterAssetsを使ってみたいと思います。
スターターアセットは、以前からあるスタンダードアセットのファーストパーソンとサードパーソンの機能を今のUnityの新しめの機能(CinemachineやInputSystem)に対応させたものですぐにゲームに使用出来ます。
Cinemachineはカメラの動きを管理するコンポーネントで、InputSystemは新しい入力システムです。
使用用途としてはキャラクターを配置してゲームの舞台を歩かせて機能を確認する時に使ったり、
設定を変更したり、新たにスクリプトを追加し、既存のスクリプトを改造したりしてそのまま自身のゲームに使用したりすることも出来ます。
実際にサードパーソンのキャラクターを使ってみると以下のような感じで配置したらすぐに使えます。
スターターアセットのインポート
スターターアセットはUnityのアセットストアからダウンロードしてインポートします。
ファーストパーソンとサードパーソンのスターターアセットは別のアセットとなっているので、今回はサードパーソンのスターターアセットをダウンロードし、インポートします。
インポートが終了するとStarterAssetsというフォルダの中に色々なファイルが作られます。
サードパーソンの配置
サードパーソンのスターターアセットをインポート出来たので、早速使ってみたいと思います。
StarterAssetsフォルダのプレハブをヒエラルキーに配置して使えるようにすることも出来ますが、Assets/StarterAssets/ThirdPersonController/Prefabs/PlayerArmatureプレハブを設置した場合は、キャラクターを写すカメラを制御するVirtual Cameraを配置したり設定したりをしなければいけません。
Assets/StarterAssets/ThirdPersonController/Prefabs/NestedParentArmature_Unpackをヒエラルキーに配置した場合はそのまま使えますが、こちらの場合は元々ヒエラルキーに存在するMainCameraを削除する必要があります。
ただし、モバイル用のコントロールUIも設定されているので、モバイルで確認する時はこちらが便利です。
これらのプレハブをヒエラルキーに配置してやるやり方だと、若干手を加える必要があるので、ここではスターターアセットのメニューからキャラクターを配置するようにします。
UnityメニューのToolsからStarter Assets→Reset Third Person Controller Armatureを選択します。
Reset Third Person Controller Capsuleを選択するとキャラクターモデルがUnityのプリミティブ図形であるカプセルになります。
項目を選択するとヒエラルキーにはPlayerFollowCameraとPlayerArmatureが作られます。
PlayerFollowCameraはキャラクターを写すカメラの設定を行っていて、Cinemachineの仮想カメラコンポーネントを持ちます。
PlayerArmatureはルートゲームオブジェクトにAnimatorコンポーネント、CharacterControllerコンポーネントや操作スクリプト等が取り付けられていて、子にキャラクターモデル(Geometry)とボーンの階層(Skeleton)を持ちます。
ルートゲームオブジェクトであるPlayerArmatureにアニメーション管理と操作スクリプトが設定されているので、子のキャラクターモデルとスケルトンの部分を他の人型のキャラクターに変えれば設定を少し変えるだけでそのまま使用することが出来ます。
サードパーソンの機能を構成するもの
サードパーソンのキャラクターの機能は、PlayerFollowCameraでキャラクターを写すカメラの設定が行われています。
CinemachineVirtualCameraコンポーネントでその設定がされていて、詳細はCinemachineの仮想カメラの設定を参照してみてください。
PlayerArmatureには、キャラクターの移動スクリプト(ThirdPersonController)、キャラクターの入力受付スクリプト(StarterAssetsInputs)、キャラクターが他のRigidbodyを持つゲームオブジェクトを押すためのスクリプト(BasicRigidBodyPush)が使われています。
入力システムではInputManagerではなくInputSystemの機能が使われていて最新の入力システムに対応しています。
InputSystemに関しては以下の記事を参照してみてください。
サードパーソンに使われているスクリプトはインスペクタで設定を変更して動作を変更することが出来ますが、スクリプトの中身を見ることが出来るので処理自体の変更も出来ます。
キャラクターを変更してみる
UnityメニューのToolsからサードパーソンの移動キャラクターを配置しました。
次はデフォルトのモデルから別の人型モデルに変更してみます。
人型モデルを用意し、インスペクタのRigのAnimation TypeをHumanoidにします。
変更したら、ヒエラルキーのPlayerArmatureを選択し、右クリックからPrefab→Unpackを選択し、プレハブを解除します(ちなみにUnpack Completelyを選択すると階層下の他のプレハブもアンパックします)。
なぜこれをするかというと、ヒエラルキーに配置されたPlayerArmatureは元々プレハブをヒエラルキーに配置したもので、この階層の何かを変更しようとすると元のプレハブを変更することになるためです(編集しようとすると元のプレハブ自体を開いて変更するよう促されます)。
なので、アンパックをして元のプレハブから切り離すことによって(別のただのゲームオブジェクトの階層にして)編集を出来るようにします。
アンパックしたらGeometry(モデル)とSkeleton(スケルトン)を選択し、Deleteキーを押して削除します。
次にAssetsフォルダに用意したキャラクターモデルをヒエラルキーのPlayerArmatureの子にドラッグ&ドロップします。
キャラクターモデルのゲームオブジェクト(上の画像ではkamekumetest)のインスペクタでAnimatorコンポーネントが自動で取り付けられるので右の3つの丸を押し、Remove Componentを選択して削除します。
このAnimatorはアニメーションを管理する時に必要なコンポーネントですが、親のPlayerArmatureゲームオブジェクトにAnimatorコンポーネントが取り付けられており、そこで子のキャラクターのアニメーションを管理しているので必要ありません。
次にヒエラルキーのPlayerArmatureゲームオブジェクトのインスペクタのAnimatorコンポーネントで、AvatarがArmatureAvatarとなっていますが、これを自身のキャラクターモデルのアバターに変更します。
わたくしの場合は用意したモデルのアバターの名前がkamekumetestAvatarという名前のアバターなのでこれを設定しています。
CharacterControllerコンポーネントのコライダのサイズを調整し、キャラクターモデルに合うコライダのサイズにしてください。
これでキャラクターモデルを交換出来ます。
キャラクターを動かして確認する
キャラクターの配置が出来たので、動かしてみましょう。
Plane等を使ってキャラクターが移動する地面を作成してください。
キーボードの場合はAキーで左、Dキーで右、Wキーで前方、Sキーで後方に移動、もしくは矢印キーで移動出来、Shiftキーを押しながら移動するとダッシュ、Spaceキーでジャンプ、マウスのドラッグでカメラ視点の変更が出来ます。
移動の方向はカメラの向いている向きに対しての方向です。
操作中は初期設定だとマウスアイコンが消えるのでEscキーを押すことで再度表示出来ます。
またゲームパッドの場合(今回はPS4コントローラーで確認)は左のアナログスティックで移動、L2キーを押しながら移動するとダッシュ、×ボタンでジャンプ、右のアナログスティックでカメラ視点の変更が出来ます。
設定パラメータを変更してみる
キャラクターの移動を確認出来たら、キャラクターに設定されているパラメータが何かを見ていき、変更してみましょう。
まずはヒエラルキーのPlayerArmatureゲームオブジェクトを選択します。
ThirdPersonControllerの設定値
インスペクタのThirdPersonControllerの設定値を見ていきます。
MoveSpeedは通常時の移動する速さ。
SprintSpeedはダッシュ時の移動する速さ。
RotationSmoothTimeは移動方向を変えた時にその方向にキャラクターが向くまでの時間で0だとすぐに移動方向に向きます。
SpeedChangeRateは移動の速さが最高値になるまでの速さの数値、値が大きいと最高値に到達するのが速い。
JumpHeightはジャンプの高さ。
Gravityは重力加速度。-を付けると下向きの重力がかかる。
JumpTimeoutはジャンプから着地した後に再度ジャンプ出来るまでの時間。着地後この時間を経過していないとジャンプ出来ない。
FallTimeoutは地面から外れた時に落下アニメーションに遷移するまでの時間を設定します。段差が大きい階段を降りる時に落下アニメーションが1段ごとに再生されるのを防ぐための時間です。
Groundedは地面に落下したかどうかを判定するフラグです。
GroundedOffsetは地面に接地したかどうかを判定する時のオフセット値を設定します。
GroundedRadiusは地面と接地しているかどうかを判定する時の判定のコライダの範囲を設定します。CharacterControllerコンポーネントのコライダの半径と同じにします。
GroundLayersは地面と判定するレイヤーを設定します。
CinemachineCameraTargetにはCinemachineのカメラが映す対象を設定します。デフォルトではPlayerArmatureの子のPlayerCameraRootを映すように設定されています。
TopClampはカメラが上にどれだけの角度回転するかの設定です。
BottomClampはカメラが下にどれだけの角度回転するかの設定です。
CameraAngleOverrideはカメラの角度を微調整するのに使います。
LockCameraPositionをチェックすると現在のカメラの角度を固定します。
BasicRigidBodyPushの設定値
BasicRigidBodyPushの設定値を見ていきます。
PushLayersには力を加える事が出来るゲームオブジェクトのレイヤーを設定します。
CanPushにチェックを入れると相手のゲームオブジェクトを押すことが出来ます。チェックが入っていないと設定したレイヤーでも力を加える事が出来ません。
Strengthは加える力です。
StarterAssetsInputsの設定
StarterAssetsInputsの設定を見ていきます。
Moveには移動値が表示します。
Lookはカメラの視点の角度を表示します。
Jumpにチェックが入るとジャンプします。
Sprintにチェックが入るとダッシュします。
AnalogMovementにチェックが入っている場合は移動方向のベクトルの長さを使いますが、チェックが入っていない場合は1を使用します。キャラクターを斜め方向に移動する際に違いが出ます(チェックが入っていると斜め方向のベクトルの長さが大きいので移動の速さとアニメーションの速さが速くなります)。
CursorLockedにチェックを入れるとゲーム実行時にマウスカーソルが消えます。
CursorInputForLockにチェックを入れるとカメラの視点変更の入力があった時に視点を変更しますが、チェックをしない時は視点の変更が出来ません。
PlayerInputコンポーネントに関してはInputSystemの記事を参照してください。
終わりに
スターターアセットを使うとすぐにキャラクターを動かすことが出来ます。
配置するだけでパソコンでのキーボード操作やゲームパッド(PS4コントローラー等)の操作にも対応しています。
今回はサードパーソンのキャラクターを配置し動かしましたが、ファーストパーソンのキャラクターも同じような感じで動かす事が出来ます。
また、スクリプトの中身も見れるので、どのような処理を行っているのか?というのも見て勉強になりますね。(^_^)v