まずは小さいところから
目標としてはサーバーを契約してオンラインの何かを作りたいというのをゴールに設定。UNETとかphotonなんかのオンラインゲーム専用のクラウドサービスはとりあえず使わない方針で。 最初からVPSやら契約してもお金ばっかりかかっちゃうんで、VirtualBOXを使って仮想環境を自分のPC内に構築してやってみます。 月数万円+初期費用数十万円するアホほど高い専用サーバーをいつか使ってみたい。このページに書いてある内容としては
環境を準備する
ここからvirtualBoxをダウンロード
OSはCentOSにしてみる。
(Linux入門の教科書
UnityでビルドしたLinux用のアプリを置くために共有フォルダを作成する。(結構手間だった)
root権限で以下のコマンドを実行
1 2 3 4 5 6 |
yum update kernel reboot #再起動 yum update yum -y install epel-release yum -y groupinstall "Development Tools" yum -y install dkms bzip2 gcc make kernel-devel kernel-headers |

1 2 3 4 |
mkdir -p /mnt/cdrom mount -r /dev/cdrom /mnt/cdrom sh /mnt/cdrom/VBoxLinuxAdditions.run reboot #CentOSの再起動 |
色々と作業しやすいようにCentOSにGuestAdditionsをインストールして、
ファイルを共有させます。
手動で面倒だったら、vagrantとかを使ったほうがいいです。
環境
hostOS : Windows 10
g...
Unityで簡単なアプリを作る
ようやっとUnityの作業に着手。 とにもかくにも、サーバーとクライアントでオブジェクトを共有させてみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using UnityEngine.Networking; using UnityEngine.Networking.NetworkSystem; public enum MachineType { Server,Client,Host } public class NetworkStart : MonoBehaviour { public MachineType machineType; // Use this for initialization void Start() { NetworkManager netManager = GetComponent<NetworkManager>(); switch (machineType) { case MachineType.Client: netManager.StartClient(); break; case MachineType.Server: netManager.StartServer(); break; case MachineType.Host: netManager.StartHost(); break; } } } |

これで通信はできる。
オブジェクトを共有
とりあえずint型の変数を共有する。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; using UnityEngine.UI; public class testText : NetworkBehaviour { [SyncVar] int syncCountNum = 0; int nonSyncCountNum = 0; public Text syncText,nonSyncText; private void Update() { if (isServer) { syncCountNum++; nonSyncCountNum++; } syncText.text = syncCountNum.ToString(); nonSyncText.text = nonSyncCountNum.ToString(); } } |
そういうわけでシーンはこんな感じに。

1 2 3 4 5 6 7 8 |
Main Camera--デフォルトのまま。 DirectionalLight--デフォルト。 EventSystem--デフォルト。 NetworkManager--NetworkManagerコンポーネント。 --Netstartコンポーネント。自作。 Canvas--Test text自作。 --NetworkIdentity。NetworkBehaiviourから継承したコンポーネントを追加すると自動で追加される ----Canvasの子は全部普通のText |
ビルドしていきます
まずはサーバー側のビルド
NetStartコンポーネントのMachcinTypeをServerにする。 File➡BuildSettingsを開く。 TargetPlatformをLinuxにする。表示されなかったらLinux用のビルドを追加しないといけないです。UnityHubを使っていればAddComponentから追加する。 Architectureは仮想環境のOSが64ビットならx86_64に、32ビット違ったらx86にする。 Headlessモードにチェックを入れる。これはシーンの描画にかかわる機能を除いてビルドしてくれる機能だそうです。
クライアント側をビルド
File➡BuildSettingsからTargetPlatformをWindowsにする。 Architectureをx86_64にする。(32ビットOSならx86)ポート設定
サーバー側で実行するわけですが、その前にポートについて設定する必要があります。コンピュータで走っているプログラムが、どこで接続を待ち受けているかを表す数字です。 VirtualBoxで動いているマシンのネットワークとホストOSのネットワークをつなげるには、ポートフォワーディングという機能を使う必要があります。 VirtualBoxのウィンドウから設定➡ネットワーク➡高度➡ポートフォワーディング ウィンドウ右側の+ボタンをおす。
1 2 |
firewall-cmd --zone=public --add-port=5555/udp --permanent firewall-cmd -reload |
実行
サーバー側を実行。仮想OS内で、
1 2 |
(共有フォルダのパス/プロジェクト名.x86.64を実行) /media/共有フォルダ/projectName.x86.64 |
こんな感じになるはず。
networkBehaiviourを継承したコンポーネント内の、syncVar属性を持った変数を共有する。 [syncVar]属性のない変数は共有されていません。
シーンを作って、共有したいオブジェクトにNetworkBehaiviourコンポーネントを付けて、サーバーの世界を同時に複数のユーザーに体験させる。みたいな考え方なんでしょうか。
ともかく、一つの変数を共有させるだけでしたが、スタートとしてはこんなもので。