オンラインコンテンツへの道OnUnityー1

初めて触ったMMOはラグナロクオンラインというゲームでした。最近はあまりやってないんですが。 大人数で同じ世界を共有するゲームにとても感動した覚えがあります。のめりこみすぎたくらいでしたけど。   Unityでアプリを作るようになって、Unityの扱いを覚えてきて、MMOを作りたいなという欲が出てきました。   少しづつ計画を進めていこうかと。   MMOにするか何にするか、決まってもないんですが、ともかく「オンラインコンテンツ」の作成記録をぼちぼち作ってみます。  

まずは小さいところから

目標としてはサーバーを契約してオンラインの何かを作りたいというのをゴールに設定。UNETとかphotonなんかのオンラインゲーム専用のクラウドサービスはとりあえず使わない方針で。 最初からVPSやら契約してもお金ばっかりかかっちゃうんで、VirtualBOXを使って仮想環境を自分のPC内に構築してやってみます。 月数万円+初期費用数十万円するアホほど高い専用サーバーをいつか使ってみたい。  
このページに書いてある内容としては
  1. 仮想マシンでCentOSを準備
  2. 仮想マシンとホストOSの共有フォルダを作成
  3. Unityを使って通信する簡単なアプリを作成
  4. Linux用とWindows用にビルド
  5. ポートの設定
  6. 実行

環境を準備する

ここからvirtualBoxをダウンロード
OSはCentOSにしてみる。
Linux入門の教科書がCentOSだったため) Linuxのコマンドライン入力の基礎については本で覚える。 とりあえずUnityで作ったアプリをLinuxに置くだけならググるだけでも足りるかもしれませんが、基礎は知っていた方が何かとスムーズにいきます。
UnityでビルドしたLinux用のアプリを置くために共有フォルダを作成する。(結構手間だった)
root権限で以下のコマンドを実行 ウィンドウ内のメニュー、デバイス➡Guest Additionsイメージの挿入をクリック ViutualBoxの管理画面から設定➡共有フォルダに共有したいフォルダのパスを入力して自動マントにチェックを入れておく。 これでうまくいっていれば、/media/共有フォルダ名/をホストOSとゲストOS両方で参照できます。 以下のサイトを参考にさせていただきました:
色々と作業しやすいようにCentOSにGuestAdditionsをインストールして、 ファイルを共有させます。 手動で面倒だったら、vagrantとかを使ったほうがいいです。 ##環境 - hostOS : Windows 10 ...

Unityで簡単なアプリを作る
ようやっとUnityの作業に着手。 とにもかくにも、サーバーとクライアントでオブジェクトを共有させてみる。 こんなかんじのオブジェクトを作る。NetworkStartコンポーネントは自分で書いたもの。 NetworkManagerはNetworkAddressをlocalhost。 NetworkPortはサーバーとクライアントで同じにする。
NetworkStartコンポーネントは以下 NetworkManagerコンポーネントから通信を開始する。その時、クライアントとして通信を開始するかサーバー側として開始するかを決める。 メソッド名そのままだけど、サーバー側はStartServer()、クライアント側はStartClient()。 enumでマシンタイプを選べるようにしている。Start()時にMachineTypeでサーバーとして通信するかクライアントとして通信するかを選択。
これで通信はできる。
オブジェクトを共有
とりあえずint型の変数を共有する。 canvas以外は普通のText canvasに変数を共有する以下のコンポーネントを付ける NetWorkBehaiviourを継承 [syncVar]属性のついたプロパティだけ共有される isServerはそのままサーバー側として通信している場合のみtrue サーバー側の時のみ、int変数がインクリメントされて、変数をテキストに表示するだけの簡単なコンポーネント。
そういうわけでシーンはこんな感じに。 オブジェクト詳細 これでシーンは完成。

ビルドしていきます

まずはサーバー側のビルド
NetStartコンポーネントのMachcinTypeをServerにする。 File➡BuildSettingsを開く。 TargetPlatformをLinuxにする。表示されなかったらLinux用のビルドを追加しないといけないです。UnityHubを使っていればAddComponentから追加する。 Architectureは仮想環境のOSが64ビットならx86_64に、32ビット違ったらx86にする。 Headlessモードにチェックを入れる。これはシーンの描画にかかわる機能を除いてビルドしてくれる機能だそうです。 こんな感じに。 ビルドしたら”プロジェクト名.x86.64”ファイルと”プロジェクト名_Data"フォルダが出来ますので、それを環境の準備で設定した共有フォルダに入れる。つまりは仮想環境で実行できるフォルダに入れる。
クライアント側をビルド
File➡BuildSettingsからTargetPlatformをWindowsにする。 Architectureをx86_64にする。(32ビットOSならx86)

ポート設定

サーバー側で実行するわけですが、その前にポートについて設定する必要があります。コンピュータで走っているプログラムが、どこで接続を待ち受けているかを表す数字です。 VirtualBoxで動いているマシンのネットワークとホストOSのネットワークをつなげるには、ポートフォワーディングという機能を使う必要があります。 VirtualBoxのウィンドウから設定➡ネットワーク➡高度➡ポートフォワーディング ウィンドウ右側の+ボタンをおす。 プロトコルをUDPに、今回の場合だとゲストOSとホストOSともに5555を設定。
これでゲストOSで設定したポート番号とホストOSで設定したポート番号をつなげてくれます。 さらにポート番号を開きます。 CentOS内のターミナルからroot権限で を実行。 これでやっと実行できます。

実行

サーバー側を実行。仮想OS内で、 次にクライアント側を実行。(windowsならexeをダブルクリックするだけ)   今回は分かりやすくするために全部Windows上で起動しました。左上がサーバー側です。 headlessモードで起動したらサーバー側のシーンは見れないです。
こんな感じになるはず。
変数を共有してそれをTextに表示するだけの、通信を確認するだけのシンプルなアプリです。
networkBehaiviourを継承したコンポーネント内の、syncVar属性を持った変数を共有する。 [syncVar]属性のない変数は共有されていません。
シーンを作って、共有したいオブジェクトにNetworkBehaiviourコンポーネントを付けて、サーバーの世界を同時に複数のユーザーに体験させる。みたいな考え方なんでしょうか。
  ともかく、一つの変数を共有させるだけでしたが、スタートとしてはこんなもので。