はじめに
UnityではProject内にあらかじめAssetsを保持しておいたものをロードして、シーン上に配置を行うことが多いです。
しかし、上記の方法だと例えばユーザが指定したVRMファイルを読み込んで表示するといったことができません。
VRMは仕様が標準化されているファイル方式であり、せっかくならユーザが用意した任意のVRMモデルを使用して色々と活用したいところです。
これを実現するための機能がUniVRMではあらかじめ用意されています。
指定したパスのVRMファイルを読み込みインスタンス化する機能があるので、この方法について記載します。
これができるとユーザにファイルのパスを指定させて、任意のVRMモデルをゲーム上に反映させるということができるようになります。(例↓)
環境
インポート用の処理をコンパイルするには下記のパッケージが必要になるため、あらかじめ導入しておいてください。
UniTask

🌶️UniTaskの導入|LitMotion Guidebook
UniVRM1.0
実装例
ごく簡単な実装例を提示します。
このコンポーネントをシーンに存在する適当なGameObjectにアタッチするとpathに指定されたファイルからVRMモデルがロードされます。
using System;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UniVRM10;
public class TestVrmImportScript : MonoBehaviour
{
Vrm10Instance vrmInstance; // VRMインスタンスを保持する変数
public string path = @"D:\Documents\Vroid\AvatarSample_B.vrm";
// Start is called once before the first execution of Update after the MonoBehaviour is created
async void Start()
{
vrmInstance = await LoadVRMAsync(path);
}
/// <summary>
/// MARK: LoadVRMAsync
/// VRMファイルを非同期でロードします
/// </summary>
/// <param name="path">VRMファイルのパス</param>
/// <returns>ロードされたVRM10Instanceオブジェクト</returns>
private async UniTask<Vrm10Instance> LoadVRMAsync(string path)
{
try
{
// VRMファイルのロード
Debug.Log($"VRMファイルをロード中: {path}");
Vrm10Instance loadedVrmInstance = await Vrm10.LoadPathAsync(path);
if (loadedVrmInstance == null)
{
Debug.LogError("VRMモデルのロードに失敗しました");
return null;
}
Debug.Log($"VRMモデル「{loadedVrmInstance.Vrm.Meta.Name}」をロードしました");
return loadedVrmInstance;
}
catch (Exception ex)
{
Debug.LogError($"VRMファイルのロード中に例外が発生しました: {ex.Message}");
throw; // 呼び出し元で処理できるように例外を再スロー
}
}
}
色々書かれていますが、重要なのは下記行だけです。
Vrm10Instance loadedVrmInstance = await Vrm10.LoadPathAsync(path);
UniVRM側でロード用のメソッドが用意されているためこれにファイルパスを指定してやるだけでロードしてくれます。(便利ですね!)

実環境においてはロードしたVRMに親を設定したり、AnimatorControllerを設定したりすると思います。
上記のコンポーネントを参考にお好み処理を実装してみてください。
さいごに
本記事がどなたかのお役に立てば幸いです。
最後までお読みいただき、ありがとうございます!
コメント