unity netcode for gameobject(NGO)逻辑代码教程

这篇具有很好参考价值的文章主要介绍了unity netcode for gameobject(NGO)逻辑代码教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

本文均为作者摸索得出的经验,主要介绍制作联机游戏的逻辑代码,比如生成/销毁物体,逻辑同步等。以下内容仅仅是NGO的冰山一角,用于快速开发联机内容,我会在以后的文章里更新NGO类型的详细介绍

作者的信息源:

  1. youtube code monkeyLearn Unity Multiplayer (FREE Complete Course, Netcode for Game Objects Unity Tutorial 2023) (youtube.com)
  2. bilibili:Unity多人游戏学习:从MLAPI到Netcode for GameObjects_哔哩哔哩_bilibili
  3. 官方文档:About Netcode for GameObjects | Unity Multiplayer Networking (unity3d.com)

基础知识

Host/Client/Server

Client,Server是客户端和服务器,没什么好说的。Host就是将一个Client作为Server,而不额外创建Server。Host既是Client,也是Server,进行消息分发。

unmanaged value(非托管类型)

作为下文的  NetworkVariable和Rpc函数的参数

在我的学习范围内,只有非托管类型才能被网络传输,包括了数值与字符流(不是String,是指形如FixedString64Bytes的固定长度类型),也可以使用自定义类,但是它的字段必须全是unmanaged,并且实现INetworkSerializable接口。

有兴趣可以了解:

NGO官方文档介绍Custom Serialization | Unity Multiplayer Networking (unity3d.com)

C#官方介绍:Unmanaged types - C# reference - C# | Microsoft Learn

unity ngo,unity,游戏引擎

联机时的场景

每个客户端场景中都会有本地场景物体与网络物体,以下是2个Player物体,每加入一个玩家,每个客户端都会生成一个Player物体。接下来介绍的网络组件属性字段用来标识不同客户端的网络物体

unity ngo,unity,游戏引擎

网络组件属性字段

player脚本继承了NetworkBehaviour,所有需要网络同步的组件都要继承NetworkBehaviour

归属于本地的网络物体字段

unity ngo,unity,游戏引擎

归属于本地的网络物体字段:有变化的部分已指出

unity ngo,unity,游戏引擎

当unity运行客户端,窗口运行主机时

unity ngo,unity,游戏引擎

数值同步

NetworkVariable

任何的数值、枚举类型、字符流同步都推荐使用NetworkVariable

NGO文档对NetworkVariable的介绍

NetworkVariable | Unity Multiplayer Networking (unity3d.com)

简单来说NetworkVariable封装了基础数值类型,自动地将数值同步给所有客户端。任何时刻加入的客户端都会自动获得最新的数值,非常方便。

实例

举例:后加入的客户端能够同步最新的数值unity ngo,unity,游戏引擎

脚本展示

控制游戏运行时间

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Netcode;
public class GameManager : NetworkBehaviour {
    public static GameManager Instance { private set; get; }
    //标识游戏运行时间
    public NetworkVariable<float> GameTimer = new NetworkVariable<float>(0f);
    public float gameTimerMax = 10f;
    private void Awake() {
        Instance = this;
    }
    //在网络对象生成时调用,可以在这里初始化NetworkVariable,也可以直接声明时初始化
    public override void OnNetworkSpawn() {
        if (IsServer)
            GameTimer.Value = gameTimerMax;
    }
    private void Update() {
        //游戏运行时间应该由服务器控制,并且所有NetworkVariable的默认权限为只能被服务器修改,可以被所有客户端读取
        if (!IsServer) {
            return;
        }
        if (GameTimer.Value > 0) {
            GameTimer.Value -= Time.deltaTime;
        }
    }
}

时钟UI,及时展示 

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Clock : MonoBehaviour
{
    Image image;
    private void Awake() {
        image = GetComponent<Image>();
    }
    private void Start() {
        //NetworkVariable具有事件OnValueChanged,允许其他元素对此做出响应
        GameManager.Instance.GameTimer.OnValueChanged += GameTimer_OnValueChanged;
    }

    private void GameTimer_OnValueChanged(float previousValue, float newValue) {
        image.fillAmount = GameManager.Instance.GameTimer.Value / GameManager.Instance.gameTimerMax;
    }
}

逻辑同步

对于游戏行为的同步,NGO采用RPC(Remote Procedure Call)发送同步信息,除此之外还有Custom Messages,这里主要介绍RPC

个人理解:客户端和服务端使用同一套代码运行,但是执行同步的RPC函数的调用和运行被拆到了不同用户中。

官方文档(提供了运行逻辑图):ClientRpc | Unity Multiplayer Networking (unity3d.com)

Rpc

