UnityDOTS备忘

Unity DOTS中创建一个AssetBundle并将其用作Entity

  1. 创建一个新的Unity项目,并确保已启用DOTS功能。

  2. 创建一个AssetBundle,可以通过在Project视图中右键单击文件夹并选择“Create > AssetBundle”来创建。

  3. 将您想要转换为Entity的资源(例如模型、纹理等)拖放到AssetBundle中。

  4. 创建一个新的C#脚本,用于加载AssetBundle并将其转换为Entity。以下是一个示例代码:

System间的数

using Unity.Entities;
using Unity.Transforms;
using Unity.Rendering;
using UnityEngine;
using Unity.Mathematics;

public class AssetBundleToEntity : MonoBehaviour
{
    public GameObject prefab;
    public Material material;

    void Start()
    {
        var entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;

        var entityPrefab = GameObjectConversionUtility.ConvertGameObjectHierarchy(prefab, World.Active);

        Entity entity = entityManager.Instantiate(entityPrefab);

        entityManager.AddComponentData(entity, new Translation { Value = new float3(0, 0, 0) });

        entityManager.AddSharedComponentData(entity, new RenderMesh
        {
            material = material,
            mesh = entityManager.GetSharedComponentData<RenderMesh>(entityPrefab).mesh
        });
    }
}

据传递

动态加载代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine;
using Unity.Entities;
using Unity.Transforms;
using Unity.Rendering;
using Unity.Mathematics;

public class DynamicAssetBundleLoading : MonoBehaviour
{
    public string assetBundlePath;
    public string assetName;
    public Material material;

    IEnumerator Start()
    {
        AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(assetBundlePath);
        yield return request;

        AssetBundle assetBundle = request.assetBundle;

        AssetBundleRequest assetRequest = assetBundle.LoadAssetAsync<GameObject>(assetName);
        yield return assetRequest;

        GameObject prefab = assetRequest.asset as GameObject;

        var entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;

        var entityPrefab = GameObjectConversionUtility.ConvertGameObjectHierarchy(prefab, World.Active);

        Entity entity = entityManager.Instantiate(entityPrefab);

        entityManager.AddComponentData(entity, new Translation { Value = new float3(0, 0, 0) });

        entityManager.AddSharedComponentData(entity, new RenderMesh
        {
            material = material,
            mesh = entityManager.GetSharedComponentData<RenderMesh>(entityPrefab).mesh
        });

        assetBundle.Unload(false);
    }
}

释放Entity

using Unity.Entities;
using Unity.Transforms;
using Unity.Rendering;
using UnityEngine;

public class ReleaseEntity : MonoBehaviour
{
    EntityManager entityManager;

    void Start()
    {
        entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;

        // 创建Entity
        Entity entity = entityManager.CreateEntity();

        // 添加组件数据
        entityManager.AddComponentData(entity, new Translation { Value = new float3(0, 0, 0) });

        // 添加SharedComponent数据
        entityManager.AddSharedComponentData(entity, new RenderMesh
        {
            material = GetComponent<Renderer>().material,
            mesh = GetComponent<MeshFilter>().sharedMesh
        });
    }

    void OnDestroy()
    {
        // 释放Entity
        entityManager.DestroyEntity(entity);

        // 释放相关的GameObject和AssetBundle引用
        Destroy(gameObject);
        Resources.UnloadUnusedAssets();
    }
}

System以MonoBehaviour数据事件通知

