using Procedural; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; namespace ProceduralEditor { public static class TriangleWavePanelMenu { const string MaterialsFolder = "Assets/Materials"; const string FaceMaterialPath = MaterialsFolder + "/LowPolyTriangleFace.mat"; const string BackerMaterialPath = MaterialsFolder + "/LowPolyTriangleBacker.mat"; [MenuItem("Tools/Scene/Add Triangle Wave Panel (Tiles)")] public static void CreateInScene() { var faceMaterial = GetOrCreateMaterial(FaceMaterialPath, "Universal Render Pipeline/Lit", mat => { mat.SetColor("_BaseColor", new Color(0.09f, 0.11f, 0.14f)); if (mat.HasProperty("_Smoothness")) mat.SetFloat("_Smoothness", 0.45f); if (mat.HasProperty("_Metallic")) mat.SetFloat("_Metallic", 0.05f); if (mat.HasProperty("_Cull")) mat.SetFloat("_Cull", 0f); }); var backerMaterial = GetOrCreateMaterial(BackerMaterialPath, "Universal Render Pipeline/Unlit", mat => { mat.SetColor("_BaseColor", new Color(0.95f, 0.96f, 0.98f)); if (mat.HasProperty("_Cull")) mat.SetFloat("_Cull", 0f); }); var go = new GameObject("Triangle Wave Panel"); Undo.RegisterCreatedObjectUndo(go, "Add Triangle Wave Panel"); go.transform.position = new Vector3(0f, -1.5f, 15f); go.transform.rotation = Quaternion.identity; var panel = go.AddComponent(); panel.faceMaterial = faceMaterial; panel.backerMaterial = backerMaterial; EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene()); Selection.activeGameObject = go; if (SceneView.lastActiveSceneView != null) SceneView.lastActiveSceneView.FrameSelected(); } static Material GetOrCreateMaterial(string path, string shaderName, System.Action configure) { var existing = AssetDatabase.LoadAssetAtPath(path); if (existing != null) return existing; if (!AssetDatabase.IsValidFolder(MaterialsFolder)) AssetDatabase.CreateFolder("Assets", "Materials"); var shader = Shader.Find(shaderName); if (shader == null) { Debug.LogError($"TriangleWavePanelMenu: could not find shader '{shaderName}'."); return null; } var mat = new Material(shader); configure(mat); AssetDatabase.CreateAsset(mat, path); AssetDatabase.SaveAssets(); return mat; } } }