Unityで3Dモデルにアニメーションを設定する方法
今回はUnityで3Dモデルにアニメーションを設定して待機モーションをとらせたいと思います。
プロジェクトは前回の記事の続きから↓
それではまずProjectのAssets/Animationsフォルダの中を右クリックして" Create → Animator Controller "としてAnimatorを作成しましょう。(Project上部の+ボタンからでもできます。)そして名前を" PlayerController "としておきましょう。↓
次に作成したAnimatorにアニメーションを設定していきましょう。
アニメーションはMixamoのモーションを使用します。Idleのモーションデータを開くとその中の" mixamo.com "を選択” Ctrl + D "を押して複製しましょうそしてわかりやすくIdleと名前を変更しておきましょう。↓
次は先ほど作成したPlayerControllerを選択しInspectorにある" Open "を押してAnimatorを開きましょう。すると↓の画像の赤線で囲んである部分のようなWindowが立ち上がっているはずです。
そのWindowへ先ほど複製してIdleという名前にしたアニメーションクリップをドラッグ&ドロップしましょう。↓の画像のようになっていれば大丈夫です。
次にHierarchyのPlayerオブジェクトに" Add Component "で" Animator "というコンポーネントを追加しましょう。そして追加したAnimatorに" Controller "という項目と" Avatar "という項目があります。↓画像の赤枠部分
" Controller "には" PlayerController "を設定し、Avatarには使用しているモデルの中に入っているものを設定しておきましょう。↓の画像が設定後
この状態で再生ボタンを押すと、
待機モーションをするようになりました。(動きが小さすぎてわかりにくいですが・・・)
なおキャラクターの脚が地面についていない場合はPlayerオブジェクトのCharactor ControllerにあるHightの値やCenterのY値を変更するなどして調整してください。
今回はここまでです。本当は今回でプレイヤーの歩きモーションを設定して移動に合わせてアニメーション遷移させるつもりだったんですが・・・CharactorControllerのIsGroundedの判定が安定していないのでうまく移動できなくなってししまったため次回に回します。
Unityのプレイヤー移動処理【3D】
今回はプレイヤーに歩きモーションをつけて移動させようかと思ってたんですがその前にキーボード入力orゲームパッドの入力を受けてキャラクターを移動させるためのスクリプトの記述を先にやっておこうと思います。
ではまず3Dテンプレートから新しくプロジェクトを作成しましょう。そしてHierarchyで右クリックもしくはHierarchyの上部にある+ボタンを押して、3D Object → Planeをクリックして床を作りましょう。
次にプレイヤーのモデル(今回はMixamoよりダウンロードしてきたモデルを使用してます)をSceneに追加して名前をPlayerに変更しましょう。
今のところの状態↓の画像のような感じです
そして↓の画像ようにPlayerを選択してInspectorのAdd ComponentでCharactorControllerを追加しましょう。
ここからはプレイヤーを移動させるためのScriptを記述していきます。まずはProjectのAssetsフォルダにScriptsというフォルダを作成して、その中に右クリックもしくはProjectの上部にある+ボタンを押して
Create → C# Scriptとして新規にスクリプトを作成しファイル名をPlayerControllerとしてください。ではPlayerControllerをダブルクリックしVisualStudioを立ち上げてScriptを記述していきましょう。
ソースコードは以下
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { //移動関連のパラメータ [Header("速さの最低値")] [SerializeField] private float minSpeed = 3.0f; [Header("速さの最高値")] [SerializeField] private float maxSpeed = 5.0f; [Header("プレイヤーの方向転換スピードの調整値")] //0.0fだと一切向きが変わらず1.0fだと入力後すぐ入力された方向へ向く [SerializeField, Range(0.0f, 1.0f)] private float turnRate = 0.3f; //移動速度 private Vector3 velocity; //キャラクターコントローラー private CharacterController controller; //InspectorにてRangeの値が指定の範囲に収まるようにClamp処理 private void OnValidate() { this.turnRate = Mathf.Clamp(this.turnRate, 0.0f, 1.0f); } //初期設定 void Awake() { //キャラクターコントローラー取得 this.controller = this.GetComponent<CharacterController>(); //速度をゼロに設定 this.velocity = Vector3.zero; } //更新処理 void Update() { Vector3 vec = this.velocity; float Speed = 0.0f; //床に接地していたら歩く if (this.controller.isGrounded) { //ゲームパッドのスティック入力値を取得して移動ベクトルを作成 //..ついでに接地しているのでY軸の値をリセット vec = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical")); //入力値から得たベクトルの長さが0.1fを越えていれば速さを設定 if (vec.magnitude > 0.1f) { //スティックの倒し具合によって速さを変更 Speed = Mathf.Lerp(this.minSpeed, this.maxSpeed, vec.magnitude); //向きの変更 Vector3 dir = vec.normalized; float rotate = Mathf.Acos(dir.z); if (dir.x < 0) rotate = -rotate; rotate *= Mathf.Rad2Deg; Quaternion Q = Quaternion.Euler(0, rotate, 0); //ここでモデルの向いている方向が徐々に変わるように処理しつつ //モデルの向きを変更 this.transform.rotation = Quaternion.Slerp( this.transform.rotation, Q, this.turnRate ); } //移動ベクトルを正規化 vec = vec.normalized; } //移動速度を設定 this.velocity.x = vec.x * Speed; this.velocity.y = vec.y; this.velocity.z = vec.z * Speed; //重力による落下を設定 this.velocity.y += Physics.gravity.y * Time.deltaTime; //移動させる this.controller.Move(this.velocity * Time.deltaTime); } }
このスクリプトをPlayerオブジェクトにAdd Componentで追加して再生ボタンを押せばキーボードの↑↓→←キーもしくはゲームパッド(Directインプットのもの)の左スティックで
プレイヤーが移動するようになっていると思います。詳しくコードの解説とかはしませんが、transform.LookAt(向けたい先のTransform)とするとプレイヤーの向きが一瞬で切り替わってしまって気持ち悪いのでtransform.rotationを変更してプレイヤーの向きを変えるようにしてあります。また今回はCharactorControllerのコンポーネントを使用して移動処理を実装しましたが、他にも移動処理を実装する方法はあるので今後機会があれば紹介したいと思います。
MixamoからUnityにインポートしたモデルのテクスチャが存在しない問題の解決法
今回はMixamoよりダウンロードしてきたモデルをUnityにインポートした際にマテリアルにテクスチャが反映されていない問題の解決方法についてまとめていきます。
今回使用するモデルはこいつ↓ サイト内で" Paladin "と検索すれば出てくるやつです。
では早速ダウンロードしてきたモデルのfbxファイルをUnityにインポートしましょう。
インポートしたモデルをシーンに配置すると↓のようにテクスチャが反映されていない状態になっています。
この原因はFbxのファイルにテクスチャが埋め込まれているためマテリアルにテクスチャが反映されていないためです。そこで以下の手順でFbxファイルに埋め込まれているテクスチャのデータを取り出してあげましょう。
① AssetsにあるモデルデータをクリックするとInspectorが表示されます。
②Inspectorを見ると1番上に"Model" "Rig" "Animation" "Materials"という4つの項目が並んでいますその中の"Materials"をクリックしてください。
③下に"Texture"という項目が表示されるのでその項目の横にある"Extract Textures..."というボタンをクリックしてください。
※①,②,③の番号は↓の画像と対応してます。
すると、↓のようなダイアログが表示されます。このダイアログで今回インポートしたモデルの入っているフォルダを選択してください。
(私の場合はModelsというフォルダの中にモデルがあったためModelsを選択しています)
そしてフォルダを選択すると・・・
テクスチャのデータが取り出されました、
↓シーンのほうにもテクスチャの反映されたモデルが表示されるようになりました。
今回はMixamoのモデルを使用しましたが、Fbxファイルにテクスチャが埋め込まれているモデルは同様の手順を行えばテクスチャを取り出すことが出来ると思います。
(Mixamoのモデル以外で確認していないので絶対とは言い切れませんが・・・)
また場合によってはMaterialに取り出したテクスチャを設定していく必要があるかもしれません。
”MixamoからUnityにインポートしたモデルのテクスチャが存在しない問題の解決法”は以上です。
今回はモデルの読み込みとかやったんで次回はアニメーションを読み込んで読み込んだモデルを歩かせたりしようかと思います。Unityやっぱかんたんやなぁ~