トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

ローカル環境からのVRMインポーターを作った!【アニメーション付き】

よくあるVRMソフトみたいに、自分のローカル環境からvrmファイルを選んで読み込んで、とあるポーズをさせるみたいなのを実装してみたい!!!

この記事で紹介しているようなやつね!

bibinbaleo.hatenablog.com

 

非同期とかランタイムとか全然分からないけど!

やるぞ!

基礎

とりあえずUnivrmをインポートします。

Releases · dwango/UniVRM · GitHub

そのあとスクリプトを書きます。

vrmの公式githubにインポートのスクリプトは書いてあります。

VRMモデルを実行時にインポートする - dwango on GitHub

f:id:bibinbaleo:20181202183756p:plain

4種類書いてありますが、とりあえず一番上のをコピペします。

var path="sample.vrm";
var go=VRM.VRMImporter.LoadFromPath(path);
Debug.LogFormat("loaded {0}", go.name);

最初updateに書いたけど、そしたら無限に呼び込みしてしまいUnityが止まりそうになりました。

ボタンを押したらこの処理をするようにします。

public void onFileOpen()
{
     var path = "A:\\3Dmodel\\VRM\\AliciaSolid.vrm";
     var go = VRM.VRMImporter.LoadFromPath(path);
     Debug.LogFormat("loaded {0}", go.name);

}

 

pathはとりあえず最初は自分のPCのvrmファイルがある場所を指定します。

ボタンを設置、押したらあの関数を実行するようにする。

f:id:bibinbaleo:20181202184619p:plain

なんとこれでボタンを押したら指定したモデルを読み込んでくれました!

こんなあっさりできるんだ!感動した!!!0,0,0の位置に表示されます。

f:id:bibinbaleo:20181202184345g:plain

非同期

ただ少し読み込むのに時間がかかります。

こんなものなのか?

もしかして非同期とかいうやつをしたら早くなるのかな??と思い非同期のほうをコピペしたらエラーが出ます。

f:id:bibinbaleo:20181202183800p:plain

調べたらこちらのツイートで、VRMImporterの前にVRMを付けていました。

 付けたらエラーが消えて無事に取り込めました。

が速さはそんなに変わらない。

非同期とはロード中にほかのものの動作を止めずにできる構造らしいです。

qiita.com

選択ダイアログ

本当にやりたいのはファイルを自分の環境から選択できるようにすることです。

下の記事を参考にしました。

www.sejuku.net

OpenFileDialogというのを使えばいいということがわかりました。

これを使うには

using System;
using System.Windows.Forms;

がいるそうですが、これを書いたらエラーが出ます。

調べたらなんか設定しないといけないそうです。

C#のコンソールアプリでSystem.Windows.Forms空間のコントロールを使う | IT忘備録・メモ書きと日記

ソリューションエクスプローラにある「参照設定」を右クリックして「参照の追加」を選択し、「参照の追加」ウインドウを表示します。そして、「.NET」タブのコンポーネント名「System.Windows.Forms」を選択し「OK」ボタンを選択します。

 

 

私はWindowsのVisualStudio2017を使っています。

参照設定ってどこやねん!!!

f:id:bibinbaleo:20181202191648p:plain

参照設定の追加でググったら上のプロジェクト>参照の追加で追加できました。

VB 参照設定を追加する方法

f:id:bibinbaleo:20181202192336p:plain

そしたらエラーも消えました。

ただエディターがすごく重くなった。

しかもVS側はエラー消えてるけどUnityには出続けてる。

しかもVSをいったん閉じて、また開いたらimportしたはずのSystem.Windows.Formsが消えてる

 

またいろいろ調べたらUnityに直接?System.Windows.Formsをインポートしないといけないらしい。

alpacatech.hateblo.jp

こっちの記事に全部書いてたや

qiita.com

UnityEditorの奥のほうにある.dllをコピーして、

f:id:bibinbaleo:20181202195935p:plain

Assets下のPluginsフォルダーを作ってそこにコピーする。

f:id:bibinbaleo:20181202195104p:plain

ちなみにsystem.dllもいるかと思ってコピーしたらいらないって怒られた。

f:id:bibinbaleo:20181202200016p:plain

 

あとplayer setting>Other settingのこれを.Net 2.0(無印)にする。

f:id:bibinbaleo:20181202194547p:plain

