2-4 混合三角面片颜色

  在上一章中我们因为引入了HexDirection枚举,所以对一些方法进行了重构。接下来需要实现相邻两个地图单元的颜色混合功能。这里首先需要修改HexMesh.cs脚本中的AddTriangleColor方法。这个方法原本的参数只有一个,在构建三角面片的时候,会将这个参数的颜色信息赋值到三角面片的三个顶点信息中。为了实现颜色混合,需要再添加两个参数,让三角面片的每个顶点分别有不同的颜色值。

HexMesh.cs
1
2
3
4
5
6
7
8
9
10
11
12
/// <summary>
/// 为每个三角面片的3个顶点分别赋予不同的颜色值
/// </summary>
/// <param name="c1">第一个顶点的颜色信息(中心点的颜色)</param>
/// <param name="c2">第二个顶点的颜色信息</param>
/// <param name="c3">第三个顶点的颜色信息</param>
private void AddTriangleColor(Color c1, Color c2, Color c3)
{
colors.Add(c1);
colors.Add(c2);
colors.Add(c3);
}

  接下来,我们在构建三角面片的时候就可以进行颜色的混合了。

HexMesh.cs
1
2
3
4
5
6
7
8
9
10
private void Triangulate(HexDirection direction, HexCell cell)
{

//获取与自身当前相邻的cell的颜色值
//每个cell会在 Triangulate(HexCell cell) 方法中将与自身相邻的cell遍历一次
HexCell neighbor = cell.GetNeighbor(direction);

//为三角面片的顶点赋颜色值
AddTriangleColor(cell.color, neighbor.color, neighbor.color);
}

  运行以上代码的时候,Unity会产生一个空引用异常。这是因为,并不是每个地图单元都有6个与之相邻的地图单元。所以,这里要进行一次判断。当一个方位上没有地图单元的时候,就用自身的颜色代替。

HexMesh.cs
1
2
3
4
5
6
7
8
9
10
private void Triangulate(HexDirection direction, HexCell cell)
{

//获取与自身当前相邻的cell的颜色值
//每个cell会在 Triangulate(HexCell cell) 方法中将与自身相邻的cell遍历一次
//?? 为 可空合并运算符,即cell.GetNeighbor(direction)的值为null时,使用 cell的值
HexCell neighbor = cell.GetNeighbor(direction) ?? cell;


}

“??”的含义:
这被称为可空合并运算符,简单来说”a??b”即”a!=null?a:b”的简写。
MSDN连接,“从可为空的值类型转换为基础类型”部分。
这里有个小诡计,因为Unity在把一个东西与组件比较时会自定义,(注:Unity中判断一个对象不为空时可以直接写成if(someThings),这在C#原本语法里是没有的)而这个运算符会绕过它并直接与null比较,不过这是销毁对象时才需要考虑的问题。

  现在,我们虽然完成了相邻地图单元之间的颜色混合,但是视觉效果显得非常奇怪,完全不是我们想象中的样子。接下来我们需要慢慢解决这些问题。下一章中,我们将会让颜色混合更加平滑。

Github代码