游戏开发日志 (其四·一):迷雾大小与物体实际大小不一致的原因

发表于: 7/18/2022

Unity

战争迷雾

localScale

在上一篇的最后,可以看到小尺寸的障碍物有着与之不匹配的巨大遮挡面积。

——这里不得不补充下:尚未书面记录的,本项目使用了 “地图” 这一概念,目前的运行场景中包含编辑器中添加的物体和读取地图文件后运行时添加的物体。在地图生成完成后调用初始化网格。

所以合理怀疑到了地图生成阶段。

太长不看

Gizmos

为了Debug,学习了下原项目中绘制地图网格的操作,在Hierarchy中选中对象,可以将生成的网格显示到屏幕上。

private void OnDrawGizmosSelected()
{
  
    if(mapGrid != null)
    {
        Gizmos.color = Color.blue;
        Gizmos.DrawWireCube(transform.position, new Vector3(mapGrid.Width, mapGrid.Height, 0) * mapGrid.GridSize);
        for (int i = 0; i < mapGrid.Width; i++)
            for(int j = 0; j < mapGrid.Height; j++)
            {
                Gizmos.color = mapGrid[i, j].HasFlag(MapGrid.MapStatus.Obstacle) ? Color.red : Color.white;
                Gizmos.DrawWireCube(mapGrid.GetRealPosition(i,j), new Vector3(mapGrid.GridSize, mapGrid.GridSize, 0));
            }
    }
}

地图可视化后,发现右侧小障碍物在网格中的大小似乎与左下侧大障碍物(编辑器中的Prefab原型)相近,而该小障碍物是在运行后创建的对象,其大小是从地图文件中读取缩放值后设定的。

{
    // ...
    "scale": [1,1],
    // ...
}
Vector3 scale = st.scale; scale.z = 1;
st_in.transform.localScale = scale;

而尝试将其变得更大后,发现遮挡面积并未改变,

答案呼之欲出

—— localScale并非立即生效,所以生成阶段设置scale,生效延后到了生成阶段完成网格初始化之后,可能是在下一帧中生效?

使用Invoke延迟网格初始化后问题也成功解决。

:::default 这个异常的迷雾没有碰撞体积,走在里面会丢失周围一切的视野,只能看到周围一圈,外面自然也无法看到里面 其实还挺酷的,“黑域”,后续可以专门搞一个。 :::

另外的小收获

在上一篇的缓动函数Lerp中 将

Graphics.Blit(nextTexture, currnetTexture, blurMaterial, 1);

中的pass传入参数 1 改为 0,可以避免迷雾的透明度的提升导致可以透过未探索迷雾看到地形。

新效果