Unity | NGO网络框架

目录

 一、相关属性及变量

1.ServerRpc属性

2.ClientRpc属性

3.NetworkVariable变量

二、相关组件

1.NetworkManager

2.Unity Transport

3.Network Object

4.NetworkBehaviour:

5.NetworkTransform

Syncing(Synchronizing)

Thresholds

Interpolation

三、Demo

1.同步位置及颜色

2.NetworkTransform应用


        Netcode for GameObjects(简称Netcode或NGO)是一个为Unity构建的高级网络库,可用于抽象化网络逻辑,抽象化网络逻辑是指将网络通信的复杂性和细节隐藏在一个高级接口之后,使开发者能够更专注于构建游戏,而无需深入了解底层的网络协议和通信机制。Netcode提供了简单的网络操作,让我们能够更方便的将GameObject和世界数据通过网络会话发送给多个玩家或接收,并在多个玩家之间同步数据。

        官网:Unity Multiplayer Networking | Unity Multiplayer Networking

 一、相关属性及变量

1.ServerRpc属性

        被添加到方法上以标记方法为远程过程调用,ServerRpc在客户端调用,服务器端执行。

[ServerRpc]
public void ColorServerRpc()//注意函数以ServerRpc为后缀
{
    Debug.Log("来自客户端的请求,server ColorServerRpc:"+ material.color);
    if (NetworkManager.Singleton.IsServer)//判断可省略
        ColorClientRpc(material.color);
}

2.ClientRpc属性

        被添加到方法上以标记他们为远程过程调用,ClientRpc在服务器端调用,但是会在客户端执行。

[ClientRpc]
public void ColorClientRpc(Color color)//注意函数名以ClientRpc为后缀
{
    Debug.Log("来自服务端的要求,ColorClientRpc:"+ color);
    GetComponent<MeshRenderer>().material.color = color;
}

3.NetworkVariable变量

        这是一种特殊类型的变量,当服务器中的NetworkVariable<T>的值发生更改时,任何已连接的客户端会自动同步;在游戏中途加入的客户端会自动同步服务器的当前状态。

        NetworkVariable<T>也对外提供值被修改时触发的回调OnValueChanged 。

public NetworkVariable<Color> ServerColor = new NetworkVariable<Color>();

[ServerRpc]
public void ColorServerRpc()
{
    ServerColor.Value = material.color;
}
void Update()
{
    GetComponent<MeshRenderer>().material.color=ServerColor.Value;
}

二、相关组件

1.NetworkManager

        可通过该组件来启动不同的端。该组件是整个NGO中最为重要的组件,包含了项目中所有与网络代码相关的设置,可以说netcode的中心。它提供了启动和停止作为主机(Host)、客户端(Client)或服务器(Server)的功能。

  • Player Prefab:玩家角色的预制件。
  • Host :启动服务器并以客户端的形式加入,同时充当服务器和客户端的角色。
  • Client :以客户端玩家的形式加入服务器,负责向服务发送请求和接收来自服务端的数据更新。
  • Server :以服务器的形式启动游戏,通常用于专门运行游戏逻辑而不参与任何客户端交互操作场景。一旦客户端连接成功,服务器通常会为该客户端实例化一个 Player Prefab。

2.Unity Transport

        设置IP、端口号、连接超时、最大连接数、心跳超时等。

3.Network Object

         这是附加到Player Prefab上的一个组件,它标记了该对象需要在网络上进行同步。

4.NetworkBehaviour

        NetworkBehaviour是一个抽象类,继承自MonoBehavior 。一个自定义脚本类继承自此类可以实现网络行为。它允许你同步变量、调用远程过程调用(RPCs)、命令以及客户端Rpc方法。

    public class HelloWorldPlayer : NetworkBehaviour
    {
        public NetworkVariable<Color> ServerColor = new NetworkVariable<Color>();
        Material material;
        public override void OnNetworkSpawn()
        {
            material = new Material(Shader.Find("Standard"));
            material.color = Color.HSVToRGB(Random.Range(0f, 1f), 1f, 1f);
            GetComponent<MeshRenderer>().material = material;
            if (IsOwner)
            {
                ColorServerRpc();
            }
        }
        //统一颜色
        [ServerRpc]
        public void ColorServerRpc()
        {
            Debug.Log("来自客户端的请求,server ColorServerRpc:"+ material.color);
            if (NetworkManager.Singleton.IsServer)//判断可省略
                ColorClientRpc(material.color);
        }
        [ClientRpc]
        public void ColorClientRpc(Color color)
        {
            Debug.Log("来自服务端的要求,ColorClientRpc:"+ color);
            GetComponent<MeshRenderer>().material.color = color;
        }
    }

