天天看點

Unity3dNetwork網絡基礎學習

1.Network.Player

擷取本地NetworkPlayer執行個體NetworkPlayer,一個可以從網絡定位玩家的資料結構。我們來看一下API的檢視一下包含的變

量:NetworkPlayer.ipAddress

IP我們可以得到這個參數的IP位址,NetworkPlayer.externalIP得到外網的IP,port和external

port可以的到端口和外網的端口。内網跟外網的差別大家可以去查一查,個人了解就是一個區域網路和外部網絡。GUID這個我也不清楚什麼東西,就是知道在

初始化伺服器的參數,具體功能後面再說,對其運作機制的有興趣的朋友可以查一查。

2.OnServerInitialized()當Network.InitializeServer被調用并完成時,在伺服器上調用Network.InitializeServer(connections : int, listenPort : int, useNat : bool)初始化伺服器Network.Instantiate()執行個體化預設,我們看一看他的參數:connections是允許的入站連接配接或玩家的數量,listenPort是要監聽的端口(如果不知道什麼是端口的,自己查檢視吧,我真不想說),useNat設定NAT穿透功能。如果你想要這個伺服器能夠接受連接配接使用NAT穿透,使用facilitator,設定這個為true(打臉啊,這麼快就出來了)。

3.OnPlayerConnected()當一個新玩家成功連接配接時在伺服器調用。

4.OnSerializeNetworkView() 自定義變量同步。後續會有這個函數的講解。

5.OnPlayerDisconnected()當一個玩家從伺服器上斷開時在伺服器端調用Network.RemoveRPCs(player)移除所有屬于這個玩家的ID的RPC函數

Network.Destroy()跨網絡銷毀該物體(本地和遠端)

6.OnDisconnectedFromServer()當失去連接配接或從伺服器端斷開時在用戶端調用

7.Network.peerType端類型的狀态,即disconnected, connecting, server 或 client四種NetworkPeerType 描述作為由Network.peerType傳回的網絡接口端類型的狀态

8.Network.connections所有連接配接的玩家

9.NetworkView網絡視圖,定義什麼在網絡上同步和如何同步Gameobject.networkView 附屬于這個遊戲物體上的網絡視圖networkView.RPC()遠端過程調用

10.Network.Disconnect() 關閉所有開放的連接配接并關閉網絡接口。

了解了上面的函數之後,我們先做一個簡單的連接配接。​

[AppleScript]純文字檢視複制代碼

​​​​​// Use this for initialization

//定義遠端連接配接IP位址

private string remoteIP = "127.0.0.1";

//定義遠端的端口号

private int remotePort = 10000;

//限制連接配接數量為15個使用者

private int connectCount=15;

//是否啟用網絡位址轉換器

private bool useNAT=false;

void OnGUI() {

switch (Network.peerType) {

case NetworkPeerType.Disconnected:

//伺服器未開啟時,開啟伺服器

StartConnect();

break;

case NetworkPeerType.Server:

//成功連接配接伺服器

OnServer();

case NetworkPeerType.Client:

case NetworkPeerType.Connecting:

}

​(這尼瑪貼不了圖了,湊合着看吧);這段斷代碼做了一個簡單的判斷,其中Network.peerType用來判斷網絡的連接配接狀态(是否連接配接,是用戶端還是服務端);

繼續:

void StartConnect(){

remoteIP=GUI.TextField(new Rect(10,30,100,20),remoteIP);

if(GUI.Button(new Rect(10,50,100,30),"建立伺服器")){

Network.incomingPassword="UnityNetwork";

NetworkConnectionError error=Network.InitializeServer(connectCount,remotePort,useNAT);

Debug.Log(error);

if(GUI.Button(new Rect(10,85,100,30),"連接配接伺服器")){

NetworkConnectionError error=Network.Connect(remoteIP,remotePort,"UnityNetwork");

這個函數表示服務端的​連接配接。

void OnServer() {

GUILayout.Label("  服務端建立成功。等待連接配接····");

//得到的IP與端口

string ip=Network.player.ipAddress;

int port=Network.player.port;

GUILayout.Label("  ip位址:"+ip+".\n  端口号碼:"+port);

//連接配接到伺服器的所有用戶端

int connectLength=Network.connections.Length;

//周遊所有用戶端并擷取IP與端口号

for(int i=0;i

GUILayout.Label("  連接配接的IP:"+Network.connections.ipAddress);

GUILayout.Label("  連接配接的端口:"+Network.connections.port);

if(GUI.Button(new Rect(10,140,100,30),"斷開連接配接"))

{

//從伺服器上斷開連接配接

Network.Disconnect(200);

///

/// 當有新的使用者連接配接進來時

void OnPlayerConnected(NetworkPlayer player){

Debug.Log("新連接配接入用戶端:"+player);

SendMessage("createPlayer",player);

//networkView.RPC("OnNetworkLoaded",RPCMode.Others,player);

/// 當現有使用者斷線時

void OnPlayerDisconnected(NetworkPlayer player) {

Debug.Log("清除對象: " + player);

Network.RemoveRPCs(player);

Network.DestroyPlayerObjects(player);

/// 目前腳本作為用戶端時 成功連接配接到伺服器時 調用目前方法

void OnConnectedToServer(){

Debug.Log("用戶端成功連接配接上伺服器了!!!");

好了,到此為止,建立連接配接的腳本已經建立完成。下次更新資訊同步的功能。​

​SendMessage("createPlayer",player);這個資訊發送無法執行,因為“create Player”方法在另一個腳本中,如果有朋友想要嘗試運作此腳本,将這個方法暫時注掉就可以了。

繼續閱讀