Unity之NetCode多人网络游戏联机对战教程(4)--连接申请ConnectionApproval

这篇具有很好参考价值的文章主要介绍了Unity之NetCode多人网络游戏联机对战教程(4)--连接申请ConnectionApproval。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

没看过前面的教程请先阅读前面的教程,本期将会讲到Netcode联机的申请,当一个Client想连接进来,应向Server发送申请联机的信息,然后由服务端向客户端下发数据,所有数据应该在服务端,而不是在客户端。


适用场景

举几个常见的例子需要用到ConnectionApproval的场景

  • 使用密码加入房间
  • 玩家选择不同的角色
  • 房间人数
  • 各种需要服务端下发的信息等等

1. 准备

需要在第二期上添加多的一个Player预制体

unity netcode,# NetCode,unity,netcode,NGO,Approval,Connection

unity netcode,# NetCode,unity,netcode,NGO,Approval,Connection

每个Player都需要挂载上NetworkObject这个组件

unity netcode,# NetCode,unity,netcode,NGO,Approval,Connection

最重要的一点是在NetworkManager上开启ConnectionApproval

unity netcode,# NetCode,unity,netcode,NGO,Approval,Connection


2.新建GameManager

新建一个GameManager空物体,添加NetworkObject这个组件

unity netcode,# NetCode,unity,netcode,NGO,Approval,Connection

Scripts目录下新建一个GameManager脚本,挂载到GameManager的空物体上

using UnityEngine;
using Unity.Netcode;
using System.Text;

public class GameManager : NetworkBehaviour
{
    public GameObject Man;
    public GameObject Girl;

    public override void OnNetworkSpawn()
    {
        if (IsServer)
        {
            NetworkManager.ConnectionApprovalCallback = ApprovalCheck;
        }
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.O))
        {
            NetworkManager.Singleton.NetworkConfig.PlayerPrefab = Man;
            NetworkManager.Singleton.StartHost();
        }

        if (Input.GetKeyDown(KeyCode.P))
        {
            NetworkManager.Singleton.NetworkConfig.ConnectionData = Encoding.UTF8.GetBytes("Girl");
            NetworkManager.Singleton.StartClient();
        }
    }

    private void ApprovalCheck(NetworkManager.ConnectionApprovalRequest request, NetworkManager.ConnectionApprovalResponse response)
    {
        // The client identifier to be authenticated
        var clientId = request.ClientNetworkId;

        // Additional connection data defined by user code
        var connectionData = request.Payload;

        var _character = Encoding.UTF8.GetString(connectionData);

        if (_character == "Girl")
        {
            response.PlayerPrefabHash = Girl.GetComponent<NetworkObject>().PrefabIdHash;
        }
        else
        {
            response.PlayerPrefabHash = Man.GetComponent<NetworkObject>().PrefabIdHash;
        }

        // Your approval logic determines the following values
        response.Approved = true;
        response.CreatePlayerObject = true;

        // Position to spawn the player object (if null it uses default of Vector3.zero)
        response.Position = Vector3.zero;

        // Rotation to spawn the player object (if null it uses the default of Quaternion.identity)
        response.Rotation = Quaternion.identity;

        // If response.Approved is false, you can provide a message that explains the reason why via ConnectionApprovalResponse.Reason
        // On the client-side, NetworkManager.DisconnectReason will be populated with this message via DisconnectReasonMessage
        response.Reason = "Some reason for not approving the client";

        // If additional approval steps are needed, set this to true until the additional steps are complete
        // once it transitions from true to false the connection approval response will be processed.
        response.Pending = false;
    }
}

Inspector窗口绑定一下两个角色到脚本中

unity netcode,# NetCode,unity,netcode,NGO,Approval,Connection


3.编译运行

分别按下O键与P键,可以看到有两个不同的Player Prefab实例化了。

unity netcode,# NetCode,unity,netcode,NGO,Approval,Connection


4.脚本详解

  • GameManager继承的是NetworkBehaviour而非MonoBehaviour

重写OnNetworkSpawn()方法,让NetworkManager放入回调方法ApprovalCheck让服务端处理

public override void OnNetworkSpawn()
    {
        if (IsServer)
        {
            NetworkManager.ConnectionApprovalCallback = ApprovalCheck;
        }
    }

ApprovalCheck这个回调方法传入两个类型的参数,分别是NetworkManager.ConnectionApprovalRequestNetworkManager.ConnectionApprovalResponse

  • NetworkManager.ConnectionApprovalRequest 是客户端的请求,一共两个字段
    ClientNetworkId 是客户端的唯一标识ID
    Payload是客户端发送的信息,封装成byte类型,这也是我们主要使用的
private void ApprovalCheck(NetworkManager.ConnectionApprovalRequest request, NetworkManager.ConnectionApprovalResponse response)
    {
        // The client identifier to be authenticated
        var clientId = request.ClientNetworkId;

        // Additional connection data defined by user code
        var connectionData = request.Payload;

        var _character = Encoding.UTF8.GetString(connectionData);

        if (_character == "Girl")
        {
            response.PlayerPrefabHash = Girl.GetComponent<NetworkObject>().PrefabIdHash;
        }
        else
        {
            response.PlayerPrefabHash = Man.GetComponent<NetworkObject>().PrefabIdHash;
        }

        // Your approval logic determines the following values
        response.Approved = true;
        response.CreatePlayerObject = true;

        // Position to spawn the player object (if null it uses default of Vector3.zero)
        response.Position = Vector3.zero;

        // Rotation to spawn the player object (if null it uses the default of Quaternion.identity)
        response.Rotation = Quaternion.identity;

        // If response.Approved is false, you can provide a message that explains the reason why via ConnectionApprovalResponse.Reason
        // On the client-side, NetworkManager.DisconnectReason will be populated with this message via DisconnectReasonMessage
        response.Reason = "Some reason for not approving the client";

        // If additional approval steps are needed, set this to true until the additional steps are complete
        // once it transitions from true to false the connection approval response will be processed.
        response.Pending = false;
    }
  • NetworkManager.ConnectionApprovalResponse是服务端给客户端的响应,一共有八个字段
    Approved:是否同意客户端加入
    Reason: 如果Approvedfalse,填写拒绝理由
    CreatePlayerObject 是否生成玩家实体
    PlayerPrefabHash 如果null则生成在NetworkManager默认的Player Prefab,这个值要填入NetworkObjectPrefabIdHash
    Position生成玩家实体的position
    Rotation生成玩家实体的rotation
    Pending 挂起approval延迟授权,直到其他客户端完成approval, 官方解释:Provides the ability to mark the approval as pending to delay the authorization until other user-specific code finishes the approval process.

