UnityでMMDモデルを自由自在に動かしてみよう!

19/02/03 14:27:11     19/05/05 18:03:04

MMDモデル

MMDとはMikuMikuDanceの略で、もともとは初音ミクを動かすために開発されたツールです。初音ミクが3Dで高度な動きを実現して話題になりましたが、MMDは初音ミクを動かすツールのなかでも主役でした。

そして、現在MMDは初音ミクを動かすだけのツールではなく、それ以外のキャラクターも動かせるようになっています。作られた当初から神ツールと言われていましたが、現在も変わらず神ツールとして知られています。

UnityでMMDモデルを使う方法

UnityでMMDを使用するためには、まずMMDモデルをインポートします。インポートの方法としては、以下の公式ページからファイルをダウンロードして実行します。

Stereoarts Homepage
 http://stereoarts.jp/

実行すればインポート完了なので、設定していきます。

Third Person Characterの設定

Third Person CharacterはSample Asset(beta)の機能で、アセットストアからインポートすることができます。サンプルという名前の通り複数のアセットのサンプルが入ったものですが、十分実用的に使えるレベルです。

具体的に入っているアセットとしては、レーシングゲームようのシミュレーター、モブキャラの移動、スクロールアクションなどです。なので、幅広いジャンルのゲームに対応しています。

インポートが終わったらシーンにPlaneを作成し、Third Person Characterをシーンにドラッグ&ドロップします。そうすると、キャラクターを配置できます。キャラクターを差し替える場合は、Third Person CharacterのEthanを削除し、そこに先ほどFBX化したMMDモデルをProjectビューからHierarchyビューへドラッグ&ドロップで配置します。

キャラクターを動かすスクリプト

UnityでMMDを使用している人の多くが他のツールと合わせて使用しており、実現したい動きに対して使えるツールが複数あります。便利なアセットも多く、基本的な動きであればコーディングなしで作れます。

そのため必ずしもコードを書く必要はないのですが、ツールが多すぎてどうするか迷ってしまったり、複数のツールを使用してキャラクターに動きなどを付けると競合してよくわからないことになる可能性があります。

どのツールでどのように設定したかがわからなくなり、またどのツールが優先されるのかもよくわからなくなるということです。ツールは便利な反面このようなことがあるので、慣れればスクリプトを書いた方が早いことも多いです。

移動先を向くスクリプト

何もしないと、キャラクターが正面を向いたまま移動するという不自然な状態になります。人間の感覚だとその辺自然に動いてくれれば良いのですが、残念ながらプログラムにそのような臨機応変さはありません。

人工知能でない限り、設定した通りにしか動かないということです。そして移動先を向くスクリプトの例は以下です。

if (direction != Vector3.zero) {
    var velocity = characterController.velocity;
    velocity.y = 0;
    transform.rotation = Quaternion.LookRotation(velocity);
}

移動先に向かってキャラクターが回転するスクリプトです。

using UnityEngine;
using System.Collections;

[SelectionBase]
[RequireComponent(typeof(Animator))]
[RequireComponent(typeof(CharacterController))]
public class Move : MonoBehaviour {

    [SerializeField, DisappearAttachedField]
    Animator animator;

    [SerializeField, DisappearAttachedField]
    CharacterController characterController;

    private Vector3 direction;

    void Reset()
    {
        animator = GetComponent<Animator> ();
        animator.applyRootMotion = false;

        characterController = GetComponent<CharacterController> ();
        characterController.center = Vector3.up * 0.75f;
        characterController.height = 1.5f;
        characterController.radius = 0.3f;
    }

    void Update ()
    {
        var cameraForward = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized;
        direction = cameraForward * Input.GetAxis ("Vertical") +
            Camera.main.transform.right * Input.GetAxis ("Horizontal");

        animator.SetFloat ("Speed", direction.sqrMagnitude);
        animator.SetBool("IsInFall", characterController.isGrounded == false);
    }

    void OnAnimatorMove()
    {
        characterController.SimpleMove (direction.normalized * 3);
        if (direction != Vector3.zero) {
            var velocity = characterController.velocity;
            velocity.y = 0;
            transform.rotation = Quaternion.LookRotation(velocity);
        }
    }
}

キャラクターが走り回る処理で、カメラの位置や動き方も指定しています。ロジック自体はシンプルなのですが、どちらかというとどのクラスで何ができるのかを把握するのが難しいです。

なので、MMDの使い方をマスターする際はざっくりとMMDについて調べるのではなく、インストールしてある程度操作してみたら、実際に自分が実装した処理にピンポイントで焦点を合わせて調べてツールでの設定や実装するのがおすすめです。

MMDについてはあまりまとまった情報がないのが現状で、ツールを操作したりスクリプトを書いたりしながら全体像をつかんでいくような流れになるでしょう。最初からきっちり全体を押さえたい人からすると違和感があるかもしれませんが、ゲームの場合特に全部きっちり理解してからやろうとするよりも手を動かしながら理解していくことをおすすめします。

情報が断片的なので全部をきっちり押さえることが難しいということもありますが、作りながら知識をインプットした方が面白いからです。いったん画面のなかで適当にキャラクターが走り回ったり踊ったりするようにできれば、後は自分好みの動きを付ける方法を調べて足していけば良いかと思います。

Unity関連のフリーランス案件をチェック

→Unity関連の案件情報一覧はこちら

 

Unity関連記事
1, 【unityのフリーランス求人・案件情報】エンジニア需要や開発単価、未経験でもいける?
2, 【unity入門】ゲーム開発だけじゃない、Unityで出来ること
3, (この記事)UnityでMMDモデルを自由自在に動かしてみよう!
4, Unityでオブジェクトを回転させる方法をわかりやすくまとめました
5, Unityで簡単にアニメーションを作成する方法をまとめました
6, Unity adsを使って簡単に広告を導入しよう
7, Unityのパーティクルを使って演出できるエフェクト例
8, Unityのtransformを使ってオブジェクトの座標や回転を操作する
9, Unityのコルーチンとは?使い方をまとめました
10, Unityのアセットストアの上手な使い方
11, Unityのアニメーターを簡単に作成する方法まとめ
12, UnityのShaderの解説と使い方まとめました
13, Unityのrigidbodyを使って物理演算を導入してみよう
14, Unityを使って半日でFPSゲームを作ってみよう

人気記事

編集部おすすめ記事

この記事を読んだ人はこんな記事を読んでいます

案件探しやフリーランスになるための相談する