欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-06 22:59:54
...

最近在学习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给实体修改组件。同样的,也可以调用EntityManager.AddComponentData给实体添加任意多个组件。

 

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

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

4.运行

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

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

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

 

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

相关标签: Unity ECS