MLAPIでOculus Quest2のマルチプレイ ②GCPにサーバー用ビルドをアップ・実行する

# レポジトリのリンク
https://github.com/TomohiroHibino600/TuneVisualizerNetwork

# シリーズ目次
[①プロジェクトを実装するまで](https://qiita.com/Hibiro22/items/d97b203dfaef734ff299 "①プロジェクトを実装するまで")
(今ここ→)[②GCPにサーバー用ビルドをアップ・実行する](https://qiita.com/Hibiro22/items/b1a701d1f8b0b490953d "②GCPにサーバー用ビルドをアップ・実行する")
[③実機でテストするまで](https://qiita.com/Hibiro22/items/e2313215b6e4bad1cfef "③実機でテストするまで")

# 開発環境
Windows10
Unity(AndroidモジュールとLinuxモジュールを開発に使った)
Quest2, RiftSを用いたが、実機テストの時以外は関係がない

--------------------------------------
# 対象読者と本記事の目的
サーバーにClientとして接続して、MLAPIのマルチプレイを行いたい方
↓
Clientを接続させるサーバー向けの実行ファイルを<br>GCPのVM(仮想Linuxサーバー)にアップし、実行出来るようになる

各Clientはサーバーと通信することで、マルチプレイするための情報を得られます。
今回はサーバーの話なのでMLAPI自体とはあまり関係がありません

# GCPを選んだ理由
1. 個人的な事情でGoogle Drive APIを使いたかったので勉強効率を理由に
2. 音声認識, 翻訳, 画像認識などのためのAPIを今後使いたくなりそうだったため
3. AWSはGCPより検索で何とかなりやすいかと思ったため<br>
一般的にはAWSの方がGameLiftやSDKがあり、便利だろうと推測します。<br>
それらを使いたい方は他の記事をご覧ください。

# 本題
## 1 VM(仮想Linuxサーバー)を作成する
### 基本
こちらの記事でVMを作成し、料金アラート・ssh接続を設定するまで説明されています。
ssh接続とは超省略すると、とても強い自動生成パスワードがある場合のみ可能な接続です。

VMはそれを作成したGoogleアカウントのみブラウザから情報を見れるようになっていますが、自分のPCのコマンドで操作したい時にssh接続を設定することで、パスワードを持っていない人が簡単にVMを触れないようにしています。
[これから始めるGCP（GCE）　安全に無料枠を使い倒せ](https://speakerdeck.com/xrdnk/xrdnk-roppongiunitylt8-presentation-bdd2321a-3555-4f17-bbcb-2a68f2021d57 "これから始めるGCP（GCE）　安全に無料枠を使い倒せ")

これ以上ssh接続を知りたい方は検索してください。

### 基本と変えた部分
##### 1. VMの設定
VMの初期設定を画像のようにしました。なお、このVMは削除済みです。
特徴1. OSをCentOSにすることで調べやすくする
特徴2. リージョンを東京にして、少しでも低遅延でやり取りできるようにする
![Linuxサーバー設定1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182279/5f5eb2b8-6806-1fbb-7df1-84c14a47c408.png)
![Linuxサーバー設定2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182279/ce676b21-3693-238a-05ab-b15d3e4bebe5.png)



##### 2. サーバーとローカルPCを接続し、VMを操作する方法
自分の場合はもう一つの方法を書きます。Google Cloud SDKをインストールし、<br>Google Cloud SDK Shellを用いてVMを操作出来ます。記事内のgcloud initまで行ってください。<br>VMを操作するためのGoogle認証もinitに含まれています。
[Google Cloud SDKインストール手順](https://cloud.google.com/sdk/docs/install?hl=ja "Google Cloud SDKのインストール手順")

手順を終えるとSDK Shellが使えるようになります。
そこで下記コマンドを入力するとssh接続し、操作のためのCUIを表示するまでを行ってくれます。

```text
gcloud compute ssh <作成したVMの名前>
```
接続すると初回だけ質問してきます。
`GCP「ssh鍵がないけど作る？」`
→ yes

`GCP「接続するゾーンどこ？」`
→ 自分が設定したゾーンを数字で選択。asia-northeast1-bなど。
　間違えると接続できないので正しいものをご入力ください。もちろん修正は出来ます。

これ以降同じことは質問されません。
毎回SDK Shellに対して同じコマンドを入力すると、VMを操作するために接続できます。

## 2 サーバー用にビルドしたものをzip化
ここはUnityの話になります。
UnityではWindowsやAndroidなど以外にもLinux向けにゲームをビルド出来ます。
それをVMにアップし実行することで、各Clientからサーバーに接続しマルチプレイ通信が出来るようになります。ビルドまでの手順と注意したことを書いておきます。

##### 0. Linuxモジュールをインストール
unityにLinuxモジュールをインストールしていない人はまず行ってください。

##### 1. ビルドするScene内でサーバーが関係しないGameObjectを非アクティブ化
サーバーの余計な処理を省くために行いましたが、不要な人には不要な過程です。
MLAPI用のスクリプト以外は使う見込みがなかったので、関係するGameObject以外は全て非アクティブ化しました。

##### 2. いつものビルド画面でビルドする
`Target Platform` → `WindowsではなくLinux`
`Server Build` → `オンにする`
![ビルド画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182279/616cb5b5-9478-242c-547e-e4302e5860ec.png)

##### 3. zip化
ビルドしたものをzip化し早くアップ出来るようにしましたが、必須ではないです。
大きいサイズの場合はzip化しないと時間を食うかもしれません。

## 3 ストレージにアップロードし、サーバーにコピー
##### 1. ストレージにzipをアップ
ストレージとはPCでいう外付けHDDのようなものです。
サーバーの中以外にもファイルを保存することが出来ます。
念のためストレージにzipをアップロードし、使います。

GCPのストレージはGoogleドライブのようにブラウザへのドラッグでアップ可能な仕様ですが、<br>メニューに2個「ストレージ」ボタンがあって場所が分かりづらいです。

ホーム画面で左上のメニューを開き、下の方に行くことで見れるこの画面が正しいです。
ここで「バケットを作成」ボタンを押し、バケットの中にzipをアップしてください。
![gcpストレージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182279/b46b3162-f188-173b-23b0-eed88f52ba70.png)
![gcpストレージ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182279/c058d43b-ffc1-2f8f-324a-b66e6442de38.png)

##### 2. ストレージのzipをVMにコピー
下記の順に入力するとコピーできます。
＝＝Google Cloud SDK Shellを開く==

```text
gcloud compute ssh <作成したVMの名前>
```
＝＝接続完了後、新しく開かれたウィンドウで＝＝
> mkdir = VM内にフォルダ(正確にはディレクトリと呼ぶ)を作成するコマンド

```text
mkdir <中にzipを移動させるフォルダの名前>
```
> gsutil cp aファイル bフォルダ = aファイルをbフォルダへコピー

```text
gsutil cp gs://<作成したバケット名>/<作成したzip名> <移動させるフォルダ名>
```

## 4 .linux86_64ファイルを実行するまで
＝＝接続完了後のウィンドウで引き続き＝＝
> sudo 管理者権限で実行。出来るだけ使うべきではない。
> yum install CentOSなどのOSでプログラムをインストールする。
今回はzip解凍プログラムを入れた。

```text
sudo yum install unzip
```
> cd = 作業場所のフォルダを変更

```text
cd <中にzipを移動させたフォルダの名前>
```
> unzip = 解凍

```text
unzip <zipの名前>.zip
```

> chmod 755 = 指定ファイルを実行可能にする
最後の/*を忘れないでください！「フォルダ直下のファイル全てが対象」という意味です。

```text
chmod 755 <解凍したフォルダの名前, lsで見ることが出来る>/*
```

```text
cd <解凍したフォルダの名前, lsで見ることが出来る>
```
> ls = 作業フォルダ内を全表示
拡張子が.x86_64のファイルを探す

```text
ls
```

> 実行。
Errorが出てきたらmessageを読んで見落としたであろうコマンドか<br>必要なインストールを実行してください。messageを検索すると大抵答えが出てきます。

```text
./<実行ファイル名>.x86_64
```

↓が表示されたら、MLAPIマルチプレイの準備完了です！

```text
Server Started
```

## 5 外部IPアドレスをメモ
マルチプレイの接続のために、VMの外部IPアドレスをメモする必要があります。
URLみたいなものです。(正確にはURLの生身の姿の一部です。)
お疲れ様でした。
![Linuxサーバー外部IPアドレス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182279/a71e6e90-aecf-eeda-6abe-3c98f933c190.png)

# 続きはこちら
[①プロジェクトを実装するまで](https://qiita.com/Hibiro22/items/d97b203dfaef734ff299 "①プロジェクトを実装するまで")
(今ここ→)[②GCPにサーバー用ビルドをアップ・実行する](https://qiita.com/Hibiro22/items/b1a701d1f8b0b490953d "②GCPにサーバー用ビルドをアップ・実行する")
[③実機でテストするまで](https://qiita.com/Hibiro22/items/e2313215b6e4bad1cfef "③実機でテストするまで")

# 思っていること
製品化するにはアカウントやRoomパスワードなどが必須な気がする