2
1

【Unity×VRM1.0】任意のVRMファイルをフォルダから選択し読み込む

Posted at

概要

Unityで任意のVRMファイルをフォルダから選択し読み込むまでのデモです。

2024-02-04 20-51-09.gif

開発環境

Windows 10
Unity 2022.3.6f1
Api Compatibility Level .NET Standard 2.1

使用したパッケージ

VRM 1.0

リンク先からunitypackageをダウンロード、事前にプロジェクトにインポートしておきます。
https://github.com/vrm-c/UniVRM
なお、利用したのはVRM-0.117.0_9a91.unitypackageです。

VRMの実装に関しては、以下が参考になりました。

Unity Standalone File Browser

こちらは、フォルダからファイルを読み込むのに利用しました。
Windowsでしか試していませんが、クロスプラットフォーム対応できるようです。素晴らしい!

リンク先からunitypackageをダウンロード、事前にプロジェクトにインポートしておきます。
https://github.com/gkngkc/UnityStandaloneFileBrowser

実装に関しては、githubに記載のあるExample usageとサンプルシーン(Sample/BasicSampleScene.unity)を参考にしました。

実装

スクリプト

C#スクリプトは以下の通りです。
今回は"Load VRM"ボタンをクリックするとエクスプローラーが開いて、任意のVRMファイルを読み込めるようにしています。
ボタンの実装はCanvasを利用していますが、その説明はここでは行いませんので、参考資料を最後に載せておきました。
また、以下の投稿でCanvasのテスト実装を試しているので、参考にしていただければと思います。
https://qiita.com/Gamo_2683/items/0894bfb34b2b14b32e96

publicで定義したLoadVRM()関数をButtonコンポーネントのOn Click()にセットすれば、ボタンクリック時の動きが定義できるのですが、関数をTaskで書くとOn Click()にセットできる関数の一覧に表示されなかったため、気持ちが悪いですがTaskで書く必要のある処理はOpenVRM()関数として別定義しています。
このあたりの仕様は追々確認が必要そうです。

UniVrm10.cs
using UnityEngine;
using System.Threading.Tasks;
using UniVRM10;
using SFB;

public class UniVrm10 : MonoBehaviour
{
    // デフォルトで読み込みたいモデルがある場合はpathをセットする。
    string path = "";

    // Open file with filter
    // 拡張子がvrmまたはVRMのファイルのみ選択させる。
    ExtensionFilter[] extensions = new[] {
        new ExtensionFilter("VRM Files", "vrm", "VRM"),
    };

    // Start is called before the first frame update
    async void Start()
    {
        if (path != "" && path != null)
        {
            // VRMファイルのロード
            Vrm10Instance vrm10Instance = await Vrm10.LoadPathAsync(path);
        }

    }

    // Update is called once per frame
    void Update() { }

    // ButtonコンポーネントとOn Click()にセットして利用することを想定
    public void LaodVRM()
    {
        string[] paths = StandaloneFileBrowser.OpenFilePanel("Load VRM File", "", extensions, true);
        // Vrm10Instance vrm10Instance = await Vrm10.LoadPathAsync(paths[0]);

        // すでに開かれているVRMファイルがある場合は削除する。
        GameObject currentVrm = GameObject.Find("VRM1");
        if (currentVrm != null)
        {
            Destroy(currentVrm);
        }
        OpenVRM(paths);
    }

    private async Task OpenVRM(string[] paths)
    {
        // VRMファイルのロード
        Vrm10Instance vrm10Instance = await Vrm10.LoadPathAsync(paths[0]);
    }
}

利用方法

  • Unityを起動します。
  • 使用するUnityパッケージをインポートします。
  • Emptyオブジェクトを用意します。
  • 用意したEmptyオブジェクトのコンポーネントにUniVRM10.csをセットします。
  • GameObject>UIからCanvasを用意します。
  • 同様にGameObject>UIからButton - TextMeshProを用意します。
  • ButtonコンポーネントのOn Click()のSelect Objectにはじめに作成したEmptyオブジェクトをセットします。続いて、UniVrm10>LaodVRM()の順に選択して、クリック時に実行する関数を指定します。
  • Playモードに入ります。
  • Buttonをクリックして、読み込みたいVRMファイルを読み込むことができたら成功です。

はじめのデモ画像(GIF)で使用したアバター

2つ目のアバターは2024/2/5時点で無料配布されているとてもかわいいガニ股で歩く無料3D美少女アバターですが、vrmは同梱されていないため、自力で変換する必要があります。
今回は製作者のひまたさんのご厚意でご提供いただきました。感謝です!

1. New NecoMaid(製作:QuQu)

2. がにまた(製作:ひまた工房)

3. 薄荷(製作:mio3io)

参考資料

VRM関連

Unity Standalone File Browser関連

Canvas関連

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1