首页 > 解决方案 > 在脚本中操作 Tilemap 颜色组件

问题描述

因此,我正在尝试制作一个脚本来更改某些瓷砖地图的颜色和透明度,以显示我正在查看的结构的楼层。本质上,我下方的地板看起来更暗,上方的地板大多是透明的,我正在查看的地板是默认颜色。我想一次更改瓷砖地图上每个瓷砖的颜色。通过让实际的瓷砖地图成为该楼层网格的子对象,我可以更改子对象上的瓷砖地图的颜色,就像这样

if (activeFloor == thisFloor)
{
    isActiveFloor = true;
    for (int i = 0; i < this.transform.childCount; i++)
    {
        floorChildren[i].GetComponent<TilemapRenderer>().sortingOrder = 2 + i;
        floorChildren[i].GetComponent<Tilemap>().color = defaultColor;
    }
}
else
{
    isActiveFloor = false;
    for (int i = 0; i < this.transform.childCount; i++)
    {
        floorChildren[i].GetComponent<TilemapRenderer>().sortingOrder = -2 + i;
        if(thisFloor>activeFloor)
        {
            floorChildren[i].GetComponent<Tilemap>().color = nearlyTransparent;
        }
        else
        {
            floorChildren[i].GetComponent<Tilemap>().color = blackedOutColor;
        }
    }
}

不幸的是,这似乎没有多大作用。它确实改变了排序顺序,所以活动层将在前面,但是如果没有对上下楼层进行一些颜色校正,它看起来很奇怪。我知道 SetColor 存在,但是从统一文档看来它只影响一个图块,这意味着我必须制作一个荒谬的 for 循环或其他东西才能做到这一点,而只是让 ().color 改变会更容易.

编辑:所以我发现了一些有趣的东西。在 tilemap 上,当我进入播放模式时,它总是将 tilemap 的颜色设置为 (191, 191, 191, 255)。这不是它应该设置的颜色,并且此脚本中的颜色值都不是该值。即使在检查器中设置它的颜色,它仍然会将其更改为该值。我可以在检查器的播放模式下将其设置为正确的颜色,但是按下一个更改地板的按钮(意味着上面的代码将再次运行),将始终将其设置回该颜色值。这里的代码正在改变一些东西,我只是不确定为什么它将它设置为这个特定的值。

标签: c#unity3dcolors

解决方案


好的,所以出于某种原因,像这样设置颜色

private Color defaultColor = new Color(255, 255, 255, 255);
private Color blackedOutColor = new Color(30, 30, 30, 255);
private Color nearlyTransparent = new Color(255, 255, 255, 50);

不起作用。这是因为当使用new Color(r,g,b,a); 该值实际上应该设置在 0 和 1 之间,因此 0 是颜色可以具有的最小值,而 1 是最大值,表示它的 255。您可以使用浮点数设置介于 0 和 1 之间的数字,所以

private Color defaultColor = new Color(30,30,30,255)

实际上应该设置为

private Color defaultColor = new Color(0.13f,0.13f,0.13f,1);

推荐阅读