文档地址1:https://docs-multiplayer.unity3d.com/netcode/current/tutorials/get-started-ngo/
创建空对象NetworkManager并添加NetworkManager组件
打开 Protocol type 下拉选项, 选择UnityTransport,然后勾选 allow remote Connections
创建空对象Player并添加组件NetworkObject,然后将其制作成预制体,新建脚本Player并将父类更换为NetworkBehaviour,并创建方法OnNetworkSpawn,TestServerRpc,TestClientRpc,最后将Player预制体拖拽至NetworkManager对象的Player Prefab属性上。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Netcode;
public class Player : NetworkBehaviour
{
/// <summary>
/// 当前对象生成时调用
/// </summary>
public override void OnNetworkSpawn()
{
// 非服务器,且是属于当前玩家的对象
if (!IsServer && IsOwner)
{
// 发送信息至服务器(即客户端向服务器发送信息)
TestServerRpc(0, NetworkObjectId);
}
}
/// <summary>
/// 客户端不运行该方法,服务器端运行该方法
/// </summary>
/// <param name="value"></param>
/// <param name="sourceNetworkObjectId"></param>
[Rpc(SendTo.Server)]
void TestServerRpc(int value, ulong sourceNetworkObjectId)
{
Debug.Log($"服务器接收:#{value} 发送端:#{sourceNetworkObjectId}");
// 分发信息至所有客户端
TestClientRpc(value, sourceNetworkObjectId);
}
/// <summary>
/// 客户端运行该方法,服务器端不运行该方法
/// </summary>
/// <param name="value"></param>
/// <param name="sourceNetworkObjectId"></param>
[Rpc(SendTo.ClientsAndHost)]
void TestClientRpc(int value, ulong sourceNetworkObjectId)
{
Debug.Log($"客户端接受:#{value} 发送端:#{sourceNetworkObjectId}");
}
}
在NetworkBehaviour对象下创建NetworkCommandLine对象,创建并添加NetworkCommandLine脚本(该脚本用于读取启动时的命令参数并根据参数决定按服务器还是客户端启动,编辑器下跳过)
using System.Collections.Generic;
using Unity.Netcode;
using UnityEngine;
public class NetworkCommandLine : MonoBehaviour
{
private NetworkManager netManager;
void Start()
{
netManager = GetComponentInParent<NetworkManager>();
if (Application.isEditor) return;
// 获取命令行参数映射
var args = GetCommandlineArgs();
// 获取运行模式
if (args.TryGetValue("-mode", out string mode))
{
switch (mode)
{
// 按服务器启动
case "server":
netManager.StartServer();
break;
case "host":
netManager.StartHost();
break;
// 按客户端启动
case "client":
netManager.StartClient();
break;
}
}
}
private Dictionary<string, string> GetCommandlineArgs()
{
Dictionary<string, string> argDictionary = new Dictionary<string, string>();
var args = System.Environment.GetCommandLineArgs();
for (int i = 0; i < args.Length; ++i)
{
var arg = args[i].ToLower();
if (arg.StartsWith("-"))
{
var value = i < args.Length - 1 ? args[i + 1].ToLower() : null;
value = (value?.StartsWith("-") ?? false) ? null : value;
argDictionary.Add(arg, value);
}
}
return argDictionary;
}
}
修改运行窗口配置,并打包程序
运行程序