Unity初心者は、まず初めに
”プレイヤーキャラクターを動かしたい(操作したい)”
と思うのが、世の常ではないでしょうか?
安心してください。
コードいらずで、簡単に実装できます!
私が知っている方法は、2つあります。
1つは、以前紹介した
”Standard Assets (for Unity 2018.4)”に入っているコードを、
操作したいモデルにアタッチする方法です↓
上の記事では、”VRoid Studio”という誰でも簡単にオリジナルキャラクターを作れるソフトから、モデルをもってきて動かす流れで説明していますが、
他にどんなモデルでも動かせます(Humanoidであれば)。
そして、
もう1つの方法は、
”Unity-Chan! Model”というアセットに入っているコードをアタッチする。
本記事では、後者の方法を紹介します。
<完成イメージ>
1.2つの方法の使い分け
なぜ本ブログで2つの方法を紹介するのかというと、両者で動かし方が異なるからです。
”Standard Assets (for Unity 2018.4)”のコードは、
グランドセフトオートや三國無双のような
左右のコマンドでキャラクターの向きを変える仕様となっています。
一方、
”Unity-Chan! Model”のコードは、
方向キーの通りに、上下左右に移動(そちらを向いて前進)する仕様となっています。
クラッシュバンディクーやメタルギア、ボンバーマンのようなものです。
(プレステ1、2世代なので、最近のゲームで例えられません^^;)
2つの方法を知っておくと、作りたいゲームによって使い分けられますね。
触っているうちに詳しくなって、自分でコードを書いてカスタムを計れるようになってくるでしょう。
まずは、作れる体験をするのが大事!
簡単なのでサクッといってみましょう。
2.モデルとアセットの準備
プレイヤーキャラクターとして、操作したいモデルをUnityのassetsフォルダに入れてください。
(ファイルをドラッグ&ドロップで可能です)
Blenderなどから持ってくる場合は、fbxファイルとして出力したものが良いです。
VRoid Studioなどで作成したモデル(vrmファイル)の場合は、Unityで扱えるようにする外部Packageをインポートする必要があります。
その方法も、こちらに書いてます↓
動かしたいモデルの準備がない人は、Unityのアセットストアから無料で使えるモデルが配布されているので、それを使用して、モデルを動かせるか試してみてください。
モデルをUnityに入れたら、そのRig設定で「Humanoid」を選択し、Applyを押します。
ここでエラーとなる場合は、モデルのリギングが上手くできていません(ダウンロードしたものの中には、ボーンすら仕込まれていないことも)。
そして、モデルをSceneに配置します。
動かすための場として、Cubeを地面様になるように作成しておきます(TransformをX:20、Z:20にするなど)。
ちなみに、モデルのMaterialの割り当ては、それからでもできます。
次に、動かすためのコードを入手しましょう。
アセットストアから、"Unity-Chan! Model"というアセットをダウンロード&インポートします。
3.モデルに動かすコンポートネントを設定する
Sceneに配置したモデルに対して、以下のコンポーネントをアタッチし、パラメータ等を設定します。
※モデルを配置したら、キャラが真っ黒になりますが、それは仕様で、逆光となってしまうからです。RotationのY:180にすることは習慣づけましょう^^;
Animator
HumanoidでApplyしたモデルであれば、自動でついています。
Controllerの丸いところ(◎)をクリックし、「UnityChanLocomotions」に変えます。
Character Controller
プレイヤーキャラクターの行動制限やコライダー(当たり判定スペース)の設定となります。
「Add Component」で「Character Controller」を検索し、アタッチしましょう。
各パラメータの数値は、お使いのモデルに適した数値を設定してください。
(Center YやHeight、Radiusはモデルに適した大きさに設定へ)
Character Control Script
「Add Component」をクリックして、”Character”と入力しただけで、候補として出てくるコンポーネントです(unity-chan!Modelをインポートしてるため)。
★★2021年8月訂正★★
残念なことに"Unity-Chan!Model"に「CharacterControlScript」が含まれなくなったみたいです。
でも、大丈夫。次のスクリプトを作成してアタッチしてください。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CharacterControlScript : MonoBehaviour { //移動処理に必要なコンポーネントを設定 public Animator animator; //モーションをコントロールするためAnimatorを取得 public CharacterController controller; //キャラクター移動を管理するためCharacterControllerを取得 //移動速度等のパラメータ用変数(inspectorビューで設定) public float speed; //キャラクターの移動速度 public float jumpSpeed; //キャラクターのジャンプ力 public float rotateSpeed; //キャラクターの方向転換速度 public float gravity; //キャラにかかる重力の大きさ Vector3 targetDirection; //移動する方向のベクトル Vector3 moveDirection = Vector3.zero; // Start関数は変数を初期化するための関数 void Start () { } // Update関数は1フレームに1回実行される void Update () { moveControl(); //移動用関数 RotationControl(); //旋回用関数 //最終的な移動処理 //(これが無いとCharacterControllerに情報が送られないため、動けない) controller.Move(moveDirection * Time.deltaTime); } void moveControl() { //★進行方向計算 //キーボード入力を取得 float v = Input.GetAxisRaw("Vertical"); //InputManagerの↑↓の入力 float h = Input.GetAxisRaw("Horizontal"); //InputManagerの←→の入力 //カメラの正面方向ベクトルからY成分を除き、正規化してキャラが走る方向を取得 Vector3 forward = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized; Vector3 right = Camera.main.transform.right; //カメラの右方向を取得 //カメラの方向を考慮したキャラの進行方向を計算 targetDirection = h * right + v * forward; //★地上にいる場合の処理 if (controller.isGrounded) { //移動のベクトルを計算 moveDirection = targetDirection*speed; //Jumpボタンでジャンプ処理 if (Input.GetButton("Jump")) { moveDirection.y = jumpSpeed; } } else //空中操作の処理(重力加速度等) { float tempy = moveDirection.y; //(↓の2文の処理があると空中でも入力方向に動けるようになる) moveDirection = Vector3.Scale(targetDirection, new Vector3(1, 0, 1)).normalized; //◆ コメントアウト解除 moveDirection *= speed; //◆ コメントアウト解除 moveDirection.y = tempy - gravity * Time.deltaTime; } //★走行アニメーション管理 if (v > .1 || v < -.1 || h > .1 || h < -.1) //(移動入力があると) { animator.SetFloat("Speed", 1f); //キャラ走行のアニメーションON } else //(移動入力が無いと) { animator.SetFloat("Speed", 0f); //キャラ走行のアニメーションOFF } } void RotationControl() //キャラクターが移動方向を変えるときの処理 { Vector3 rotateDirection = moveDirection; rotateDirection.y = 0; //それなりに移動方向が変化する場合のみ移動方向を変える if (rotateDirection.sqrMagnitude > 0.01) { //緩やかに移動方向を変える float step = rotateSpeed * Time.deltaTime; Vector3 newDir = Vector3.Slerp(transform.forward, rotateDirection, step); transform.rotation = Quaternion.LookRotation(newDir); } } }
アタッチしたら、AnimatorやControllerの空欄に、上記のコンポーネントをドラッグ&ドロップします。
その他パラメータは、図のように任意に設定します。
これらのコンポーネントを設定すれば、もう動きます!
実行してみてください。
★もし動かない場合★
Animatorの「Apply Root Motion」のチェックを外してみてください。
「Min Move Distance」の値を少し大きくしたりすると改善することも…。
このコードでは、矢印キーの「←↑↓→」または「AWSD」でカメラが映し出す空間を基準に、移動方向が決まります。
なので、カメラの位置設定に注意しましょう。
以上~