您当前的位置: 首页 > 

CloudHu1989

暂无认证

  • 4浏览

    0关注

    89博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

用ECS做HexMap:六边形单元的颜色混合

CloudHu1989 发布时间:2019-08-24 16:13:57 ,浏览量:4

基于Unity2019最新ECS架构开发MMO游戏笔记19
  • 颜色混合
    • 颜色平均化
    • 区域混合
    • 三角化混合区域
    • 边界连接桥
    • 填充间隙
    • 边界合并
  • 更新计划
    • 作者的话
  • 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:鼠标点击六边形单元涂色

颜色混合

在开始之前先纠正上一篇的错误,首先逐个打印颜色:

	 //打印六个方向的颜色:NE, E, SE, SW, W, NW
     if (i == 0)
     {
         Debug.Log("自身颜色:" + color + " |  NE方向颜色:" + neighbor);
     }

然后分别得到第一个六边形单元的六个方向的颜色值:

HexCellColorRGBA(0.098, 0.902, 0.934, 1.000) | NE Direction ColorRGBA(0.638, 0.136, 0.585, 1.000) HexCellColorRGBA(0.098, 0.902, 0.934, 1.000) | E Direction ColorRGBA(0.239, 0.273, 0.753, 1.000) HexCellColorRGBA(0.098, 0.902, 0.934, 1.000) | SE Direction ColorRGBA(0.098, 0.902, 0.934, 1.000) HexCellColorRGBA(0.098, 0.902, 0.934, 1.000) | SW Direction ColorRGBA(0.098, 0.902, 0.934, 1.000) HexCellColorRGBA(0.098, 0.902, 0.934, 1.000) | W Direction ColorRGBA(0.098, 0.902, 0.934, 1.000) HexCellColorRGBA(0.098, 0.902, 0.934, 1.000) | NW Direction ColorRGBA(0.098, 0.902, 0.934, 1.000)

如下图所示,第0个六边形单元的SE、SW、W、NW这四个方向的颜色应该与自身颜色一致才对。实际上打印出来的颜色也是如此,那为什么还会渲染出其他颜色来呢? 第0个六边形单元 我调整矩阵的宽和高,使其只产生4个单元,终于发现了真相: 单元位置颠倒 把最后一个放到第0个,然后依照顺序递推,就能得到正确的结果。为什么会产生这种问题的本质原因不明,但是逻辑上已经找到了蛛丝马迹,愚蠢的解决办法是按照其逻辑反递推,把最后一个插入到第0个,代码很简单:

	 //把最后一个放到第0顺位,后面的依此类推
      Vector3 center;
      if (i+1== vertices.Length)
      {
          center = vertices[0];
      }
      else
      {
          center = vertices[i+1];
      }

本质原因是实体在Job中的执行顺序颠倒了,正常顺位应该是:0->1->2->3,但实际上变成了:3->1->2->0。 虽然不知道底层为什么要这样做,但是困扰我一夜的bug总算搞定了。 正确的颜色表现 如上图所示,问题修复了!之前做了减法(单元数量4),现在做加法看看有没有问题: 六边形单元的颜色混合 好了,问题解决了,代码已推送Github!

颜色平均化

其实只需改动少量的代码即可完成这个功能,我们在HexCellData六边形单元数据中已经有字段来保存颜色数据了:

neighbor = (color + neighbor) * 0.5f;

颜色平均化效果 可以看到,和最终效果还有一定距离,每3个相邻的单元就有四种颜色: 相邻单元 接下来就进行三个方向的颜色混合:

 //保存需要混合的颜色
 Color[] blendColors = new Color[6];
  //把六个相邻单元的颜色添加到这个数组中,代码省略
	………………
   //三向混合
   for (int j = 0; j             
关注
打赏
1664096582
查看更多评论
0.2360s