Unity ECS学习笔记(6)通过Prefab创建实体

最近在学习unity的ecs框架,转载几篇写的比较好的文章帮助理解

原文日期 2019-12-5 避免误导未来使用正式版的开发者。

 

大家会不会很疑惑,创建实体都需要将场景里的GameObject进行转换,太麻烦了吧?

正常情况下我们都是从prefab(预制体)实例化游戏对象的,这种在场景里转换实体的方式总感觉哪里不对,是这样吗?

没错,其实还有更方便的转换实体方式,一起来看看吧。

1.世界(World)

新的转换实体的代码其实很简单,但在这之前,我们需要先了解一些基础概念。

ECS中有一个很基本的东西——世界(World)。

整个游戏过程中可以有多个世界,而ECS会自动为我们创建一个默认世界(可以关闭自动创建,这里不做过多的介绍)。

默认创建的世界(World)包含了实体管理器(EntityManager)以及项目中所有可用的系统(System)。

这也就解释了为什么我们的System类会自动被执行,这因为它们被添加到了默认的世界中。至于怎么添加的,我们就先不管了(用了反射)。

2.实体管理器(EntityManager)

这个就很好理解了,EntityManager负责管理某个世界(World)下的所有实体,理论上来说我们可以直接从EntityManager获取到某个实体的组件。

3.我们所喜爱的实体创建方式

直接看代码吧:

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

public class Manager : MonoBehaviour
{
	public GameObject m_Prefab;
	public int m_CountX = 10;
	public int m_CountY = 10;

	void Start()
	{
		/// 从我们的prefab中创建一个实体对象
		var entityFromPrefab = GameObjectConversionUtility.ConvertGameObjectHierarchy(m_Prefab, World.Active);
		var entityManager = World.Active.EntityManager;

		for (var x = 0; x < m_CountX; x++)
		{
			for (var y = 0; y < m_CountY; y++)
			{
				/// 赋值新的实体
				var instance = entityManager.Instantiate(entityFromPrefab);

				var position = transform.TransformPoint(new float3(x * 1.3F, noise.cnoise(new float2(x, y) * 0.21F) * 2, y * 1.3F));
				entityManager.SetComponentData(instance, new Translation { Value = position });
			}
		}

	}
}

a.首先,这是一个MonoBehaviour

b.通过调用GameObjectConversionUtility.ConvertGameObjectHierarchy函数从我们的Prefab中创建了一个实体对象

c.调用EntityManager的Instantiate函数,从现有的实体创建新的实体,然后循环创建多个相同的实体。

d.接下来就是创建组件,通过调用EntityManager.SetComponentData给实体修改组件(SetComponentData方法,该方法将数值传进组件中,并让组件储存起来。)。同样的,也可以调用EntityManager.AddComponentData给实体添加任意多个组件。

 

代码很简单,相信大家看看就懂了。

这种创建实体的方式,我个人认为,是非常贴近实际开发情况了。

4.运行

至于效果,当然是先创建一个场景,然后创建一个空的GameObject,然后把Spawner_FromMonoBehaviour挂到GameObject上。

另外,自己创建一个Prefab(预制体)拖到Spawner_FromMonoBehaviour的Prefab字段上,然后运行,就能看到创建了一堆对象了。

 

注意,本系列教程基于DOTS相关预览版的Package包,是预览版,不代表正式版的时候也适用。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity ECS(Entity Component System)是Unity引擎的一种编程范式,它是一种数据驱动的编程模型,它将游戏对象(Entity)分解为数据和行为两个部分,其中数据由组件(Component)来表示,行为则由系统(System)来实现。相对于传统的面向对象编程模型,ECS提供了更高效、更灵活的编程方式,可以有效地提高游戏的性能和扩展性。 下面是我学习Unity ECS时的笔记: ## Entity Entity是ECS中最基本的概念,它表示游戏对象。每个Entity由一个唯一的ID来标识,可以通过EntityManager来创建、销毁、查询和管理Entity。 ## Component Component是Entity的数据部分,用来描述Entity的属性和状态。每个Component包含一些数据成员和一些方法,用来操作这些数据成员。Component是以结构体(struct)的形式定义的,通常只包含数据成员,不包含方法。 ## System System是Entity的行为部分,用来实现游戏逻辑和操作Component。System可以访问和操作EntityManager和Component,但不能直接访问Entity。每个System包含一个或多个Component,表示它所处理的数据类型。System是以类(class)的形式定义的,通常包含一个Update方法,用来实现游戏逻辑。 ## Job Job是一种轻量级的线程,用于并行执行System中的任务。Job可以访问和操作Component,但不能直接访问Entity和EntityManager。Job通常是以结构体(struct)的形式定义的,不包含方法。 ## Archetype Archetype是Entity的集合,包含一组具有相同Component类型的Entity。Archetype可以用来优化数据的访问和处理,可以在不同的System之间共享。 ## Chunk Chunk是Archetype中的数据块,包含一组连续的Entity和它们的Component数据。Chunk可以用来优化内存的分配和访问,可以在Job中进行并行处理。 ## Buffer Buffer是一种Component类型,用来存储可变长度的数据,例如数组或列表。Buffer可以在System和Job中进行修改和访问。 以上是我学习Unity ECS时的笔记,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值