当前位置: 热点 > >正文

Unity中基于Tilemap的战争迷雾实现踩坑指南

来源:哔哩哔哩    时间:2023-06-19 12:32:59

这周的开发视频不更新了,着实没有什么像样的新内容,最近打算把阴影的效果改成类似stoneshard的样子,无奈碰到很多坑。具体如下:

坑1、


(资料图片)

tilemap.color = Color.black

Tilemap的color不要设置成黑色,否则对tile的任何修改都会被黑色覆盖。

设置Tilemap的color并不是设置Tilemap初始化时的每个Tile的初始颜色,他的设置和设置SpriteRenderer的color类似,是与tile中的sprite相互叠加的。

坑2、

tilemap.SetColor(pos,color)

这个设置的是某个位置上的color,设置并不一定成功。如果tile来自asset(不是通过代码动态创建的静态资源)则很有可能颜色被锁住了,需要先解锁颜色设置。

tilemap.RemoveTileFlags(pos, TileFlags.LockColor);

坑3、

tilemap.RefreshAllTiles();

刷新所有的Tiles,同样的方法还有

tilemap.RefreshTile(pos)

他的作用并不是将修改的内容推送到显示缓冲区;类似的功能在OpenGL等API中有,修改不一定显示到屏幕,需要代码人工推送,主要是为了节省性能,比如多次设置后一次性推送。但这个接口并不是这样。如果tile的资源来自asset,则Refresh会将tile重新设置回asset的设置,之前的SetColor无效。

坑4、

Color lightingColor = new Color(1.0f, 1.0f, 1.0f, 0.0f);

tilemap.RemoveTileFlags(pos, TileFlags.LockColor); 

tilemap.SetColor(pos, lightingColor); 

Tile curTile = fowMap.GetTile<Tile>(pos); 

Debug.Log(string.Format("设置完颜色后再次获取颜色为:{0}!", curTile.color.a));

如果tile来自asset,则设置他的颜色后,虽然显示上颜色正确,但当前位置获取的颜色仍然是asset的Tile的颜色。即便你重新锁定颜色tilemap.AddTileFlags(pos, TileFlags.LockColor);也无济于事。

所以最稳妥的办法是不使用SetColor方法了,改用SetTile。给光照,阴影,暗处三种表现分别使用3个不同的Tile,虽然资源多了两张,但恶心的bug会少很多。

坑5、

跟Tilemap没有关系,而是Component的自定义面板。如果一个Component的新增一个自定义属性后,所有包含这个Component的prefab都会更新,这个自定义属性获得一个默认值。当修改Component的默认值后,prefab的值并不会更新。所以如果没有把这个参数公布出来就不容易发现。

X 关闭

精心推荐

Copyright ©  2015-2022 南方建筑工程网版权所有  备案号:粤ICP备18023326号-21   联系邮箱:855 729 8@qq.com