もくじ
はじめに
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)
Unityへのインポート
MixamoからダウンロードしたFBXファイルをテクスチャ画像と一緒にProjectウィンドウのAssetsフォルダにドラッグ&ドロップしてUnityに読み込む。読み込んだ全ての3Dモデルを選択して、InspectorのRigを選択し、Animation TypeをHumanoidに変更しApplyする。( 3.3)
HierarchyウィンドウにIdleの3Dモデルをドラッグ&ドロップしScene上にゲームオブジェクトとしてインスタンス化する。好みで名称をPlayer等に変更する。また、カメラに合わせてオブジェクトのPositionやRotationも好みで調整する。( 3.4)
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)
Animator Controller
ProjectウィンドウのAssets配下に新しくPlayerAnimatorControllerという名前でAnimator Controllerを作成し、Sceneに追加したPlayerゲームオブジェクトのAnimatorコンポーネントのControllerに設定する。( 3.6)
Animatorコンポーネントは3DモデルのRig設定時に通常自動で追加されるはずだが、Sceneに追加した3DモデルのオブジェクトにAnimatorコンポーネントが付いていない場合は、Animation Typeが変更されているか確認する。もし手動で設定したい場合は、Add Componentから追加できる。
アニメーション設定
Animatorコントローラーのステート編集画面(Animator)を開いてIdleステートを追加する。IdleステートのInspectorを表示させてMotionにMixamoのモデルファイルに含まれているアニメーションデータを設定する。( 3.7)
Idleのほかにも、RunとJumpステートを追加し、同様にそれぞれのステートのMotionにインポートした3Dモデルからアニメーションデータを割り当てる。( 3.8, 3.9)
IdleとRunはAnimatorの各ステートをダブルクリックしてInspectorに表示されるLoop Timeにチェックを入れる。( 3.10)
ステート同士、トランジションをそれぞれ相互に接続させる。また、Bool型のパラメータとしてisRunとisJumpを追加する。( 3.11)
全部で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)
テスト実行
Playボタンをクリックしてゲームを実行し、Playerの動きがおかしくないか、矢印キーやスペースキーの入力に応じて正しくアニメーションするかテストする。もしうまく動かない場合は、これまでの設定内容を見直して問題ないか確認する。( 3.14)
UnityChanToonShader
ウィンドウメニューの「Assets」 → 「Import Package」 → 「Custom Package...」を選択する。( 3.15)
ファイル選択画面が表示されるのでインターネットからダウンロードして解凍したファイルから「UTS2_ShaderOnly_v2.0.7_Release.unitypackage」を選択して「Open」をクリックする。( 3.16)
Assetsフォルダ内にある3DモデルであるFBXファイルを選択してInspectorのMaterialsを選択。Materials → Extract Materials...を選択。フォルダ選択画面が出るのでそのまま「Select Folder」をクリックする。( 3.17)
MaterialファイルがFBXファイルと同じフォルダに自動生成される。( 3.18)
生成されたMaterialファイルを選択し、InspectorのShaderメニューからUnityChanToonShader -> Toon_DoubleShadeWithFeatherを選択する。( 3.19)
最初、BaseMapにしかテクスチャが適用されていないので、1st ShadeMapと2nd ShadeMapにも3Dモデルと一緒にインポートしたテクスチャを反映させる。( 3.20)
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)
Unity chanアニメーション
Unity chanのアニメーションデータを使ってみる。
上記サイトから「ユニティちゃん 3Dモデルデータ」をダウンロードして使用する。ダウンロードした「UnityChan_1_2_1.unitypackage」をメニューの「Assets」→「Import Package」→「Custom Package...」からインポートする。結構多くのファイルを含んでいるが、今回は一部のアニメーションファイルしか使用しないので分かる範囲でVoiceデータなど不要なファイルを外してインポートする。
Animatorで各ステートのアニメーションをUnity chanのデータに差し替えていく。以下のように変更した。( 3.23)
- Idle → WAIT00
- Run → RUN00_F
- Jump → JUMP00
完成デモビデオ
Unityでの設定は以上となる。ゲームプロトタイプとするならもう少しゲーム要素を加えないといけないが今回はここまでとする。次は、この3Dキャラクターを操作するだけのUnityプロジェクトをWebGLを利用してUnity Playに公開したいと思う。