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

【Unity3D】ECS入门学习(二)实例化预制体

创建Cube预制体,挂载脚本如下 

 

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

/// <summary>
/// 将物体转化实体脚本类
/// 并且转化时进行对实体entity添加组件PrintTestComponentData
/// 同时将helloworld参数传递到组件中
/// 
/// 我们需要将这个物体挂载到随便一个物体上,即利用Monobehaviour周期去创建一个实体,并且这个实体带有组件PrintTestComponentData
/// 它只会创建1个
/// </summary>
public class PrintTestConvert : MonoBehaviour, IConvertGameObjectToEntity
{
    //public float num;
    public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
    {
        //dstManager.AddComponentData(entity, new PrintTestComponentData() { 
        //    num = num
        //});
        dstManager.AddComponentData(entity, new RotationEulerXYZ());
    }
}

创建空物体挂载脚本如下 

 

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

public class ECSCubePrefabCreator : MonoBehaviour
{
    public int num = 10;
    public float interval = 1;
    public GameObject cubePrefab;
    void Start()
    {
        GameObjectConversionSettings settings = GameObjectConversionSettings.FromWorld(World.DefaultGameObjectInjectionWorld, null);
        Entity tempEntityPrefab = GameObjectConversionUtility.ConvertGameObjectHierarchy(cubePrefab, settings);

        EntityManager entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;


        Translation translation = new Translation();

        for (int i = 0; i < num; i++)
        {
            for (int j = 0; j < num; j++)
            {
                Entity tempCube = entityManager.Instantiate(tempEntityPrefab);
                translation.Value.x += interval;
                entityManager.SetComponentData(tempCube, translation);
            }
            translation.Value.x = 0;
            translation.Value.y += interval;
        }
    }
}

注意:如果发现位置没生效,那肯定是有ComponentSystem获取到了实体并持续修改位置。如下代码,让系统不生效即可,加上[DisableAutoCreation]特性

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

/// <summary>
/// 系统是class,ComponentSystem是最基础的组件系统基类
/// 使用系统从全局实体遍历筛选出带有<PrintTestComponentData>组件的实体
/// </summary>
[DisableAutoCreation]
public class PrintTestSystem : ComponentSystem
{
    protected override void OnUpdate()
    {
        Entities.ForEach((ref RotationEulerXYZ com, ref Translation translation) =>
        {
            //Debug.Log(com.helloworld);
            //Debug.Log(com.num);
            //com.Value = new float3(2, 2, 2);
            com.Value = new float3(0, 45, 0);
            translation.Value = new float3(3, 3, 3);
        });
    }
}

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

相关文章:

  • 通过 `@Configuration` 和 `WebMvcConfigurer` 配置 Spring MVC 中的静态资源映射
  • PCA降维MATLAB代码解释及应用场景
  • arcface
  • FreePBX修改IP地址和端口以及添加SSL证书开启HTTPS访问
  • 攻防世界web新手第四题easyphp
  • 某些iphone手机录音获取流stream延迟问题 以及 录音一次第二次不录音问题
  • k8s-node2 NotReady 节点NotReady如何解决?
  • 蓝桥杯——神奇的数组
  • 认识Linux的Bash
  • AppAgent 源码 (xml 解析)
  • Python机器学习笔记(十四、凝聚聚类和DBSCAN)
  • Java学习总路线 详细
  • .net core sdk 项目多版本切换
  • DataCap MongoDB Driver: 全面解析MongoDB在DataCap中的使用指南
  • JVM运行时数据区的详细解析
  • [Redis] 在Linux中安装Redis并连接图形化工具详细过程(附下载链接)
  • LeetCode-寻找两个正序数组的中位数(004)
  • 阿里云DataWorks产品使用
  • 泰山派GPIO子系统驱动---亮灯
  • 教师管理系统
  • 《C++设计模式》生成器模式
  • spring-面试整理
  • 基于 Spring Boot 的在线教育平台设计与实现设计书
  • 浅谈下雪花算法的原理,及在项目中使用需要注意哪些事项
  • idea报错:There is not enough memory to perform the requested operation.
  • 【电路笔记】-布尔代数与逻辑门示例