ECS丨通过Prefab创建实体

提示:选中右侧目录,可快速找到所需内容

本系列博客地址:传送门

为什么要了解通过Prefab创建实体呢?

想一下,如果场景中每个物体,都需要自己手动赋值、转化,这么繁琐,我想这样写么?(我想。。像下面这样写~)

还记得我们讲过ECS自动为我们创建一个默认世界(World),世界包含了实体管理器(EntityManager)和项目中所有可用的系统(System)吗?EntityManager负责管理某个世界(World)下的所有实体,那么我们便可以直接从EntityManager获取到某个实体的组件。

所以利用Prefab创建实体代码如下:

注意:

  • SetComponentData 是修改组件数值。
  • 同样的,也可以调用EntityManager.AddComponentData给实体添加任意多个组件。
using Unity.Entities;
using Unity.Mathematics;
using Unity.Transforms;
using UnityEngine;
 
public class Spawner_FromMonoBehaviour : MonoBehaviour
{
	public GameObject Prefab;
	public int CountX = 10;
	public int CountY = 10;
 
	void Start ()
	{
		// 创建实体时需要指定配置
		var settings = GameObjectConversionSettings.FromWorld(World.DefaultGameObjectInjectionWorld, null);
 
		// 从我们的prefab中创建一个实体对象,虽然创建了,但这个对象并不会生成在场景
		var entityFromPrefab = GameObjectConversionUtility.ConvertGameObjectHierarchy(Prefab, settings);
 
		// 实体管理器
		var entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;
 
		// 循环创建多个实体
		for (var x = 0; x < CountX; x++)
		{
			for (var y = 0; y < CountY; y++)
			{
				//生成实体。(现在生成的能在场景看到)
				var instance = entityManager.Instantiate(entityFromPrefab);
 
				// 修改实体的Translation组件
				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 });
			}
		}
	}
}
扫描二维码关注公众号,回复: 10820225 查看本文章

本节到此结束,我们知道Mono的生命周期是什么,ECS生命周期是什么?

那下节我们讲ECS生命周期。

Enjoy~

发布了335 篇原创文章 · 获赞 88 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/weixin_38239050/article/details/105515891