【NeosVR】ヘッドレスクライアントを構築する

NeosVRのヘッドレスクライアントについて私自身も詳しいわけではありませんが、日本語でまとまった情報があまりにも少ないように思われるため作成しました。
情報は2021/5時点のNeosVR Beta 2021.5.17.909バージョンのものとなります。現在NeosVRのアップデート頻度は非常に高いため、貴方がこの記事を読んだ時には仕様が変更されているかもしれません。
基本的に最新情報はNeosVR公式Discordのどこかにあります。

#ヘッドレスクライアントとは
NeosVRのセッションをホストし維持するために使用する、CLIベースの専用プログラムです。

NeosVRはVRChatのインスタンスとは異なり、セッションのホストを委譲することが出来ません。
そのためホストがNeosVRを終了するとそのセッションも必ず終了してしまいます。

この仕様に加えて、NeosVRは機能追加頻度が高いことや、ユーザーに許された行動が多いためかアプリがクラッシュしやすく、セッションが強制終了されてしまうことが多々あります。

クラッシュした場合は当然セッション内で行っていた作業も最後に保存したところまでリセットされてしまいますから、折角組んでいたLogiXなどが無に帰したりします。

この問題をある程度解決してくれるのがヘッドレスクライアントです。
ヘッドレスのセッションは安定度が段違いであり、滅多なことではクラッシュしません。
グラフィック処理を行わずに稼働したりする部分が大きいのだと思われます。

#使用条件

ヘッドレスクライアントにはNeosVRのPatreonとなり、月額$12以上のプランで支援を行っている必要があります。

また、ヘッドレスクライアントを起動するサーバをNeosVR本体を起動する端末とは別で準備が出来ていることが大変望ましいです。

普段使っている端末でヘッドレスとNeosVR本体の同時起動も可能ではありますが、
どちらも単体でそれなりのスペックを要求してくるためそのような使用をしている方はあまりいないと思われます。
落ちにくい一人作業部屋といった使い方では有りかもしれません。

#要求スペックなど

OSはWindowsまたはLinuxが使用可能であることを確認しています。
基本的にはCPU、メモリのみで動作するため、GPU性能を気にする必要はありません。
また、接続しているクライアント達との通信が発生しますから最低限のネットワーク環境が求められます。サーバーとして稼働するものなのですから有線にしましょう。

メモリは16GB以上が推奨されています。5人以下の少数特定での利用などであれば8GBほどでも使えると思います。

CPUの推奨に関しては不明です･･。
私はi7-4790kを使用していますが、使用率が100%に張り付くことはほとんどありません。

かなり妥協した構成でも起動は可能となりますが、セッションの動作は当然不安定になり安定度が高いというメリットが無くなってしまいます。

また、ほぼ常設･フレンドプラスで運用しているサーバー1ヶ月のデータ通信量が約180GB程でした。
AWSなどで運用した場合、EC2などの料金に加えて通信料金が別途かかりますから注意してください。
180GBですと24ドル前後になるようです。
VPSサービスはデータ転送量による従量課金不要の場所が多いはずですから、自宅にPCを置きたくない･置けない場合はこちらを利用するのがよいと思います。

#インストール

ヘッドレスクライアントのインストール方法は二種類あり、Steamを使用する方法とSteamCMDを使用する方法があります。
まずインストール(共通)を実施し、その後は自分に合った方法を選んでください。
SteamCMDは導入が手間ですが後の管理はしやすくなります。

##インストール(共通)

Steam・Steamcmdどちらを使用する場合でも必要となる共通の手順について記載します。

###1.NeosVRの支援者になる
Patreonに登録し、NeosVRの$12/月以上のプランに加入します。
その後、Patreonページ右上に表示されている自分のアイコンをクリックし表示されるメニューから、「My profile settings->Apps」の順に開きDiscordとPatreonアカウントを連携します。

