public static string GetShaderName(this MfxShaderType mfxShaderType) { switch (mfxShaderType) { case MfxShaderType.Standard: return(MfxStandardShaderName); case MfxShaderType.StandardSpecular: return(MfxStandardSpecularShaderName); case MfxShaderType.StandardTransparent: return(MfxStandardTransparentShaderName); case MfxShaderType.Unlit: return(MfxUnlitShaderName); default: return(MfxUnlitShaderName); } }
public MfxObjectMaterialUpdater(GameObject targetObject, bool modifyChildren, bool replaceMaterialsAtStart, Material mfxTemplateMaterial, bool determineWorkflow, MfxShaderType mfxShaderType) { _determineWorkflow = determineWorkflow; _mfxShaderType = mfxShaderType; _renderers = modifyChildren ? targetObject.GetComponentsInChildren <Renderer>() : targetObject.GetComponents <Renderer>(); if (!replaceMaterialsAtStart) { foreach (var renderer in _renderers) { foreach (var material in renderer.materials) { _mfxMaterials.Add(material); } } return; } Replace(mfxTemplateMaterial); }
public static List <Material> ReplaceMaterialsToMfx(Material mfxTemplateMaterial, Material[] targetRendererMaterials, bool determineWorkflowAutomatically, MfxShaderType mfxShaderType, bool editorMode) { var newMaterials = new List <Material>(); foreach (var targetRendererMaterial in targetRendererMaterials) { if (targetRendererMaterial == null) { continue; } #if UNITY_EDITOR string newAssetPath = string.Empty; if (editorMode) { var materialPath = AssetDatabase.GetAssetPath(targetRendererMaterial); var extensionIdx = materialPath.LastIndexOf("/", StringComparison.Ordinal); if (extensionIdx <= 0) { Debug.LogError("the path is incorrect"); continue; } var pathWithoutExtension = materialPath.Substring(0, extensionIdx); newAssetPath = pathWithoutExtension + "/" + targetRendererMaterial.name + "_MFX.mat"; var assetType = AssetDatabase.GetMainAssetTypeAtPath(newAssetPath); if (assetType != null) { var existingMaterial = AssetDatabase.LoadAssetAtPath <Material>(newAssetPath); newMaterials.Add(existingMaterial); continue; } } #endif var shaderName = determineWorkflowAutomatically ? GetShaderByWorkflow(targetRendererMaterial) : mfxShaderType.GetShaderName(); var newMaterial = new Material(targetRendererMaterial) { shader = Shader.Find(shaderName) }; CopyMfxProperties(mfxTemplateMaterial, newMaterial, targetRendererMaterial, determineWorkflowAutomatically); ReplaceMetallicSpecularKeywords(targetRendererMaterial, newMaterial); newMaterials.Add(newMaterial); #if UNITY_EDITOR if (editorMode) { AssetDatabase.CreateAsset(newMaterial, newAssetPath); Debug.Log("Mfx Material Was Created: " + newAssetPath); } #endif } return(newMaterials); }
public static void ReplaceRenderersMaterials(Material mfxTemplateMaterial, GameObject targetObject, bool determineWorkflowAutomatically, MfxShaderType mfxShaderType, bool editorMode) { var renderers = targetObject.GetComponentsInChildren <Renderer>(); foreach (var targetRenderer in renderers) { var targetRendererMaterials = targetRenderer.sharedMaterials; var newMaterials = ReplaceMaterialsToMfx(mfxTemplateMaterial, targetRendererMaterials, determineWorkflowAutomatically, mfxShaderType, editorMode); targetRenderer.sharedMaterials = newMaterials.ToArray(); } }