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.mzph.cn/web/11331.shtml

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

相关文章

炒股开户佣金最低万1和万0.854,融资融券现在利率最低4.0%~5%

​​炒股开户佣金一般是万1和万0.854&#xff0c;万0.854有一定的资金量要求&#xff0c;高于万1的是可以申请降低的。 开户万1佣金和万0.854佣金只需要联系证券公司客户经理协商就行。 开户流程&#xff1a; 1、向客户经理索要开户链接或者扫描二维码、进入申请页面&#x…

本地搭建各大直播平台录屏服务结合内网穿透工具实现远程管理录屏任务

文章目录 1. Bililive-go与套件下载1.1 获取ffmpeg1.2 获取Bililive-go1.3 配置套件 2. 本地运行测试3. 录屏设置演示4. 内网穿透工具下载安装5. 配置Bililive-go公网地址6. 配置固定公网地址 本文主要介绍如何在Windows系统电脑本地部署直播录屏利器Bililive-go&#xff0c;并…

Nachi那智不二越机器人维修技术合集

一、Nachi机械手维护基础知识 1. 定期检查&#xff1a;定期检查机器人的各个部件&#xff0c;如机械手伺服电机、机器人减速器、机械臂传感器等&#xff0c;确保其运行正常。 2. 清洁与润滑&#xff1a;定期清洁Nachi工业机器人表面和内部&#xff0c;并使用合适的润滑油进行润…

VRRP协议-负载分担配置【分别在路由器与交换机上配置】

VRRP在路由器与交换机上的不同配置 一、使用路由器实现负载分担二、使用交换机实现负载分担一、使用路由器实现负载分担 使用R1与R2两台设备分别进行VRRP备份组 VRRP备份组1,虚拟pc1的网关地址10.1.1.254 VRRP备份组2,虚拟pc2的网关地址10.1.1.253 ①备份组1的vrid=1,vrip=…

修正牛顿法求解无约束问题

function [x,val,k]revisenm(fun,gfun, Hess, x0) %功能:用修正牛顿法求解无约束问题:min f(x) %输入:x0是初始点&#xff0c;fun, gfun,Hess分别是求目标函数值&#xff0c;梯度&#xff0c;Hesse矩阵的函数 %输出:x,val分别是近似最优点和最优值&#xff0c;k是迭代次数 nl…

vue3中使用cherry-markdown

附cherry-markdown官网及api使用示例 官网:https://github.com/Tencent/cherry-markdown/blob/main/README.CN.md api:Cherry Markdown API 考虑到复用性,我在插件的基础上做了二次封装,步骤如下: 1.下载 (一定要指定版本0.8.22,否则会报错: [vitel Internal server e…

初识指针(5)<C语言>

前言 在前几篇文章中&#xff0c;已经介绍了指针一些基本概念、用途和一些不同类型的指针&#xff0c;下文将介绍某些指针类型的运用。本文主要介绍函数指针数组、转移表&#xff08;函数指针的用途&#xff09;、回调函数、qsort使用举例等。 函数指针数组 函数指针数组即每个…

深度学习知识点全面总结

ChatGPT 深度学习是一种使用神经网络来模拟人脑处理数据和创建模式的机器学习方法。下面是深度学习的一些主要知识点的总结&#xff1a; 1. 神经网络基础&#xff1a; - 神经元&#xff1a;基本的计算单元&#xff0c;模拟人脑神经元。 - 激活函数&#xff1a;用于增加神…

【CSP CCF记录】数组推导

题目 过程 思路 每次输入一个Bi即可确定一个Ai值&#xff0c;用temp记录1~B[i-1]&#xff0c;的最大值分为两种情况&#xff1a; 当temp不等于Bi时&#xff0c;则说明Bi值之前未出现过&#xff0c;Ai必须等于Bi才能满足Bi是Ai前缀最大的定义。当temp等于Bi时&#xff0c;则说…

SpringAMQP-消息转换器

这边发送消息接收消息默认是jdk的序列化方式&#xff0c;发送到服务器是以字节码的形式&#xff0c;我们看不懂也很占内存&#xff0c;所以我们要手动设置一下 我这边设置成json的序列化方式&#xff0c;注意发送方和接收方的序列化方式要保持一致 不然回报错。 引入依赖&#…