これで準備OK

あとは

OpenFileDialog ofDialog = new OpenFileDialog();

open_file_dialog.ShowDialog();

を実行したら

ofDialog.FileName

にpathが入るっぽい?

そのほか、最初に開くフォルダの位置を指定したり、ファイルの種類を指定したり、ダイアログの文字を指定したりできる。

// デフォルトのフォルダを指定する
//ofDialog.InitialDirectory = @"A:";

//csvファイルを開くことを指定する
ofDialog.Filter = "vrmファイル|*.vrm";

//ダイアログのタイトルを指定する
ofDialog.Title = "VRMファイルを開け!!!!!";

 いまいちデフォルトのフォルダ指定がうまくいかない。デスクトップが開いたりする。

とりあえずこれらを組み合わせて下のようなコードを書いた。

gist.github.com

すると。。。

こんなダイアログが出てファイルを選べるようになった!何このスタイル!?初めて見た

f:id:bibinbaleo:20181202200812p:plain

無事開けました!!!

f:id:bibinbaleo:20181202200815p:plain

やったああああああ!!!!!

ちなみに読み込んだVRMの名前は「VRM」になっていました。

あと再び読み込むと同じ場所に重ねて表示されます。

切り替えるには何か工夫しないといけないな

f:id:bibinbaleo:20181202232950p:plain

世界

周りの世界はAllskyのtoon系の空と、standardAssetの水です。

あとカメラにfogの効果もかけています。

f:id:bibinbaleo:20181202230659p:plain

アニメーションを付ける

読み込んだ時点で特定のアニメーションをさせたいです。

こちらの記事とgithubをめちゃくちゃ参考にして作りました。

c-taquna.hatenablog.com

github.com

まずVRMの読み込みのスクリプトをwwwを使ってモノに変えます。

wwwが何かはわかりません。

こちらを参考にします。

qiita.com

こんな感じになりました。

https://github.com/bibinba/VRMImport/blob/master/vrmimport.cs

f:id:bibinbaleo:20181202225023p:plain

 

gist.github.com

こちらのコードをほとんどコピペした、AddAnimationスクリプトを作ります。

SelectVRMCharacter/AddAnimation.cs at master · chittai/SelectVRMCharacter · GitHub

指定したAnimationControllerをよみこんでるんだと思います。

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AddAnimation : MonoBehaviour
{

    public void AddAnimationController(GameObject gameObject)
    {
        var gameObjectAnimator = gameObject.GetComponent<Animator>();
        gameObjectAnimator.runtimeAnimatorController = Resources.Load<RuntimeAnimatorController>("Animator/wait");
    }
}

そしてあらかじめmotionをセットしておいたAnimationControllerをResources>Animatorの中に置いておきます

f:id:bibinbaleo:20181202220428p:plain

Resourcesは素材とかを軽く読み込むために使うそうです。

qiita.com

これで実行すると無事最初から動いた状態で読み込めました!!!!!!

f:id:bibinbaleo:20181202220318p:plain

やったぜ!できたとき普通にガッツポーズしてしまった!

© UTJ/UCL

モデルの位置を指定することもできます!

exeにする

久々に書き出しました。

Resolutionでdefault is full screenのチェックを外すと起動時にフルスクリーンじゃなくなります。

大きさ指定できます。

f:id:bibinbaleo:20181202221405p:plain

これやらないと全画面になって、escでも戻らないからPC初心者が困る。

こうして書き出すとこんな感じの起動画面になります。

f:id:bibinbaleo:20181202225200p:plain

 こんな感じです!

youtu.be

配布しようかと思ったけどexeだけじゃダメなのか。

teratail.com

後で配布するかも

github.com

 

最後に

いや~できるんですね!!

すごい満足した!

途中でbandicamで動画取ったらPCがクラッシュして記事が消えたのでアニメーションあたりの説明が薄くなっています。

私はこれを「VR添い寝彼氏」アプリに使おうと思っています。

bibinbaleo.hatenablog.com

 

ただoculusGoにモデルを読み込む方法はまだあんまり確立していない気がします。

そのうちpixivのhubがネットにできるらしいですね。

www.moguravr.com

個人開発者も使えるのかな?

 

とりあえず今度いくつかvrmモデルを用意して切り替える、というのを実装しようと思います。

参考

qiita.com