This page has been translated automatically.
视频教程
界面
要领
高级
实用建议
基础
专业(SIM)
UnigineEditor
界面概述
资源工作流程
Version Control
设置和首选项
项目开发
调整节点参数
Setting Up Materials
设置属性
照明
Sandworm
使用编辑器工具执行特定任务
如何擴展編輯器功能
嵌入式节点类型
Nodes
Objects
Effects
Decals
光源
Geodetics
World Nodes
Sound Objects
Pathfinding Objects
Players
编程
基本原理
搭建开发环境
使用范例
C++
C#
UnigineScript
统一的Unigine着色器语言 UUSL (Unified UNIGINE Shader Language)
Plugins
File Formats
材质和着色器
Rebuilding the Engine Tools
GUI
双精度坐标
应用程序接口
Animations-Related Classes
Containers
Common Functionality
Controls-Related Classes
Engine-Related Classes
Filesystem Functionality
GUI-Related Classes
Math Functionality
Node-Related Classes
Objects-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
IG Plugin
CIGIConnector Plugin
Rendering-Related Classes
VR-Related Classes
创建内容
内容优化
材质
Material Nodes Library
Miscellaneous
Input
Math
Matrix
Textures
Art Samples
Tutorials

C#组件系统

组件系统使您可以通过一组构建块(组件)实现应用程序的逻辑,并将这些块分配给节点,从而为它们提供附加功能。通过组合这些小块和简单块,您可以创建一个非常复杂的逻辑系统。

逻辑组件集成了节点和C#类,其中包含逻辑实现(要执行的动作),定义了要使用的一组其他参数。

分配给节点的组件

