通过更改四边形 uv 位置在 tilemap(每个 tile 四边形)网格中为 tile 设置动画是否合乎逻辑且有效?

Is animating a tile in a tilemap (quad per tile) mesh by changing quads uv position logical and efficient?

我不熟悉精灵图集的程序网格生成和 uv 映射。所以我不知道我想到的解决方案是否有效、合乎逻辑并且 "best way",或者两者都不是。

我目前正在 Unity 中制作程序瓦片地图 "engine-y"。几天前我在这里有一个问题,(我问是否使用网格或多个精灵对象)并且根据给定的答案我现在正在处理网格生成方式。

我已经在脑海中创建了基本结构框架。我什至制作了一些原型。我将通过精灵图集中相应的图块映射每个四边形的 UV。 (如果有更好的方法,请不吝赐教^^)

但是我在制作动画时遇到了问题。例如,对于一个 "water-type" 的图块,当然要进行动画处理,精灵图集中会有不同的 "frames" 个水精灵。

所以,我正在考虑更新 "that quad's" UV 位置以转移到图集中水精灵的下一帧。 但我不确定这是否是一个好方法。在更新周期中这样做合乎逻辑吗?即使动画速度较慢,它也会在一个更新周期内更新大量的 uv 点。

假设我在游戏中缩小,并且屏幕上有 100x100 = 10.000 个水砖,(10.000 个四边形 * 4 = 40.0000 个要更新的 uv 点),当我更新它时会对性能产生影响吗很多 UV 位置?

还是显卡优化了它,所以它甚至不明显?

如果这不是一个明智的方法(可能不是),那么最合乎逻辑且最专业的磁贴动画方法是什么?

注意:用着色器计算可能有也可能没有,但我对着色器编程一无所知,所以如果最好的解决方案是使用着色器,我会毫不犹豫地学习它。如果是这样,请提供着色器编程和 UV 更新的培训资源。 (如果重要,Unity 使用 ShaderLab 作为着色器)

更新 UV 位置是制作此动画的好方法。我不认为它会给你带来性能问题。

但是,这里还有另一种方法可供考虑。让你的水成为一个单独的 material,只和一个瓷砖的纹理一样宽,但和你想要的一样高。为水纹理构建一个四边形网格,将 UV 设置为纹理高度的一个平铺。现在,在 material 属性中,只需更改每一帧上纹理的 Y 偏移量。不理会所有的紫外线; Y 偏移量将有效地添加到每个顶点的 V 值。您甚至可以在每一帧上以较小的增量(小于整个图块的价值)对其进行更改,以获得黄油般流畅的动画,而无需触摸网格。

成本当然是它是一个单独的 material,因此是一个单独的绘图调用。但无论如何,人们往往对绘制调用过于关注。

如果您有多个滚动条 material(例如清水、浑水、熔岩、神奇的发光河流等等),它们都可以共享相同的 material,只有一列每个纹理贴图。 (但这将要求他们以相同的速度滚动。)