ゲーム開発初心者の覚え書き

ひとまず初めにここには私が個人で勉強した内容(つまずいたところとか時間がかかった部分)などを覚え書きする感じで書き込んでいきます。 誤った情報を発信してしまうこともあるでしょうが、本人的には気を付けているつもりなので温かく見守っていただくかコメントなどで ご指摘いただけるとありがたいです。

Unityで3Dモデルにアニメーションを設定する方法

今回はUnityで3Dモデルにアニメーションを設定して待機モーションをとらせたいと思います。

プロジェクトは前回の記事の続きから↓

kanipan-man.hatenablog.jp


それではまずProjectのAssets/Animationsフォルダの中を右クリックして" Create → Animator Controller "としてAnimatorを作成しましょう。(Project上部の+ボタンからでもできます。)そして名前を" PlayerController "としておきましょう。↓

f:id:Kanipan_Man:20210114180803p:plain

次に作成したAnimatorにアニメーションを設定していきましょう。

アニメーションはMixamoのモーションを使用します。Idleのモーションデータを開くとその中の" mixamo.com "を選択” Ctrl + D "を押して複製しましょうそしてわかりやすくIdleと名前を変更しておきましょう。↓

f:id:Kanipan_Man:20210114181442p:plain


次は先ほど作成したPlayerControllerを選択しInspectorにある" Open "を押してAnimatorを開きましょう。すると↓の画像の赤線で囲んである部分のようなWindowが立ち上がっているはずです。

f:id:Kanipan_Man:20210114181721p:plain

そのWindowへ先ほど複製してIdleという名前にしたアニメーションクリップをドラッグ&ドロップしましょう。↓の画像のようになっていれば大丈夫です。

f:id:Kanipan_Man:20210114182007p:plain

次にHierarchyのPlayerオブジェクトに" Add Component "で" Animator "というコンポーネントを追加しましょう。そして追加したAnimatorに" Controller "という項目と" Avatar "という項目があります。↓画像の赤枠部分

f:id:Kanipan_Man:20210114184129p:plain

" Controller "には" PlayerController "を設定し、Avatarには使用しているモデルの中に入っているものを設定しておきましょう。↓の画像が設定後

f:id:Kanipan_Man:20210114184333p:plain

この状態で再生ボタンを押すと、

f:id:Kanipan_Man:20210114185310g:plain

待機モーションをするようになりました。(動きが小さすぎてわかりにくいですが・・・)

なおキャラクターの脚が地面についていない場合はPlayerオブジェクトのCharactor ControllerにあるHightの値やCenterのY値を変更するなどして調整してください。

今回はここまでです。本当は今回でプレイヤーの歩きモーションを設定して移動に合わせてアニメーション遷移させるつもりだったんですが・・・CharactorControllerのIsGroundedの判定が安定していないのでうまく移動できなくなってししまったため次回に回します。

Unityのプレイヤー移動処理【3D】


今回はプレイヤーに歩きモーションをつけて移動させようかと思ってたんですがその前にキーボード入力orゲームパッドの入力を受けてキャラクターを移動させるためのスクリプトの記述を先にやっておこうと思います。

ではまず3Dテンプレートから新しくプロジェクトを作成しましょう。そしてHierarchyで右クリックもしくはHierarchyの上部にある+ボタンを押して、3D Object → Planeをクリックして床を作りましょう。

次にプレイヤーのモデル(今回はMixamoよりダウンロードしてきたモデルを使用してます)をSceneに追加して名前をPlayerに変更しましょう。

今のところの状態↓の画像のような感じです

f:id:Kanipan_Man:20210109134535p:plain

そして↓の画像ようにPlayerを選択してInspectorのAdd ComponentでCharactorControllerを追加しましょう。

f:id:Kanipan_Man:20210109134742p:plain

ここからはプレイヤーを移動させるための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 "と検索すれば出てくるやつです。

 

 

f:id:Kanipan_Man:20210107010430p:plain

 

では早速ダウンロードしてきたモデルのfbxファイルをUnityにインポートしましょう。

 

インポートしたモデルをシーンに配置すると↓のようにテクスチャが反映されていない状態になっています。

f:id:Kanipan_Man:20210107001908p:plain

この原因はFbxのファイルにテクスチャが埋め込まれているためマテリアルにテクスチャが反映されていないためです。そこで以下の手順でFbxファイルに埋め込まれているテクスチャのデータを取り出してあげましょう。

 

① AssetsにあるモデルデータをクリックするとInspectorが表示されます。

 

②Inspectorを見ると1番上に"Model" "Rig" "Animation" "Materials"という4つの項目が並んでいますその中の"Materials"をクリックしてください。

 

③下に"Texture"という項目が表示されるのでその項目の横にある"Extract Textures..."というボタンをクリックしてください。

 

※①,②,③の番号は↓の画像と対応してます。

f:id:Kanipan_Man:20210107003226p:plain

 

すると、↓のようなダイアログが表示されます。このダイアログで今回インポートしたモデルの入っているフォルダを選択してください。

(私の場合はModelsというフォルダの中にモデルがあったためModelsを選択しています)

 

f:id:Kanipan_Man:20210107003429p:plain

 

そしてフォルダを選択すると・・・

 

f:id:Kanipan_Man:20210107004136p:plain

テクスチャのデータが取り出されました、

 

↓シーンのほうにもテクスチャの反映されたモデルが表示されるようになりました。

f:id:Kanipan_Man:20210107004458p:plain

 

今回はMixamoのモデルを使用しましたが、Fbxファイルにテクスチャが埋め込まれているモデルは同様の手順を行えばテクスチャを取り出すことが出来ると思います。

(Mixamoのモデル以外で確認していないので絶対とは言い切れませんが・・・)

 

また場合によってはMaterialに取り出したテクスチャを設定していく必要があるかもしれません。

 

”MixamoからUnityにインポートしたモデルのテクスチャが存在しない問題の解決法”は以上です。

 

今回はモデルの読み込みとかやったんで次回はアニメーションを読み込んで読み込んだモデルを歩かせたりしようかと思います。Unityやっぱかんたんやなぁ~