おもちゃラボ

Unityで遊びを作ってます

Unityでネットワーク通信をする5 (動作を同期する)

前回までに、Unity上でネットワーク通信をしてインスタンス生成を同期する方法まで説明しました。今回はネットワーク通信を通して移動・回転・拡大などの動作を同期するプログラムの説明します。

networkViewを使って動作を同期する

前回(Unityでネットワーク通信をする3 (インスタンス生成) - おもちゃラボ)つくったプロジェクトにプログラムを追加する形で説明していきます。まずはネットワーク同期させたいオブジェクトに、動作プログラムをアタッチします。下にそのプログラムをおいておきます。

ネットワーク同期プログラム
Pig.cs

void Update () 
{
	Vector3 pos = transform.position;
	if( networkView.isMine )
	{
		if( Input.GetKey("right") )
		{
			pos.x += 0.2f;
			transform.position = pos;
		}
		else if( Input.GetKey("left") )
		{
			pos.x -= 0.2f;
			transform.position = pos;			
		}
	}
}

ここでは、上記プログラムの主要な部分を載せます。動作としては右矢印が押された場合には右に移動し、左矢印が押された場合には左に移動します。このプログラムをUnityにインポートしてキャラクタにアタッチし、実際にMasterが左右矢印で移動入力を入れることで、その挙動がネットワークを介して同期できることを確認してください。

NetworkView.isMineについて

f:id:nn_hokuson:20140516064330j:plain

ここで、networkView.isMineが真の場合のみに移動のプログラムを実行していることに注意してください。networkView.isMineは「networkViewをアタッチしたオブジェクトを自分自身が作ったかどうか」を示しており、自分が作ったものであればtrueを、そうでなければfalseを返します。例えばMasterで生成した場合、MasterではnetworkView.isMineが真に、Clientでは偽になります。

f:id:nn_hokuson:20140521233930j:plain

もちろん下図のように、Clientで生成した場合には、ClientのnetworkView.isMineは真になり、masterのnetworkView.isMineは偽になります。このようにnetworkView.isMineの真偽は「誰が作成したか?」によるものであり、自身がMasterかClientかは一切関係ありません

f:id:nn_hokuson:20140521234706j:plain

networkView.isMineの必要性

さて、networkView.isMineの動作が分かったところで、サンプルプログラムの動作を考えてみます。今回はMasterでオブジェクトの生成をしているため、Masterが矢印を押した場合のみ移動し、その挙動がネットワークを通してClientにも伝わり、Clientでもオブジェクトが移動します。Client側が矢印を押した場合はisMineが偽になるため移動しません。

f:id:nn_hokuson:20140521235717j:plain

もし、networkView.isMineを忘れると、ひとつのオブジェクトを二人が共有して動かせる状態になってしまいます。Masterで右に動かそうとした場合、ネットワークを通してその挙動がClientに伝わり、Clientのオブジェクトも右への移動しようとします。しかし、Clientでは左へ動かそうとする入力があるため、どちらにも動けずパタパタしてしまいます。

f:id:nn_hokuson:20140522000735j:plain

この状態に陥ると非常に目障りな状態になるので、基本的には自分で作ったオブジェクトを移動させるときにはnetworkView.isMineが真であることを確かめてから移動させるようにしたほうがよいでしょう。

参考図書

「ゲームの作り方 Unityで覚える遊びのアルゴリズム」

こちらはUnity中級編の参考書です。2Dから3Dのゲームまで、プロが作ったゲームのサンプルが10個もついています。サンプルプログラムといっても入門書に付いているような簡単なものではなく、ミニゲームとしてリリースしても良いレベルのものなので、読んでいて非常に勉強になります!