提示:选中右侧目录,可快速找到所需内容
本系列博客地址:传送门
为什么要了解通过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~