だらだら〜自由自在〜

インディーゲーム制作チーム GAME GABURI でプログラム担当してます

Unity MasterServerを独自に用意する。立ち上げまで。

どうでもいいけど、自分で7000のキリ番踏んだ。わーい。

UnityにはMultiPlayerゲームを作成するためにNetwork関係のFrameworkが用意されている。
なかでも、MasterServer(とかFacilitateServerとか)はマッチングやNAT貫通に使えるらしい。
NAT貫通(NATパンチング)はPrivateIPのピアの接続をするための仕組みだと思ってるけど、詳細はよく分からない。

MasterServerはUnityがデフォルトで提供しているものがあり、何もせずにMasterServerに接続するとそのデフォルトのやつにつながる。

Networkのサンプルは以下のページで配布されていて、今回はそのサンプルをつかってMacOSXローカルで立ち上げたMasterServerへ接続を行う。
http://unity3d.com/support/resources/example-projects/networking-example.html

ちなみに、Unity3.4で試したが、Androidビルドに設定するとスクリプトエラーが起きて実行できなかった、よく分からないので保留中(以下BuildTargetはMac/WinNative)

MasterServerのソースコードをDL

http://unity3d.com/master-server/index.html
ここからMaster Serverを落とす。Facilitatorなどはまだ試してない。
Zipが落ちるので、Unzipする。
Unzipしたフォルダのパスを便宜上[SrcRoot]と呼ぶことにする。

MasterServerのビルド

Mac上で、Terminalからmakeしてやってみた。
Xcodeでもビルドだけやったが、おそらくエラーが出るはず。SDKのパスがどうのこうの言われるので、オプションとかからSDKのパスを再設定してやる)
まずは、ncursesというパッケージをInstallする必要があるみたい。
http://forum.unity3d.com/threads/13347-Need-help-deploying-Master-Server
Macportで、
$ sudo port install ncurses

[SrcRoot]に移動して、
$ make

ビルドが終わったら、[SrcRoot]/MasterServerという1Mぐらいのファイルが出来ているので、こいつがMasterServerの実行ファイル。

で、こいつに動作開始とか停止の命令を与えるためのスクリプトが、[SrcRoot]/config/unity-masterserverになる。このファイルを開くとMasterServerのオプションとかが指定できる。
まず、MasterServerの実行ファイルパスを設定する。

BINARYNAME=MasterServer #実行ファイル名
HOMEDIR=[SrcRoot] #実行ファイルの入るディレクトリ

実行ユーザー名も設定する。自分のUnixユーザーでも指定しとく
USERNAME=nyakagawan

起動オプションを設定する。
OPTIONS="-s 3600 -p 10000 -l"
sは『Statistics print delay (minutes)』と、usageには書いてあるが、詳細不明。
pがListenするポート番号。
lはログファイルを出力するかどうか(だと思う)

ログファイルはオプションでは指定できない?MasterServer.cppのlogfile変数を変更すれば指定できそうだが、それならオプションで指定できるように変更した方がいいかも。


変更した起動スクリプトは自分の場合/usr/local/binなどにコピーした。パスが通っているところなので、
$ sudo unity-masterserver start
とやればサーバーが起動する。ちなみにstatusコマンドが動かない気がするがどういうことだろう?エラーが出て結果がみれない。

ログファイルはデフォルトでは[SrcRoot]/masterserver.logに出る。

NetworkExampleで接続してみる

NetworkExampleのloaderシーンを開いて実行する。
しばらく待つと、ログに
>Connected to master server at 67.225.180.24:23466
とか出る。これがUnityデフォルトのMasterServerで、ここまで問題なければMasterServer接続先を変える為にソースを編集する。
ちなみに、デフォルトのMasterServerは(おそらく)全Unityユーザー共有なのでリスト表示されたサーバーに、どっかのだれかがテストでたてたサーバーが表示されるかもしれない。

編集するソースは、Assets/Networking Scripts/ConnectGuiMasterServer.js
このソースの、Awake()の先頭に次のように挿入する。

var isConnectMyMasterServer = true;//falseにするとUnity共有MasterServerに接続
if( isConnectMyMasterServer ) {
	MasterServer.ipAddress = "127.0.0.1";
	MasterServer.port = 10000;
}

これでローカルでたてたサーバーに接続出来る。(ポート番号は適当)

また、gameNameが"You must change this"となっていると思うので、これを何か適当なやつに変えておけば、共有MasterServerにつないでも他の人とマッチングしないと思われる(実際に変更してみた結果、他の人のサーバーがリストされないようになったのでこのように書いているが、ちゃんと調べた訳ではないので念のため...)


この状態で再度実行してみる(そういえばMasterServerは事前に起動しておくことが必要。前述の起動スクリプトにstartを指定して起動)
しばらく待って、ログに
>Connected to master server at 127.0.0.1:10000
と出て、その後エラーが出なければたぶんおk。

お次は

さて、MasterServerたてることは出来たが、問題はAndroidでビルドできないこと。JavascriptというのがUnity開発上の経験が無いのでC#に移植してみることにする。とりあえず。