项目场景:
在Unity编辑器中快速打开所有选中物体的Emission,并将其MainTex赋予Emissionmap参数,以实现AR中让物体发光更亮又不至于突兀的作用,减少了手动开启关闭和调节颜色的过程。
实现脚本
using UnityEngine;
using UnityEditor;
public class ApplyAlbedoToEmission : EditorWindow
{
[MenuItem("Tools/Apply Albedo to Emission Window")]
public static void ShowWindow()
{
EditorWindow.GetWindow(typeof(ApplyAlbedoToEmission));
}
void OnGUI()
{
GUILayout.Label("Apply Albedo to Emission", EditorStyles.boldLabel);
if (GUILayout.Button("EnableEmission"))
{
ApplyEmission(true);
}
if (GUILayout.Button("DisableEmission"))
{
ApplyEmission(false);
}
}
static void ApplyEmission(bool enableEmission)
{
Undo.RecordObjects(Selection.gameObjects, "Apply Albedo to Emission");
foreach (GameObject obj in Selection.gameObjects)
{
ApplyEmissionToMaterials(obj, enableEmission);
ApplyEmissionToChildren(obj.transform, enableEmission);
}
AssetDatabase.SaveAssets();
}
static void ApplyEmissionToChildren(Transform parent, bool enableEmission)
{
foreach (Transform child in parent)
{
ApplyEmissionToMaterials(child.gameObject, enableEmission);
ApplyEmissionToChildren(child, enableEmission);
}
}
static void ApplyEmissionToMaterials(GameObject obj, bool enableEmission)
{
MeshRenderer meshRenderer = obj.GetComponent<MeshRenderer>();
if (meshRenderer != null)
{
foreach (Material mat in meshRenderer.sharedMaterials)
{
if (mat != null)
{
if (enableEmission)
{
mat.EnableKeyword("_EMISSION");
mat.globalIlluminationFlags = MaterialGlobalIlluminationFlags.RealtimeEmissive;
mat.SetColor("_EmissionColor",mat.color);
if (mat.HasProperty("_MainTex") && mat.mainTexture != null)
{
mat.SetTexture("_EmissionMap", mat.mainTexture);
}
}
else
{
mat.DisableKeyword("_EMISSION");
mat.SetTexture("_EmissionMap", null);
mat.SetColor("_EmissionColor", Color.black);
}
EditorUtility.SetDirty(mat);
}
}
}
}
}