こんにちは、Unity LV2:せいぶんです。
 
先日おきなわマラソンを走りました。
しにかんてぃーっ(倒れそうに)なりながらもなんとか
ギリギリで完走しました。(^^)/

しかし翌日。。。胃腸炎となり腹痛が!?
開発&腹痛と戦いながら業務をする日々です。

さて、今回は、NetwrokViewについて調べてみました。

 ■NetwrokViewってなに?
  Unityサイト

  簡単にいうと、端末同士をネットワークでつなげて通信できるもの。
  あとは、参考URLで( ^o^)ノ〜*ぽいっ

  [参考URL]
   ご存知の「テラシュールウェア」さん
   個人的には、解りやすかったのでこちらの動画
    http://www.youtube.com/watch?v=jjOe5dNOI34

■早速作ってみる。
 すごーくシンプルな内容です。
  *ネットワークを管理するスクリプト(NetworkViewMgr.cs
  *Chat部分のスクリプト(Chat.cs)
 この2つのスクリプトだけっ!

以上!!

つづきは。。。。。うそです。


早速、スクリプトの中を除いてみましょう。
※ソースは、下部に貼付けてあります。


(1)NetworkViewMgrでは、接続と切断を管理します。
※特に説明するほどの内容じゃありませんが。。。(^^;

今回の例は、ローカルIP(127.0.01)指定で接続するようにしています。
特定の端末に接続する場合、IPアドレスを変更して接続してください。
※IPアドレスとPort番号で接続するため、ファイアウォール等で制限掛けている場合は注意が必要。

 1)接続状態(connected)が接続(True)の場合は、Disconnectボタンを表示
 2)接続状態(connected)が接続(False)の場合は、ConnectボタンとServerボタンを表示


(2)Chatでは、接続後のメッセージのやりとりを管理します。
 1)メッセージをリスト(各端末内のメモリ)で管理する。[7行目]
 2)接続が確立されている時のみChatのUIを表示。[14行目]
 3)入力情報を取得[21行目]]
 4)Sendボタンの処理[24〜43行目]
   *入力情報が空の場合は、処理しないように制御
   *送信メッセージに送信者の情報(ここでは、GUIDを使用)を付加
   *今回は、ここがポイント!
    本来メソッドを実行する場合、以下のように記述すると思いますが
     this.chatMessage(msg);
    メッセージを共有するため接続されているピアのRPC関数を
    呼び出す事ができる。
    つまりここが接続している端末に送信している部分となる。
    (RPCMode.Allは、接続している全ての端末に送信する事になる。)
   networkView.RPC("chatMessage", RPCMode.All, new object[] { msg } );
 5)メッセージをリストに追加する。[56〜61行目]
   *[RPC]の記述されたメソッドは、networkView.RPCで呼び出されるため、
    接続端末間で処理を同期する事が可能となる。
 6)入力されたメッセージを逆順に表示。[48〜51行目]

各スクリプトの説明は、以上です。


(3)Unityで設定する。
 1)適当名称なGameObjectを追加します。
   (サンプルでは、Main Cameraを利用します。)
 2)1)で作成したGameObjectにNetworkViewMgr.csとChat.csを
   アタッチします。
    Blog1
 3)Chat.csで同期を行うため、Chat.csがアタッチされている
   GameObjectには、NetworkViewをアタッチします。
   ※Chat(Script)をドラック&ドロップでNetworkViewの
    Observedへ反映する。
    Networkで同期する対象に設定する。
    Blog2


ここまできたら実行してみましょう。!
以下のような感じになるはずです。
Blog3

さて、今回はこの辺で終わりです。
どうだったでしょうか?

NetworkViewは、いろんなシーンで使えそうですね。

でわでわっm(__ )m



[NetworkViewMgr.cs]
using UnityEngine;
using System.Collections;

public class NetworkViewMgr : MonoBehaviour {
	public 			string	connectionIP	= "127.0.0.1";
	public 			int		portNumber		= 8632;
	public static 	bool	Connected 		{ get{ return connected; } }

	private static 	bool	connected		= false;
    
