Files
YachtDice/Assets/Plugins/AllIn13DShader/Scripts/AllIn13DShaderComponent.cs
T
2026-02-23 22:01:07 +07:00

104 lines
2.1 KiB
C#

#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace AllIn13DShader
{
[ExecuteInEditMode]
[DisallowMultipleComponent]
[AddComponentMenu("AllIn13DShader/AddAllIn13DShader")]
public class AllIn13DShaderComponent : MonoBehaviour
{
public Renderer currRenderer;
public Material currMaterial
{
get
{
return currRenderer.sharedMaterial;
}
set
{
currRenderer.sharedMaterial = value;
}
}
#if UNITY_EDITOR
public void NewCleanMaterial(Shader shader, Material matPreset)
{
Material previousMat = currMaterial;
currMaterial = new Material(shader);
currMaterial.CopyMatchingPropertiesFromMaterial(matPreset);
string materialName = currMaterial.name;
int nameStartIndex = materialName.LastIndexOf("/");
if(nameStartIndex >= 0)
{
materialName = materialName.Substring(nameStartIndex + 1);
}
currMaterial.name = $"MAT_{materialName}";
}
public void CleanMaterial()
{
currMaterial = new Material(Shader.Find(ConstantsRuntime.STANDARD_SHADER_NAME));
}
public bool CheckValidComponent()
{
bool res = true;
bool dirty = false;
if (currRenderer == null || currMaterial == null)
{
res = res && TryGetComponent<Renderer>(out currRenderer);
dirty = true;
}
if (dirty && res)
{
currRenderer = GetComponent<Renderer>();
EditorUtility.SetDirty(this);
if(currMaterial != null)
{
EditorUtility.SetDirty(currMaterial);
}
}
return res;
}
public void ApplyMaterialToChildren()
{
ApplyMaterialRecursively(transform, currMaterial);
}
public Material DuplicateCurrentMaterial()
{
currMaterial = new Material(currMaterial);
return currMaterial;
}
private void ApplyMaterialRecursively(Transform tr, Material mat)
{
bool existsMeshRenderer = tr.TryGetComponent<Renderer>(out currRenderer);
if (existsMeshRenderer)
{
currRenderer.sharedMaterial = mat;
}
int childCount = tr.childCount;
for(int i = 0; i < childCount; i++)
{
ApplyMaterialRecursively(tr.GetChild(i), mat);
}
}
#endif
}
}