1.Unity网络开发2022版-运行项目获取命令行参数
2.Unity新HL网络API——NetCode 0.1.0-preview6 文档翻译 第一篇 入门
3.Unity中文版-Unity2023.2更新日志(自翻译)
4.Unity:Unity多人在线游戏开发教程
Unity网络开发2022版-运行项目获取命令行参数
本文章旨在为学习Unity网络开发提供指南,源码着重介绍NGO(Netcode for GameObjects)及其应用。源码NGO是源码一个高级网络库,旨在简化多玩家游戏的源码网络逻辑,帮助开发者专注于游戏设计而非底层网络细节。源码NGO适用于多种平台,源码个人主页开源码包括Windows、源码MacOS、源码Linux、源码iOS、源码Android以及游戏主机等,源码同时也支持WebGL(需NGO 1.2.0+和UTP 2.0.0+),源码尽管NGO 1.2.0存在WebGL兼容性问题,源码建议使用NGO 1.3.0+版本。源码
在进行多人游戏开发时,源码需要使用NGO的特定Unity版本(.3或更高),并确保脚本后端为Mono或IL2CPP。Mono是一种开源跨平台.NET实现,允许开发者在不同操作系统上运行.NET应用程序。IL2CPP则是在运行前对整个应用程序进行提前编译。
为了实际操作,首先需在Unity项目中添加NGO。打开Package Manager,输入“com.unity.netcode.gameobjects”进行搜索并添加NGO。随后,通过命令行助手脚本启动Unity实例,指定运行参数以模拟多玩家环境。在命令行中,使用`System.Environment.GetCommandLineArgs()`方法获取命令行参数,以便在程序中访问这些信息。然后,创建一个示例项目,安然源码添加一个用于显示参数的文本元素和相应脚本,通过命令行启动程序并输入参数。程序执行后,会显示获取到的参数,包括启动命令,作为参数数组的第一个元素(args[0])。
在实现NGO基本功能时,可以创建一个空物体作为网络管理器,并为其添加NetworkManager组件,将协议类型设置为Unity Transport。这将自动添加UnityTransport组件。接下来,创建玩家预制体以构建游戏中的多玩家交互。随着内容的持续更新,本文将逐步深入探讨NGO的更多功能和应用,欢迎指正任何错误或提出建议。
Unity新HL网络API——NetCode 0.1.0-preview6 文档翻译 第一篇 入门
翻译者:BolanT
注:转载时应标注原文链接,以便在NetCode版本更新、文档内容改变时查阅。
原文链接(官方文档):
本文档将提供一个使用Unity NetCode创建基本客户端/服务器结构联机游戏的实践教程。
译者注:建议在学习NetCode前对Unity ECS有较深入了解,因为当前版本NetCode的API和功能还在发展中,没有ECS基础可能会难以理解其中概念。在翻译中,对文档中模糊、版本变化、缺乏解释的内容进行了注释,但可能对无ECS基础读者仍较为困难,甚至可能增加困惑。
一、创建项目
启动UnityHub并创建一个新项目。通用源码)
(注:使用Unity NetCode需要的Unity版本至少为.3.b及以上。)
打开Package Manager(目录:Window->Package Manager),在包管理器窗口顶部栏,选择Advanced下拉菜单,勾选Show preview packages。
至少安装以下Package:
注:某些包可能为其他包的依赖项,无需过多关注,只需确保上述包的右侧图标显示为箭头或勾选状态且无报错,随意升级或卸载某些包可能会导致难以解决的错误。
二、创建初始场景
为了在客户端和服务器之间共享数据,需要为每个客户端和服务器创建不同的World。首先在NetCode中实现这种分离,创建一个客户端World和一个服务器World。
注:当前版本的NetCode会自动创建ClientWorld和ServerWorld,并注入所需官方System。使用NetCode自带的世界注册前,可能需要编写脚本找到这两个World并用代码管理System。ClientWorld在World.AllWorlds中的Index为1,ServerWorld在World.AllWorlds中的Index为7。原有的World.AllWorlds[0](即DefaultWorld)失去作用,它不会注入任何有意义的System,同时原有的Convert To Entity组件也因此失去作用,需要用新的ConvertToClientServerEntity组件代替。在将非NetCode ECS游戏迁移到NetCode时需特别注意。
创建一个空GameObject(示例中称为SharedData),添加ConvertToClientServerEntity组件。
设置好后,在客户端和服务器世界中生成一个平面。右键单击SharedData Prefab,选择3D Object -> Plane,浩瀚源码创建嵌套在SharedData下的Plane。
三、创建ghost预制件
为了在客户端/服务器结构下运行游戏,需要为联网对象创建一个定义,称为ghost。创建ghost预制件需要以下步骤:在场景中创建一个Cube(右键SharedData,选择3D Object > Cube),然后将创建的Cube拖动到Project窗口的Asset文件夹。这创建了一个Cube的预制件。
注:创建完Prefab后可删除场景中的Cube。若遇到问题,使用搜索引擎搜索如何在Unity中创建Prefab即可。
NetCode使用PlayerId来识别不同的玩家。要将之前的Cube预制件作为玩家,需创建一个包含以下简单代码的组件。
创建新文件MovableCubeComponent.cs,并添加GenerateAuthoringComponent注解(关于使用和理解可参考B站视频av)。将此组件添加到Cube预制件,然后添加Ghost Authoring组件,点击Update Component List按钮更新组件列表。
完成后,Unity会为Translation和Rotation组件添加默认值,并将组件展开到列表中,让用户选择它们在客户端或服务端的存在。
注:例如,输入和渲染组件仅在客户端存在,不应当在客户端操作的内容(如物理/可见性更新)仅在服务端存在。
在示例中,服务端关闭了PerInstanceCullingTag和RenderMesh。客户端上的插值物体不进行任何物理模拟。
注:原文未关闭客户端的golanghttpserver源码物理模拟,有时在需要高同步且不担心外挂的物理模拟游戏时,客户端模拟物理可以提升视觉效果。此外,原文未提及关闭RenderBounds,该组件也应在服务端关闭。
将Default Client Instantiation更改为Owner Predicted,以便在本地预测运动。
四、创建Ghost集合
说明:为了向NetCode提供所知Ghost的信息,需要设置GhostCollection,并将其添加到SharedData下。客户端和服务端都需要了解当前的Ghost。
右键SharedData,选择Create Empty,将新建的GameObject命名为GhostCollection,添加GhostCollectionAuthoringComponent组件。
在组件中点击Update ghost list按钮,然后点击Generate collection code按钮。
五、建立连接
服务器开始监听连接,客户端连接至服务端,并标记为“游戏中”,开始发送快照。此案例只需简单编码使游戏启动即可。在Assets文件夹下创建Game.cs文件,并输入以下代码。
Game.cs:
注:原文可能未直接在OnCreate方法中添加连接逻辑,这是因为当系统发现断开连接时,只需重新CreateEntity触发连接,这也是一种系统间触发方式。官方可能要求我们完成这样的任务。
客户端需要告诉服务端已准备好开始游戏,使用NetCode提供的Rpc功能实现。
在Game.cs文件中,添加如下的 RpcCommand来告知服务端已准备好开始游戏:
注:别忘了在InvokeExecute前添加BurstCompile属性。
为了使用NetCode发送此RpcCommand,需在Game.cs中增加一个继承自RpcCommandRequestSystem的系统。
注:类里无需添加额外内容,若想传输其他RpcCommand无需重写override,直接继承RpcCommandRequestSystem并替换<>内的类型即可。
接下来,创建一个实现ICommandData接口的结构体,负责序列化和反序列化输入信息。创建CubeInput.cs脚本文件,并输入以下代码:
原文代码(现有版本0.1.0-preview6下已无法使用,下面提供基于0.1.0-preview6 API修改的代码):
0.1.0-preview6版本下的代码:
注:简要解释序列化与反序列化过程。序列化是从内存数据提取为网络传输或本地存储的string或Byte[],反序列化是读取数据并存储到内存、触发对应方法的过程。在实时游戏环境中,Unity NetCode提供DataStreamWriter与DataStreamReader让我们自己组装序列化与反序列化工作,而非完全接管。
命令流包含当前tick与水平、垂直的速度,类似之前的Rpc,可使用创建并继承系统的方式来同步ICommandData接口数据。
接下来,编写一个获取输入信息、将信息发送出去的系统:
注:部分读者可能找不到EnableNetCubeGhostReceiveSystemComponent问题。使用GhostCollectionAuthoringComponent生成代码,类名默认为项目名称,若未更改NamePrefix,则类名应为{ 项目名称 } + GhostReceiveSystemComponent。修改NamePrefix后,类名应为{ NamePrefix} + GhostReceiveSystemComponent。
译者碎碎念:官方似乎喜欢使用单例component来传递信息?
最终,创建一个读取CommandData的系统,并移动玩家方块:
六、最后一步
最后一步是创建一个连接成功时使客户端进入游戏状态、通知服务端也进入游戏状态的系统,需要在连接时向服务器发送Rpc表示客户端已准备开始游戏:
在服务端上,确保在收到GoInGameRequest时为该玩家创建并生成一个Cube。
注:部分读者可能找不到NetCubeGhostSerializerCollection问题。使用GhostCollectionAuthoringComponent生成代码,类名默认为项目名称,若未更改NamePrefix,则类名应为{ 项目名称 } + GhostSerializerCollection。修改NamePrefix后,类名应为{ NamePrefix} + GhostSerializerCollection。
七、测试
现在,已完成代码编写,打开Multiplayer> PlayMode Tools并设置PlayMode Type为Client&Server。进入播放模式。生成Cube,并按下A、S、D和W键移动Cube。
回顾所做的工作:
Unity中文版-Unity.2更新日志(自翻译)
我们翻译Unity中文版的初衷是为了解决官方中文版存在的不足,以及提供完整的内容。针对Unity .2的更新,我们为您带来详细的翻译,以帮助您更好地理解和利用新功能。新特性概览
要了解.2版本的新功能,可以参考发布说明,它详述了新功能、变更和改进点。升级指南
升级现有项目至.2的用户,请务必阅读升级指南,以预防可能对项目产生的影响。主要变化
从.1版本以来,Unity .2引入了Accessibility Hierarchy Viewer,可查看项目中的可访问性结构,通过Window > Accessibility > Accessibility Hierarchy viewer轻松访问。音频和2D编辑
Tile Palette编辑器支持了覆盖层功能。
Joint Angular Limits gizmo增加了ArticulationBody.jointPosition指示,帮助精确展示关节位置。
图形与渲染
Universal Render Pipeline (URP)提供了详细的新功能描述,查看以获取完整更新。
High Definition Render Pipeline (HDRP)同样提供了详细的更新内容,确保您了解所有改进。
多人游戏和网络
Netcode for GameObjects更新了专用服务器平台和Unity Transport。
Package Manager对缓存管理和窗口界面进行了调整。
其他增强
SpeedTree在HDRP中通过传输遮罩提高视觉质量,修复了某些光照问题。
Splines功能增强,支持个性化数据存储,Inspector编辑和新的Scene视图操作。
测试与控制
项目选项新增了支持外部磁盘包版本控制的功能。Web平台和XR
Web平台(之前WebGL)和XR部分的更新同样值得关注。 总的来说,Unity .2的更新内容丰富,无论是新用户还是经验丰富的开发者,都能找到适应项目发展的工具和优化。祝您在使用过程中一切顺利!Unity:Unity多人在线游戏开发教程
Unity多人在线游戏开发教程深入解析
Unity作为强大的跨平台游戏开发工具,入门网络编程首先需熟悉其编辑器界面。Unity编辑器的核心组成部分包括基础操作,如动态改变场景元素属性。例如,通过脚本控制场景中的立方体颜色变化。
转向网络编程,Unity提供了UNet和Netcode框架,但推荐使用后者。Netcode for GameObjects以数据导向设计,优化了网络同步,如创建远程操作的玩家角色示例。
在多人在线游戏中,关键在于客户端与服务器分离,确保游戏公平性。例如,通过C#实现简单的射击游戏架构,客户端负责用户界面,服务器负责核心逻辑,如玩家状态同步和动画处理。
游戏大厅构建中,玩家匹配和房间系统是重要环节。通过示例展示如何利用Unity创建匹配逻辑和房间管理。
实时通信采用UDP和TCP,UDP适合低延迟但可能有丢包,TCP则提供可靠但速度较慢。正确处理数据包设计,包括压缩、加密和优化数据结构,确保游戏状态高效传输。
网络同步通过网络预测与校正技术,减少延迟影响,例如实现客户端的预测和服务器的校正。同时,通过示例代码展示序列化和反序列化过程。
优化网络性能涉及带宽管理、数据压缩和负载均衡。例如,通过减少更新频率来减轻服务器压力,同时确保数据安全,如使用AES加密保护通信。
防作弊机制涉及数据校验和服务器验证,如使用SHA算法验证数据完整性和服务器逻辑验证,以维护游戏公平性。
在实战项目中,项目规划和开发流程至关重要,从功能定义到压力测试,每个环节都需要精心设计和执行。Unity编辑器工具如Play as Server和压力测试功能,有助于确保游戏的稳定性和玩家体验。