在Unity的Data-Oriented Technology Stack (DOTS)中,如果您希望在ECS系统中的Job执行完毕后通知MonoBehaviour或外部代码,可以使用Unity的Events系统或自定义事件系统来实现通信。以下是一种常见的方法:

  1. 使用Unity的Events系统:
    • 在MonoBehaviour中定义一个事件,当事件被触发时通知外部代码。
    • 在ECS系统中,创建一个System,在System中检查Job是否执行完毕,并在适当的时机触发MonoBehaviour中定义的事件。
    • using Unity.Entities;
      using UnityEngine;
      using UnityEngine.Events;

      public class JobCompletedEvent : MonoBehaviour
      {
          public UnityEvent onJobCompleted;

          public void TriggerJobCompletedEvent()
          {
              onJobCompleted.Invoke();
          }
      }

      public class JobCompletionSystem : ComponentSystem
      {
          protected override void OnUpdate()
          {
              // 检查Job是否执行完毕
              if (jobCompleted)
              {
                  // 获取JobCompletedEvent组件
                  JobCompletedEvent jobCompletedEvent = FindObjectOfType<JobCompletedEvent>();

                  // 触发事件通知外部代码
                  jobCompletedEvent?.TriggerJobCompletedEvent();
              }
          }
      }

    • 自定义事件系统:
      • 创建一个自定义的事件系统,允许ECS系统和MonoBehaviour之间进行通信。
      • 在ECS系统中,触发自定义事件来通知MonoBehaviour或外部代码。
      • using Unity.Entities;
        using UnityEngine;

        public class CustomEventSystem : ComponentSystem
        {
            public delegate void JobCompletedEventHandler();
            public static event JobCompletedEventHandler OnJobCompleted;

            protected override void OnUpdate()
            {
                // 检查Job是否执行完毕
                if (jobCompleted)
                {
                    // 触发自定义事件通知外部代码
                    OnJobCompleted?.Invoke();
                }
            }
        }

  2. IBufferElementData

    要将DynamicBuffer与Entity关联,我们只需要定义需要的IBufferElementData,而不是DynamicBuffer本身,使用GenerateAuthoringComponent属性会自动帮我们生成DynamicBuffer并添加到Entity上,这里需要注意一下,下面定义一个简单的IBufferElementData看一下吧:

  3. using Unity.Entities;
    
    [GenerateAuthoringComponent]
    public struct IntBufferElement : IBufferElementData
    {
        public int Value;
    }

 添加与释放

EntityManager.AddComponent<IntBufferElement>(yourEntity);
EntityManager.RemoveComponent<IntBufferElement>(yourEntity);

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

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

相关文章

官方文档k8s1.30安装部署高可用集群,kubeadm安装Kubernetes1.30最新版本

文章目录 节点架构一、准备开始(每一台机器都执行)1️⃣ 检查所需端口(可以直接关闭防火墙放开所有端口)端口和协议控制面工作节点 关闭防火墙关闭 SELinux 2️⃣ 安装containerd容器containerd部署containerd切换为国内源 3️⃣ 设置/etc/hosts 二、安装 kubeadm、kubelet 和 …

C++青少年简明教程:C++程序结构

C青少年简明教程&#xff1a;C程序结构 一个简单的C程序源码如下&#xff1a; #include <iostream> using namespace std;int main() {cout << "Hello World" << endl;return 0; }下面解析一下。 1. #include <iostream> 这是一条预处理…

SSH隧道可以做什么?

SSH隧道是SSH协议服务端提供的一种扩展功能&#xff0c;一般仅在linux服务器的SSH服务端中提供&#xff0c;其它的如交换机、防火墙等网络设备中&#xff0c;虽然支持SSH协议&#xff0c;但多数并不提供SSH隧道功能。 所以&#xff0c;在通过SSH协议连接远程设备时&#xff0c…

Python远程连接Linux执行操作

一、任务要求 要使用Python编写代码来远程给Linux主机上传一个文件&#xff0c;可以使用paramiko库&#xff0c;这是一个实现了SSHv2协议的Python库&#xff0c;它支持SSH连接&#xff08;包括客户端和服务端&#xff09;&#xff0c;并且提供SFTP&#xff08;SSH File Transf…

VScode查看以十六进制查看文件的插件说明

找到插件并下载 打开指定的文件 选择打开方式即可 结果如下

STM32——GPIO输出(点亮第一个LED灯)

代码示例&#xff1a; #include "stm32f10x.h" // Device headerint main() {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启时钟GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_InitSt…

成为计算机视觉(CV)需要掌握哪些技术知识(综述)

在CV领域&#xff0c;深度学习和机器学习技术发挥着至关重要的作用&#xff0c;它们为图像识别、目标检测、图像分割等任务提供了强大的工具和方法。本文将综述CV中需要学习的深度学习和机器学习技术。 一、深度学习技术 卷积神经网络&#xff08;Convolutional Neural Netwo…

【吊打面试官系列】Java高并发篇 - 为什么线程通信的方法 wait(), notify()和 notifyAll()被定义在 Object 类里?

大家好&#xff0c;我是锋哥。今天分享关于 【为什么线程通信的方法 wait(), notify()和 notifyAll()被定义在 Object 类里&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 为什么线程通信的方法 wait(), notify()和 notifyAll()被定义在 Object 类里&#xff1…

被严重低估的后端技术面经,强到离谱!

