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.rhkb.cn/news/232104.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fastadmin学习02-修改后台管理员账号密码

问题 如果是别人部署好的fastadmin网站不知道后台登录地址和账号密码怎么办 后台登录地址 public目录下有一个很奇怪的php就是后台登录地址啦 忘记账号密码 找到fa_admin&#xff0c;fa_是前缀&#xff0c;肯能每个项目不太一样 UPDATE fa_admin set password1d020dee8ec…

【LMM 011】MiniGPT-5:通过 Generative Vokens 进行交错视觉语言生成的多模态大模型

论文标题&#xff1a;MiniGPT-5: Interleaved Vision-and-Language Generation via Generative Vokens 论文作者&#xff1a;Kaizhi Zheng* , Xuehai He* , Xin Eric Wang 作者单位&#xff1a;University of California, Santa Cruz 论文原文&#xff1a;https://arxiv.org/ab…

TypeScript 从入门到进阶之基础篇(三) 元组类型篇

系列文章目录 TypeScript 从入门到进阶系列 TypeScript 从入门到进阶之基础篇(一) ts基础类型篇TypeScript 从入门到进阶之基础篇(二) ts进阶类型篇TypeScript 从入门到进阶之基础篇(三) 元组类型篇TypeScript 从入门到进阶之基础篇(四) symbol类型篇 持续更新中… 文章目录 …

JDBC数据库访问——数据库操作

与指定的数据库建立连接后&#xff0c;就可以使用JDBC提供的API对数据库进行操作&#xff0c;包括查询、新增、更新、删除等。 1.查询操作 和数据库建立连接后&#xff0c;对数据库表进行查询操作的步骤如下&#xff1a; ①创建statement对象 由已创建的Connection对象con调…

【MySQL】事务Transaction

1. 事务的概念 事务是什么 在业务逻辑中使用sql&#xff0c;面对一些较复杂的场景&#xff0c;是需要多个sql语句组合起来实现的。如&#xff1a;银行的转账业务&#xff0c;若客户A要转账100元给客户B&#xff0c;就要两条sql&#xff1a;A余额减100&#xff0c;B余额加100&a…

深度学习(学习记录)

题型&#xff1a;填空题判断题30分、简答题20分、计算题20分、综合题&#xff08;30分&#xff09; 综合题&#xff08;解决实际工程问题&#xff0c;不考实验、不考代码、考思想&#xff09; 一、深度学习绪论&#xff08;非重点不做考察&#xff09; 1、传统机器学习&…

Android学习(一):Android Studio安装与配置

Android学习&#xff08;一&#xff09;&#xff1a;Android Studio安装与配置 一、安装 下载地址 下载zip文件&#xff0c;免安装。 二、下载资源 启动后&#xff0c;出现该弹框&#xff0c;点击Cancel。 点击Next 默认&#xff0c;点击Next。 点击Next。 点击Finish 开始…

鸿蒙应用中的通知

目录 1、通知流程 2、发布通知 2.1、发布基础类型通知 2.1.1、接口说明 2.1.2、普通文本类型通知 2.1.3、长文本类型通知 2.1.4、多行文本类型通知 2.1.5、图片类型通知 2.2、发布进度条类型通知 2.2.1、接口说明 2.2.2、示例 2.3、为通知添加行为意图 2.3.1、接…

Vue小练习--任务列表

这是一个非常实用的例子&#xff0c;主要实用的是v-model、v-on、v-for指令&#xff0c;javaScript的数组也会涉及一些&#xff0c;javaScript数组方法有很多&#xff0c;本文使用的添加元素和删除元素非常实用&#xff0c;可以记下来。 设计思路 很多例子看起来很难&#xf…

【BCC动态跟踪PostgreSQL】

BPF Compiler Collection (BCC)是基于eBPF的Linux内核分析、跟踪、网络监控工具。其源码存放于GitCode - 开发者的代码家园 想要监控PostgreSQL数据库的相关SQL需要在编译PostgreSQL的时候开启dtrace。下文主要介绍几个和PostgreSQL相关的工具,其他工具可根据需求自行了解。 …

【React系列】父子组件通信—props属性传值

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 认识组件的嵌套 组件之间存在嵌套关系&#xff1a; 在之前的案例中&#xff0c;我们只是创建了一个组件App&…

VINS-MONO拓展1----手写后端求解器,LM3种阻尼因子策略,DogLeg,构建Hessian矩阵

文章目录 0. 目标及思路1. 非线性优化求解器2. 基于VINS-MONO的Marginalization框架构建Hessian矩阵2.1 estimator.cpp移植2.2 solve.cpp/preMakeHessian()2.3 solve.cpp/makeHessian() 3. solve.cpp/solveLinearSystem()求解正规方程4. 更新状态5. 迭代求解6. EVO评估结果7. 待…

微服务-dubbo工程案例搭建

基础案例搭建 1 依赖 父工程POM <dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${com.alibaba.cloud.vers…

设计模式学习2

代理模式&#xff1a;Proxy 动机 “增加一层间接层”是软件系统中对许多复杂问题的一种常见解决方案。在面向对象系统中&#xff0c;直接食用某些对象会带来很多问题&#xff0c;作为间接层的proxy对象便是解决这一问题的常见手段。 2.伪代码&#xff1a; class ISubject{ pu…

【LMM 012】TinyGPT-V:24G显存训练,8G显存推理的高效多模态大模型

论文标题&#xff1a;TinyGPT-V: Efficient Multimodal Large Language Model via Small Backbones 论文作者&#xff1a;Zhengqing Yuan, Zhaoxu Li, Lichao Sun 作者单位&#xff1a;Anhui Polytechnic University, Nanyang Technological University, Lehigh University 论文…

thinkphp学习04-控制器定义

控制器&#xff0c;即 controller&#xff0c;控制器文件存放在 controller 目录下&#xff1b; 如果想改变系统默认的控制器文件目录&#xff0c;可以在 config 下 route.php 配置&#xff1a; 将controller修改为controller123&#xff0c;就会报错&#xff0c;说明这个配置…

Python基础入门第八课笔记(自定义函数 lambda)

什么时候用lambda表达式&#xff1f; 当函数有一个返回值&#xff0c;且只有一句代码&#xff0c;可以用lambda简写。 2、lanbda语法 lambda 形参 : 表达式 注意&#xff1a; 1、形参可以省略&#xff0c;函数的参数在lambda中也适用 2、lambda函数能接收任何数量的参数但只能…

[HCTF 2018]Warmup

[HCTF 2018]Warmup wp 进入页面&#xff1a; 查看源码&#xff1a; 发现提示&#xff1a;source.php &#xff0c;直接访问&#xff0c;得到源代码&#xff1a; <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist [&qu…

关于github最新登录方法

https://blog.csdn.net/freewzx2005/article/details/133956893 通过手机号验证&#xff0c;发现没有国内的手机号选项&#xff0c;尝试了修改网页的办法以及终端方式&#xff0c;都已经阻止了。 1.商店下载微软验证 2.扫描github上的二维码 大概几十秒钟就会刷新一次&#…

mysql原理--事务

1.事务的起源 对于大部分程序员来说&#xff0c;他们的任务就是把现实世界的业务场景映射到数据库世界。比如银行为了存储人们的账户信息会建立一个 account 表&#xff1a; CREATE TABLE account (id INT NOT NULL AUTO_INCREMENT COMMENT 自增id,name VARCHAR(100) COMMENT …