// 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);
        }
    }
Beispiel #3
0
    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
    }