公式サイト
http://docs-jp.unity3d.com/Documentation/Manual/NetworkedMultiplayer.html
コミュニティーサイトなど
http://www.slideshare.net/koppepan/unity-16450853
サンプルソースコード
https://github.com/anchan828/unity-network-sample
ローカルネットワークのアドレスを確認する方法
http://www.akakagemaru.info/port/windows7.html
マスターサーバのソースコードのダウンロード場所
http://unity3d.com/master-server
上記サイトで分からなかった事を理解した事
RPCについて
by http://docs-jp.unity3d.com/Documentation/Components/net-RPCDetails.html
RPCはリモート(Remote)マシンの関数(Procedure)呼び出し(Calls)を可能にする。
全てのネットワーク通信はNetworkViewコンポーネントで行うためRPC関数を宣言したスクリプトに呼び出し前にアタッチする必要があります。
状態同期(State Synchronization)について
by http://docs-jp.unity3d.com/Documentation/Components/net-StateSynchronization.html
サンプルソースコードについて
サンプルコードの抜粋
foreach (GameObject go in FindObjectsOfType (typeof(GameObject))) go.SendMessage (“OnNetworkLoadedLevel”, SendMessageOptions.DontRequireReceiver);
SendMessage関数について
by http://docs-jp.unity3d.com/Documentation/ScriptReference/GameObject.SendMessage.html
FindObjectsOfType関数について
http://docs-jp.unity3d.com/Documentation/ScriptReference/Object.FindObjectsOfType.html
OnNetworkLoadedLevel関数について
マスターサーバへの接続確立とホストサーバの立ち上げというネットワークの事はAssets→PrefabファルダにあるConnectionGUIプレハブがやってくれるのでネットワークの実装とゲームの実装を切り離してプログラム出来る。ゲームの実装はConnectionGUIプレハブのNetworkLevelLoad.csのgo.SendMessage(“OnNetworkLoadedLevel”,//・・・略から呼び出される、各オブジェクトのOnNetworkLoadedLevel関数に書き込む事だけを考えればいい。
オリジナルのプレイヤーオブジェクトの作り方
新規作成したオブジェクトにNetwork Interpolated Transformスクリプトを追加する。Network Interpolated Transformスクリプトの内容は良く分からないが機能的に同期を取るための設定のよう。これを新規追加したNetwork ViewコンポーネントのObservedにドラッグアンドドロップして適応させる。
ネットワーク上でNetwork.Instantiate関数を用いてインスタンス化されたオブジェクトに対して呼び出される関数OnNetworkInstantiateの作成をするために適当なクラスを作成(例えば上記の画像のようにThird Person Network Init 2)して、この中に以下のようなスクリプトを書き込む。
using UnityEngine; using System.Collections; public class ThirdPersonNetworkInit2 : MonoBehaviour { void OnNetworkInstantiate (NetworkMessageInfo msg) { // This is our own player //自身のプレイヤーオブジェクトかどうかをnetworkView.isMineで判別し //そうであればNetworkInterpolatedTransformスクリプトをオフにし //リモート側のプレイヤーオブジェクトであればNetworkInterpolatedTransformスクリプトをオンにする if (networkView.isMine) { GetComponent ().enabled = false; // This is just some remote controlled player } else { name += "Remote"; GetComponent ().enabled = false; GetComponent ().enabled = true; } } }
ネットワーク レベルロード
by http://docs-jp.unity3d.com/Documentation/Components/net-NetworkLevelLoad.html