分为客户端RPC和服务端RPC,声明RPC函数时要用ServerRpc/ClientRpc结尾,并且函数开头声明[ServerRpc]/[ClientRpc]

Client Rpc

特点:在Server/Host中调用,在Client/Host中运行,客户端中不调用ClientRpc

测试案例:在GameManager末尾增加以下代码,添加了一个按钮,按下时UI文字会改变
 

public void DebugCallBack() {
        DebugClientRpc();
    }
[ClientRpc]
private void DebugClientRpc() {
    debugText.text = "button clicked";
}

效果展示:unity运行客户端,窗口运行主机

可以看到unity中按下按钮,文字不改变,但是窗口中按下按钮,二者一起改变,因为Host同样也作为客户端。这说明了ClientRpc在Server/Host中调用了,在所有客户端中运行了

unity ngo,unity,游戏引擎

Server Rpc

特点:与ClientRpc相反,在Client/Host中调用,在Server/Host中运行,Server中不调用ServerRpc

另外,ServerRpc有一个重要参数:RequireOwnership

因为Client可能有多个,这个参数指明了哪些Client可以调用ServerRpc,含义为是否需要拥有者权限。当RequireOwnership=false时,所有客户端都可以调用,为true时,只有定义ServerRpc函数的NetworkObject的拥有者可以调用。

举例:RequireOwnership=true

将GameManager末尾的代码替换成

    public void DebugCallBack() {
        DebugServerRpc();
    }
    [ServerRpc(RequireOwnership =true)]
    private void DebugServerRpc() {
        debugText.text = "button clicked";
    }

DebugServerRpc在GameManager中定义,GameManager属于Server/Host

unity ngo,unity,游戏引擎

测试: unity运行客户端,窗口运行主机

可以看到没有拥有者权限的客户端调用ServerRpc报错

unity ngo,unity,游戏引擎

RequireOwnership=false

将GameManager末尾的代码替换成

    public void DebugCallBack() {
        DebugServerRpc();
    }
    [ServerRpc(RequireOwnership = false)]
    private void DebugServerRpc() {
        debugText.text = "button clicked";
    }

测试: unity运行客户端,窗口运行主机

很显然,在Client中没有运行,而Host中运行了ServerRpc。同样地,Host是充当Sever的Client,Host能够调用ServerRpc,并且能够运行ServerRpc。此外,Host是GameManager的拥有者,RequireOwnership=true,仍然能够调用运行

unity ngo,unity,游戏引擎

利用Rpc广播消息

通过ServerRpc调用ClientRpc,实现广播

     public void DebugCallBack() {
        DebugServerRpc();
    }
    //在任意客户端按下按钮后,服务器运行ServerRpc,服务器再调用所有客户端的ClientRpc,实现了广播效果
    [ServerRpc(RequireOwnership = false)]
    private void DebugServerRpc() {
        DebugClientRpc();
    }
    
    [ClientRpc]
    private void DebugClientRpc() {
        debugText.text = "button clicked";
    }

测试:unity运行主机,其他窗口运行客户端

可以看到任何一个Client按下按钮后,其他所有客户端都会同步

unity ngo,unity,游戏引擎

RPC的消息分发逻辑

建议去看官方文档,很多配图ClientRpc | Unity Multiplayer Networking (unity3d.com)

这里只提一下,Host既是Client也是Server,如果Host是RPC的调用者也是执行者,那么该消息不再网络分发,而是直接本地执行。

unity ngo,unity,游戏引擎

写在未来

RPC是可以传递参数的,只能是unmanaged类型,并且RPC函数的默认参数提供了调用者的信息,以此我们可以定向地为玩家执行逻辑。下一章将讲述如何用RPC动态创建物体文章来源地址https://www.toymoban.com/news/detail-761502.html

