// editor 下使用的方法,同步加载 public static Dictionary <string, Material> CreateMaterial_Editor(RenderDataGroup rdg, bool hdOrSd) { Dictionary <string, Material> result = new Dictionary <string, Material>(); foreach (RenderDataGroup.RendererData rd in rdg.RendererDataArr) { Material mat = new Material(Shader.Find(rd.ShaderName)); ApplyFloatProperty(mat, rd.FloatProperty); ApplyColorProperty(mat, rd.ColorProperty); ApplyTexturePropertyInEditor(mat, rd.TextureProperty, hdOrSd); mat.shaderKeywords = rd.Keywords; result.Add(rd.TargetRendererName, mat); } return(result); }
// runtime 下使用的方法 public static IEnumerator CreateMaterial_Runtime( Dictionary <string, Material> result, RenderDataGroup rdg, bool hdOrSd, MonoBehaviour coroutineOwner) { foreach (RenderDataGroup.RendererData rd in rdg.RendererDataArr) { Material mat = new Material(Shader.Find(rd.ShaderName)); ApplyFloatProperty(mat, rd.FloatProperty); ApplyColorProperty(mat, rd.ColorProperty); yield return(coroutineOwner.StartCoroutine(ApplyTexturePropertyInRuntime(mat, rd.TextureProperty, hdOrSd))); mat.shaderKeywords = rd.Keywords; result.Add(rd.TargetRendererName, mat); } }
private static void GenerateRendererDataGroup(GameObject prefab, string folderPath) { #if UNITY_EDITOR RenderDataGroup rd = ScriptableObject.CreateInstance <RenderDataGroup>(); rd.name = prefab.name.ToLower(); rd.RendererDataArr = new List <RenderDataGroup.RendererData>(); foreach (Renderer r in prefab.GetComponentsInChildren <Renderer>()) { if (r.sharedMaterials.Length != 1) { Debug.Assert(r.sharedMaterials.Length != 1); continue; } rd.RendererDataArr.Add(GenerateRendererData(r)); } string resultPath = folderPath + prefab.name + ".asset"; AssetDatabase.CreateAsset(rd, resultPath.ToLower()); #endif }