您当前的位置: 首页 > 

CloudHu1989

暂无认证

  • 5浏览

    0关注

    89博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

用ECS做HexMap:利用RenderMesh为六边形涂色

CloudHu1989 发布时间:2019-08-23 22:24:37 ,浏览量:5

基于Unity2019最新ECS架构开发MMO游戏笔记18
  • 为六边形涂色
    • 链接相邻单元
    • 颜色混合
  • 更新计划
    • 作者的话
  • 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主世界
    • UnityMMO网络同步
    • 用ECS做HexMap:自动生成地图系统
    • 用ECS做HexMap:利用RenderMesh绘制六边形
    • 用ECS做HexMap:利用RenderMesh为六边形涂色
    • 用ECS做HexMap:六边形单元的颜色混合
    • 用ECS做HexMap:重构地图系统
    • 用ECS做HexMap:鼠标点击六边形单元涂色

为六边形涂色

上一篇中为我们已经画好了六边形,接下来我们要给六边形上色,如图所示: 为六边形涂色 其实只需改动少量的代码即可完成这个功能,我们在HexCellData六边形单元数据中已经有字段来保存颜色数据了:

/// 
/// C:保存六边形的坐标和颜色数据
/// 
[Serializable]
public struct HexCellData : IComponentData {
    public int X;
    public int Y;
    public int Z;
    public Color color;

}

因此不需要额外新增数据,并且我们在创建六边形单元(CreateHexCellSystem)时已经为其赋值:

    //4.设置每个单元的数据
    CommandBuffer.SetComponent(index, instance, new HexCellData
    {
        X = x - z / 2,
        Y = 0,
        Z = z,
        color = createrData.Color,

    });

这时每个六边形单元都有颜色数据了,我们只需要调动RenderMesh来渲染即可,打开CreateHexMapSystem:

  1. 新增颜色的原生数组,来获取六边形单元的颜色数据:
    var colors = new NativeArray(HexMetrics.HexCelllCount, Allocator.TempJob);
    //获取六边形单元实体的数据
      var getDataJob = new GetHexCellDataForRenderMeshJob
      {
          Vertices = vertices,
          Colors=colors

      }.Schedule(hexCells, inputDeps);
      getDataJob.Complete();
    //这个必须要在使用完后手动释放内存
      colors.Dispose();
  1. 在Job中得到颜色数据
    /// 
    /// 把所有六边形单元实体的数据传递出去
    /// 
    [BurstCompile]
    private struct GetHexCellDataForRenderMeshJob : IJobForEachWithEntity {
        public NativeArray Vertices;
        public NativeArray Colors;
        public void Execute(Entity entity, int index, [ReadOnly]ref Translation position,[ReadOnly]ref HexCellData hexCellData)
        {
            var center = position.Value;
            Colors[index] = hexCellData.color;
            Vertices[index] = new Vector3
            {
                x = center.x,
                y = center.y,
                z = center.z
            };
        }
    }
  1. 把数据交给网格组件进行渲染:
            var Colors= new NativeList(HexMetrics.HexCelllCount*18, Allocator.TempJob);
            for (int i = 0; i             
关注
打赏
1664096582
查看更多评论
0.1616s