【Unityゲーム開発入門】ゲーム・プロトタイプの作り方(3/4)

Unityに3Dモデルを取り込みキャラクターを動かす

Posted by 51n1 on 11 Mar, 2021

もくじ

1. Blenderで3Dモデルを作成する
2. Mixamoで3Dアニメーションを組み込む
3. Unityに3Dモデルを取り込みキャラクターを動かす
4. Unity Playにパブリッシュする

はじめに

MixamoのアニメーションデータとUnity chanのアニメーションデータの両方を試してみた。Unityに最適化されているのだろうか。Unity chanのデータの方は調整なしでも自然なアニメーションになる。Mixamoはアニメーションによると思うが、ジャンプモーション等で不自然な動きが入る場合があった。

今回の作業の流れとしてはまずはMixamoのアニメーションデータ3種類(Idle、Run、Jump)をUnityで設定して、最後にUnity chanのアニメーションデータに差し替えてみたい。

ボーンの設定などBlenderで実施した方が自然な人型の骨格が作れるだろうが、Mixamoではリギングの作業を簡単に済ませることができるのがメリットである。Mixamoで自動リギングを行い、アニメーションはUnity chanなど別のアセットから持ってきても良いだろう。本番用に3Dモデルをきちんと制作したいときはBlenderで設定し、プロトタイプ等で簡易に作成したいときはMixamoとケースバイケースで使い分けられる。

新規プロジェクト作成

Unity HubのProjectsウィンドウから「NEW」ボタンをクリックし、Templatesの3Dを選択してProject Nameに名前を入力し新規プロジェクトを作成する。( 3.1, 3.2)

3.1 Projects - Unity Hub

3.2 Create a new project

Unityへのインポート

MixamoからダウンロードしたFBXファイルをテクスチャ画像と一緒にProjectウィンドウのAssetsフォルダにドラッグ&ドロップしてUnityに読み込む。読み込んだ全ての3Dモデルを選択して、InspectorのRigを選択し、Animation TypeをHumanoidに変更しApplyする。( 3.3)

HierarchyウィンドウにIdleの3Dモデルをドラッグ&ドロップしScene上にゲームオブジェクトとしてインスタンス化する。好みで名称をPlayer等に変更する。また、カメラに合わせてオブジェクトのPositionやRotationも好みで調整する。( 3.4)

3.3 Rig - 3D Models

3.4 Transform - Player

PlayerControllerスクリプト

ProjectウィンドウのAssetsフォルダでC#スクリプトを新規作成しPlayerControllerと名称を変更する。詳細は省略するが、キャラクターの移動、ジャンプやアニメーションの遷移処理を設定する。以下、C#スクリプトのコードを参考に掲載する。今回プログラム処理はC#スクリプトで組んだが、今度、Boltで実装してみたい。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    private Animator anim;
    private Rigidbody rb;
    private bool isGrounded = true;

    [SerializeField]
    private float speed = 10;
    [SerializeField]
    private float jumpForce = 250;

    void Start()
    {
        anim = GetComponent();
        rb = GetComponent();
    }

    void Update()
    {
        // RUN
        if (Input.GetButton("Horizontal") || Input.GetButton("Vertical"))
        {
            transform.Translate(Vector3.forward * Time.deltaTime * speed * 1); // Front
            anim.SetBool("isRun", true);
        }
        else
        {
            anim.SetBool("isRun", false);
        }

        // JUMP
        if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
        {
            rb.AddForce(Vector3.up * jumpForce);
            anim.SetBool("isJump", true);
            isGrounded = false;
        }

        //Direction of Caracter's face
        if (Input.GetButton("Horizontal") || Input.GetButton("Vertical"))
        {
            if (isGrounded)
            {
                Vector3 moveDirection = transform.position + (Vector3.right * Input.GetAxisRaw("Horizontal")) +
                (Vector3.forward * Input.GetAxisRaw("Vertical")) - transform.position;

                transform.rotation = Quaternion.LookRotation(moveDirection);
            }
        }
    }

    private void OnCollisionEnter(Collision collision)
    {
        anim.SetBool("isJump", false);
        isGrounded = true;
    }
}

PlayerゲームオブジェクトにはCapsule ColliderとRigidbodyを追加する。ColliderはInspectorからEdit Colliderをオンにして適当な大きさに編集する。先ほど、作成したPlayerControllerスクリプトもアタッチしておく。( 3.5)

3.5 Capsule Collider - Player

Animator Controller

ProjectウィンドウのAssets配下に新しくPlayerAnimatorControllerという名前でAnimator Controllerを作成し、Sceneに追加したPlayerゲームオブジェクトのAnimatorコンポーネントのControllerに設定する。( 3.6)

Animatorコンポーネントは3DモデルのRig設定時に通常自動で追加されるはずだが、Sceneに追加した3DモデルのオブジェクトにAnimatorコンポーネントが付いていない場合は、Animation Typeが変更されているか確認する。もし手動で設定したい場合は、Add Componentから追加できる。

3.6 Animator Controller - Player

3.7 Motion - Animator

アニメーション設定