[NeosVR - Patreon](https://www.patreon.com/neosvr)

支払方法にはクレジットカードまたはPayPalが選択可能です。

###2.Patreon-Discord連携確認
Patreonで連携したアカウントにてDiscordにログインし、NeosVRサーバーを開きます。
チャンネル一覧の中に「PREVIEW TESTERS」カテゴリが表示されていることを確認します。

###3.ベータアクセスコード取得
NeosVRサーバにて「PRIVIEW TESTERS」カテゴリ内に存在する「headless-client」チャンネルを開きます。

![headless_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83116/b0648fe4-6ee4-f64b-4646-bc84fc65d742.png)
その後チャンネル内のピン留めを開き、2019/9/9にFrooxius|CTOさんが投稿したメッセージからベータアクセスコードを取得します。

###4.Neosアカウント作成
ヘッドレス用のNeosアカウントが必要となるため、新規でNeosアカウントを作成します。

[Neos Account](https://account.neosvr.com/)

つまり$12/月払い自分のアカウントをPatreonと連携しただけでは、ストレージ容量増加等の恩恵をヘッドレス用アカウントでは受けられません。
無料アカウントを普段使いし、ヘッドレスのアカウントは連携したものを使う･･･といったことも可能ですが不便なことのほうが多いと思われます。

##インストール(Steam)

インストール(共通)実施後にSteamを使用して後続を実施する場合の手順を記載します。

##1.ヘッドレス機能アンロック

Steamを起動し、NeosVRのプロパティを開きます。
![headless_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83116/33d4c08c-c84d-b52f-6a6c-532ea0eea6f3.png)

ベータタブを選び、下のテキストボックスにインストール(共通)の手順3で取得したベータアクセスコードを貼り付け「コードを確認」ボタンを押下します。
![headless_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83116/cdd42859-4b8a-7a7b-f1e1-c0a140464e97.png)

正しいコードを入力すると、「headless-client - Includess headlesss client/server」が選べるようになります。
![headless_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83116/84b8c877-f607-6af0-0ce0-4fedf6f7b82e.png)

選択した状態でプロパティ画面を閉じることで、NeosVRがアップデートされます。
その後インストールフォルダ配下にHeadlessClientフォルダが作成され、ヘッドレスの起動が出来るようになります。
後続作業として、[設定ファイル準備](#設定ファイル準備)を実施してください。

##インストール(SteamCMD)

インストール(共通)実施後にSteamCMDを使用して後続を実施する場合の手順を記載します。

###1.steamcmdインストール

以下のページを参考にsteamcmdをインストールします。
[SteamCMD - Valve Developer Community](https://developer.valvesoftware.com/wiki/SteamCMD#Downloading_SteamCMD)

OS毎に手順が異なりますので注意してください。
本記事ではAmazonEC2で作成したUbuntu Server 20.04 LTSを使用した手順のみ記載します。
異なる環境でインストールを行う場合は適宜読み替えてください。
debian系OSを使用するとスムーズに進むのでオススメです。

**ヘッドレス実行用ユーザ作成**

```
#ユーザ作成
#今回は名前をneosとしています
sudo useradd -m neos

#パスワード設定
#実行後にパスワード変更画面が表示されるため、変更する
sudo passwd neos

#sudoグループに追加
sudo gpasswd -a neos sudo

#ログインシェルをbashに変更
sudo usermod -s /bin/bash neos

#ユーザ切替え
su - neos
```

**steamcmdインストール**

```
#steamcmdをインストール
sudo add-apt-repository multiverse
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install lib32gcc1 steamcmd 

#steamcmdを実行
steamcmd
```

**Neosインストール**
steamcmdにて操作を行います。

```
#自身の所有しているsteamアカウントでログインします
login <Steamユーザ名>

#ログインに使用したsteamアカウントがNeosVRを使用したことがない場合は以下のコマンドを実行
app_license_request 740250

#インストール(共通)の手順3で取得したベータアクセスコードを貼り付け、インストール
app_update 740250 -beta headless-client -betapassword <ベータアクセスコード>

#steamcmd終了
exit
```

**monoインストール**
exeファイルを起動出来るようにするため、以下のページに従ってmonoをインストールします。
[Download - Stable | Mono](https://www.mono-project.com/download/stable/#download-lin)

```
#リポジトリ追加
sudo apt install gnupg ca-certificates
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb https://download.mono-project.com/repo/ubuntu stable-focal main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list
sudo apt update

#Monoインストール
sudo apt install mono-devel
```

**起動シェル編集**
起動時、自動的にアップデートを行ってくれるようにするため起動シェルを編集します。

```
#neosVRのデータが入ったディレクトリへ移動します
#
#フルパスは以下になります
#ユーザディレクトリ直下に格納されています
#/home/neos/.steam/steamapps/common/NeosVR
cd .steam/steamapps/common/NeosVR

#起動シェルのバックアップ
cp ./RunHeadlessMono.sh ./RunHeadlessMono.sh.bk

#viやEmacsなどお好みのテキストエディタで編集してください
vi RunHeadlessMono.sh
```

以下のように1行目を追加し、保存します

```
steamcmd +login <Steamユーザ名> +app_update 740250 +exit
mono Neos.exe
```

これでヘッドレスの起動が出来るようになります。


後続作業として、[設定ファイル準備](#設定ファイル準備)を実施してください。

#設定ファイル準備

設定ファイルを準備することで、ヘッドレスの起動設定を変更することが可能です。
**デフォルトの場合パブリックセッションとして起動され、セッションの名前はPC名と同じになります。更にセッションの保存も行えません。**
**面倒ではありますがきちんと設定内容を理解して変更したうえで運用することが重要です。**

何が設定出来るのかについては別記事の[【NeosVR】ヘッドレスクライアントの起動設定ファイルメモ](https://qiita.com/syuzen/items/09eff688038896cae108)を参照してください。

起動のテストだけ行いたいのであれば、以下を使用してください。

Config.json

```
{
  "comment": "起動テスト用設定ファイル",
  "loginCredential": <Neosアカウントメールアドレス>,
  "loginPassword": <Neosパスワード>,
  "startWorlds": [
    {
      "sessionName": "Hello Space World",
      "accessLevel": "Anyone",
      "loadWorldPresetName": "SpaceWorld",
    }
  ],
}
```
※NeosアカウントメールアドレスおよびNeosパスワードはダブルクオーテーションで囲んで記述する必要があります

格納場所の参考は以下となります。
steamのインストール場所や使用OS等によって格納場所は変わってきます。

Windows
`C:\Program Files (x86)\steam\steamapps\common\NeosVR\HeadlessClient\Config\Config.json`

Linux(debian系)
`/home/<linuxユーザ名>/.steam/steamapps/common/NeosVR/Config/Config.json`

※Configフォルダが無い場合は自分で作成してください。

#起動

ヘッドレスを起動します。

Windows
コマンドプロンプトで以下のコマンドを実行すると、起動されます
`C:\Program Files (x86)\steam\steamapps\common\NeosVR\HeadlessClient\neos.exe`

Linux(debian系)
`/home/<linuxユーザ名>/.steam/steamapps/common/NeosVR/RunHeadlessMono.sh`

上述した起動テスト用設定ファイルを使いWindowsで起動した場合、
以下のように`World running...`と表示された後に黄文字で`Hello Space World>`(フォーカスしているセッションを示します)と表示されたら起動成功です。
![headless_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83116/afe6f962-a8e7-61d5-0a7a-7ff4e18dd97e.png)

ゲーム内からも、ヘッドレスセッションが起動されていることが確認できます。
![headless_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83116/4805d578-3450-195e-b030-6631b808e608.png)

終了する時は
`shutdown`
コマンドを実行しましょう。

終了時に赤文字と共にExceptionなどの文字列が見えたりしますが、大抵の場合気にする必要はありません。3Dゲームサーバーの宿命だと思っています。起動時もよく出ます。
もちろん起動しない時は設定ファイルが誤っているなど悪い部分があるはずですからエラー出力を読んだほうがよいです。
![headless_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83116/8d2a039f-b56b-c107-0d1b-ef1231c1c9db.png)


#おわりに
ヘッドレスクライアントの起動設定ファイル記事に続いて構築方法をまとめました。

今回は`shutdown`コマンドしか載せませんでしたが、ヘッドレスではコンソールコマンドも大量に用意されており、
セッション内にDynamicImpulseを飛ばせるものなども用意されています。
こちらもいつかまとめたいと思います。

#参照

+ NeosVR公式Discord
+ [NeosVR日本語Wiki - ヘッドレスクライアント](https://neosvrjp.memo.wiki/d/%a5%d8%a5%c3%a5%c9%a5%ec%a5%b9%a5%af%a5%e9%a5%a4%a5%a2%a5%f3%a5%c8)
+ [Neos公式wiki Headless Client/Server](https://wiki.neos.com/Headless_Client/Server)