到了这里,关于unity netcode for gameobject(NGO)逻辑代码教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Unity Netcode for GameObjects多人联机(源文件)

    Unity Netcode for GameObjects多人联机(源文件)

    一、安装Netcode for Gameobjects Netcode for Gameobjects是Unity新推出的联机解决方案,该解决方案目前处于初期,相关功能不是很完善,但是用起来还不错。下面介绍一下相关用法。 首先下载安装Netcode for Gameobjects,其官方网站为Netcode for Gameobjects,安装方式也很简单,新建好Unity项目

    2024年02月03日
    浏览(14)
  • Unity 基于Netcode for gameObjects实现局域网同步

    Unity 基于Netcode for gameObjects实现局域网同步

    1.需要将unity升级到2021.3及以后的版本的稳定版本,使用不稳定的2022版本测试过,存在打包问题: 1. Netcode for gameObjects 2. Multiplayer Tools 该package是附带Netcode for GameObjects手动安装的 3. Burst 该Package同样也是附带安装,如果在不稳定的2022版本中打包问题也源于这个package,猜测可能

    2024年02月11日
    浏览(26)
  • 多元分类预测 | Matlab基于北方苍鹰优化深度置信网络(NGO-DBN)的分类预测,多输入模型,NGO-DBN分类预测

    多元分类预测 | Matlab基于北方苍鹰优化深度置信网络(NGO-DBN)的分类预测,多输入模型,NGO-DBN分类预测

    效果一览 文章概述 多元分类预测 | Matlab基于北方苍鹰优化深度置信网络(NGO-DBN)的分类预测,多输入模型,NGO-DBN分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可出分类效果图,迭代优化图,混淆矩阵图。

    2024年02月13日
    浏览(13)
  • 【Matlab】智能优化算法_北方苍鹰算法NGO

    【Matlab】智能优化算法_北方苍鹰算法NGO

    北方苍鹰是一种猛禽,其狩猎策略代表了一个优化过程。在这种策略中,北方苍鹰首先选择猎物并攻击它,然后在追逐过程中猎杀选定的猎物。 本文的创新之处在于设计了一种新的基于苍鹰的优化算法,称为北方苍鹰优化(NGO),模仿北方猎鹰的行为。拟议的NGO算法的各个步

    2024年02月03日
    浏览(11)
  • 分类预测 | MATLAB实现NGO-DBN北方苍鹰优化深度置信网络多特征输入分类预测

    分类预测 | MATLAB实现NGO-DBN北方苍鹰优化深度置信网络多特征输入分类预测

    效果一览 基本介绍 MATLAB实现NGO-DBN北方苍鹰优化深度置信网络多特征输入分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可出分类效果图,迭代优化图,混淆矩阵图。 北方苍鹰优化学习率、迭代次数和隐

    2024年02月11日
    浏览(16)
  • 时序分解 | Matlab实现NGO-VMD北方苍鹰算法优化变分模态分解时间序列信号分解

    时序分解 | Matlab实现NGO-VMD北方苍鹰算法优化变分模态分解时间序列信号分解

    效果一览 基本介绍 北方苍鹰算法NGO优化VMD,对其分解层数,惩罚因子数做优化,利用NGO优化算法确定其最佳参数,适应度函数为样本熵。 NGO-VMD北方苍鹰算法NGO优化VMD变分模态分解 可直接运行 分解效果好 适合作为创新点(Matlab完整源码和数据) 1.利用北方苍鹰算法算法优化

    2024年02月05日
    浏览(8)
  • 回归预测 | MATLAB实现NGO-SVM北方苍鹰算法优化支持向量机多输入单输出回归预测(多指标,多图)

    回归预测 | MATLAB实现NGO-SVM北方苍鹰算法优化支持向量机多输入单输出回归预测(多指标,多图)

    效果一览 基本介绍 回归预测 | MATLAB实现NGO-SVM北方苍鹰算法优化支持向量机多输入单输出回归预测(多指标,多图),输入多个特征,输出单个变量,多输入单输出回归预测; 多指标评价,代码质量极高;excel数据,方便替换,运行环境2018及以上。 程序设计 完整源码和数据

    2024年02月11日
    浏览(18)
  • Unity之NetCode多人网络游戏联机对战教程(1)

    Unity之NetCode多人网络游戏联机对战教程(1)

    官网链接:https://docs-multiplayer.unity3d.com/netcode/current/about/ Netcode for GameObjects(NGO)是专为Unity构建的高级网络库。它能够在网络会话中将 GameObject 和 世界数据 同时发送给多名玩家。使用NGO不必关心低级协议和网络框架。 打开一个unity项目,在菜单栏中选择 Window Package Manager

    2024年02月07日
    浏览(38)
  • Unity之NetCode多人网络游戏联机对战教程(4)--连接申请ConnectionApproval

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

    没看过前面的教程请先阅读前面的教程,本期将会讲到Netcode联机的申请,当一个Client想连接进来,应向Server发送申请联机的信息,然后由服务端向客户端下发数据,所有数据应该在服务端,而不是在客户端。 举几个常见的例子需要用到 ConnectionApproval 的场景 使用密码加入房

    2024年02月03日
    浏览(22)
  • 【Unity基础】什么是GameObject

    【Unity基础】什么是GameObject

    环境: UnityHub3.3.0-c8 Unity2021.3.20f1c1 LTS Visual Studio 2022 在 Unity 中, GameObject 是游戏中最基本的实体。它可以被看作是游戏场景中所有其他对象的容器。 GameObject 可以包含许多不同的组件,如 Transform、Renderer、Collider``等。通过添加这些组件,GameObject 可以具有不同的属性和功能,

    2024年02月08日
    浏览(10)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包