VRMファイルのインポート(ローカル版)

VRMファイルをローカル環境で読み込むヤツを勉強します。

Windowsダイアログでファイルを選択して読み込めるようにする!

最終的にはVroidSDKでやりたい・・・。
ネット環境が無い環境だと結局ローカル読み込みが必要なので先にこっちを。

 

 

◆環境

Unity 2018.4.3f1
UniVRM ver0.53.0

 

◆サンプルの確認

①UniVRMをDLしてインポート

https://github.com/vrm-c/UniVRM

 

②UniVRMTestをDLしてインポート

https://github.com/vrm-c/UniVRMTest

 

Assets>VRM.Samples>Scenes内のVRMRuntimeLoaderSampleシーンを開く

実行して[LoadVRM]ボタンを押してVRMファイルを選択

 

3秒ほど経つとモデルがロードされる。
FirstPersonカメラで頭が表示されていないのは仕様ですね。(自分が入り込む時用)

モデルはVRMRuntimeLoaderの下に配置される。

 

 

◆サンプルで流用

Sampleのスクリプトを流用して、シンプルに必要なところだけにする。

 

こんな感じ・・・?

これを使う場合は毎回「UniVRMTest」をインポートしておく必要がある。

この方法は同期処理、読み込み中にシーンが固まる。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using VRM;//VRMImporterContextで使用
using VRM.Samples;//FileDialogForWindowsで使用
using System;
using System.IO;
using System.Runtime.InteropServices;

public class VRMLoad1 : MonoBehaviour
{
  
  
    public void LoadVRMClicked()
        {

            //ファイル選択ダイアログウィンドウを表示
            var path = FileDialogForWindows.FileDialog("open VRM", ".vrm");

            if (string.IsNullOrEmpty(path))
            {
                return;
            }

            var bytes = File.ReadAllBytes(path);
            // なんらかの方法でByte列を得た

            var context = new VRMImporterContext();

            // GLB形式でJSONを取得しParseします
            context.ParseGlb(bytes);


            // metaを取得(todo: thumbnailテクスチャのロード)
            var meta = context.ReadMeta();
            Debug.LogFormat("meta: title:{0}", meta.Title);

            // ParseしたJSONをシーンオブジェクトに変換していく
            context.Load();
            OnLoaded(context);
           
    }


    void OnLoaded(VRMImporterContext context)
        {
            var root = context.Root;
            root.transform.SetParent(transform, false);

            //メッシュを表示します
            context.ShowMeshes();

            // add motion
            var humanPoseTransfer = root.AddComponent<UniHumanoid.HumanPoseTransfer>();
   
        }
}

新規シーン作成して、このスクリプトを空のオブジェクトにアタッチして

Canvasにボタン追加して呼び出せば動く

 

まぁこれで動きはするんですが、毎回サンプルインポートしたくないのと

FileDialogForWindows.FileDialogの中身見たら

ワカラン( ^ω^ )

ってなったので他の方法試します。

 

 

◆Windows.Forms.dllを使用する。

bibinba師匠の記事を参考にします。

こちらも分かりやすかったので参考:
https://qiita.com/sh_akira/items/8155e4b69107c2a7ede6
https://qiita.com/toRisouP/items/7d2c57d7d160f375e2d8

 

UnityをインストールしているフォルダからSystem.Windows.Forms.dllをコピーしてきます。

“C:\Program Files\Unity\Hub\Editor\2018.4.3f1\Editor\Data\Mono\lib\mono\2.0\System.Windows.Forms.dll”

 

Assetsフォルダ直下にPluginsフォルダを作成して、コピーしたdllを張り付けます。
Pluginsフォルダは特殊フォルダなので名前の変更したら機能しない。

 

PlayerSetting>OtherSettingsのApi Compatibility Levelを.Net Standard 2.0に設定

 

dllをVisualStudioで使用できるようにプロジェクト>参照の追加

検索フォームで「system.windows.Forms」を検索、出てきたモノにチェックをつけてOKで追加

 

以下のスクリプトを準備

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Windows.Forms;
using VRM;//VRMImporterContextで使用
using System.IO;//Fileで使用

public class VRMLoad : MonoBehaviour
{
    public void VRMLoadAsync(){
        
        var dlg = new OpenFileDialog();
        
        dlg.Title = "VRMファイルを選択";
        dlg.Filter = "VRM(*.vrm)|*.vrm";
        
        dlg.CheckFileExists = false;
        if (dlg.ShowDialog() == DialogResult.OK)
        {
            var bytes = File.ReadAllBytes(dlg.FileName);//ファイルをBytes列に読み込む
            var context = new VRMImporterContext();     //インスタンスの作成
            context.ParseGlb(bytes);                    //GLB形式でJSONを取得しParse
            var meta = context.ReadMeta();              //VRMメタファイルの取得
            Debug.LogFormat("meta: title:{0}",  meta.Title);//読み込めたらモデル名表示

            //非同期処理で読み込み(ロード中にシーンが固まらない)
            context.LoadAsync(() => OnLoaded(context));
            
        }

       }

    
        void OnLoaded(VRMImporterContext context)
        {
            var root = context.Root;//読み込み完了後Context.Rootにモデルが入る
            root.transform.SetParent(transform, false);//モデルの配置

            context.ShowMeshes();//メッシュを表示します

  
        }


 
}

 

新規シーン作成して、このスクリプトを空のオブジェクトにアタッチして
Canvasにボタン追加して呼び出せば動く(この手順はサンプルを流用」と同じ)

これでVRM形式のモデルを動的に配置できる!

 

 

ちなみにこの動画を撮る前、ボタンを押すと

could not register the window class, win32 error 0

というメッセージボックスが2回出てきた。ナニコレ怖い。
OK押したら問題なく画面が表示されてVRMファイルは読み込めた。

 

unity再起動しても、最初の1回目は表示されないが2回目以降は表示される。

同じ症状:https://qiita.com/hibiki8229/items/5bd675073c7e041e222f

 

PlayerSetting>OtherSettingsのScripting Runtime Versionを.Net3.5にしたところ改善した。

the .Net3.5 scripting runtime has been deprecated and will be removed in a future release.
「.Net3.5スクリプトランタイムは廃止され、将来のリリースで削除される予定です。」

ってあるし、.net4でやるのがいいのかもしれない。

 

 

◆モデル

今回のモデルは麻倉ましゅさん制作のましゅ式初音ミクを使わせて頂いてます。

https://hub.vroid.com/characters/3815752209424693026/models/8346048590558780850

VroidHubにアップされているミクさんの中で一番可愛かったので直接本人にDM送ってお借りさせて頂きました。

 

ちなみに

2019/9/14に銀座で「JapanVR Fest 2019」通称「銀VR(ぎんゔぃら)」が開催されます。

今回、個人製作でLookingGlassコンテンツを展示するんですが
このミクさんをメインに色々実装していく予定です。

 

頑張ってつくるぞーい。

 

久々に自分の記事にミクさんの画像載せた気がする、やっぱ良いですね。

関連記事




コメントを残す

※コメントは承認後に表示されます。
 コメントを公開されたくない場合、名前の後に「:非公開」とつけてください。