【目次】
概要
フォルダ構成
サーバを立てる
クライアントの接続
複数人でのマッチング対戦
本サンプルは MonobitEngine による、プレイヤーマッチング(マッチングルーム)の管理から
バトルシーン導入までの一連の流れを組み込んだもので、先の echo_sample_lite よりも本格的な、
そして、より MO / MOBA のネットワークゲーム開発に適したフレームワークです。
しかしながら、ゲームルール部分については自由に書き換え可能なため、
さまざまなゲームジャンルに対応が可能です。
また、サーバ側に多くのゲーム内要素を処理させることで、
よりセキュアなネットワークゲームを提供できます。
このサンプルプロジェクトを触っていただくことで、
「MonobitEngine を使ってどんなネットワークゲームが作れるの?」
「ゲームのどの部分がフレームワーク依存で、どこからゲームデザインが可能なの?」
「サーバ側でのゲーム内要素の管理の仕方は?」
といった、おそらく開発者の皆さんが本当に知りたい疑問への答えが見えてくるはずです。
フォルダ構成▲
フォルダ構成は以下のようになります。
prefork_battle_matching_lite
├ client … prefork_battle_matching クライアントプロジェクト
├ server … prefork_battle_matching サーバプロジェクト
└ tools … RPCスタブ環境一式
■ client
Unity4.x / 5.x 向けに作られた、クライアントプロジェクトが入っています。
開発者の方にカスタマイズしていただける部分は以下のファイル群になります。
☆ Unity4.x の場合
・client/unity4/battle/Assets/Projects/Scripts/sample/ClientScene.cs
・client/unity4/battle/Assets/Projects/Scripts/sample/ClientSceneGUI.cs
・client/unity4/battle/Assets/Projects/Scripts/sample/core/Client.cs
・client/unity4/battle/Assets/Projects/Scripts/sample/pu/GameRpcClientPU.cs
☆ Unity5.x の場合
・client/unity5/battle/Assets/Projects/Scripts/sample/ClientScene.cs
・client/unity5/battle/Assets/Projects/Scripts/sample/ClientSceneGUI.cs
・client/unity5/battle/Assets/Projects/Scripts/sample/core/Client.cs
・client/unity5/battle/Assets/Projects/Scripts/sample/pu/GameRpcClientPU.cs
なお、上記ファイル以外はライブラリとして用意しているものですので、
不用意に触らないようにしてください。
■ server
Linux向けに作られた、各種サーバプロジェクトが入っています。
開発者の方にカスタマイズしていただける部分は以下のファイル群になります。
☆ Battleサーバ
・server/battle/src/RPC_BTL_Battle.cpp
・server/battle/src/RPC_BTL_Battle.hpp
・server/battle/src/RPC_BTL_RoomHub.cpp
・server/battle/src/RPC_BTL_RoomHub.hpp
☆ Matchingサーバ
・server/matching/src/sample/RPC_BTL_Matching.cpp
・server/matching/src/sample/RPC_BTL_Matching.hpp
なお、上記ファイル以外はライブラリとして用意しているものですので、
不用意に触らないようにしてください。
■ tools
RPCのコードに展開する元のRubyコードが入っています。
RPCにつきましては、後述のRPC編にて触れていきます。
サーバを立てる▲
■ サーバを立てる前に
サーバを起動する前に、サーバプログラム側のシェルスクリプトを
それぞれのサーバ環境に合わせて変更する必要があります。
先に、Linuxサーバの root 権限から ifconfig コマンドを実行し、
イーサネットのIPアドレスを調べておいてください。
# ifconfig
その後、各種サーバの実行シェルスクリプトを開き、以下の太字の部分を
該当するサーバのIPアドレスに合わせて書き換えてください。
◎ battle サーバ(server/battle/battle.sh)
./battle -l 7101 -L 127.0.0.1 -f 7000 -F 127.0.0.1 -c 6501 -C 192.168.189.128 -n 0x4000000 -N 0x4ffffff -p 1 -d 0x10100001
◎ battle2 サーバ(server/battle2/battle2.sh)
./battle2 -l 7102 -L 127.0.0.1 -f 7000 -F 127.0.0.1 -c 6502 -C 192.168.189.128 -n 0x5000000 -N 0x5ffffff -p 1 -d 0x10200001
◎ matching サーバ(server/matching/matching.sh)
./matching -l 9101 -L 127.0.0.1 -f 7000 -F 127.0.0.1 -c 8501 -C 192.168.189.128 -n 0x24000000 -N 0x24000000 -b 0x1400000000001
◎ matching2 サーバ(server/matching2/matching2.sh)
./matching2 -l 9102 -L 127.0.0.1 -f 7000 -F 127.0.0.1 -c 8502 -C 192.168.189.128 -n 0x25000000 -N 0x25000000 -b 0x1500000000001
■ server のビルド
server のビルドに移ります。
任意のディレクトリに配置後、以下のコマンドを実行して
ビルド用シェルの実行権限を割り当ててください。
$ bash ./setup.sh
続けて、Linux上の適切なディレクトリ上に配置し、server のディレクトリから
以下のコマンドを実行してください。
$ ./server.sh debug
■ server の起動
最後に以下のコマンドを実行して、server を起動させましょう
$ ./server.sh start
すると以下の表示がなされ、server が起動します。
Starting Server:
sync start
matching start
matching2 start
battle start
battle2 start
battle_pulist start
battle_pulist2 start
クライアントの接続▲
■ Unity クライアントの起動
/client/unity4/battle/Assets/Projects/Scenes/ClientScene.unity を開き、
Unity クライアントを起動させてください。
■ シーンの実行
Unity の実行再生ボタンを押下し、シーンを起動します。
※ このとき、以下のエラーメッセージが出現し起動できない場合があります。
その場合には、再度 Unity を起動しなおしてください。
Internal compiler error. See the console log for more information. output was:
Unhandled Exception: Mono.CSharp.InternalErrorException: Assets/Projects/Scripts/mln/pu/RpcClientPU.cs(17,30): BTL.PU_Client ---> System.TypeLoadException: Could not load type 'mln.RelayConnector' from assembly 'MLNClient, Version=1.0.5525.19549, Culture=neutral, PublicKeyToken=null'.
■ マッチングサーバへのアクセス
起動後、以下の画面が表示されます。現在 matching サーバを立ち上げている
サーバのIPアドレスを入力し、「マッチングリスト登録」のボタンを押下します。
すると「マッチングサーバリスト」が現れますので、該当するマッチングサーバのボタンを押下します。
マッチングルール&マッチング値はそのままに「マッチングスタート」のボタンを押下します。
しばらくするとログが流れます。
Matching Start
Entry MatchingRoom Success roomId = ....
Appintment Battle Success
Exit MatchingRoom Success
Matching End
m_CharaId=0x.....
xxx.xxx.xxx.xxx:xxxx 0x............
Battle Waiting
ログが流れたところで、「強制バトルスタート」のボタンを押下します
その後再びログに追加されます。
Battle Start
流れたログと同時に、バトル開始となります。今回はサンプルということで
チャット形式になっています。
チャット入力欄に発言内容を入力し、「発言する」のボタンを押下します
ボタンを押下すると、以下のようなログが流れ、チャットが出来る状態になります。
Chat=CharaId=0x........ ClientId=0x........ : <発言内容>
なお一定時間経過すると BattleEnd となり、起動する前に戻ります。
複数人でのマッチング対戦▲
サンプルのマッチング人数は「1人のみ」に設定されていますので、複数人でのマッチングを可能にしましょう。
■ マッチングルームの収容人数を変更するには?
マッチングルームの収容人数を変更するには、server/matching/src/sample/RPC_BTL_Matching.hpp
の 28行目に定義している
m_RoomCharaMax の値を変更します。
下記のように初期値は「1」ですので、この値を増やすことでマッチングルームの収容人数を増やすことが出来ます。
protected:
uint64 m_AutoRoomId; // 自動ルームID
static const uint64 m_RoomCharaMax = 1; // TODO マッチング規定人数
■ バトルルームの収容人数を変更するには?
一方、バトルルームの収容人数を変更するには、server/battle/src/RPC_BTL_Battle.cpp の 14行目に定義している
RPC_BTL_Battle::MAX_ENTER_NUM の値を変更します。
下記のように初期値は「2」ですので、この値を増やすことでバトルルームの収容人数を増やすことが出来ます。
const uint8 RPC_BTL_Battle::MIN_ENTER_NUM = 1; ///< ルーム入室可能な最小人数
const uint8 RPC_BTL_Battle::MAX_ENTER_NUM = 2; ///< ルーム入室可能な最大人数
■ サーバを再度 make しなおして実行する
変更を加えたら、サーバを再度 make しなおして実行しましょう。
まずはサーバを停止するコマンドを実行します。
$ ./server.sh stop
すると以下の表示がなされ、サーバが停止します。
Stopping Server:
battle_pulist stop
battle_pulist2 stop
battle stop
battle2 stop
matching stop
matching2 stop
sync stop
サーバが停止したら、以下のコマンドを入力し、再度makeを掛けます。
$ ./server.sh debug
make が終わったところでサーバを再起動しましょう。
$ ./server.sh start
■ 注意:複数人のマッチング対戦の場合、複数分のクライアントを起動させること。
m_RoomCharaMax に「マッチングルーム内に入ることが出来る最大人数」を指定していますが、この数値を「2」以上にしている場合、
少なくとも指定している台数分だけのクライアントを起動しない限り、この画面から先に進むことはありません。
これは prefork_battle_matching サンプルの仕様です。
サンプルが提供している機能は「マッチング→バトルの遷移」であり、マッチング中の演出に関しては
こちらで用意せず、開発者様に組み込んでいただくことになります。
本サンプルではマッチング中の演出については省略しています。
そのため、複数人でのマッチング対戦のデモを見たい場合には、相応の台数分だけのクライアントアプリを起動させてください。