您当前的位置: 首页 > 

CloudHu1989

暂无认证

  • 5浏览

    0关注

    89博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

ECS官方案例7. SpawnAndRemove

CloudHu1989 发布时间:2019-08-10 20:56:34 ,浏览量:5

基于Unity2019最新ECS架构开发MMO游戏笔记6
  • 官方案例解析7
      • 开始之前的准备工作:
    • 7. SpawnAndRemove
      • 小结
        • DOTS 逻辑图表
  • 更新计划
    • 作者的话
  • ECS系列目录
    • ECS官方示例1:ForEach
    • ECS官方案例2:IJobForEach
    • ECS官方案例3:IJobChunk
    • ECS官方案例4:SubScene
    • ECS官方案例5:SpawnFromMonoBehaviour
    • ECS官方案例6:SpawnFromEntity
    • ECS官方案例7:SpawnAndRemove
    • ECS进阶:FixedTimestepWorkaround
    • ECS进阶:Boids
    • ECS进阶:场景切换器
    • ECS进阶:MegaCity0
    • ECS进阶:MegaCity1
    • UnityMMO资源整合&服务器部署
    • UnityMMO选人流程
    • UnityMMO主世界

官方案例解析7 开始之前的准备工作:

0下载Unity编辑器(2019.1.0f1 or 更新的版本),if(已经下载了)continue; 1下载官方案例,打开Git Shell输入: git clone https://github.com/Unity-Technologies/EntityComponentSystemSamples.git --recurse or 点击Unity官方ECS示例下载代码 if(已经下载了)continue; 2用Unity Hub打开官方的项目:ECSSamples 3在Assets目录下找到HelloCube/7. SpawnAndRemove,并打开SpawnAndRemove场景

7. SpawnAndRemove

上一个案例演示了如何使用实体来生成别的实体,那么有生成,自然就有移除,下面一起来一探究竟吧:

  • Main Camera ……主摄像机
  • Directional Light……光源
  • Spawner……旋转方块生成器

打开Spawner生成器的Inspector窗口,我们发现这个案例是建议在第六个之上的,因为它也是先将自身转化成实体,再生成别的实体。所以我们忽略相同之处,看不同的地方,也就是移除操作了。

  • 实体和案例六几乎一致,所以对应的Entity脚本SpawnerAuthoring_SpawnAndRemove就跳过了。
  • Component组件脚本Spawner_SpawnAndRemove也跳过,该脚本存储的数据和案例六几乎一致。
  • 实体生成实体的System和案例六一致,所以SpawnerSystem_SpawnAndRemove跳过。

因此移除操作就只能在LifeTimeSystem(生命周期系统)实现了,且看:

/// 
/// 生命周期,这里属于Component
/// 
public struct LifeTime : IComponentData
{
    public float Value;
}

/// 
/// 这个系统负责场景中所有实体的生命周期
/// 也可以将其改装来负责特定实体的生命周期,添加刷选条件Filter即可
/// 
public class LifeTimeSystem : JobComponentSystem
{
    /// 
    /// 实体命令缓存系统--阻塞
    /// 
    EntityCommandBufferSystem m_Barrier;

    /// 
    /// 将阻塞缓存起来
    /// 
    protected override void OnCreate()
    {
        m_Barrier = World.GetOrCreateSystem();
    }

    [BurstCompile]//Burst加速编译器
    struct LifeTimeJob : IJobForEachWithEntity
    {
        public float DeltaTime;

        [WriteOnly]//只写
        public EntityCommandBuffer.Concurrent CommandBuffer;

        /// 
        /// 每帧执行,如果寿命 < 0 则摧毁实体
        /// 
        /// 实体
        /// 任务索引
        /// 寿命
        public void Execute(Entity entity, int jobIndex, ref LifeTime lifeTime)
        {
            lifeTime.Value -= DeltaTime;

            if (lifeTime.Value             
关注
打赏
1664096582
查看更多评论
0.0970s