Unity ECS 基础教学(二)
OK 老规矩,直接上代码上图片:
组件搭载:
注意预制体、材质球以及网格搭载。
运行效果:
ECS的组件接口
有四种加载方式以及创建逻辑输出,自己看一下,看不明白就查找一下资料,或者留言吧。
using System.Collections;
using System.Collections.Generic;
using Unity.Entities;
using Unity.Rendering;
using Unity.Transforms;
using UnityEngine;
public class CraeatNewEntity_ZH : MonoBehaviour
{
//Entity 类型
private EntityManager _EntityManager;
[SerializeField]
private GameObject _GameObjectPrefabe;//预制体
[SerializeField]
private Mesh _MyEntityMesh;//网格赋予
[SerializeField]
private Material _MyEntityMaterial;//材质赋予
void Start()
{
//赋值
_EntityManager = World.DefaultGameObjectInjectionWorld.EntityManager;
CerateMyEntity();
}
/// <summary>
/// 创建 Enity 方法
/// </summary>
private void CerateMyEntity()
{
#region 组件添加 方式:EntityArchetype
//组件添加 方式:EntityArchetype
EntityArchetype _EntityArchetype = _EntityManager.CreateArchetype(
//组件添加
typeof(Translation),
typeof(RenderMesh),
typeof(Rotation),
typeof(RenderBounds),
typeof(LocalToWorld)
);
Entity _EntityArchetypeOne = _EntityManager.CreateEntity(_EntityArchetype);
//组件属性变更
_EntityManager.SetComponentData(_EntityArchetypeOne, new Translation { Value = Vector3.zero });
//RenderMesh 赋值才能显示出来
//组件赋值 RenderMesh (_EntityNull)
_EntityManager.AddSharedComponentData(_EntityArchetypeOne, new RenderMesh
{
mesh = _MyEntityMesh,
material = _MyEntityMaterial,
});
#endregion
#region 组件添加 方式:ComponentType 数组
ComponentType[] _ComponentType = new ComponentType[]
{
typeof(Translation),
typeof(RenderMesh),
typeof(Rotation),
typeof(RenderBounds),
typeof(LocalToWorld)
};
//组件赋值 (ComponentType)
EntityArchetype _EntityArchetypeComponentArray = _EntityManager.CreateArchetype(_ComponentType);
//创建 Entity (ComponentType)
Entity _MyEntityComArray = _EntityManager.CreateEntity(_EntityArchetypeComponentArray);
//组件属性变更
_EntityManager.SetComponentData(_MyEntityComArray, new Translation { Value = Vector3.up*2 });
//组件赋值 (_MyEntityComArray)
_EntityManager.AddSharedComponentData(_MyEntityComArray, new RenderMesh
{
mesh = _MyEntityMesh,
material = _MyEntityMaterial,
});
#endregion
#region 组件添加 方式:ComponentType 和 EntityArchetype
ComponentType _Translation = new ComponentType(typeof(Translation), ComponentType.AccessMode.ReadWrite);
ComponentType _RenderMesh = new ComponentType(typeof(RenderMesh), ComponentType.AccessMode.ReadWrite);
ComponentType _Rotation = new ComponentType(typeof(Rotation), ComponentType.AccessMode.ReadWrite);
ComponentType _RenderBounds = new ComponentType(typeof(RenderBounds), ComponentType.AccessMode.ReadWrite);
ComponentType _LocalToWorld = new ComponentType(typeof(LocalToWorld), ComponentType.AccessMode.ReadWrite);
//组件赋值 (_EntityArchetypeBlend)
EntityArchetype _EntityArchetypeBlend = _EntityManager.CreateArchetype(_Translation, _RenderMesh, _Rotation, _RenderBounds, _LocalToWorld);
//创建 Entity (_EntityArchetypeBlend)
Entity _MyEntityOneBy = _EntityManager.CreateEntity(_EntityArchetypeBlend);
//组件属性变更
_EntityManager.SetComponentData(_MyEntityOneBy, new Translation { Value = Vector3.up * 4 });
//组件赋值 (_MyEntity)
_EntityManager.AddSharedComponentData(_MyEntityOneBy, new RenderMesh
{
mesh = _MyEntityMesh,
material = _MyEntityMaterial,
});
#endregion
#region 组件添加 方式:拷贝 预制体
BlobAssetStore _BlobAssetStore = new BlobAssetStore();
GameObjectConversionSettings _Settings = GameObjectConversionSettings.FromWorld(World.DefaultGameObjectInjectionWorld, _BlobAssetStore);
Entity _EntityPrefabe = GameObjectConversionUtility.ConvertGameObjectHierarchy(_GameObjectPrefabe, _Settings);
//组件属性变更
_EntityManager.SetComponentData(_EntityPrefabe, new Translation { Value = Vector3.up * 6 });
//创建 Entity (_MyEntityCopy)
Entity _MyEntityCopy = _EntityManager.Instantiate(_EntityPrefabe);
#endregion
#region 组件添加 方式:自定义
//创建 Entity (_EntityNull)
Entity _EntityNull = _EntityManager.CreateEntity();
_EntityManager.AddComponentData(_EntityNull, new Translation { Value = Vector3.one });
_EntityManager.AddComponentData(_EntityNull, new Rotation { });
_EntityManager.AddComponentData(_EntityNull, new RenderBounds { });
_EntityManager.AddComponentData(_EntityNull, new LocalToWorld { });
//组件属性变更
_EntityManager.SetComponentData(_EntityNull, new Translation { Value = Vector3.up * 8 });
//组件赋值 (_EntityNull)
_EntityManager.AddSharedComponentData(_EntityNull, new RenderMesh
{
mesh = _MyEntityMesh,
material = _MyEntityMaterial,
});
#endregion
}
}
暂时先这样吧,如果有时间的话就会更新,如果实在看不明白就留言,看到我会回复的。
路长远兮,与君共勉。