5.NetworkTransform

        同步物体的Transform是Netcode当今多人游戏中最常见的任务之一 。参考文档

  • Syncing(Synchronizing)

        这个是用来指定同步位置,旋转,缩放的,需要同步哪些值就勾选哪些。一般情况下,不需要同步GameObject的所有变换值。例如,如果GameObject的缩放从不改变,可以在面板中的Syncing Scale禁用。禁用同步可以节省CPU成本和网络带宽。

  • Thresholds

        可以使用阈值来设置最小阈值。这可以用来通过只同步大于或等于阈值值的变化(低于阈值的变化不会同步)来降低同步更新的频率。

  • Interpolation

        默认情况下启用了插值。插值会缓冲传入的状态更新,这可能会在authoritative实例(服务端)和非authoritative实例(客户端)之间引入轻微的延迟。当禁用插值属性时,变换的更改会立即应用到非authoritative实例上,这可能会导致视觉上的"抖动",或者在延迟较高时似乎会"跳跃"到新应用的状态更新。

1. lerp通常用于数值和向量的插值,而slerp主要用于四元数的插值,尤其是在处理旋转时。2. lerp的计算成本较低,因为它是直接的线性运算;与之相比,slerp更为复杂,计算成本较高,但结果在某些情况下更为理想。

三、Demo

1.同步位置及颜色

        利用ServerRpc属性及ClientRpc属性、NetworkVariable变量实现位置及颜色的同步。

2.NetworkTransform应用

        player上挂载Network Transform组件、Network Object组件及下面函数:

public class NetworkTransformTest : NetworkBehaviour
{ 
    void Update()
    {
        if (IsServer)
        {
            float theta = Time.frameCount / 10.0f;
            transform.position = new Vector3((float)Math.Cos(theta), 0.0f, (float)Math.Sin(theta));
            Debug.Log("Change Position");
        }
    }
}