	private void OnGUI()
	{
		// 接続済み
		if ( connected )
		{
			GUILayout.Label("Connections: " + Network.connections.Length.ToString());
			// 接続を切断する場合
			if ( GUILayout.Button("Disconnect") ) 
			{
				Network.Disconnect();
			}
		}
		else
		{
			// 画面の入力情報を取得する。
			connectionIP = GUILayout.TextField(connectionIP);
			int.TryParse(GUILayout.TextField(portNumber.ToString()), out portNumber);

			// Clientになる場合
			if ( GUILayout.Button("Connect") ) 
			{
				Network.Connect(connectionIP, portNumber);
			}

			// Serverになる場合
			if ( GUILayout.Button("Server") )
			{
				Network.InitializeServer(4, portNumber);
			}
		}
	}

	#region Connection
	//サーバーが初期化されたとき、サーバー側で呼び出されます。
	void OnServerInitialized()
	{
		Debug.Log("Server initialized and ready");
		connected = true;
	}

	//サーバーに接続したとき、クライアント側で呼び出されます。
    void OnConnectedToServer()
    {
		Debug.Log("Connected to server");
        connected = true;
    }

	// プレイヤーが接続されたとき、サーバー側で呼び出されます。
	void OnPlayerConnected(NetworkPlayer player) 
	{
		Debug.Log("Connected from " + player.ipAddress + ":" + player.port);
		connected = true;
	}

	//プレイヤーが切断されたとき、サーバー側で呼び出されます。
	void OnPlayerDisconnected(NetworkPlayer player) 
	{
		Debug.Log("Clean up after player " + player);
		Network.RemoveRPCs(player);
		Network.DestroyPlayerObjects(player);
	}

	//サーバーから切断したとき、クライアント側で呼び出されます。
	void OnDisconnectedFromServer(NetworkDisconnection info) {
		connected = false;
		if (Network.isServer)
		{	
			Debug.Log("Local server connection disconnected");
		}
		else if (info == NetworkDisconnection.LostConnection)
		{
			Debug.Log("Lost connection to the server");
		}
		else
		{
			Debug.Log("Successfully diconnected from the server");
		}
	}

	//サーバーの接続に失敗したとき、クライアント側で呼び出されます。
	void OnFailedToConnect(NetworkConnectionError error) 
	{
		Debug.Log("Could not connect to server: " + error);
	}
	#endregion
}


[Chat.cs]
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Chat : MonoBehaviour {
	// メッセージを管理するリスト
	private List messages = new List();
	// Chat用のテキスト
	private string currentMessage = string.Empty;
	
	private void OnGUI()
	{
		// 接続が確率されていた場合の処理
		if ( NetworkViewMgr.Connected )
		{
			GUILayout.Space(150);
			
			GUILayout.BeginHorizontal(GUILayout.Width (250));
			
			// 入力情報の取得
			currentMessage = GUILayout.TextField(currentMessage);
			
			// Sendボタンの処理
			if ( GUILayout.Button("Send") )
			{
				// 入力情報が空ではない場合処理します。
				if ( !string.IsNullOrEmpty(currentMessage.Trim ()) )
				{
					// GUIDを先頭に付加したメッセージを作成する。
					// (本来ならユーザを特定する名称を使った方がよいかもです。)
					string msg = Network.player.guid + ": " + currentMessage;
					
					// ここがポイント本来なら以下のようにメソッドを記述し実行します。
					// this.chatMessage(msg);
					// メッセージを共有するため接続されているピアのRPC関数を呼び出す事ができる。
					// つまりここが接続している端末に送信している部分となる。
					// (※RPCMode.Allは、接続している全ての端末に送信する事になる。)
					networkView.RPC("chatMessage", RPCMode.All, new object[] { msg } );
					
					// 送信後は、入力値を空にしておく。
					currentMessage = string.Empty;
				}
			}
			
			GUILayout.EndHorizontal();
			
			// 入力されたメッセージを逆順に表示していく。
			for ( int i=messages.Count-1; i>=0; i-- )
			{
				GUILayout.Label(messages[i]);
			}
		}
	}
	
	// 接続されているピアで認識されるRPC関数として指定するために[RPC]を記述する。
	[RPC]
	public void chatMessage(string msg)
	{
		// 引数のメッセージをローカルの配列にセットする。
		messages.Add(msg);
	}
}


 

ブログを引っ越しました。

Unity,cocos2dxを中心とした、ゲーム制作の技術メモ。沖縄のゲームアプリ開発会社・ブリブサーのブログです。
ほぼ毎日更新中!下記リンクよりどうぞ。
ブリブサー開発戦線〜僕らはあの戦いを忘れない〜