我在Unity制作RTS游戏。在这样的游戏中,玩家通常可以使用单位颜色标记来确定单位忠诚度。我现在正在尝试实施系统,它将在设备所有者的颜色上重新映射紫色。
一个想法是确定将用作面具然后重新着色为任何颜色的颜色。可以使用一些色调分布函数来完成:
我使用基于max()
的功能。你可以see the plot there。
hue = min(hue, pow(Math.abs(hue-MASK_HUE),8)*5000000+RESULT_HUE)
这个解决方案有两个很大的缺陷:
你上面看到的只是我的小事。实际项目将在C#中的Unity引擎上运行。
我的朋友提出了不同的方法:每张图片都应使用地图 - 褪色或只是true
/ false
数组 - 来映射应用颜色的位置。我还没有尝试过这个,因为测试ad-hoc更加复杂。
似乎是texture for material can be easily altered in Unity,所以问题是:
问:我应该如何在Unity中实现动态纹理着色(生成)?我的任何方法都是好方法吗?我应该如何使用什么函数生成新纹理?
我需要有关应该使用哪些功能的信息,而不是完整的代码。我希望其他用户也能从一般信息中获益。
为了帮助您回答,我猜这个过程将有三个重要部分:
答案 0 :(得分:1)
如果你去纹理处理路线,你需要为每种颜色制作存储在内存中的纹理的附加副本,这将增加场景的“加载”时间。您可以使用具有渲染器组件的GameObject上使用的renderer.material.mainTexture
来访问GameObject的纹理。然后,您可以使用各种像素操作选项(例如SetPixel
或SetPixels
)批量执行此操作以获得更好的性能。
然而,我会建议第三种选择。如果编写/修改自定义着色器,则可以在渲染时执行颜色替换,而不会显着降低性能。这可以通过添加一个步骤来实现,您可以将颜色输出从RGB转换为HSV,更改色相和饱和度,然后转换回HSV。
通过制作色相和饱和度外部参数,您应该能够使用各种颜色,包括用于标记颜色的任何颜色。
来自Unity论坛的This post应该有助于使用色调偏移着色器。