1.Network.Player
獲取本地NetworkPlayer實例NetworkPlayer,一個可以從網(wǎng)絡(luò)定位玩家的數(shù)據(jù)結(jié)構(gòu)。我們來看一下API的查看一下包含的變
量:NetworkPlayer.ipAddress
IP我們可以得到這個參數(shù)的IP地址,NetworkPlayer.externalIP得到外網(wǎng)的IP,port和external
port可以的到端口和外網(wǎng)的端口。內(nèi)網(wǎng)跟外網(wǎng)的區(qū)別大家可以去查一查,個人理解就是一個局域網(wǎng)和外部網(wǎng)絡(luò)。GUID這個我也不清楚什么東西,就是知道在
初始化服務(wù)器的參數(shù),具體功能后面再說,對其運行機(jī)制的有興趣的朋友可以查一查。
2.OnServerInitialized()當(dāng)Network.InitializeServer被調(diào)用并完成時,在服務(wù)器上調(diào)用Network.InitializeServer(connections : int, listenPort : int, useNat : bool)初始化服務(wù)器Network.Instantiate()實例化預(yù)設(shè),我們看一看他的參數(shù):connections是允許的入站連接或玩家的數(shù)量,listenPort是要監(jiān)聽的端口(如果不知道什么是端口的,自己查查看吧,我真不想說),useNat設(shè)置NAT穿透功能。如果你想要這個服務(wù)器能夠接受連接使用NAT穿透,使用facilitator,設(shè)置這個為true(打臉啊,這么快就出來了)。
3.OnPlayerConnected()當(dāng)一個新玩家成功連接時在服務(wù)器調(diào)用。
4.OnSerializeNetworkView() 自定義變量同步。后續(xù)會有這個函數(shù)的講解。
5.OnPlayerDisconnected()當(dāng)一個玩家從服務(wù)器上斷開時在服務(wù)器端調(diào)用Network.RemoveRPCs(player)移除所有屬于這個玩家的ID的RPC函數(shù)
Network.Destroy()跨網(wǎng)絡(luò)銷毀該物體(本地和遠(yuǎn)端)
6.OnDisconnectedFromServer()當(dāng)失去連接或從服務(wù)器端斷開時在客戶端調(diào)用
7.Network.peerType端類型的狀態(tài),即disconnected, connecting, server 或 client四種NetworkPeerType 描述作為由Network.peerType返回的網(wǎng)絡(luò)接口端類型的狀態(tài)
8.Network.connections所有連接的玩家
9.NetworkView網(wǎng)絡(luò)視圖,定義什么在網(wǎng)絡(luò)上同步和如何同步Gameobject.networkView 附屬于這個游戲物體上的網(wǎng)絡(luò)視圖networkView.RPC()遠(yuǎn)程過程調(diào)用
10.Network.Disconnect() 關(guān)閉所有開放的連接并關(guān)閉網(wǎng)絡(luò)接口。
了解了上面的函數(shù)之后,我們先做一個簡單的連接。?
[AppleScript] 純文本查看 復(fù)制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Use this for initialization
//定義遠(yuǎn)程連接IP地址
private string remoteIP = "127.0.0.1";
//定義遠(yuǎn)程的端口號
private int remotePort = 10000;
//限制連接數(shù)量為15個用戶
private int connectCount=15;
//是否啟用網(wǎng)絡(luò)地址轉(zhuǎn)換器
private bool useNAT=false;
void OnGUI() {
switch (Network.peerType) {
case NetworkPeerType.Disconnected:
//服務(wù)器未開啟時,開啟服務(wù)器
StartConnect();
break;
case NetworkPeerType.Server:
//成功連接服務(wù)器
OnServer();
break;
case NetworkPeerType.Client:
break;
case NetworkPeerType.Connecting:
break;
}
}
(這尼瑪貼不了圖了,湊合著看吧);這段斷代碼做了一個簡單的判斷,其中Network.peerType用來判斷網(wǎng)絡(luò)的連接狀態(tài)(是否連接,是客戶端還是服務(wù)端);
繼續(xù):
[AppleScript] 純文本查看 復(fù)制代碼
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
void StartConnect(){
remoteIP=GUI.TextField(new Rect(10,30,100,20),remoteIP);
if(GUI.Button(new Rect(10,50,100,30),"創(chuàng)建服務(wù)器")){
Network.incomingPassword="UnityNetwork";
NetworkConnectionError error=Network.InitializeServer(connectCount,remotePort,useNAT);
Debug.Log(error);
}
if(GUI.Button(new Rect(10,85,100,30),"連接服務(wù)器")){
NetworkConnectionError error=Network.Connect(remoteIP,remotePort,"UnityNetwork");
Debug.Log(error);
}
}
這個函數(shù)表示服務(wù)端的?連接。
void OnServer() {
GUILayout.Label(" 服務(wù)端創(chuàng)建成功。等待連接····");
//得到的IP與端口
string ip=Network.player.ipAddress;
int port=Network.player.port;
GUILayout.Label(" ip地址:"+ip+".\n 端口號碼:"+port);
//連接到服務(wù)器的所有客戶端
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),"斷開連接"))
{
//從服務(wù)器上斷開連接
Network.Disconnect(200);
}
}
///
/// 當(dāng)有新的用戶連接進(jìn)來時
///
void OnPlayerConnected(NetworkPlayer player){
Debug.Log("新連接入客戶端:"+player);
SendMessage("createPlayer",player);
//networkView.RPC("OnNetworkLoaded",RPCMode.Others,player);
}
///
/// 當(dāng)現(xiàn)有用戶斷線時
///
void OnPlayerDisconnected(NetworkPlayer player) {
Debug.Log("清除對象: " + player);
Network.RemoveRPCs(player);
Network.DestroyPlayerObjects(player);
}
///
/// 當(dāng)前腳本作為客戶端時 成功連接到服務(wù)器時 調(diào)用當(dāng)前方法
///
void OnConnectedToServer(){
Debug.Log("客戶端成功連接上服務(wù)器了?。?!");
}
好了,到此為止,創(chuàng)建連接的腳本已經(jīng)建立完成。下次更新信息同步的功能。?
SendMessage("createPlayer",player);這個信息發(fā)送無法執(zhí)行,因為“create Player”方法在另一個腳本中,如果有朋友想要嘗試運行此腳本,將這個方法暫時注掉就可以了。
文/zero_lb(簡書作者)
原文鏈接:http://www.jianshu.com/p/fec3ec5f8f16
著作權(quán)歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),并標(biāo)注“簡書作者”。