当前位置: 首页 > article >正文

【Unity3D】ECS入门学习(五)共享组件 ISharedComponentData

using Unity.Entities;
using System;

//[GenerateAuthoringComponent] 无法生效 必须手动添加
public struct MyShareComponentData : ISharedComponentData, IEquatable<MyShareComponentData>
{

    public int data;

    public bool Equals(MyShareComponentData other)
    {
        return data == other.data;
    }
    public override int GetHashCode()
    {
        int tempHash = 0;
        return tempHash ^= data.GetHashCode();
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Entities;
public class ShareConvert : MonoBehaviour, IConvertGameObjectToEntity
{
    public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
    {
        dstManager.AddSharedComponentData<MyShareComponentData>(entity, new MyShareComponentData() { data = 1 });
    }
}

一个继承于Monobehaviour脚本 Start方法执行如下代码: 

    //查询共享组件 缓存到数组
        EntityManager entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;
        EntityQuery query = entityManager.CreateEntityQuery(typeof(MyShareComponentData));
        NativeArray<Entity> array = query.ToEntityArray(Allocator.TempJob);

        //获取并修改 (默认是1)  实际上它会创建一个新的共享组件,并不会影响array[1]实体的组件,它还是保持1
        //MyShareComponentData shareCom = entityManager.GetSharedComponentData<MyShareComponentData>(array[0]);
        //shareCom.data = 5;
        //entityManager.SetSharedComponentData(array[0], shareCom);

        //与上方同理
        entityManager.SetSharedComponentData(array[0], new MyShareComponentData() { data = 5 });

        //移除
        //entityManager.RemoveComponent<MyShareComponentData>(array[0]);        

        MyShareComponentData share1 = entityManager.GetSharedComponentData<MyShareComponentData>(array[0]);
        MyShareComponentData share2 = entityManager.GetSharedComponentData<MyShareComponentData>(array[1]);
        Debug.Log(share1.Equals(share2));
        query.Dispose();
        array.Dispose();

场景上创建2个空物体挂载如下脚本:

 运行测试会发现如下图

仅有index=0的被修改为5,另一个不会,也就是说修改共享组件会生成一个新的组件,能让共享组件发挥作用就是不要修改内容,这样才会保持使用同一个。

共享组件使用AddSharedComponentData接口添加、SetSharedComponentData设置、GetSharedComponentData获取。


http://www.kler.cn/a/457631.html

相关文章:

  • 如何利用 ClickHouse 实现高级分析:MySQL 到 ClickHouse 实时数据同步指南
  • 路由基本配置实验
  • 如何利用Logo设计免费生成器创建专业级Logo
  • AfuseKt1.4.4 | 刮削视频播放器,支持阿里云盘和自动海报墙
  • 图片验证码如何显示在 Apifox 的响应控制台中
  • 前端路由layout布局处理以及菜单交互(三)
  • MySQL三层B+树能存多少条数据
  • 鸿蒙项目云捐助第三十一讲云捐助项目云前台显示商品列表
  • UDP协议解说
  • RJ45网口模块设计
  • 常见网络攻击场景常被用于测试系统安全性
  • Android中使用AIDL实现进程通信
  • ArrayList和LinkedList的区别、优缺点与使用场景
  • 生产力利器,Mac 系统优选,keychron K10Max 三模键盘体验分享
  • QT-------认识QT
  • 呼叫中心中间件免费体验测试和freeswitch部署方案
  • Linux CPU调度算法
  • 领克Z20结合AI技术,革新自动驾驶辅助系统
  • 无需配置设备,借助GitHub快速编译项目并直接运行!
  • 更新本地 specs 仓库时,出现 SSL 证书验证失败错误 临时解决方案
  • GSM PDU解码在Linux下的C语言实现
  • [oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
  • ARM64 CSEL条件 B条件一览
  • 【畅购商城】详情页模块之评论
  • STM32完全学习——使用定时器1精确延时
  • Docker离线安装简易指南