Animatorコントローラーのステート編集画面(Animator)を開いてIdleステートを追加する。IdleステートのInspectorを表示させてMotionにMixamoのモデルファイルに含まれているアニメーションデータを設定する。( 3.7)

Idleのほかにも、RunとJumpステートを追加し、同様にそれぞれのステートのMotionにインポートした3Dモデルからアニメーションデータを割り当てる。( 3.8, 3.9)

3.8 Run - Animator

3.9 Jump - Animator

IdleとRunはAnimatorの各ステートをダブルクリックしてInspectorに表示されるLoop Timeにチェックを入れる。( 3.10)

ステート同士、トランジションをそれぞれ相互に接続させる。また、Bool型のパラメータとしてisRunとisJumpを追加する。( 3.11)

3.10 Loop Time - Animation

3.11 Transition & Parameters - Animator

全部で6つのトランジションの設定をそれぞれInspectorで行う。主なパラメータの設定内容は下記のとおりである。

  • Idle → Run : isRun = true, Has Exit Time = Off
  • Run → Idle : isRun = false, Has Exit Time = Off
  • Run → Jump : isJump = true, Has Exit Time = Off
  • Jump → Run : isJump = false, Has Exit Time = On
  • Idle → Jump : isJump = true, Has Exit Time = Off
  • Jump → Idle : isJump = false, Has Exit Time = On

ここでゲームを実行してみるとRunやJumpのアニメーションがなんだかおかしい。調べたところ、インポートした3DモデルのAnimationに追加設定が必要らしい。それぞれInspectorでAnimationメニューを表示させる。( 3.12)

下の方にあるLoop Time, Root Transform Rotation, Root Transform Position(Y), Root Transform Position(XZ)にチェックを入れてApplyする。JumpアニメーションはループさせないのでLoop Timeのチェックは不要。( 3.13)

3.12 Animation - Inspector

3.13 Root Transform - Inspector

テスト実行

Playボタンをクリックしてゲームを実行し、Playerの動きがおかしくないか、矢印キーやスペースキーの入力に応じて正しくアニメーションするかテストする。もしうまく動かない場合は、これまでの設定内容を見直して問題ないか確認する。( 3.14)

3.14 Test Play

UnityChanToonShader

ウィンドウメニューの「Assets」 → 「Import Package」 → 「Custom Package...」を選択する。( 3.15)

ファイル選択画面が表示されるのでインターネットからダウンロードして解凍したファイルから「UTS2_ShaderOnly_v2.0.7_Release.unitypackage」を選択して「Open」をクリックする。( 3.16)

3.15 Custom Package

3.16 UnityChanToonShader

Assetsフォルダ内にある3DモデルであるFBXファイルを選択してInspectorのMaterialsを選択。Materials → Extract Materials...を選択。フォルダ選択画面が出るのでそのまま「Select Folder」をクリックする。( 3.17)

MaterialファイルがFBXファイルと同じフォルダに自動生成される。( 3.18)

3.17 Extract Materials

3.18 Materialファイル

生成されたMaterialファイルを選択し、InspectorのShaderメニューからUnityChanToonShader -> Toon_DoubleShadeWithFeatherを選択する。( 3.19)

最初、BaseMapにしかテクスチャが適用されていないので、1st ShadeMapと2nd ShadeMapにも3Dモデルと一緒にインポートしたテクスチャを反映させる。( 3.20)

3.19 Shader

3.20 1st/2nd ShadeMap

1st ShadeMapに影の色を付けていく。2nd ShadeMapでもう一段階影を付けられる。その他パラメータを好みで調整する。( 3.21)

  • BaseColor Step:影の広さ
  • Base/Shade Feather:影の境界のぼかし度合
  • ShadeColor Step:2つ目の影の広さ
  • 1st/2nd_Shades Feather:2つ目の影の境界のぼかし度合

アウトラインを付ける。Inspector下の方の[Outlines Settings] -> Outline Widthで線幅を調整、Blend BaseColor to OutlineをActiveにするとBaseColorと色を混合させて表示させる。( 3.22)

3.21 Color Settings

3.22 Outline Settings

Unity chanアニメーション

Unity chanのアニメーションデータを使ってみる。

https://unity-chan.com

上記サイトから「ユニティちゃん 3Dモデルデータ」をダウンロードして使用する。ダウンロードした「UnityChan_1_2_1.unitypackage」をメニューの「Assets」→「Import Package」→「Custom Package...」からインポートする。結構多くのファイルを含んでいるが、今回は一部のアニメーションファイルしか使用しないので分かる範囲でVoiceデータなど不要なファイルを外してインポートする。

Animatorで各ステートのアニメーションをUnity chanのデータに差し替えていく。以下のように変更した。( 3.23)

  • Idle → WAIT00
  • Run → RUN00_F
  • Jump → JUMP00

3.23 Motion - Animator

完成デモビデオ

3.24 Complete Image

Unityでの設定は以上となる。ゲームプロトタイプとするならもう少しゲーム要素を加えないといけないが今回はここまでとする。次は、この3Dキャラクターを操作するだけのUnityプロジェクトをWebGLを利用してUnity Playに公開したいと思う。