最近色々いじっているVRメタバース NeosVRについて、調べてる最中の情報などをメモ書きしていきます。
NeosVRは、VRCHAT・Cluster・Mozilla HubsなどのVRメタバースの一つですが
VR空間内で制作活動の大半を完結させることが出来るのが面白い世界です。
Pier to Pierの技術を使っており、VR空間(World)をホストとなるユーザが立てて、そこに他の人を招いてワイワイと遊ぶスタイルです。
公開されているWorldを利用してホストする事が可能で、公開Worldにアクセスすると、最初の人は、セッションを開始しますか?となり、2番目以降の人は参加しますか?となります。ちなみに、ホストユーザがログアウトしてしまうと、その世界は閉じられるので、全員落ちることになります。
Steamで無料インストール出来るので、まずは試してみると良いのですが、何ができるのか、自分で探すより初心者ツアーとか詳しい人に色々見せてもらったり教えてもらうのが一番効率よいです。自分で探してたら魅力に気が付く前に脱落しかねないので。
にアクセスすれば、公式へのリンクもあるので、最初の手がかりは手に入るかと思います。
とりあえず、気になって弄っているのが、Headless Client って機能です。
これは画面回りのグラフィック処理を取り除いた、クライアントソフトです。画面描画を省いているので、Worldとか他人のAvatorとかを見ることは出来ません。ただ、誰が入ってきているのか確認したり、メッセージを発信したりする事は出来ます。
UNDO処理で不具合起きる場合があったりとまだまだ開発中なところもあります。
少し試してる感じでは、非常に動作が軽いです。何世代も前のパソコンでも十分動いてます。
想定される利用用途は、不在時に自分の作ったワールドなどをホストしておいて、みんなに入って見たり、弄ったりしてもらう感じでしょうか。
VRで利用する事を主としたアプリでそもそも処理が重い上に、なんでも作れてしまうという無制限さからPCクラッシュが起きやすい事もあり、別のパソコンでワールドをホストしておいて、メインパソコンでそこに参加しておけばメインパソコンがクラッシュしても他の人に迷惑がかからなくなりますね。
ただ、この情報があまり整理されていなくてあれこれ調べてたので、これをメモしようというのがこのページの目的です。
つまり、個人的な理解ベースなので、間違いが含まれている可能性は十二分にあるので、情報の真偽については自己責任で宜しくお願いいたします。
Headless Clientを使うには、月額12$を寄付するパトロンになる必要があります。
このあたりは、日本語Wikiに書いてあるので、割愛。
で、起動にあたりConfigファイルを定義する必要があります。
定義出来たら、ただ試すだけなら、Neos.exeという実行ファイルを走らせるだけ。CUI画面が表示されて稼働します。
メインパソコン上で動かす場合、先にHeadless Clientを起動すると、Steamの管理上NeosVRが起動中ステータスに入る為、VRクライアントが起動できなくなります。
なので、先にVRを起動しておいてから、Headless Clientを起動すると良さそうです。
別のパソコン上で動かす場合、メインパソコンと同じSteamアカウントを使っていると、後勝ちでSteamアカウントにログインしてしまうので不具合が出そうです。
別のSteamアカウントを作って動かすのが良さそう。
また、NesoVRのアカウントについても
※- You can use the Config/DefaultConfig.json file to setup startup world or have it login into an account (don't use the same one as you're using in normal Neos)
と、メインと同じアカウントは使わないようにと注意があります。
これは、どうやら同期エラーの原因になるぽいです(私の環境での実体験)
なので、こちらもHeadless Client用に新規アカウントを作って立ち上げるのが良さそうですが、
パトロンの権利が使えない(ディスク容量追加など)
フレンドリストなど新規に登録しなければならない
ワールドの権限設定を別途しなければならない
と、少し不便な事になっています。
このあたりは、開発も気が付いていて、改善策に乗せてくれているので、今後に期待です。
Configファイル これを適切に定義しないとHeadless Clientは起動しません。
※将来的には設定画面が出来るかもしれないけど・・・
最初に引っかかったのが、Windowsのメモ帳を使って編集したら、ダメだったってところです。
起動時に一瞬CUIが出て、すこん、と落ちます。文字列削除するだけなら大丈夫だったのですが追記がとにかくダメ。
家の環境だけかもしれませんが、文字制御の関係かなとJSONeditというアプリを使うようにしたら解決しました。
すいません、JSON弄る人の常識かもしれませんが、初めて触るもので・・・・
後は、どうやって記述するんだろうかと、あちこち調べた結果です
DefaultConfig.jsonの記載内容は以下の解釈
true,false,null,数値についてはそのまま。その他は” ”で括る
{
"comment": "DO NOT EDIT THIS FILE! Your changes will be lost. Copy it over and create a new file called Config.json",
コメント行:このまま使わず、Config.jsonって名前でコピーファイルを作って編集してねと書いてある
"tickRate": 60.0,
秒間あたりの同期回数の設定
"maxConcurrentAssetTransfers": 4,
同時にアセット転送を行う数を指定。Worldの読み込み速度に影響。通信回線が良い場合に増やす、悪い場合に減らすと良いらしい。
"usernameOverride": null,
World一覧などでWorld詳細に記載されるホストしてるユーザ名を任意の名前に上書きする事ができます。
"loginCredential": null,
NeosVRのログインIDです。nullのままだとゲストユーザになるのは、VRクライアントと同じですね。
Worldの状態をクラウドに保存したければ、ログインが必要です。
"loginPassword": null,
NeosVRのログインパスワードです。
"startWorlds": [
{
"isEnabled": true,
上のstartWorlds以下を1World毎に繰り返し定義すれば、複数Worldを一度に立ち上げることができます。
定義内容を削除せずに、対象のWorldを有効か無効かをコントロールできる。 true , false
"sessionName": null,
Worldセッションを立ち上げる際の名前を付けることができます。nullのままだと、利用したWorldのひな型の名前となります。
"customSessionId": null,
"description": null,
Worldセッションの注釈です。 "Test World", など任意に
"maxUsers": 32,
Worldセッションの接続上限数を設定する事ができます。
"accessLevel": "Anyone",
Worldセッションの参加範囲の設定です。"Anyone", "RegisteredUsers" , "Friends" , "Private" , "LAN"など
"hideFromPublicListing": null,
公開リストから隠す事ができます。true , False
"tags": null,
Worldセッションのタグをつけることができます。どういうジャンルのWorldか区別しやすくするため?
"mobileFriendly": false,
Androidクライアントの優先接続先Worldフラグのようです。
"loadWorldURL": null,
公開Worldのセッションを開く際に指定します。
ただし、LoadWorldURLと書いてあるのは罠で、Worldのセッションから取得できるレコードURL(neosrec:///で始まる)を記述します。
"saveAsOwner": null,
Worldセッションの進捗をローカルに保存するには"saveAsOwner":"LocalMachine" に設定します。
クラウドに保存するには"saveAsOwner" : "CloudUser"に設定します。
一度保存されると、LoadworldURLが自動的に指定した保存セッションに書き換わり次回のロード時に使用されます。
"loadWorldPresetName": "SpaceWorld",
WorldセッションをNeosVRのテンプレートWorldを指定して開くことができます。
テンプレートワールドは、"SpaceWorld", "Basic Empty", "GridSpace", "Microworld", "Testing Scaling", "ScratchSpace", "ScratchSpace (mobile)", "Instancing Test", "Physical Locomotion Test" and "UIX Test" が指定できます。
"forcePort": null,
Pier to Pierで使う通信ポートを指定する事ができます
"keepOriginalRoles": false,
"defaultUserRoles": null,
Wolrdセッションのアクセス権限をユーザ毎に設定できます。"USERNAME": "ROLE", の形式で指定。
権限ロールは "Admin" , "Builder" , "Moderator" , "Guest" , "Spectator" が指定できます。
"autoInviteUsernames": null,
Worldセッション開始時に自動的に、招待するユーザを指定できます。
"autoInviteMessage": null,
Worldセッション開始時に自動的にユーザを招待する際のメッセージを指定できます。
"autoRecover": true,
セッションレベルのクラッシュなどが発生した際に、自動的にWorldを再起動させる事ができます。 true,false
"idleRestartInterval": -1.0,
Worldから最後のユーザが離れた時から、指定秒数後にWorldを再起動させる事ができます。-1.0はOFF指定です。
"forcedRestartInterval": -1.0,
強制的に指定秒数毎にWorldを再起動させることができます。-1.0はOFF指定です。
"saveOnExit": false,
終了時にセッション情報をセーブするかしないか。true , false
"autosaveInterval": -1.0,
定期的に指定秒数後毎にセッション情報をセーブさせる事ができます。-1.0はOFF指定です。20分以下は非推奨だそうです。1200,
"awayKickMinutes": -1.0,
おそらく、別のWorldに移動して戻ってこない人を、指定秒数後にキックさせる事ができます。-1.0はOFF指定です。
"autoSleep": true
Autosleep はWorldに誰も居なくなった時に、dynamic features を非活性化させる機能です。 true , false
}
],
"dataFolder": null,
Worldに関するAssetsなどの情報の格納先を指定できます。"c:/neos/neos_data" など <¥とか\ ではダメでした>
"cacheFolder": null,
Worldに関するCacheなどの情報の格納先を指定できます。"c:/neos/neos_cache" など<¥とか\ ではダメでした>
"allowedUrlHosts": null,
"autoSpawnItems": null,
"metamovieRoles": null
}
起動後 利用できるコマンドはHelp を入力する事で表示される
または、本家WIKIのCOMMANDリストページに表記がある。
終了時はShutdownコマンドを実行する。
実行後、環境によって終了までかなり時間がかかるけど、気長に待つ。
※There's 3 stages. The lockup which is where it takes a snapshot, the 0% where it's packaging up the world and then the actual X% where it's doing the transfer.
同期処理とかやってるので、下手に落とすと、次回起動時にコンフリクトが発生する。
発生すると、ワールドが立ち上がらなくて焦る。なので、大事なWorldは定期的に別途バックアップするほうが良いかも。
発生した場合は、何回か起動をやり直すと、コンフリクト改善してくれる事がある。
Dumped world state to: System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。 場所 FrooxEngine.World.RunSynchronousActions() 場所 D:\Sync\Projects\Software\Applications\NeoS\Neos Framework\FrooxEngine\World.cs:行 1156 場所 FrooxEngine.World.NextRefreshStage() 場所 D:\Sync\Projects\Software\Applications\NeoS\Neos Framework\FrooxEngine\World.cs:行 1210 場所 FrooxEngine.World.Refresh() 場所 D:\Sync\Projects\Software\Applications\NeoS\Neos Framework\FrooxEngine\World.cs:行 1103 場所 FrooxEngine.WorldManager.UpdateStep(Double maxMilliseconds) 場所 D:\Sync\Projects\Software\Applications\NeoS\Neos Framework\FrooxEngine\WorldManager.cs:行 622 at void FrooxEngine.WorldManager.UpdateStep(double maxMilliseconds) in D:/Sync/Projects/Software/Applications/NeoS/Neos%20Framework/FrooxEngine/WorldManager.cs:line 622 at bool FrooxEngine.WorldManager.RunUpdateLoop(double maxMilliseconds) in D:/Sync/Projects/Software/Applications/NeoS/Neos%20Framework/FrooxEngine/WorldManager.cs:line 419 at void FrooxEngine.Engine.UpdateStep(double maxMilliseconds) in D:/Sync/Projects/Software/Applications/NeoS/Neos%20Framework/FrooxEngine/Engine.cs:line 980 at void FrooxEngine.Engine.RunUpdateLoop(double maxMilliseconds) in D:/Sync/Projects/Software/Applications/NeoS/Neos%20Framework/FrooxEngine/Engine.cs:line 817 at void NeosHeadless.Program.UpdateLoop() in D:/Sync/Projects/Software/Applications/NeoS/Neos%20Framework/NeosHeadless/Program.cs:line 381 at void System.Threading.ThreadHelper.ThreadStart()
というエラーがログに出ますが、Dドライブなんか無いぞ~とか叫ぶ必要はないようです。確認したところ、
That's the build directory for Mono, don't worry about the paths there.
と、出てるけど気にしないで良いよ!との事です。