こんにちは
記事を書いてる途中ですが 所用ができたので中断してます で 更新に間があいてしまったので
とりあえずアップしておきます
(ブログのエディタにLiveWriterを使用していますが 保存ファイルを読み直すと書式がぶっ壊れてる仕様に泣かされています ある意味MS製品の通常運転)
●M2H
現在ダウンロード出来ませんが わたしがUnityを初めたころ2009年末?にはチュートリアルなどのPDFファイルがフリーで公開されていました 現在はアセットストアのほうで$85でご提供なようです。 世の中おカネです
http://www.scribd.com/doc/38400039/M2H-Unity-Networking-Tutorial
当時のフリーのPDFと同じ物がここにアップされているようです。今回はこの情報をふまえて加筆修正してみます
● http://www.slideshare.net/ShinsukeSugita
ネットワーク周りに関して こちらのスライドが上手くまとまっているようなので まとめかたを参考にさせていただきました
その他 くわしくは後日webで
| ネットワークの状態 |
●Network.peerType
・・・接続状態(ピアタイプ)のステータス、サーバーまたはクライアントで接続しているかの判定をします
NetworkPeerType. Connecting ・・・ ネットワーク接続中
NetworkPeerType. Disconnected ・・・ ネットワーク切断中
NetworkPeerType. Server ・・・ サーバーとして接続
NetworkPeerType. Client ・・・ クライアントとして接続
EX)
function OnGUI() {
if (Network.peerType == NetworkPeerType.Disconnected)
GUILayout.Label("Not Connected");
else if (Network.peerType == NetworkPeerType.Connecting)
GUILayout.Label("Connecting");
else
GUILayout.Label("Network started");
} | サーバの初期化 |
● Network.InitializeServer (connections : int, listenPort : int, useNat : boolean) : NetworkConnectionError
(接続数、ポート番号, NATパンチスルー機能のオンオフ)
function LaunchServer () {
Network.incomingPassword = "HolyMoly";
var useNat = !Network.HavePublicAddress();
Network.InitializeServer(32, 25000, useNat);
} 接続数は接続が許可された着信接続(一般的にプレーヤーの数と同じではないことに注意)の数です。
ListenPortは使用したいポート番号です。
useNatは NATのパンチスルー機能を設定します。NATのパンチスルー機能を使用して接続を受け入れることができるようにしたい場合は、この属性をtrueに設定します。
NAT接続 (Network.useNat)
NATのパンチスルーについての解説(英文)
http://www.raknet.net/raknet/manual/natpunchthrough.html
NATについての詳細は、次のリンク先を見てください
http://unity3d.com/support/documentation/Components/net-MasterServer.html
『NAT(Network Address Translation)/NAPT(Network Address and Port Translation)とは』
http://www.nic.ad.jp/ja/basics/terms/nat_napt.html
NAT(Network Address Translation)とは、ある範囲のIPアドレスを別の範囲のIPアドレスと対応付け、 送受信する IPパケットのヘッダ部のIPアドレスを、対応付けられた範囲で変換する技術です。 NATは、プライベートアドレスとグローバルアドレスを相互に変換する用途によく使用されます。
具体的には、IPパケットのヘッダ部の送信元アドレスがプライベートアドレスである場合に、 その送信元アドレスをグローバルアドレスに書き換えます。 また、該当グローバルアドレスを宛先アドレスとする応答パケットについて、 宛先アドレスをプライベートアドレスに変換します。 (以下本文にて
| サーバへの接続 |
サーバ側
●OnServerInitialized()
・・・ サーバ初期化され準備が出来た時に実行されます
●OnPlayerConnected (player : NetworkPlayer)
・・・ クライアントのプレーヤが接続した時に実行されます
private var playerCount: int = 0;
function OnPlayerConnected(player: NetworkPlayer) {
Debug.Log("Player " + playerCount++ +
" connected from " + player.ipAddress +
":" + player.port);
// Populate a data structure with player information ...
}
●OnPlayerDisconnected (player:NetworkPlayer)
・・・ クライアントのプレーヤが切断した時に実行されます
function OnPlayerDisconnected(player: NetworkPlayer) {
Debug.Log("Clean up after player " + player);
Network.RemoveRPCs(player);
Network.DestroyPlayerObjects(player);
}
クライアント側
●Network.Connect (IP : String, remotePort : int, password : String = "")
・・・指定されたホスト(IPまたはドメイン名)とサーバー・ポートに接続します。
function ConnectToServer () {
Network.Connect("127.0.0.1", 25000);
} ●Network.Disconnect (timeout : int )
・・・サーバーからの切断 timeout:切断までの待ち時間
function OnGUI() {
if (GUILayout.Button ("Disconnect")) {
Network.Disconnect();
MasterServer.UnregisterHost();
}
} ●OnConnectedToServer()
・・・サーバー接続に成功した時に実行されます
function OnConnectedToServer() {
Debug.Log("Connected to server");
// Send local player name to server ...
} ●OnDisconnectedFromServer (mode : NetworkDisconnection)
・・・サーバーから切断された時に実行されます
function OnDisconnectedFromServer(info : NetworkDisconnection) {
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");
}
}
●OnFailedToConnect (error : NetworkConnectionError)
・・・サーバーへの接続失敗
function OnFailedToConnect(error: NetworkConnectionError) {
Debug.Log("Could not connect to server: "+ error);
}
| オブジェクトの生成 と 破壊 |
●Network. Instansiate()
・・・ネットワーク越しのオブジェクトの生成
Instantiate (prefab : Object, position : Vector3, rotation : Quaternion, group : int) : Object
EX)
// Immediately instantiate new connected player's character
// when successfully connected to the server.
var playerPrefab : Transform;
function OnConnectedToServer () {
Network.Instantiate(playerPrefab, transform.position, transform.rotation, 0);
}
●Network. Destroy()
・・・ネットワーク越しのオブジェクトの破壊
EX)
var timer : float = 0;
function Awake () {
timer = Time.time;
}
// Network destroy the object which has this script
// it must have a NetworkView attached
function Update() {
if (Time.time - timer > 2) {
Network.Destroy(GetComponent(NetworkView).viewID);
}
}
var timer : float = 0;
function Awake () {
timer = Time.time;
}
// Network destroy the object which has this script
function Update() {
if (Time.time - timer > 2) {
Network.Destroy(gameObject);
}
}
RPC buffer によるネットワーク越しのオブジェクトの破壊:
function OnNetworkInstantiate(info: NetworkMessageInfo) {
Debug.Log(networkView.viewID + " spawned");
if (Network.isServer) {
Network.RemoveRPCs(networkView.viewID);
Network.Destroy(gameObject);
}
}
| RPC(RemotePrecedureCall) ・・ 遠隔スクリプトの呼び出し |
● Unityのネットワークを介してスクリプトをリモートで呼び出すことができます。
※この関数は 送信側と供給側の両方に存在する必要があります。
■RPCコールで送ることができる変数の種類
RPCファンクションを有効にするには javascriptなら”@RPC" C#なら”[RPC]”をファンクションの前につけます
EX)
networkView.RPC ("PrintText", RPCMode.All, "Hello world");@RPC function PrintText (text : String, info : NetworkMessageInfo) { Debug.Log(text + " from " + info.sender); }● NetworkView.RPC (name : String, mode : RPCMode, params args : object[])
(”ファンクションネーム”, RPCモード, viewID, transform.positionなどの値)
EX)
var cubePrefab : Transform;
function OnGUI () {
if (GUILayout.Button("SpawnBox")) {
var viewID : NetworkViewID= Network.AllocateViewID();
networkView.RPC("SpawnBox", RPCMode.AllBuffered, viewID, transform.position);
}
}
@RPC
function SpawnBox (viewID : NetworkViewID, location : Vector3) {
// Instantate the prefab locally
var clone : Transform;
clone = Instantiate(cubePrefab, location, Quaternion.identity) as Transform;
var nView : NetworkView;
nView = clone.GetComponent(NetworkView);
nView.viewID = viewID;
}
RPCModeの種類
| RPCMode.Server | サーバーだけに送信 |
| RPCMode.Others | 送信者を除く全体に送信 |
| RPCMode.OthersBuffered | Bufferedモードで送信者を除く全体に送信 |
| RPCMode.All | 送信者を含む全体に送信 |
| RPCMode.AllBuffered | Bufferedモードで送信者を含む全体に送信 |
●Buffered とは
バッファーを用いた送信方法です。新規プレーヤーが接続する場合に 新規プレーヤーがこのメッセージを受け取ります。
●たくさんのプレーヤーを生成するのに有用です。