后话

官方相关的阅读文档:文章来源地址https://www.toymoban.com/news/detail-769079.html

  • https://docs-multiplayer.unity3d.com/netcode/current/basics/connection-approval/
  • https://docs-multiplayer.unity3d.com/netcode/current/basics/object-spawning/
  • GitHub

到了这里,关于Unity之NetCode多人网络游戏联机对战教程(4)--连接申请ConnectionApproval的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity2022】Unity多人游戏开发教程-Netcode for GameObjects-使用命令行启动多人游戏

    首先亮出文档,可以直接去看官方文档。 本文章大部分内容来源于官方文档,另一部分为笔者讲解的教程。 如果英语不好,或看不懂文档的人,可以阅读本文章。 官方文档 官方文档的中文翻译: 中文翻译 本教程使用的开发环境如下: Windows10 Unity 2022.3.0f1c1 Netcode for GameOb

    2024年02月08日
    浏览(59)
  • 【Unity2022】Unity多人游戏开发教程-安装Netcode for GameObjects

    首先亮出文档,可以直接去看官方文档。 本文章大部分内容来源于官方文档,另一部分为笔者讲解的教程。 如果英语不好,或看不懂文档的人,可以阅读本文章。 官方文档 官方文档的中文翻译: 中文翻译 本教程使用的开发环境如下: Windows10 Unity 2022.3.0f1c1 Netcode for GameOb

    2024年02月11日
    浏览(56)
  • unity使用PhotonEngine实现多人联机游戏开发(一)

    先来了解一下PhotonEngine(光子引擎),这是德国ExitGame公司开发的网络引擎,photonengine简单易上手,很多游戏公司开发的网络游戏都是使用的这个。这个网络引擎里面包括了PhotonCloud(光子云)、photonServer(光子服务器)、PhotonQuantum(确定性量子引擎)、PhotonVoice(光子语音)

    2024年02月07日
    浏览(56)
  • 2.6.C++项目:网络版五子棋对战之数据管理模块-游戏房间管理模块的设计

    对匹配成功的玩家创建房间,建立起一个小范围的玩家之间的关联关系! 房间里一个玩家产生的动作将会广播给房间里的其他用户。 将这些房间管理起来,以便于进行房间生命周期的控制! 游戏房间类: // 实现两个部分: // 1. 房间的设计 // 2. 房间管理的设置 // 游戏房间的

    2024年02月08日
    浏览(43)
  • 在Unity中使用Photon(网络多人联机)

    photon官网地址

    2024年02月04日
    浏览(42)
  • 【联机对战】微信小程序联机游戏开发流程详解

    现有一个微信小程序叫中国象棋项目,棋盘类的单机游戏看着有缺少了什么,现在给补上了,加个联机对战的功能,增加了可玩性,对新手来说,实现联机游戏还是有难度的,那要怎么实现的呢,接下来给大家讲一下。 考虑到搭建联机游戏的服务器成本不小,第一个想法是用

    2024年02月04日
    浏览(138)
  • 【简单3d网络游戏制作】——基于Unity

    目录 Demo展示 前期知识点准备 1.delegate委托 2.通信协议 3.List容器 4.dictionary容器 5.MethodInfo类 进入创作 c/s通用通信协议: 客户端  1.场景搭建 2.BaseHuman刨析(Sync+Ctrl)         Ctrl脚本         Sync完整代码          BaseHuman完整代码 3.NetManager刨析 4.Main刨析       

    2024年02月05日
    浏览(55)
  • Unity游戏开发客户端面经——网络(初级)

    前言:记录了总6w字的面经知识点,文章中的知识点若想深入了解,可以点击链接学习。由于文本太多,按类型分开。这一篇是 网络 常问问题总结,有帮助的可以收藏。 区别 UDP TCP 是否连接 不连接 面向连接 是否可靠 不可靠 可靠传输(传输过程中会丢失,但会重发)使用

    2024年02月01日
    浏览(44)
  • 21uec++多人游戏【AI联机】

    一句话,跟掉血有关的代码都在服务器端执行 修改小球的游戏开始函数 在服务器端,小球自动寻找路径 修改SelfDestruct函数 在服务器端小球会对自己施加伤害 修改每帧函数 在服务器端,小球自动寻找路径 修改重叠函数 在服务器端,小球自爆倒计时 修改生命值组件 添加网络

    2024年02月15日
    浏览(51)
  • 【UE5 多人联机教程】04-加入游戏

    1. 新建一个控件蓝图,父类为“USC_Button_Standard”  控件蓝图命名为“UMG_Item_Room”,用于表示每一个搜索到的房间的界面 打开“UMG_Item_Room”,在图表中新建一个变量,命名为“Session”  变量类型为“蓝图会话结果”,选择可编辑实例和生成时公开 2. 打开“UMG_MainMenu”,添加

    2024年02月15日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包