重磅推出:135届广交会采购商名录,囊括28个行业数据!

5.5日&#xff0c;第135届中国进出口商品交易会&#xff08;简称广交会&#xff09;在广州圆满闭幕&#xff0c;这一全球贸易盛典再次展现了中国制造的卓越实力和文化魅力&#xff0c;成就斐然&#xff0c;吸引了全球目光。 本届广交会线下出口成交额达247亿美元&#xff0c;对…

项目-坦克大战-让坦克动起来

为什么写这个项目 好玩涉及到java各个方面的技术 1&#xff0c;java面向对象 2&#xff0c;多线程 3&#xff0c;文件i/o操作 4&#xff0c;数据库巩固知识 java绘图坐标体系 坐标体系-介绍 坐标体系-像素 计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的像素是一…

详细解读字节跳动视频生成模型StoryDiffusion:连环画创作和长视频生成

Diffusion Models专栏文章汇总:入门与实战 前言:最近字节跳动提出了一项关于特征一致图像生成的工作StoryDiffusion,可以生成一系列特征主题相关的图像,还可以扩展成具有时间一致性的帧序列,从而组成长视频。这篇博客火速解读这篇最新的工作,包括论文和代码。 目录 贡献…

安卓开发问题:安卓Ble出现动态鉴权失败以及扫描设备一直进入不了回调函数的问题

问题1描述 1、安卓12需要动态鉴权 // 鉴权函数 requestPermissions(permissionsList.toArray(strings), MyConstants.REQUEST_CODE_PERMISSIONS);但是在鉴权回调函数中如Manifest.permission.BLUETOOTH_SCAN、Manifest.permission.BLUETOOTH_CONNECT一直显示失败&…

力扣HOT100 - 70. 爬楼梯

解题思路&#xff1a; 动态规划 注意 if 判断和 for 循环 class Solution {public int climbStairs(int n) {if (n < 2) return n;int[] dp new int[n 1];dp[1] 1;dp[2] 2;for (int i 3; i < n; i) {dp[i] dp[i - 1] dp[i - 2];}return dp[n];} }

设计模式-10 - Memento Design Pattern

设计模式-10 - Memento Design Pattern 1.定义 备忘录模式是一种设计模式&#xff0c;它允许在不破坏封装性的情况下捕获和恢复对象的内部状态。 其结构&#xff1a; Originator&#xff1a;创建和管理备忘录的对象。 Memento&#xff1a;存储 Originator 状态的备忘录对象…

品牌设计理念和logo设计方法

一 品牌设计的目的 设计是为了传播&#xff0c;让传播速度更快&#xff0c;传播效率更高&#xff0c;减少宣传成本 二 什么是好的品牌设计 好的设计是为了让消费者更容易看懂、记住的设计&#xff0c; 从而辅助传播&#xff0c; 即 看得懂、记得住。 1 看得懂 就是让别人看懂…

树莓派|采集视频并实时显示画面

1、使用SSH远程连接到树莓派 2、新建存放代码的目录 mkdir /home/pi/my_code_directory 3、进入存放代码的目录 cd /home/pi/my_code_directory 4、新建py文件 nano cv2test.py 5、输入代码 import cv2# 打开摄像头 cap cv2.VideoCapture(0)while True:# 读取视频帧ret…

BGP学习二:BGP通告原则,BGP反射器,BGP路径属性细致讲解,新手小白无负担

目录 一.AS号 二.BGP路由生成 1.network 2.import-route引入 三.BGP通告原则 1.只发布最优且有效的路由 2.从EBGP获取的路由&#xff0c;会发布给所有对等体 3.水平分割原则 4.IBGP学习BGP默认不发送给EBGP&#xff0c;但如果也从IGP学习到了这条路由&#xff0c;就发…

mysql 幻读,脏读和不可重复读

MySQL的脏读、幻读和不可重复读是数据库事务处理中的三种常见问题&#xff0c;它们都涉及到数据的一致性和并发性。一&#xff0c;脏读 脏读是指一个事务读取了另一个事务未提交的数据。这可能导致数据不一致的问题。 例如&#xff1a; 用户user1的初始balance是100&#xff0…