ゾンビとUnity

ゾンビネタとUnityでのゲーム制作について綴るブログです。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Unityで引っかかったところを書いてく3

※Unity 5以上では未検証。

公式の日本語マニュアルを読んでも、英語のチュートリアルを試しても、いまいち理解できなかった部分。

Unity の Network
ソケット通信の send, recv を使った仕組みは Unity にはない。
Network, NetworkView を使ってやりくりする。

NetworkView
サーバを初期化するだけなら NetworkView は不要。
クライアントがサーバに接続するだけなら、NetworkView は不要。
NetworkView が必要になるのは、サーバ、クライアント間で何らかのデータを同期させるときだけ。
接続するだけならサーバのIPとポート番号が分かれば良い。
サーバとクライアントを別々のプロジェクトで作成しても同期可能。
OnSerializeNetworkView と RPC でチェックしたが、どちらも通信できた。

OnSerializeNetworkView()
Network View が監視しているスクリプトに書かれているクラスの変数に変化があったときに勝手に呼ばれる。
同期させる変数名はサーバ、クライアント間で異なっていても問題ない。
その変数は private でも public でも動作に影響はない。
Network View - Observed に登録しているスクリプトに書かれているクラスの変数を監視するだけで、そのクラス名やスクリプトファイル名を監視するわけではない。
変数の値に変化があると勝手に OnSerializeNetworkView() が呼び出されるので、その中で同期が必要な変数だけをシリアライズ/デシリアライズする。

RPC(リモート・プロシージャ・コール)
Network View が監視しているスクリプトに書かれているクラスの関数を呼び出す。
受信側の Network View が監視しているクラスのメンバ関数名を指定するので、関数名は一致させなければいけない。
Network View ID が一致していれば、監視するスクリプトは何でも良く、そのスクリプトに書かれているクラスに[RPC]属性付きの同じ名前の関数が存在していれば良い。

画面に表示されるオブジェクトの同期
キューブやスフィア、複雑なキャラクターモデルなどの画面に表示させるオブジェクトは動かすだけで勝手に同期される。
Network View の State Synchronization で、どのような条件で同期させるかを指定する。

スクリプトを監視対象にする方法
Network View - Observed にスクリプトを登録するには、Inspector に登録しているスクリプトの名前の部分をドラッグ&ドロップする
Unity Network Test 01

サーバとクライアントを同じウィンドウズPCで同時に立ち上げたときの些細な問題
Unity のプログラムはフォーカスを持っていないと動かない。
ウィンドウズは同時に複数のウィンドウにフォーカスを合わせることはできないので、フォーカスがあっている方のプログラムしか動かないことになる。
サーバを立ち上げ、続いてクライアントを立ち上げた場合、クライアントにフォーカスが合っている間、サーバは何も処理をしない(通信も)。
もし、クライアントがサーバに接続しようとしても、サーバが停止しているので接続できない。
このまま数十秒経過すると、サーバからの反応がないため、クライアントはサーバへの接続に失敗したと判断してしまう。
一度サーバにフォーカスを合わせることでサーバはクライアントの接続要求を受け付ける。
これによってサーバへの接続に成功したという通知がクライアントに送られ、クライアントも接続に成功したと判断する。
マルチプレイのゲームでは、1つのサーバに対して複数のクライアントが接続することになるので、この状況を再現したい場合、複数のクライアントを同時に立ち上げて動作確認することになる。
クライアントを立ち上げる度にサーバにフォーカスを戻し、また次のクライアントを立ち上げサーバにフォーカスを戻し…クライアントとサーバ間で何らかの通信をする度にこの手間が発生し、地味に面倒くさい。

※追記
バックグラウンドで動作させるビルドオプションがあった。



この先
サーバとクライアントのプロジェクトを別々に作成しても通信可能なことが分かったので、マスターサーバの接続テストがやりやすくなったような気がするが、実際にはすごく面倒なことが分かっている。
この先やりたいことは、プライベートネットワークに構築したマスターサーバへの接続テスト。
いくつものホストを立ち上げてマスターサーバに接続し、きちんと接続できるか?どれだけの負荷に耐えられるか?長時間接続しても問題ないか?負荷が高い状態でも動作に支障はないか…なんかを検証する。
テストを自動化するためにバッチファイルを使ってコマンドライン引数に -batchmode を指定し、ホストのプログラムをいくつも起動したいところだが、Unityには任意のコマンドライン引数を受け取る機能がない。また、同じポート番号を使ってマスターサーバに接続することはできないので、ホストのプログラムを起動する度に、未使用のポート番号でマスターサーバに接続するように設定しなければいけない。コマンドライン引数でポート番号を指定するのが簡単だが、前述の通りそれはムリ。他に方法としては、未使用のポート番号を列挙したファイルからデータを読むか、未使用のポート番号を送信するだけのサーバを作り、マスターサーバへ接続する前にそのサーバから未使用のポート番号を受け取り、そのポート番号でマスターサーバに接続する…。いずれにしても手間がかかってめんどくさい。マスターサーバがどれだけ使えるものなのかは実際に検証してみないと何とも言えないので、それを自動化してくれるツールがあればすごく有難い…探せばありそうな気がする。

※追記
C#で.Netの機能を使えば、任意のコマンドライン引数を取得できる。

スポンサーサイト

- 0 Comments

Add your comment

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。