记录:在线转换视频文件 (aconvert.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/295428.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

原生微信小程序AR(扫描指定图片显示glb模型)

效果 ar案例视频 准备&#xff1a;需要准备要扫描的图片地址和扫描成功后显示的模型 1.在components创建组件 index.js文件代码 Component({properties: {title: {type: String,value: ,},intro: {type: String,value: ,},hint: {type: String,value: ,},code: {type: String…

引导过程和服务

宏内核(monolithic kernel)&#xff1a;又称单内核和强内核&#xff0c;Unix&#xff0c;Linux把所有系统服务都放到内核里&#xff0c;所有功能集成于同一个程序&#xff0c;分层实现不同功能&#xff0c;系统庞大复杂&#xff0c;Linux其实在单内核内核实现了模块化&#xff…

汽车电子学习总结

国内的主要有比亚迪、联合汽车电子&#xff08;联电&#xff09;、麦格米特、上海电驱动&#xff1b;国外的主要有欧美系的博世、麦格纳、大陆、博格华纳&#xff1b;日系的电装、电产等公司。

【Android Studio】在单独的窗口中启动模拟器

参考&#xff1a;https://developer.android.com/studio/run/emulator-launch-separate-window?hlzh-cn 默认情况下&#xff0c;Android 模拟器会在 Android Studio 中运行。这样&#xff0c;您就可以高效地使用屏幕空间&#xff0c;使用热键在模拟器和编辑器窗口之间快速导航…

华为交换机基于mac地址划分VLAN

SW1配置 vlan 10mac-vlan mac-address 5489-98c3-5611 #pc1 mac地址 mac-vlan mac-address 5489-98c3-5622 #pc2 mac地址 interface GigabitEthernet0/0/1undo port hybrid vlan 1 #禁用交换机默认的vlan 1&#xff0c;避免产生干扰port hybrid untagged vlan 10mac-vlan enab…

【Java】RuoYi-Vue-Plus 多数据源整合TDengine时序数据库——服务端自动建库建表

目录 环境准备整合TDengine 数据源1. 添加驱动依赖2. 添加数据源配置3. 添加Mapper4. 添加建表sql脚本5. Controller 测试效果 环境准备 RuoYi-Vue-Plus v5.1.2JDK17Maven 3.6.3Redis 5.XMySQL 5.7TDengine 2.6.0.34 客户端 整合TDengine 数据源 1. 添加驱动依赖 注意&…

【AWS系列】巧用 G5g 畅游Android流媒体游戏

序言 Amazon EC2 G5g 实例由 AWS Graviton2 处理器提供支持&#xff0c;并配备 NVIDIA T4G Tensor Core GPU&#xff0c;可为 Android 游戏流媒体等图形工作负载提供 Amazon EC2 中最佳的性价比。它们是第一个具有 GPU 加速功能的基于 Arm 的实例。 借助 G5g 实例&#xff0c;游…

亚信安慧AntDB数据库:企业核心业务系统数据库升级改造的可靠之选

在近期召开的“2023年国有企业应用场景发布会”上&#xff0c;亚信安慧公司的核心数据库产品AntDB闪耀登场&#xff0c;技术总监北陌先生针对企业核心业务系统数据库升级改造的关键议题发表了深度分享。他从研发、工程实施和运维管理三个维度细致剖析了当前企业在进行数据库升级…

OpenCASCADE MFC例子

OpenCASCADE MFC例子 说明 一直对OpenCASCADE一直都比较感兴趣&#xff0c;这个例子是我参考这位大神C幼儿园中班小朋友的专栏做出来的OpenCASCADE_C幼儿园中班小朋友的博客-CSDN博客 不过我用的是vcpkg的方式安装OpenCASCADE&#xff0c;这个需要注意一下&#xff0c;可能需…

智慧机房建设浪潮:2024年动环监控系统厂家排名出炉

近几年来&#xff0c;伴随着信息化技术的快速发展&#xff0c;老旧的传统机房在设备性能、网络安全、数据统计等各方面都已经不再能完全满足使用需求&#xff0c;国内多个机房兴起了轰轰烈烈的智慧机房建设浪潮。不同于传统机房只能依赖人工24小时值守&#xff0c;智慧机房凭借…

数据库之存储引擎

1. 存储引擎的概念 存储引擎是MYSQL数据库的组件&#xff0c;负责执行时间的数据I/O操作&#xff08;数据的存储和提取&#xff09;&#xff0c;工作在文件系统之上&#xff0c;数据库的数据会先传到存储引擎&#xff0c;再按照存储引擎的存储格式保存到文件系统。 &#xff…

Spring学习 Spring IOC

创建工程&#xff1a; 2.1.程序的耦合 耦合&#xff1a;耦合指的就是对象之间的依赖关系。对象之间的耦合越高&#xff0c;维护成本越高。 案例&#xff1a;没有引入IOC容器时系统的Web层、业务层、持久层存在耦合 /*** 持久层实现类*/ public class UserDaoImpl implements U…

判断完全数-第11届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第27讲。 判断完全数&#…

如何理解Nacos的CP和AP架构模型?

Nacos是阿里巴巴开源的注册中心和配置中心&#xff0c;它既可以替应用服务管理服务相关的元数据&#xff0c;也可以管理服务相关的配置信息。 Nacos既支持单机部署&#xff0c;也支持集群部署&#xff0c;为了保证数据的一致性&#xff0c;在集群模式下&#xff0c;Nacos既支持…

CAD加密软件哪个好?CAD图纸加密软件哪个好(图纸加密软件哪个最好用)

图纸防泄密软件现在市场上是很多的&#xff0c;但是普遍采用的图纸防泄密软件技术是采用透明加密的技术&#xff0c;当企业采用透明加密技术对的图纸文件进行安全防护时&#xff0c;也是最安全的最稳定的技术。 现在常用的使用透明加密技术&#xff0c;对企业图纸防泄密的方法…

人工智能_机器学习092_使用三维瑞士卷数据_利用分层聚类算法进行瑞士卷数据三维聚类---人工智能工作笔记0132

然后我们使用分层聚类算法来对我们导入的瑞士卷数据进行聚类 agg =AgglomerativeClustering(n_clusters = 6,linkage = ward) 可以看到这里我们使用的,聚类距离计算用的是,ward这种,最小化簇内方差的形式,l进行聚类对吧 可以看到这个linkage参数有好几个选择对吧,是之前我们讲过…

复现PointNet(分割网络):Windows + PyTorch+代码

一、平台 Windows 10 GPU RTX 3090 CUDA 11.1 cudnn 8.9.6 Python 3.9 Torch 1.9.1cu111 所用的原始代码&#xff1a;https://github.com/fxia22/pointnet.pytorch​​​​​​​ 二、数据 shapenetcore_partanno_segmentation_benchmark_v0 三、代码 分享给有需要的…

【c语言】指针小结

一、指针是什么&#xff1f; 可以通过运算符&来取得变量实际保存的 起始地址 。 &#xff08;这个地址是虚拟地址&#xff0c;并不是真正物理内存上的地址。&#xff09; 数据类型 *标识符 &变量; int *pa &a; int *pa NULL; (NULL表示地址为0的内存空间&a…

金和OA JC6 ntko-upload 任意文件上传漏洞

产品介绍 金和网络是专业信息化服务商,为城市监管部门提供了互联网监管解决方案,为企事业单位提供组织协同OA系统开发平台,电子政务一体化平台,智慧电商平台等服务。 漏洞概述 金和 OA JC6 ntko-upload接口处存在任意文件上传漏洞&#xff0c;攻击者可以通过构造特殊请求包上…

使用Go语言的HTTP客户端库进行API调用

随着微服务架构和RESTful API的普及&#xff0c;API调用成为了日常开发中的常见任务。Go语言提供了多种工具和库来帮助开发者轻松地与API进行交互。本文将介绍如何使用Go语言的HTTP客户端库进行API调用。 在Go语言中&#xff0c;标准库中的net/http包提供了基本的HTTP客户端功…