Unity:VRMファイルの使い方(UniVRM、人気アセット)

最終更新日



はじめに

以下、公式のドキュメントから引用させていただきます。

VR(Virtual Reality)やVTuberなどにおいて「キャラクターや人型のアバター(の3Dモデル)」を取り扱おうとした場合、従来はアプリケーションごと・3Dモデルデータごとに独自のシステムを開発したり細かく調整したりする必要がありました。

・・・

「人型のキャラクターやアバター」において細かいモデルデータの差違を吸収・統一しアプリケーション側の取り扱いを簡単にする

つまり?

結局何が言いたいのかというと、様々な3Dモデルデータが存在する中、人型の3Dモデルを統一的に扱うための新しいフォーマットを作ったよって事です。
特徴としては以下になります。

  • gLTF 仕様 を拡張して使っています。
  • 人型のボーンがデフォルトで定義します。
  • 3Dソフトでバラバラな座標系・スケールなどを統一します。
  • 人型の目の位置を定義します。
  • 著作権の扱いを標準的に定義します。

VRMで何ができるの?

VRMファイルは人型を扱うためのファイルフォーマットなので、VRMに対応したプラットフォームやシステムなどがあれば基本的に使えます。
今回の記事では Unity を使いますが、もちろん Unity でも扱えるためのアセットが存在しますのでそれを使います。

VRM applications

VRMの使い方

さっそく、Unity で VRMファイルを使うための手順に入りたいと思います。

UniVRM のインストール(導入)

UniVRM のリリースページから最新の .unitypackage をダウンロードしましょう。

ダウンロードしたら、Unity画面の「Assets > Inport Package > Custom Package」 で先ほどダウンロードしたファイルを選択しましょう。

UniVRMがインポートできると、以下のようにメニューとAssetsフォルダにVRM関連の機能が追加されます。

VRM モデルを使う

VRMファイルがないとそもそも確認できないので今回は、公式ページのトップページ画像にも使われている、「ニコニ立体ちゃんのアリシア・ソリッド」を使わせていただきます。

ダウンロードすると、以下のように「~.vrm」のファイルがありました、これを Unity でインポートして使ってみましょう。

Unity で VRMモデルを使う方法(インポート方法)は、大きく分けて2パターンの方法があります。

  • Prefabとして静的に配置する。
  • C#スクリプトで動的に配置する。

Prefabで静的な使い方

「~.vrm」ファイルを、ドラッグアンドドロップで Assets に配置すると自動的にインポートがおこわれ、Prefabが作成されます。

以下のように、Prefabが作成されます。
Prefabが作成できたら、次に「Hierarchy」にPrefabをドラッグアンドドロップしてみましょう。

どうでしょうか、簡単にVRMファイルが使えるようになりました!すごいですね!!

C#スクリプトから動的な使い方

続いては、C#スクリプトからランタイム(動的)にロードを行ってみましょう、Unityでは、Resource/StreamingAssets などファイルをそのまま置いてAPIからロードする事ができます。

今回は、StreamingAssetsフォルダにファイルを置いて試してみましょう。

アセットフォルダに、「StreamingAssets」フォルダを新規作成し「AliciaSolid.vrm」ファイルをその下に配置します。

次に、VRMLoaderオブジェクトを作成して、VRMLoaderのC#スクリプトを追加します。

C#スクリプトは、以下のようになります。
指定のパスからVRMファイルを読み込んで、読み込みが成功したらPostision=(1, 1, 1) に移動するって感じのスクリプトになります。

using UnityEngine;
using VRM;

public class VRMLoader : MonoBehaviour
{
    void Start()
    {
        var path = Application.streamingAssetsPath + "/" + "AliciaSolid.vrm";

        VRMImporter.LoadVrmAsync(path, gameObject =>
        {
            gameObject.transform.position = new Vector3(1, 1, 1);
        });
    }
}

上記のスクリプトでの読み込み方法についてですが、最新バージョンだと「[Obsolete(“use VVRMImporterContext.LoadAsync”)]、旧型式です」と警告が表示され、非推奨になっているので新しい方法のスクリプトは以下のようになります。

using UnityEngine;
using VRM;

public class VRMLoader : MonoBehaviour
{
    void Start()
    {
        var path = Application.streamingAssetsPath + "/" + "AliciaSolid.vrm";

        var context = new VRMImporterContext();

        context.Parse(path);
        context.LoadAsync(() =>
        {
            var gameObject = context.Root;
            gameObject.transform.position = new Vector3(1, 1, 1);

            context.ShowMeshes(); // メッシュの表示・ここ重要
        });
    }
}

他のアセット情報







よければ、SNSにシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

コメントする