【手順解説】Resoniteヘッドレスサーバの建て方!
留意事項
ヘッドレスサーバとは?
Resoniteが他の多くのVRSNSと異なる点として、通信方式にP2Pを採用している点があります。
Resoniteとは?→Steamページ
これは遅延の少なさなどのメリットがある代わりに、ユーザがResoniteクライアントを終了すると、そのユーザのセッションに居た他のユーザもセッションから蹴り出されてしまうというデメリットがあります。
このため、ユーザの代わりに別のPCから常時セッションを立て続ける手段をResoniteは持っており、これを「ヘッドレスサーバ(Headless server)」と呼んでいます。
3D表示などの負荷となる部分を削り、最小限の動作要件で動くため、少し古めのノートPCなどでも動作させることが可能です。
参考までに、著者がかつてヘッドレス用PCとして使用していたマシンとしては、i3 6100Tと24GB RAMの超省スぺ―スPCで、30人規模のイベントを8時間ほど落ちることなく維持させた実績があります。→桜逢祭2023 NeosVRフロア
前提条件
この記事の手順通りにヘッドレスサーバを立ち上げる場合、以下の条件を満たしている必要があります。
ResoniteのPatreonを10$以上支援していること
ヘッドレス用Resoniteアカウントを所有していること
ヘッドレス用Steamアカウントを所有していること
ヘッドレス用のWindows PCを持っており、SteamでResoniteのインストールが済んでいること
※重要 ヘッドレス用のWindowsPCで一度Resoniteを起動していること。初回起動時に生成されるファイルが必要なため
※重要 .NET8のランタイムパッケージをインストール済であること。
Resonite、コマンドプロンプトの最低限必要な操作が分かること
.NET8のランタイムパッケージを入手する
ヘッドレスクライアントでは、.NET8ランタイムの導入が必須になりました!
以下のリンクから.NET8.0ランタイムをダウンロードし、必ずインストールしておいてください。
ダウンロードする箇所が非常にわかりづらいですが、Windowsの場合は以下の画像の箇所の「x64」をダウンロードしてください。
Steamヘッドレスクライアントを取得
Resoniteを起動し、ダッシュメニュー>フレンドタブからユーザ「Resonite」へ以下のコマンドを入力します。
/headlesscode
するとコードが返ってくるのでメモります。
ヘッドレス用マシンのSteamで、Resoniteのプロパティを開いてください。
「ベータ」タブに移動し、「プライベートベータ」のテキストボックス内にコードを入力し、「コードを確認」を押します。
コードが通ると、「ベータの参加」のプルダウンメニュー内にヘッドレスサーバ用クライアントが追加されるので、選択します。
クライアントがダウンロードされ、Resoniteインストールフォルダ配下に「Headless」フォルダが作成されます。
Configファイルを書く
C:\Program Files (x86)\Steam\steamapps\common\Resonite\Headless\Config
内にある「DefaultConfig.json」をコピーして、VSCodeなどのエディタで編集したのち「Config.json」として保存します。
(C:\Program Files (x86)\Steam\steamapps\common\Resonite\Headless\Config\Config.json)にする
最低限いじる箇所
ヘッドレスアカウントログイン情報を以下で指定
"loginCredential": <ヘッドレスユーザID>,
"loginPassword": <ヘッドレスユーザパスワード>
そして
"loadWorldURL" : <ここに開きたいワールドのレコードURL>
あるいは
"loadWorldPresetName": <新規作成ワールドのテンプレ3つのうちどれか>,
※レコードURLとはワールド詳細画面の「レコードURLをコピー」からコピーできます。
※※「ワールドURL」ではないです!!!https://から始まる文字列ではありません。ご注意を!
例えばJPチュートリアルワールドResoniteだったら、
resrec:///G-Neos-East-Japan/R-95d04d7b-322f-47ea-a18e-0fc1f473d41e
がレコードURLです。
Config例
設定解説:
「16人制限」でかつ「誰でも(Anyone)」入れる設定で、「JPチュートリアルワールドResonite」を起動、「1時間誰もセッションに居なければワールドをリセット」する。
{
"$schema": "https://raw.githubusercontent.com/Yellow-Dog-Man/JSONSchemas/main/schemas/HeadlessConfig.schema.json",
"universeId": null,
"tickRate": 60.0,
"maxConcurrentAssetTransfers": 80,
"usernameOverride": null,
"loginCredential": "akiRAM-Headless",
"loginPassword": "*****",
"startWorlds": [
{
"isEnabled": true,
"sessionName": null,
"customSessionId": null,
"description": null,
"maxUsers": 16,
"accessLevel": "Anyone",
"loadWorldURL": "resrec:///G-Neos-East-Japan/R-95d04d7b-322f-47ea-a18e-0fc1f473d41e",
"loadWorldPresetName": "Grid",
"idleRestartInterval": 3600,
"autoSleep": true
}
]
}
ちなみに普段の私のヘッドレスのコンフィグはだいたい以下のような感じです。
設定解説:
defaultUserRolesでakiRAMとMotoMaidへAdmin権限を付与している点と、ログイン後に自動でセッション参加する機能のためにcustomSessionIDでセッションIDを固定しています。
{
"$schema":"https://raw.githubusercontent.com/Neos-Metaverse/JSONSchemas/main/schemas/NeosHeadlessConfig.schema.json",
"loginCredential": "akiRAM-Headless",
"loginPassword": "****",
"tickRate": 60.0,
"maxConcurrentAssetTransfers": 40,
"startWorlds": [
{
"sessionName": "居酒屋",
"accessLevel": "FriendsOfFriends",
"loadWorldURL": "resrec:///U-akiRAM/R-73557ade-75f1-4d51-8fbb-c7d722da62e6",
"customSessionId": "S-U-akiRAMHeadless:Tavern1",
"defaultUserRoles": {
"akiRAM": "Admin",
"MotoMaid": "Admin"
},
"awayKickMinutes": 5,
"idleRestartInterval": 64800,
"autoSleep": true
}
]
}
ヘッドレスの起動
C:\Program Files (x86)\Steam\steamapps\common\Resonite\Headless
内にある「Resonite.exe」をコマンドプロンプトから叩きます。
起動したらこのような画面が表示されます。
コマンドラインの最後に、薄黄色の文字でワールド名が表示されていればOKです!
あとは、「Invite <あなたのユーザ名>」などで招待し、セッションに入れるか確認しましょう!
コマンドリファレンスは公式Wikiを参照
Configファイルの記法等はこちらのページ
小ネタ・Tips
Publishしていないワールドを立てる方法
Publishしていないワールドは通常自分しか開くことができないですが、ワールドのメタデータから開けるアカウントを「誰でも」に設定することで、
ヘッドレスアカウントから開くことができます。(この操作により、ヘッドレスアカウント以外のユーザからも開けるようになるため、意図せず開かれては困るワールドについてはレコードURLの取り扱いに注意しましょう)
以下、メタデータの設定手順です。
RHCCのススメ
ヘッドレスをコマンドで操作するのは大変です。が、ヘッドレスの操作をグラフィカルに、ボタンのポチポチで済むツールをいもっちさんが開発されています。
コマンド操作に自信の無い方や、より簡単に操作したい方は以下のツールを使うとよいかもしれません。
現在分かっている問題点
今時点で判明しているバグ、あるいはバグのような挙動を以下に紹介します。
Private状態でInviteするとヘッドレスクライアントが落ちる
(2024/1/7追記)
AccessLevelをPrivateに設定したのち、inviteコマンドを実行するとクライアントごと落ちる事があります。再現しない場合もあり、謎です。
イベントの準備等で一旦Privateでセッションを立てて設営準備するなどの時に不便なのですが、
ワークアラウンドとしてConfigにセッション起動時の自動招待のコマンドAutoinviteUsernameを設定すると正常に招待が動くため、そちらを使うか、
あるいは、Config内で"hideFromPublicListing"をtrueにすることで、プライベートじゃないが、非公開セッションを立てるなどがあります。
おわり