Unity3D Unity3D :多人游戏概述 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 多人游戏概述 重要提示:UNet 是一个已弃用的解决方案,新的多人游戏和网络解决方案(游戏对象的网络代码)正在开发中。有关更多信息和后续步骤,请参阅适用于游戏对象的 Unity 网络代码网站上的信息。 网络功能有两种用户: * 使用 Unity 制作多人游戏的用户。这些用户应从 NetworkManager 或高级 API 开始。 * 构建网络基础设施或高级多人游戏的用户。这些用户应从网络传输 API 开始。 高级脚本 API Unity 的网络功能有一个“高级”脚本 API(我们称之为 HLAPI)。使用此 API 意味着可以访问满足多用户游戏大多数常见要求的命令,而无需担心“较低级别”的实现细节。HLAPI 提供以下功能: * 使用 Network Manager 来控制游戏的联网状态。 * 操作“
Unity3D Unity3D :ParallelFor 作业 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 ParallelFor 作业 在调度作业时,只能有一个作业正在执行一项任务。在游戏中,通常希望对大量对象执行相同的操作。有一个称为 IJobParallelFor 的单独作业类型可以处理此问题。 注意:“ParallelFor”作业是 Unity 中对于任何实现 IJobParallelFor 接口的结构的统称。 ParallelFor 作业使用一个数据 NativeArray 作为其数据源。ParallelFor 作业在多个核心上运行。每个核心有一个作业,每个作业处理一部分工作量。IJobParallelFor 的行为类似于 IJob,但其并非调用单个 Execute 方法,而是对数据源中的每一项都调用一次 Execute 方法。Execute 方法中有一个整数参数。该索引用于访问和操作作业实现中的数据源的单个元素。 ParallelFor 作业定义示例: struct IncrementByDeltaTimeJob: IJobParallelFor { public Nativ
Unity3D Unity3D :JobHandle 和依赖项 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 JobHandle 和依赖项 调用作业的 Schedule 方法时,将返回 JobHandle。可以在代码中使用 JobHandle 作为其他作业的依赖项。如果一个作业依赖于另一个作业的结果,则可以将第一个作业的 JobHandle 作为参数传递给第二个作业的 Schedule 方法,如下所示: JobHandle firstJobHandle = firstJob.Schedule(); secondJob.Schedule(firstJobHandle); 注: 作业的所有依赖项都必须在与作业本身相同的控制线程上调度。 合并依赖项 如果一个作业具有许多依赖项,则可以使用 JobHandle.CombineDependencies 方法合并这些依赖项。CombineDependencies 可以将依赖项传递给 Schedule 方法。 NativeArray handles = new NativeArray(numJobs, Alloca
Unity3D Unity3D :调度作业 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 调度作业 To schedule a job, you must: * 实例化该作业。 * 填充作业的数据。 * 调用 Schedule 方法。 调用 Schedule 会将该作业放入作业队列中,以便在适当的时间执行。一旦作业已调度,就不能中断作业。 Note: You can not call Schedule from within jobs. 调度作业的示例 // 创建单个浮点数的本机数组以存储结果。此示例等待作业完成,仅用于演示目的 NativeArray result = new NativeArray(1, Allocator.TempJob); // 设置作业数据 MyJob jobData = new MyJob(); jobData.a = 10;
Unity3D Unity3D :创建作业 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 创建作业 要在 Unity 中创建作业,必须实现 IJob 接口。借助 IJob,可以调度与正在运行的其他作业并行运行的单个作业。 注意:“作业”是 Unity 中对于任何实现 IJob 接口的结构的统称。 要创建作业,您需要: * 创建实现 IJob 的结构。 * 添加该作业使用的成员变量(为 blittable 类型和 NativeContainer 类型之一)。 * 在结构中创建一个名为 Execute 的方法,并在其中实现该作业。 执行作业时,Execute 方法在单个核心上运行一次。 注: 在设计作业时,请记住它们对数据副本进行操作,但 除外。因此,从控制线程中的作业访问数据的唯一方法是写入 . 简单作业定义示例 // 将两个浮点值相加的作业 public struct
Unity3D Unity3D :并行作业 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 并行作业 计划作业时,只能有一个作业执行一项任务。但是,有时您需要对许多对象执行相同的操作。为此,请使用继承自 IJobParallelFor 的 ParallelFor 作业类型。 ParallelFor 作业使用数据的 NativeArray 作为其数据源。ParallelFor 作业跨多个 CPU 内核运行。每个核心有一个作业,每个作业处理工作负载的一个子集。 IJobParallelFor行为类似于 IJob,但它不是单个 Execute 方法,而是在数据源中的每个项调用一次该方法。该方法中还有一个整数参数索引,可用于访问作业实现中数据源的单个元素并对其进行操作。ExecuteExecute 以下是 ParallelFor 作业定义的示例: struct IncrementByDeltaTimeJob: IJobParallelFor { public NativeArray values; public float deltaTime; pu
Unity3D Unity3D :作业依赖关系 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 作业依赖关系 通常,一个作业依赖于另一个作业的结果。例如,作业 A 可能会写入作业 B 用作输入的 A。在计划依赖作业时,必须告知作业系统此类依赖项。作业系统在它所依赖的作业完成之前不会运行依赖作业。一个作业可以依赖于多个作业。NativeArray 您还可以有一个作业链,其中每个作业都依赖于前一个作业。但是,依赖项会延迟作业执行,因为您必须等待作业的任何依赖项完成才能运行。完成依赖作业必须首先完成它所依赖的任何作业,以及这些作业所依赖的任何作业。 调用作业的 Schedule 方法时,它将返回 JobHandle。可以使用 作为其他作业的依赖项。如果一个作业依赖于另一个作业的结果,则可以将第一个作业作为参数传递给第二个作业的方法,如下所示:JobHandleJobHandleSchedule JobHandle firstJobHandle = firstJob.Schedule(); secondJob.Schedule(firstJobHandle); 组合依赖关系 如果作业有很
Unity3D Unity3D :创建并运行作业 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 创建并运行作业 要创建并成功运行作业,必须执行以下操作: * 创建作业:实现 IJob 接口。 * 计划作业:在作业上调用计划方法。 * 等待作业完成:如果作业已完成,它会立即返回,当您想要访问数据时,可以在作业上调用 Complete 方法。 创建作业 要在 Unity 中创建作业,请实现 IJob 接口。您可以使用您的实现来计划与正在运行的任何其他作业并行运行的单个作业。IJob IJob有一个必需的方法:执行,每当工作线程运行作业时,Unity 都会调用该方法。 创建作业时,还可以为其创建 JobHandle,其他方法需要使用该作业来引用作业。 重要:没有针对访问非只读或可变 作业中的静态数据。访问此类数据会绕过所有安全系统,并可能导致应用程序或 Unity 编辑器崩溃。 当 Unity 运行时,作业系统会复制计划的作业数据,从而防止多个线程读取或写入相同的数据。
Unity3D Unity3D :自定义本机容器示例 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 自定义本机容器示例 以下是自定义作为仅追加列表的完整示例。它演示了对读取和写入操作的基本保护,以及创建和失效锯齿视图。有关另一个示例,请参阅 NativeContainerAttribute API 文档。NativeContainer using System; using System.Runtime.InteropServices; using Unity.Collections.LowLevel.Unsafe; using Unity.Collections; // Marks the struct as a NativeContainer. This tells the job system that it contains an AtomicSafetyHandle. [NativeContainer] public unsafe struct NativeAppendOnlyList
Unity3D Unity3D :复制本机容器结构 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 复制本机容器结构 本机容器是值类型,这意味着当它们分配给变量时,Unity 会复制结构,其中包含指向本机容器数据存储位置的指针,包括其 AtomicSafetyHandle。它不会复制 .NativeContainerNativeContainer 此方案意味着结构的多个副本可能都引用相同的内存区域,并且都包含引用同一中心记录的对象。NativeContainerAtomicSafetyHandle 上图显示了结构的三个不同副本,它们都表示相同的实际容器。每个副本都指向与原始 相同的存储数据以及相同的安全数据。但是,每个副本都有不同的标志,指示允许作业对该副本执行的操作。指向安全数据的指针与标志相结合,构成了 .NativeArrayNativeArrayNativeArrayAtomicSafetyHandle 版本号 如果 a 被处理掉,则该结构的所有副本都必须识别出原件无效。释放原始数据意味着用于保存 数据的内存块已被解除分配。在此情况下,指向存储在 的每个副本中的数据的指针无效,如
Unity3D Unity3D :实现自定义本机容器 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 实现自定义本机容器 若要实现自定义本机容器,必须使用 NativeContainer 属性批注类型。您还应该了解原生容器如何与安全系统集成。 要实现两个主要元素: * 使用情况跟踪:允许 Unity 跟踪使用实例的计划作业,以便检测和防止潜在的冲突,例如两个作业同时写入同一本机容器。NativeContainer * 泄漏跟踪:检测何时未正确处理。在此情况下,会发生内存泄漏,其中分配给 的内存在程序的整个剩余生存期内变得不可用。NativeContainerNativeContainer 实施使用情况跟踪 若要访问代码中的使用情况跟踪,请使用 AtomicSafetyHandle 类。 包含对安全系统为给定本地容器存储的中心信息的引用,并且是 a 的方法与安全系统交互的主要方式。因此,每个实例都必须包含一个名为 的字段。AtomicSafetyHandleNativeContainerNativeContainerAtomicSafetyHandlem_Safety 每个都存储一组标
Unity3D Unity3D :线程安全类型 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 线程安全类型 作业系统在与突发编译器一起使用时效果最佳。由于 Burst 不支持托管对象,因此需要使用非托管类型来访问作业中的数据。您可以使用可 blitable 类型执行此操作,也可以使用 Unity 的内置 NativeContainer 对象,这些对象是用于本机内存的线程安全 C# 包装器。 对象还允许作业访问与主线程共享的数据,而不是使用副本。NativeContainer 本机容器的类型 命名空间包含以下内置对象:Unity.CollectionsNativeContainer * NativeArray:一个非托管数组,它向托管代码公开本机内存缓冲区 * NativeSlice:从特定位置获取 a 的子集到特定长度。NativeArray 注意:集合包包含其他 s。有关其他类型的完整列表,请参阅有关集合类型的集合文档。NativeContainer 读写访问权限 默认情况下,当作业有权访问实例时,它同时具有读取和写入访问权限。此配置可能会降低性能。这是因为作业系统不允
Unity3D Unity3D :什么是多线程? 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 什么是多线程? 在单线程计算系统中,一次执行一条指令,并且一次产生一个结果。加载和完成程序的时间取决于 CPU 需要完成的工作量。 多线程是一种编程方式,利用了 CPU 在多个核心上同时处理多个线程的能力。这种情况下不是逐个执行任务或指令,而是同时运行任务或指令。 默认情况下,在程序的开头会运行一个线程。这就是“主线程”。主线程会创建新线程来处理任务。这些新线程并行运行,通常在完成后将其结果与主线程同步。 如果有一些长时间运行的任务,这种多线程方法很有效。但是,游戏开发代码通常包含许多一次执行的小指令。如果为每个指令创建一个线程,最终可能会有许多线程,每个线程的生命周期都很短。这种情况下可能会挑战 CPU 和操作系统处理能力的极限。 设置一个线程池可以缓解线程生命周期的问题。但是,即使使用线程池,也可能会同时激活大量线程。线程数多于 CPU 核心数会导致线程相互竞争 CPU 资源,进而造成频繁的上下文切换。上下文切换是这样一个过程:在执行过程的中途保存一个线程的状态,然后处理另一个线程,再然
Unity3D Unity3D :C# 作业系统概述 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 C# 作业系统概述 C# 作业系统的工作原理 借助 Unity C# 作业系统,用户可以编写与 Unity 其余部分良好交互的多线程代码,并使编写正确代码变得更加容易。 编写多线程代码可以带来高性能优势,包括显著提高帧率。将 Burst 编译器与 C# 作业配合使用可以提高代码生成质量,还可以大大降低移动设备的电池消耗。 C# 作业系统的一个重要特点是它与 Unity 内部使用的系统(Unity 的原生作业系统)相集成。用户编写的代码与 Unity 共享工作线程。此协作避免了创建超过 CPU 核心数的线程(这种情况会导致争用 CPU 资源)。 如需了解更多信息,请观看 Unity 在 GDC 大会上的演讲 - 作业系统和实体组件系统 (Unity at
Unity3D Unity3D :低级原生插件着色器编译器访问 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 低级原生插件着色器编译器访问 除了低级原生插件接口之外,Unity 还支持对着色器编译器的低级访问,从而允许用户将不同的变体注入着色器。这也是一种事件驱动的方法:当某些内置事件发生时,插件将接收回调。 Unity 公开的着色器编译器访问扩展定义位于 IUnityShaderCompilerAccess.h 中,随 Editor 提供。 目前仅在 D3D11 上支持这些扩展。随后将有更多平台支持这些扩展。 着色器编译器访问扩展 API 为了利用渲染扩展,插件应导出 UnityShaderCompilerExtEvent。include 文件中提供了大量文档。 只要 Unity 触发其中一个内置事件,就会通过 UnityShaderCompilerExtEvent 调用插件。还可使用脚本通过 CommandBuffer.IssuePluginEventAndData 或 CommandBuffer.IssuePluginCustomBlit 命令将回调添加到 CommandBuffers。
Unity3D Unity3D :低级原生插件渲染扩展 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 低级原生插件渲染扩展 除了低级原生插件接口之外,Unity 还支持低级渲染扩展,这些扩展可在发生特定事件时接收回调。这主要用于实现和控制插件中的低级渲染,并使低级渲染能够与 Unity 的多线程渲染一起使用。 由于此扩展的低级特性,可能需要在创建设备之前预先加载插件。目前约定以名称为基础:插件名称必须以 GfxPlugin 开头(例如:_GfxPluginMyNativePlugin_)。 Unity 公开的渲染扩展定义位于随 Editor 提供的文件 IUnityRenderingExtensions.h 中(请参阅文件路径 _Unity\Editor\Data\PluginAPI_)。 支持原生插件的所有平台都支持这些扩展。 渲染扩展 API 要利用渲染扩展,插件应导出 UnityRenderingExtEvent 以及选择性导出 UnityRenderingExtQuery。include 文件中提供了大量文档。 渲染线程上的插件回调 只要 Unity 触发其中一个内置事件,
Unity3D Unity3D :低级本机插件接口 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 低级本机插件接口 Unity 中的原生插件可以在发生某些事件时接收回调。您可以使用它在插件中实现低级渲染,以便它可以与 Unity 的多线程渲染一起使用。 接口注册表 要处理主要的 Unity 事件,插件必须导出并发挥作用。IUnityInterfaces 使插件能够访问这些功能,您可以在插件 API 中找到这些功能:UnityPluginLoadUnityPluginUnloadIUnityInterface.h # include "IUnityInterface.h" # include "IUnityGraphics.h" // Unity 插件加载事件 extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginLoad(IUnityInterfaces* unityInterfaces) { IUnityGraphics* graphics = unityInterfaces->Get
Unity3D Unity3D :构建适用于桌面平台的插件 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 构建适用于桌面平台的插件 桌面平台插件是可以用 C、C++ 和 Objective C 编写的本机代码库。本页介绍适用于 macOS、Windows 和 Linux 的插件。有关更多信息,请参阅本机插件。 macOS plug-ins 您可以将 macOS 增效工具部署为捆绑包,或者,如果您使用的是 IL2CPP 脚本后端,则可以部署松散的C++文件,您可以使用语法调用这些文件。有关松散C++插件的更多信息,请参阅 IL2CPP 的C++源代码插件。[DllImport("__Internal")] 要使用 XCode 创建捆绑包项目,请执行以下操作: 1. 打开XCode。 2. 选择 File > New
Unity3D Unity3D :原生插件 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 原生插件 Unity 支持原生插件,这些插件是可以用 C、C++ 和 Objective-C 等语言编写的原生代码库。插件允许用 C# 编写的代码调用这些库中的函数。此功能允许 Unity 与中间件库或现有 C/C++ 代码集成。 本机插件提供一个简单的 C 接口,然后 C# 脚本向其他脚本公开该接口。Unity 还可以调用本机插件在发生某些低级渲染事件时(例如,创建图形设备时)导出的函数。有关详细信息,请参阅低级本机插件接口。 有关本机插件的示例,请参阅本机渲染器插件。 使用本机插件 要使用本机插件: 1. 使用基于 C 的语言编写函数以访问所需的功能。 2. 将它们编译到库中。 3. 在 Unity 中,创建一个调用本机库中函数的
Unity3D Unity3D :托管插件 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 托管插件 托管插件是您在 Unity 外部创建和编译的 .NET 程序集,使用 Visual Studio 等工具将其编译为动态链接库 (DLL)。 此过程与标准 C# 脚本不同,Unity 将标准 C# 脚本作为源文件存储在 Unity 项目的“资产”文件夹中。Unity 会在标准 C# 脚本发生更改时对其进行编译,而 DLL 是预编译的,不会更改。您可以将已编译的.dll文件添加到项目中,并以与标准脚本相同的方式将其包含的类附加到游戏对象。 有关 C# 中的托管代码的详细信息,请参阅 Microsoft 的什么是托管代码?文档。 托管插件仅包含 .NET 代码,这意味着它们无法访问 .NET 库不支持的任何功能。
Unity3D Unity3D :导入和配置插件 在线工具推荐:三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 导入和配置插件 如果您有托管插件或本机插件,则可以将其导入 Unity 中,然后对其进行配置。在编辑器中,插件被视为类似于脚本的资源,您可以在检查器窗口中对其进行配置。 您可以使用插件配置来指定插件的运行位置;哪些平台和哪些平台配置,以及在哪些条件下 导入插件 将插件导入项目的最简单方法是单击插件并将其拖动到 Assets 文件夹或其子文件夹之一。Unity 将特定的文件和文件夹类型识别为插件。它还可以应用与插件的预期平台匹配的默认设置。 支持的插件文件和文件夹类型 Unity 将具有以下扩展名的文件视为插件: * a * .aar * .bc * .c * .cc * .cpp * .dll * .def * .dylib * .h * .jar * .jslib
Unity3D Unity3D :程序集定义文件格式 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 程序集定义文件格式 程序集定义和程序集定义引用资源是 JSON 文件。可以使用 Inspector 窗口在 Unity 编辑器中编辑资源文件,不过也可以使用外部工具修改 JSON 内容。 程序集定义 JSON 程序集定义是具有以下字段的一种 JSON 对象: allowUnsafeCode bool 可选。默认为 false。请参阅 Allow ‘unsafe’ Code。 "allowUnsafeCode" : true autoReferenced bool 可选。默认为 true。请参阅 Auto Referenced。 "autoReferenced": false defineConstraints string[] 可选。用作约束的符号。可以为空。请参阅 Define Constraints。
Unity3D Unity3D :程序集定义引用属性 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 程序集定义引用属性 程序集定义引用一项资源,定义了对一个程序集定义的引用。在文件夹中创建程序集定义引用资源,以在该文件夹中包含被引用的程序集定义中的脚本(而不是创建新程序集)。子文件夹中的脚本也包括在内,除非它们有自己的程序集定义或程序集定义引用资源。 属性描述Use GUID此设置控制 Unity 如何序列化对程序集定义资源的引用。启用此属性后,Unity 将这些引用另存为资源的 GUID,而不是程序集定义的名称。最好是使用 GUID 而不是名称,因为这意味着可以更改程序集定义资源的名称,而不必更新引用它的其他程序集定义及引用。Assembly Definition被引用的程序集定义资源。 由3D建模学习工作室整理翻译,转载请注明出处! 上一篇:Unity3D :程序集定义 (Assembly Definition) 属性 (mvrlink.com) 下一篇:Unity3D :程序集定义文件格式 (mvrlink.com)
Unity3D Unity3D :程序集定义 (Assembly Definition) 属性 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 程序集定义 (Assembly Definition) 属性 单击程序集定义资源 (Assembly Definition Asset) 可以在 Inspector 窗口中设置程序集的属性。 程序集定义属性分为以下部分: * Name and General * Define Constraints * Assembly Definition References * Assembly References * Platforms * Version Defines Name and General 属性:描述:Name程序集的名称(不带文件扩展名)。程序集名称在整个项目中必须是唯一的。请考虑使用反向 DNS 命名样式来减少名称冲突的可能性,尤其是在要在多个项目中使用该程序集时。 注: Unity 使用您分配给“程序集定义”资源的名称作为“名称”字段的默认值,但您可以根据需要更改名称。但是,
Unity3D Unity3D :程序集定义 推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 程序集定义 程序集定义和程序集引用是可创建用于将脚本组织为程序集的资源。 程序集是 C# 代码库,其中包含由脚本定义的已编译类和结构并且还定义了对其他程序集的引用。有关 C# 中的程序集的一般信息,请参阅 [.NET 中的程序集]。 默认情况下,Unity 几乎将所有游戏脚本都编译到预定义 程序集 Assembly-CSharp.dll 中。(Unity 还会创建[一些较小的专用预定义程序集]。) 这种安排对于小型项目而言可以接受,但是在向项目添加更多代码时会有一些缺点: * 每次更改一个脚本时,Unity 都必须重新编译所有其他脚本,从而增加迭代代码更改的整体编译时间。 * 任何脚本都可以直接访问任何其他脚本中定义的类型,这样可能更加难以重构和改进代码。 * 所有脚本都针对所有平台进行编译。 通过定义程序集,可以组织代码以促进模块化和可重用性。为项目定义的程序集中的脚本不再添加到默认程序集中,并且只能访问指定的其他程序集中的脚本。 上图演示了如何将项目中的代码拆分为多个程序集。因