组件为您提供了实现逻辑的更多灵活性,使您能够:

  • 控制要执行的代码部分(实现为组件方法),而不要执行
  • 控制这些代码部分的执行顺序
  • 重复使用一次编写的代码部分,以实现所需的任意数量的对象,而无需进行任何修改。如果要更改代码,则可以修改单个源(如果我们谈论内容,则类似于 NodeReferences
  • 合并要为某些节点执行的代码的某些部分。从许多小的块中构建一个非常复杂的系统(就像您将使用 NodeReference 来使用许多简单的节点构建一个大型的复杂结构一样)

开始编码之前,您应该安装必需的软件

也可以看看#

要求#

正确的编程和构建基于.NET的项目的工作流意味着一系列要求:

  • .NET SDK(适用于Windows和Linux)
  • IDE或文本编辑器。检查了不同IDE与以下.NET 版本的兼容性:

    IDE 支持的.NET版本
    MS Visual Studio Code 8.0.x
    MS Visual Studio 2022 8.0.x
    注意
    推荐使用Visual Studio Code

如果使用MS Visual Studio Code,请在首次打开组件时为OmniSharp驱动的Visual Studio Code安装C#扩展。

如果.NET 出现任何问题,请查看 .NET 问题上的“疑难解答”部分。

创建一个组件#

组件是使用 Editor 创建的。在资源浏览器中,右键单击,在下拉菜单中选择Create Code -> C# Component

在提示对话框中为组件指定名称,然后将在Asset Browser的当前目录中创建具有相应名称的C#脚本资源文件。

双击新脚本资源以在默认IDE中编辑组件逻辑。

警告
请勿在安装点中创建组件。

重命名组件#

理想情况下,您应该从头开始正确命名。名称应简洁明了,能反映其作用。但是,有时情况确实会发生变化,突然您意识到必须更改组件的名称。从2.11开始,这没什么大不了的。实际上,有两种方法可以做到:

  • 资源浏览器中重命名CS资源。组件类和关联的属性将自动重命名。在这种情况下,您唯一需要做的就是通过Find&Replace将源代码中对组件类的所有引用替换为首选IDE中的新引用。
  • 使用IDE的重构工具(例如,VS Code中的Rename symbolVisual StudioEdit -> Refactor -> Rename中的)。重命名后,只需打开UnigineEditor--对应的cs资源和关联的属性将自动重命名,并保留所有引用。请注意,在这种情况下,包含您的组件实现的cs文件的名称将更改,并且IDE会将文件从项目中删除该文件作为丢失的文件。所以,您必须将重命名的文件添加回IDE中的项目中。

组件的结构#

本质上来说,组件是从基数Component继承的C#类。

C#组件系统的工作基于 属性 创建新组件时,它会自动注册到 Component System 中,并创建一个内部 runtime 属性并通过GUID与该组件关联。以下Component类属性是组件正常工作所必需的。

源代码 (C#)
[Component(PropertyGuid = "2ae011355ed7f110a202912faa000cc22276e539")]
警告
不得更改Component属性的值。

C#组件在Properties层次结构中列出,最初它们是从基本C# Components属性继承的。

注意
不支持组件的通用自动继承,您可以通过从父组件的类继承其类来手动从任意组件派生逻辑实现。

简单继承#

假设您有一个实现某些功能的组件,并且需要一定数量的具有完全相同的功能但参数值不同的子组件。在实施质量预设或控件配置时,通常会出现这种情况。只需从UnigineEditor中的basiс组件继承每个预设的属性,然后调整必要的参数值即可。之后,您可以将这些继承的属性分配给节点,从而使用从继承的属性中获取的参数值将基本组件的逻辑附加到它们上。没有过多的复制粘贴,没有多余的代码。

逻辑#

组件的逻辑是通过一组方法实现的,这些方法由 world脚本的相应功能调用:

  • Init() —创建和初始化所有必需的资源。
  • UpdateAsyncThread()--指定要在独立于渲染线程的每一帧调用的所有逻辑功能。

    注意
    此方法没有保护锁,因此,除非您完全确定不会在其他位置修改或删除这些组件,否则不建议在此方法内修改其他组件。
  • UpdateSyncThread() —指定要在 Update() 之前执行的所有并行逻辑函数。此方法可用于执行一些消耗大量资源的计算,例如寻路,过程纹理的生成等。

    注意
    此方法应仅用于调用与当前节点相关的API方法:节点本身,其材质和属性。
  • Update() —指定每帧要调用的所有逻辑功能。
  • PostUpdate()--根据同一帧中更新的节点状态纠正行为。
  • UpdatePhysics() —模拟物理:执行连续操作(根据当前电动机的RPM向前推动汽车,不断模拟风向,执行即时碰撞响应等)。
  • Swap()--使用updateAsyncThread()方法的结果进行操作;所有其他方法(线程)已经执行且处于空闲状态。此功能之后,仅发生两个动作:

    • 删除所有排队等待删除的对象。
    • Profiler已更新.
  • Shutdown()--执行组件关闭的清除。
注意
您可以为每个阶段设置多个方法(例如,多个Update()方法或仅一个 Init())。
警告
UpdateAsyncThread(), UpdateSyncThread()UpdatePhysics()方法仅允许调用线程安全引擎函数。

参量#

组件可以具有在Parameters窗口中可编辑的参数。

以下实体在编辑器中根据数据类型和属性集自动生成了UI:

  • 组件类的public字段
  • 启用了[ShowInEditor]选项的支持类型的任何 privateprotected 字段
源代码 (C#)
public int public_field;

private int private_field;

[ShowInEditor]
private float private_editable_field;

[HideInEditor]
public float public_hidden_field;

可以为编辑器小部件声明参数及其属性。

有关支持的参数类型和属性的更多详细信息,请参考Component类。

将组件逻辑应用于节点#

组件中描述的逻辑实现只有在将组件分配给节点并且同时启用了节点和组件的情况下,才在运行时处于活动状态。

有几种将组件应用于节点的方法:

  • 选择节点,单击Add New Property,然后在*.cs asset in the Node Properties部分中键入Node tab. You can do it by dragging the *.cs资源拖到那里来完成此操作。

    还支持拖动到编辑器视口中的节点。

  • 通过使用AddComponent<T>(Node node)和Node的AddComponent<T>()函数通过代码将组件添加到节点。
源代码 (C#)
NewComponent component = AddComponent<NewComponent>(node);

NewComponent component = node.AddComponent<NewComponent>();

仅当启用组件和相应的节点时,某个组件的逻辑才处于活动状态。因此,您可以在运行时在必要时启用/禁用每个特定组件的逻辑。

您可以将多个组件分配给单个节点。执行组件逻辑的顺序由为相应方法指定的order值确定(如果order值相同或未指定,则该顺序是不确定的)。

组件可以与其他组件和节点进行交互。

运行项目#

要运行项目,请单击工具栏上的Play按钮。这将在单独的窗口中运行应用程序的实例。

注意
您将在编译成功时看到绿色的通知,而红色的则表示已发现错误。单击红色消息将在控制台中显示详细信息。 所有C#编译和运行时错误都显示在控制台中。
要使错误消息在Windows上正确显示,非Unicode程序的语言应与当前语言相同。系统区域设置。

列表中提供了自定义运行选项的预设。默认情况下,只有一个带有默认运行选项的Default (Debug)预设。单击齿轮图标以配置当前选择的自定义运行选项预设。

在打开的窗口中,以下运行选项可用:

配置 UNIGINE要使用的引擎版本
Video API 用于渲染的图形API:
  • DirectX11
  • DirectX12
  • Vulkan
Resolution 屏幕尺寸
Fullscreen

全屏模式设置,使用以下模式之一运行应用实例:

  • Disable--禁用,应用程序应在窗口模式下运行
  • Enable--启用,应用程序应在全屏模式下运行
  • Borderless Window--当应用程序窗口没有装饰时,应用程序应该在全窗口模式下运行
VR Mode 启用与受支持的VR耳机之一的兼容性:
  • Disable--禁用
  • Vive
  • Oculus
Video Debug 启用Vulkan或DirectX的调试上下文
  • Disable
  • Messages
  • Asserts
Materials Loading Mode

选择要使用的材质加载模式:

  • Fastest Start--最小的内存消耗和最大的引擎加载速度。 建议在应用程序开发阶段进行快速迭代。
  • Full Materials--与第一种模式相比,Engine启动时加载速度稍慢,并且使用了更多的内存,但峰值较少。 可用于材质数量少的小型项目(在令人满意的性能和足够的内存量的情况下)。
  • Full Materials + Compile Shaders + Load Shaders--此模式确保稳定的工作并显着减少尖峰,但占用大量内存并增加了启动时的加载时间。 推荐用于生产阶段(当您将应用程序移交给最终用户时)。
Run Current World 运行在编辑器中打开的当前世界,而不管逻辑设置的默认世界如何。
Arguments 一组启动命令行选项

更改任何自定义运行选项并关闭窗口时,将根据所选的预设执行以下操作:

  • 如果在列表中选择了Default (Debug)预设,则将在资源浏览器的当前文件夹中创建一个新的 *.launch 包含自定义运行选项的资源文件。相应的预设将在预设列表中提供。
  • 如果选择了另一个预设,则会对其进行更改。
注意
您可以通过重命名和删除相应的*.launch资源来重命名和删除自定义运行选项的预设。

调试C#组件#

在进行代码修改时,UnigineEditor会自动重新编译C#组件,将其保存并返回到编辑器。成功编译后,您将看到绿色的通知,而红色的则表示已发现错误。单击红色消息将在控制台中显示详细信息。

您可以在应用程序运行时检查C#组件的源代码,而不管该应用程序是通过UnigineEditor中的Play按钮启动还是通过IDE构建和启动。

有关详细信息,请参见调试C#组件文章。

构建应用程序#

要创建C#应用程序的调试版本或发行版本,请使用UnigineEditor中提供的File -> Create Build选项。

有关详细信息,请参见打包用于发布的最终版本文章。

用法#

例如,您可以使用组件来实现敌人在游戏中追逐玩家的逻辑:无​​论其大小,形状,速度如何,它们都会检查玩家的位置,并尝试找到一条尽可能快地靠近它的路径。代码基本上是相同的,只是使用不同的参数(可能是速度,网格或声音),因此您可以将所有这些参数放入组件(以便随时更改它们),并使用相应的组件类(例如,将敌人放置在Init()中并使用Update()方法追逐玩家)。

然后,您只需将组件分配给所有敌对对象并设置参数(定义网格,声音等)。组件系统将完成其余工作:在引擎的主循环的相应阶段,使用所有敌人的特定参数执行代码。如果您以后决定修改代码,则可以在一个单一的源代码中完成此操作--组件类。

Microprofile工具集成,使您可以监视组件系统的总体性能,并为自定义组件添加性能分析信息。

最新更新: 2024-06-10
Build: ()