前天加完班&#xff0c;回家路上翻了下粉丝群。发现群里最近在疯传一份叫《后端 offer 收割机养成指南》的资料。 本来感觉这个 title 看起来有点离谱&#xff0c;结果没想到仔细一看&#xff0c;这份资料竟然真的有点东西。内容收纳的很全&#xff0c;而且融合了很多今年的新…

软件测试从业人员怎么看待测试工作的前途?

调查背景   工信部发布的2023年软件业经济运行情况显示&#xff0c;全年累计完成软件业务收入123258亿元&#xff0c;同比增长13.4%&#xff0c;增速较上年同期提高2.2个百分点。值得注意的是&#xff0c;亚太地区软件测试市场正在迅速崛起&#xff0c;预计到2026年复合年增长…

Django开发实战之单元测试和集成测试之编写测试用例以及代码覆盖率统计分析

这里分为了两种情况&#xff1a; E2E&#xff1a;接近真实使用情况&#xff0c;用例数量少 UT&#xff1a;执行速度快&#xff0c;用例数量多 1、整理测试点 1、注册功能 允许匿名访问URL&#xff1a;http://127.0.0.1:8000/accounts/register/get请求&#xff1a;返回htmlp…

Linux 用户进程启动与Systemd

Linux用户空间的启动 我们都知道&#xff0c;Linux在内核的初始化自身的流程结束后&#xff0c;就会将程序流的运行转到用户态&#xff0c;也就是进入init进程流之后&#xff0c;他会按照这个流程进行初始化&#xff1a; init进程初始化 基础的底层服务&#xff1a;比如说ude…

JavaScript 事件

在 Web 开发中&#xff0c;JavaScript 事件是至关重要的概念之一。通过事件&#xff0c;我们可以实现交互性和动态性&#xff0c;使用户与网页进行互动。本篇博客将介绍 JavaScript 事件的基础知识&#xff0c;并深入探讨一些高级技术。 1. 什么是事件&#xff1f; 事件是指用…

振弦采集仪在岩土工程监测中的性能评价及标准选择

振弦采集仪在岩土工程监测中的性能评价及标准选择 河北稳控科技振弦采集仪是一种重要的岩土工程监测仪器&#xff0c;用于测量振动场的频率、振幅和相位等参数。它在岩土工程施工和地震监测中具有重要的应用价值。本文将对振弦采集仪的性能评价及标准选择进行详细介绍。 首先&…

每日一练2024.5.9

题目&#xff1a; 给定一个非负整数数组 nums&#xff0c; nums 中一半整数是 奇数 &#xff0c;一半整数是 偶数 。 对数组进行排序&#xff0c;以便当 nums[i] 为奇数时&#xff0c;i 也是 奇数 &#xff1b;当 nums[i] 为偶数时&#xff0c; i 也是 偶数 。 你可以返回 …

Java | Leetcode Java题解之第80题删除有序数组中的重复项II

题目&#xff1a; 题解&#xff1a; class Solution {public int removeDuplicates(int[] nums) {int n nums.length;if (n < 2) {return n;}int slow 2, fast 2;while (fast < n) {if (nums[slow - 2] ! nums[fast]) {nums[slow] nums[fast];slow;}fast;}return sl…

Python 全栈系列242 踩坑记录:租用算力机完成任务

说明 记一次用算力机分布式完成任务的坑。 内容 1 背景 很早的时候&#xff0c;做了一个实体识别模型。这个模型可以识别常见的PER、ORG、LOC和TIME几种类型实体。 后来&#xff0c;因为主要只用来做PER、ORG的识别&#xff0c;于是我根据业务数据&#xff0c;重新训练了模…

免费矢量图标汇总:一文掌握10个优质网站!

矢量图标是我们日常设计应用程序和网页过程中不可缺少的元素之一。通过小矢量图标&#xff0c;我们可以快速方便地实现视觉指导和功能划分。但在创作中&#xff0c;设计师往往需要花费大量的时间和精力来寻找不同网站的矢量图标&#xff0c;以满足他们的设计需求&#xff0c;这…

跨域问题(服务器和浏览器之间)待补充

一、为什么产生&#xff1a; 同源策略&#xff08;域名&#xff0c;协议&#xff0c;端口&#xff09;&#xff0c;安全问题 二、怎么解决&#xff1a; 1、cros:修改响应头 2、jp&#xff1a;采用js标签 3、代理&#xff08;创建服务器&#xff0c;定义规则&#xff0c;服…
最新文章