我怎样才能烘烤物质的多种变化?

我有一个物质(sbsar),我正在用来生成一个程序性的材料。 我已经应用这个纹理倒转片。 它运作良好,但所有的作品看起来都是一样的。 我通过使用脚本来改变$randomseed属性,然后调用RebuildTextures方法来解决这个问题。 效果正是我想要的:每件作品都有略微不同的大理石图案。

问题是,重建64个纹理的过程大约需要20秒。 对于一个简单的Android游戏,这是不可接受的性能。

devise师可以select“加载行为”下的“烘焙”材料,但这只适用于一种变体。 有没有办法可以烘烤许多不同的随机种子? 我可以预先从物质中预先生成一批非程序性材料,并在运行时从该批次中随机选取,但我不确定如何做到这一点。

我写了下面的脚本来从ProceduralMaterial生成一批预渲染的纹理。 只需将其添加到场景中的空白对象中,设置参数并运行即可。

请注意,您必须先将素材的格式设置为RAW。

 using System.IO; using System.Linq; using UnityEngine; public class ExportTexture: MonoBehaviour { public ProceduralMaterial Material; public string[] TextureNames = {}; public int Iterations = 1; public int RandomSeed = -1; public string Folder = "Export"; public void Start() { if( RandomSeed >= 0 ) Random.InitState( RandomSeed ); for( var i = 0; i < Iterations; ++i ) { var mat = Material; mat.SetProceduralFloat( "$randomseed", Random.Range( 0f, 1000f ) ); mat.isReadable = true; mat.RebuildTexturesImmediately(); var textures = ( TextureNames.Any() ? TextureNames.Select( mat.GetGeneratedTexture ).ToArray() : mat.GetGeneratedTextures() ).Cast<ProceduralTexture>(); foreach( var tex in textures ) { var tex2d = new Texture2D( tex.width, tex.height ); tex2d.SetPixels32( tex.GetPixels32( 0, 0, tex.width, tex.height ) ); tex2d.Apply(); var bytes = tex2d.EncodeToPNG(); var outFile = new FileInfo( Path.Combine( Folder, string.Format( "{0}_{1}.png", tex.name, i ) ) ); outFile.Directory.Create(); File.WriteAllBytes( outFile.FullName, bytes ); } } } } 

我在WTFPL下发布这个代码。