Unity Netcode 实践笔记-网络连接及玩家创建(二)

文档地址1:https://docs-multiplayer.unity3d.com/netcode/current/tutorials/get-started-ngo/

文档地址2:

创建空对象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;
    }
}

修改运行窗口配置,并打包程序

运行程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随与坏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值