Files
Cielonos/Assets/Plugins/AllIn13DShader/Editor/CustomEditors/AllIn13DShaderComponentCustomEditor.cs
SoulliesOfficial d94241f36c 场景设计
2026-01-12 03:22:16 -05:00

366 lines
10 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
namespace AllIn13DShader
{
[CustomEditor(typeof(AllIn13DShaderComponent))]
[CanEditMultipleObjects]
public class AllIn13DShaderComponentCustomEditor : Editor
{
private PropertiesConfigCollection propertiesConfigCollection;
private GlobalConfiguration globalConfiguration;
private Texture imageInspector;
private void RefreshReferences()
{
propertiesConfigCollection = EditorUtils.FindAsset<ScriptableObject>("PropertiesConfigCollection") as PropertiesConfigCollection;
if(propertiesConfigCollection == null)
{
propertiesConfigCollection = PropertiesConfigCreator.CreateConfig();
}
globalConfiguration = EditorUtils.FindAssetByName<GlobalConfiguration>("GlobalConfiguration");
}
private void OnEnable()
{
if (!Application.isPlaying)
{
RefreshReferences();
bool isValidComponents = CheckSelectedComponents();
if (!isValidComponents)
{
EditorUtility.DisplayDialog("Missing Renderer", "Some of the selected game objects have no Renderer component. AllIn13DShaderComponent will be removed", "Ok");
return;
}
CheckMaterialReference();
}
}
public override void OnInspectorGUI()
{
bool saveAssets = false;
serializedObject.Update();
DrawHeaderImage();
EditorGUI.BeginDisabledGroup(Application.isPlaying);
if(GUILayout.Button("Deactivate All Effects"))
{
ExecuteActionAfterCheck(DeactivateAllEffects);
saveAssets = true;
}
if (GUILayout.Button("New Clean Material"))
{
ExecuteActionAfterCheck(NewCleanMaterial);
}
if(GUILayout.Button("Create New Material With Same Properties (SEE DOC)"))
{
ExecuteActionAfterCheck(MakeCopyMaterial);
}
if(GUILayout.Button("Save Material To Folder (SEE DOC)"))
{
ExecuteActionAfterCheck(SaveMaterialToFolder);
}
if(GUILayout.Button("Apply Material To All Children"))
{
ExecuteActionAfterCheck(ApplyMaterialToAllChildren);
}
if (GUILayout.Button("Render Material To Image"))
{
ExecuteActionAfterCheck(RenderMaterialToImage);
}
EditorGUI.EndDisabledGroup();
serializedObject.ApplyModifiedProperties();
if (saveAssets)
{
AssetDatabase.SaveAssets();
EditorSceneManager.SaveOpenScenes();
AssetDatabase.Refresh();
}
EditorGUILayout.Space();
EditorUtils.DrawThinLine();
if (GUILayout.Button("Remove Component"))
{
RemoveComponent();
}
if(GUILayout.Button("Remove Component and Material"))
{
RemoveComponentAndMaterial();
}
}
private void DrawHeaderImage()
{
if(imageInspector == null) imageInspector = AllIn13DShaderConfig.GetInspectorImage();
Rect rect = EditorGUILayout.GetControlRect(GUILayout.Height(32));
GUI.DrawTexture(rect, imageInspector, ScaleMode.ScaleToFit, true);
}
private void CheckMaterialReference()
{
for (int i = 0; i < targets.Length; i++)
{
AllIn13DShaderComponent allIn13DShaderComponent = (AllIn13DShaderComponent)targets[i];
Material currMaterial = allIn13DShaderComponent.currMaterial;
if (currMaterial == null || !propertiesConfigCollection.IsAllIn3DShaderMaterial(currMaterial))
{
Shader shader = GlobalConfiguration.instance.shStandard;
//Shader shader = propertiesConfigCollection.shaderPropertiesConfig[0].shader;
Material oldMaterial = allIn13DShaderComponent.currMaterial;
allIn13DShaderComponent.NewCleanMaterial(shader, globalConfiguration.defaultPreset);
MaterialConverterTool.ApplyConversion(oldMaterial, allIn13DShaderComponent.currMaterial);
}
}
EditorUtils.SetDirtyCurrentScene();
}
private void DeactivateAllEffects()
{
bool successOperation = true;
bool selectedComponentsAreValid = CheckSelectedComponents();
for (int i = 0; i < targets.Length; i++)
{
AllIn13DShaderComponent allIn13DShaderComponent = (AllIn13DShaderComponent)targets[i];
successOperation = successOperation && allIn13DShaderComponent.CheckValidComponent();
Material mat = allIn13DShaderComponent.currMaterial;
PropertiesConfig propertiesConfig = propertiesConfigCollection.FindPropertiesConfigByShader(mat.shader);
List<AllIn13DEffectConfig> effects = propertiesConfig.GetAllEffects();
for (int j = 0; j < effects.Count; j++)
{
mat.SetFloat(effects[j].keywordPropertyName, 0f);
}
EditorUtility.SetDirty(allIn13DShaderComponent);
EditorUtility.SetDirty(mat);
}
}
private void NewCleanMaterial()
{
for (int i = 0; i < targets.Length; i++)
{
AllIn13DShaderComponent allIn13DShaderComponent = (AllIn13DShaderComponent)targets[i];
Shader shader = GlobalConfiguration.instance.shStandard;
//Shader shader = propertiesConfigCollection.shaderPropertiesConfig[0].shader;
allIn13DShaderComponent.NewCleanMaterial(shader, globalConfiguration.defaultPreset);
}
}
public void MakeCopyMaterial()
{
for (int i = 0; i < targets.Length; i++)
{
AllIn13DShaderComponent allIn13DShaderComponent = (AllIn13DShaderComponent)targets[i];
Renderer currRenderer = allIn13DShaderComponent.currRenderer;
Material currMat = currRenderer.sharedMaterial;
string materialName = "MAT_" + allIn13DShaderComponent.gameObject.name;
Material copy = new Material(currMat);
copy.name = materialName;
currRenderer.sharedMaterial = copy;
EditorUtility.SetDirty(allIn13DShaderComponent);
}
}
public void SaveMaterialToFolder()
{
for (int i = 0; i < targets.Length; i++)
{
AllIn13DShaderComponent allIn13DShaderComponent = (AllIn13DShaderComponent)targets[i];
SaveMaterialToFolder(allIn13DShaderComponent);
}
EditorUtils.SetDirtyCurrentScene();
}
private bool CheckSelectedComponents()
{
bool res = true;
for (int i = 0; i < targets.Length; i++)
{
AllIn13DShaderComponent allIn13DShaderComponent = (AllIn13DShaderComponent)targets[i];
bool isValid = allIn13DShaderComponent.CheckValidComponent();
if (!isValid)
{
DestroyImmediate(allIn13DShaderComponent);
}
res = res && isValid;
}
return res;
}
private void ExecuteActionAfterCheck(Action action)
{
bool selectedComponentsAreValid = CheckSelectedComponents();
if (selectedComponentsAreValid)
{
action();
}
else
{
SceneView.lastActiveSceneView.ShowNotification(new GUIContent("Some of the selected components are not valid"));
}
}
private void SaveMaterialToFolder(AllIn13DShaderComponent comp)
{
Material matToSave = comp.currMaterial;
bool isAlreadySaved = AssetDatabase.Contains(matToSave);
if (isAlreadySaved)
{
matToSave = comp.DuplicateCurrentMaterial();
}
string folderPath = GlobalConfiguration.instance.MaterialSavePath;
if (!Directory.Exists(folderPath))
{
bool ok = EditorUtility.DisplayDialog("The desired save folder doesn't exist",
"Go to Window -> AllIn13DShaderWindow and set a valid folder", "Set default values and save material", "Cancel");
if (ok)
{
Directory.CreateDirectory(folderPath);
}
}
if (Directory.Exists(folderPath))
{
string fullPath = Path.Combine(folderPath, matToSave.name + ".mat");
fullPath = AssetDatabase.GenerateUniqueAssetPath(fullPath);
AssetDatabase.CreateAsset(matToSave, fullPath);
AssetDatabase.Refresh();
EditorGUIUtility.PingObject(matToSave);
}
}
private void ApplyMaterialToAllChildren()
{
for (int i = 0; i < targets.Length; i++)
{
AllIn13DShaderComponent allIn13DShaderComponent = (AllIn13DShaderComponent)targets[i];
allIn13DShaderComponent.ApplyMaterialToChildren();
EditorUtility.SetDirty(allIn13DShaderComponent);
}
EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
}
private void RenderMaterialToImage()
{
for (int i = 0; i < targets.Length; i++)
{
AllIn13DShaderComponent allIn13DShaderComponent = (AllIn13DShaderComponent)targets[i];
RenderToImage(allIn13DShaderComponent);
EditorUtility.SetDirty(allIn13DShaderComponent);
}
}
public void RenderToImage(AllIn13DShaderComponent allIn13DShaderComponent)
{
Texture tex = allIn13DShaderComponent.currMaterial.GetTexture("_MainTex");
if (tex != null)
{
string folderPath = GlobalConfiguration.instance.RenderImageSavePath;
string fileName = allIn13DShaderComponent.gameObject.name + ".png";
RenderMaterialToImageTool.RenderAndSaveTexture(allIn13DShaderComponent.currMaterial, tex, 4.0f, folderPath, fileName);
}
else
{
EditorUtility.DisplayDialog("No valid target texture found",
"All In 1 3DShader component couldn't find a valid Main Texture in this GameObject (" +
allIn13DShaderComponent.gameObject.name +
"). This means that the material you are using has no Main Texture or that the texture couldn't be reached through the Renderer component you are using." +
" Please make sure to have a valid Main Texture in the Material", "Ok");
}
}
private void RemoveComponent()
{
for (int i = targets.Length - 1; i >= 0; i--)
{
AllIn13DShaderComponent allIn13DShaderComponent = (AllIn13DShaderComponent)targets[i];
DestroyImmediate(allIn13DShaderComponent);
}
//EditorUtils.SetDirtyCurrentScene();
SetSceneDirty();
EditorUtils.ShowNotification("AllIn3DShader: Component Removed");
}
private void RemoveComponentAndMaterial()
{
for (int i = 0; i < targets.Length; i++)
{
AllIn13DShaderComponent allIn13DShaderComponent = (AllIn13DShaderComponent)targets[i];
allIn13DShaderComponent.CleanMaterial();
}
for (int i = targets.Length - 1; i >= 0; i--)
{
AllIn13DShaderComponent allIn13DShaderComponent = (AllIn13DShaderComponent)targets[i];
DestroyImmediate(allIn13DShaderComponent);
}
SetSceneDirty();
}
public void SetSceneDirty()
{
if (!Application.isPlaying) EditorSceneManager.MarkAllScenesDirty();
//If you get an error here please delete the code block below
#if UNITY_2021_2_OR_NEWER
var prefabStage = UnityEditor.SceneManagement.PrefabStageUtility.GetCurrentPrefabStage();
#else
var prefabStage = UnityEditor.Experimental.SceneManagement.PrefabStageUtility.GetCurrentPrefabStage();
#endif
if (prefabStage != null)
{
EditorSceneManager.MarkSceneDirty(prefabStage.scene);
}
//Until here
}
}
}