Unity Network 使用小結
Unity提供了NetWork的方法來實現網路連線,而實際專案中缺很少備用到了。這裡作為了解NetWork的使用,做了一個CS區域網遊戲的功能
建立伺服器和連線客戶端的方法
using UnityEngine;
using System.Collections;
public class MyNetwork : MonoBehaviour
{
public int connections = 10;
public int listenPort = 8899;
public bool useNat = false;
public string ip = "127.0.0.1";
public GameObject playerPrefab;
void OnGUI()
{
if (Network.peerType == NetworkPeerType.Disconnected)
{
if (GUILayout.Button("建立伺服器"))
{
//進行建立伺服器的操作
NetworkConnectionError error = Network.InitializeServer(connections, listenPort, useNat);
print(error);
}
if (GUILayout.Button("連結伺服器"))
{
NetworkConnectionError error = Network.Connect(ip, listenPort);
print(error);
}
}
else if (Network.peerType == NetworkPeerType.Server)
{
GUILayout.Label("伺服器建立完成");
}
else if(Network.peerType == NetworkPeerType.Client)
{
GUILayout.Label("客戶端已經接入");
}
}
//注意,這兩個方法都是在伺服器上呼叫的
private void OnServerInitlized()
{
print("Server 完成初始化");
//Network.player;//訪問到當前的player,客戶端
int group = int.Parse(Network.player + "");//直接訪問Network.player會得到當前客戶端的索引是唯一的
Network.Instantiate(playerPrefab,new Vector3(0,10,0),Quaternion.identity,group );
}
private void OnPlayerConnected(NetworkPlayer player)
{
print("一個客戶端連線過來,Index,number:" +player);
}
private void OnConnectedToServer()
{
print("我成功連線到伺服器了");
int group = int.Parse(Network.player + "");//直接訪問Network.player會得到當前客戶端的索引是唯一的
Network.Instantiate(playerPrefab, new Vector3(0, 10, 0), Quaternion.identity, group);
}
//network view 元件用來在區域網之內去同步一個遊戲物體的元件屬性
//network view 會把建立出來的客戶端作為主人,就是主客戶端,其他的客戶端都是會以主客戶端為準
}
Network
class in UnityEngine
Description
The network class is at the heart of the network implementation and provides the core functions.
This class configures the network interface and all the network parameters. You use it to set up a server or connect to one and have a row of helper functions to help you with those tasks. For more information on what is exposed in the editor see the Network Manger component reference.
NetworkConnectionError error = Network.InitializeServer(connections, listenPort, useNat);
建立伺服器,連線數,埠,是否使用Nat功能;
Network.InitializeServer(connections, listenPort, useNat)<span style="color: rgb(27, 34, 41); line-height: 1em; font-family: 'Open Sans', sans-serif; background-color: rgb(255, 255, 255);"> Description</span>
Initialize the server.
connections
the number of allowed incomingis connections (note that this is generally not the same as the number
of players). listenPort
is the port number we want to listen to. useNat
sets
the NAT punchthrough functionality. If you want this server to be able to accept connections using NAT punchthrough, using the facilitator, set this to true.
連線錯誤,通過Debug,可以判斷連線是否成功
NetworkConnectionError error<span style="color: rgb(27, 34, 41); line-height: 1em; font-family: 'Open Sans', sans-serif; background-color: rgb(255, 255, 255);"> Description</span>
Possible status messages returned by Network.Connect and in OnFailedToConnect in case the error was not immediate.
Also used by the MasterServer in OnFailedToConnectToMasterServer.
OnServerInitlized,<span style="font-family: Arial, Helvetica, sans-serif;">OnConnectedToServer 是Unity提供的伺服器建立成功,客戶端連線到伺服器的執行</span>
在Network建立物體的方法由GameObject.Instantiate=>Network.Instantitae。原因是不論是客戶端和伺服器都要同步相應的建立操作,原來的方法顯然是不能滿足的。
private void OnServerInitialized()
{
//服務端
//GameController.Instantiate(soldierPrefab, pos1.position, Quaternion.identity);
NetworkPlayer player = Network.player;
int group = int.Parse(player + "");
GameObject go = Network.Instantiate(soldierPrefab, pos1.position, Quaternion.identity, group) as GameObject;
go.GetComponent<Player>().SetOwnerPlayer(Network.player);// 這個程式碼值設定了當前建立者的戰士的ownerPlayer屬性,在其他客戶端這個屬性是為null的
//RPC:遠端過程呼叫
go.networkView.RPC("SetOwnerPlayer",RPCMode.AllBuffered,Network.player);//完成一個遠端呼叫,會執行所有連線的客戶端上的setownerplayer方法
Screen.showCursor = false;
}
go.GetComponent<Player>().SetOwnerPlayer(Network.player);// 這個程式碼值設定了當前建立者的戰士的ownerPlayer屬性,在其他客戶端這個屬性是為null的
是呼叫伺服器本地的方法。
go.networkView.RPC("SetOwnerPlayer",RPCMode.AllBuffered,Network.player);//完成一個遠端呼叫,會執行所有連線的客戶端上的setownerplayer方法
呼叫客戶端執行相同的方法。
關於RPC要解釋下,“SetOwnerPlyer” 方法名,類似SeneMessage方法,RPCMode.AllBuffered通知所有物件和快取。
[RPC]//使用這個註解表示這個方法是一個遠端呼叫的方法
public void SetOwnerPlayer(NetworkPlayer player)
{
this.ownpalyer = player;
if (Network.player != player)
{
LoseControl();//如果當前角色不是這個戰士的建立者,就要把戰士的控制禁用掉
}
}
相關文章
- Unity UI優化小結UnityUI優化
- Siamese network總結
- .NET程式設計5月小結 - Blazor, Unity, Dependency Injection程式設計BlazorUnity
- Git使用小結Git
- FlatBuffers使用小結
- CocoaPods使用小結
- PyCharm工具使用小結PyCharm
- DM TDD使用小結
- 命令列使用小結命令列
- unity小恐龍模型控制Unity模型
- Unity Shader 00 - 梳理 Unity Shader 的基本結構Unity
- XGBoost類庫使用小結
- W5500 使用小結
- Editor.md 使用小結
- git 子模組使用小結Git
- Spring之RestTemplate使用小結SpringREST
- Android ConstraintLayout 最新使用小結AndroidAI
- 【Unity3D開發小遊戲】《戰棋小遊戲》Unity開發教程Unity3D遊戲
- Unity I18N 小探Unity
- Unity之掛載小問題Unity
- Unity使用小劇場—建立的按鈕On Click()只有MonoScript怎麼辦UnityMono
- Elasticsearch Head外掛使用小結Elasticsearch
- .Net(c#)使用 Kafka 小結C#Kafka
- Flutter使用TabBar問題小結FluttertabBar
- YUIDoc的使用方法小結UI
- 對於Unity回撥、監聽與廣播的使用總結Unity
- unity ui的建立方式小記UnityUI
- Unity 遊戲框架搭建 2019 (五十、五十一) 訊息機制小結&MonoBehaviourSimplify 是框架?Unity遊戲框架Mono
- Jib使用小結(Maven外掛版)Maven
- 阿里出品Excel工具EasyExcel使用小結阿里Excel
- Redux在React中的使用小結ReduxReact
- Elasticsearch-head外掛使用小結Elasticsearch
- Pytorch Optimizer類使用小技巧總結PyTorch
- ThinkPHP 5 模型使用歷程 - 小結PHP模型
- 日誌檔案使用小結(轉)
- 生成Dll在Unity中使用Unity
- 施耐德UNITY下使用ST程式設計計算最近一小時的均值Unity程式設計
- Facebook Instant Game小遊戲開發 如何接入 AUDIENCE NETWORKGAM遊戲開發
- Mybatis使用小技巧-自定義結果集MyBatis