よくあるVRMソフトみたいに、自分のローカル環境からvrmファイルを選んで読み込んで、とあるポーズをさせるみたいなのを実装してみたい!!!
この記事で紹介しているようなやつね!
非同期とかランタイムとか全然分からないけど!
やるぞ!
基礎
とりあえずUnivrmをインポートします。
Releases · dwango/UniVRM · GitHub
そのあとスクリプトを書きます。
vrmの公式githubにインポートのスクリプトは書いてあります。
VRMモデルを実行時にインポートする - dwango on GitHub
4種類書いてありますが、とりあえず一番上のをコピペします。
var path="sample.vrm";
var go=VRM.VRMImporter.LoadFromPath(path);
Debug.LogFormat("loaded {0}", go.name);
最初updateに書いたけど、そしたら無限に呼び込みしてしまいUnityが止まりそうになりました。
ボタンを押したらこの処理をするようにします。
pathはとりあえず最初は自分のPCのvrmファイルがある場所を指定します。
ボタンを設置、押したらあの関数を実行するようにする。
なんとこれでボタンを押したら指定したモデルを読み込んでくれました!
こんなあっさりできるんだ!感動した!!!0,0,0の位置に表示されます。
非同期
ただ少し読み込むのに時間がかかります。
こんなものなのか?
もしかして非同期とかいうやつをしたら早くなるのかな??と思い非同期のほうをコピペしたらエラーが出ます。
調べたらこちらのツイートで、VRMImporterの前にVRMを付けていました。
わーい、非同期テストできたー。テストたのしー。
— 伊藤周@おなかソフト (@warapuri) April 16, 2018
ちなみに画像のコードはVRMの非同期ロードのテストコード。VRMの非同期ロード超簡単。素晴らし過ぎる。 pic.twitter.com/f6aF0NqGia
付けたらエラーが消えて無事に取り込めました。
が速さはそんなに変わらない。
非同期とはロード中にほかのものの動作を止めずにできる構造らしいです。
選択ダイアログ
本当にやりたいのはファイルを自分の環境から選択できるようにすることです。
下の記事を参考にしました。
OpenFileDialogというのを使えばいいということがわかりました。
これを使うには
using System;
using System.Windows.Forms;
がいるそうですが、これを書いたらエラーが出ます。
調べたらなんか設定しないといけないそうです。
C#のコンソールアプリでSystem.Windows.Forms空間のコントロールを使う | IT忘備録・メモ書きと日記
ソリューションエクスプローラにある「参照設定」を右クリックして「参照の追加」を選択し、「参照の追加」ウインドウを表示します。そして、「.NET」タブのコンポーネント名「System.Windows.Forms」を選択し「OK」ボタンを選択します。
私はWindowsのVisualStudio2017を使っています。
参照設定ってどこやねん!!!
参照設定の追加でググったら上のプロジェクト>参照の追加で追加できました。
そしたらエラーも消えました。
ただエディターがすごく重くなった。
しかもVS側はエラー消えてるけどUnityには出続けてる。
しかもVSをいったん閉じて、また開いたらimportしたはずのSystem.Windows.Formsが消えてる
またいろいろ調べたらUnityに直接?System.Windows.Formsをインポートしないといけないらしい。
こっちの記事に全部書いてたや
UnityEditorの奥のほうにある.dllをコピーして、
Assets下のPluginsフォルダーを作ってそこにコピーする。
ちなみにsystem.dllもいるかと思ってコピーしたらいらないって怒られた。
あとplayer setting>Other settingのこれを.Net 2.0(無印)にする。
これで準備OK
あとは
OpenFileDialog ofDialog = new OpenFileDialog();
open_file_dialog.ShowDialog();
を実行したら
ofDialog.FileName
にpathが入るっぽい?
そのほか、最初に開くフォルダの位置を指定したり、ファイルの種類を指定したり、ダイアログの文字を指定したりできる。
// デフォルトのフォルダを指定する
//ofDialog.InitialDirectory = @"A:";//csvファイルを開くことを指定する
ofDialog.Filter = "vrmファイル|*.vrm";//ダイアログのタイトルを指定する
ofDialog.Title = "VRMファイルを開け!!!!!";
いまいちデフォルトのフォルダ指定がうまくいかない。デスクトップが開いたりする。
とりあえずこれらを組み合わせて下のようなコードを書いた。
すると。。。
こんなダイアログが出てファイルを選べるようになった!何このスタイル!?初めて見た
無事開けました!!!
やったああああああ!!!!!
ちなみに読み込んだVRMの名前は「VRM」になっていました。
あと再び読み込むと同じ場所に重ねて表示されます。
切り替えるには何か工夫しないといけないな
世界
周りの世界はAllskyのtoon系の空と、standardAssetの水です。
あとカメラにfogの効果もかけています。
アニメーションを付ける
読み込んだ時点で特定のアニメーションをさせたいです。
こちらの記事とgithubをめちゃくちゃ参考にして作りました。
まずVRMの読み込みのスクリプトをwwwを使ってモノに変えます。
wwwが何かはわかりません。
こちらを参考にします。
こんな感じになりました。
https://github.com/bibinba/VRMImport/blob/master/vrmimport.cs
こちらのコードをほとんどコピペした、AddAnimationスクリプトを作ります。
SelectVRMCharacter/AddAnimation.cs at master · chittai/SelectVRMCharacter · GitHub
指定したAnimationControllerをよみこんでるんだと思います。
そしてあらかじめmotionをセットしておいたAnimationControllerをResources>Animatorの中に置いておきます
Resourcesは素材とかを軽く読み込むために使うそうです。
これで実行すると無事最初から動いた状態で読み込めました!!!!!!
やったぜ!できたとき普通にガッツポーズしてしまった!
© UTJ/UCL
モデルの位置を指定することもできます!
exeにする
久々に書き出しました。
Resolutionでdefault is full screenのチェックを外すと起動時にフルスクリーンじゃなくなります。
大きさ指定できます。
これやらないと全画面になって、escでも戻らないからPC初心者が困る。
こうして書き出すとこんな感じの起動画面になります。
こんな感じです!
配布しようかと思ったけどexeだけじゃダメなのか。
後で配布するかも
最後に
いや~できるんですね!!
すごい満足した!
途中でbandicamで動画取ったらPCがクラッシュして記事が消えたのでアニメーションあたりの説明が薄くなっています。
私はこれを「VR添い寝彼氏」アプリに使おうと思っています。
ただoculusGoにモデルを読み込む方法はまだあんまり確立していない気がします。
そのうちpixivのhubがネットにできるらしいですね。
個人開発者も使えるのかな?
とりあえず今度いくつかvrmモデルを用意して切り替える、というのを実装しようと思います。