#if UNITY_EDITOR using UnityEngine; using UnityEditor; /// HOY Gallery V2 — Editor utility /// Menu: HOY Gallery → Build Scene public class GallerySceneBuilder : EditorWindow { [MenuItem("HOY Gallery/Build Scene")] static void Build() { // Remove default directional light var def = GameObject.Find("Directional Light"); if (def) Object.DestroyImmediate(def); // ── Gallery root ────────────────────────────────────────────────────── var root = new GameObject("Gallery"); var gm = root.AddComponent(); // Directional light var lgo = new GameObject("DirLight"); lgo.transform.SetParent(root.transform); var dl = lgo.AddComponent(); dl.type = LightType.Directional; dl.intensity = 0.3f; dl.shadows = LightShadows.None; lgo.transform.eulerAngles = new Vector3(60, -20, 0); gm.mainDirectionalLight = dl; // ── ArtworkFrame prefab ─────────────────────────────────────────────── var frameRoot = new GameObject("ArtworkFrame"); frameRoot.AddComponent(); var col = frameRoot.AddComponent(); col.isTrigger = true; col.size = new Vector3(1f, 1f, 0.05f); // White border quad (slightly behind artwork) var border = GameObject.CreatePrimitive(PrimitiveType.Quad); border.name = "Border"; border.transform.SetParent(frameRoot.transform); border.transform.localPosition = Vector3.zero; border.transform.localScale = new Vector3(1.05f, 1.05f, 1f); Object.DestroyImmediate(border.GetComponent()); // Artwork quad var quad = GameObject.CreatePrimitive(PrimitiveType.Quad); quad.name = "ArtworkQuad"; quad.transform.SetParent(frameRoot.transform); quad.transform.localPosition = new Vector3(0, 0, 0.01f); quad.transform.localScale = Vector3.one; Object.DestroyImmediate(quad.GetComponent()); var af = frameRoot.GetComponent(); af.artworkRenderer = quad.GetComponent(); // Label anchor below the frame var la = new GameObject("LabelAnchor"); la.transform.SetParent(frameRoot.transform); la.transform.localPosition = new Vector3(0, -0.6f, 0.02f); af.labelAnchor = la.transform; // Save prefab string path = "Assets/Resources/ArtworkFrame.prefab"; var prefab = PrefabUtility.SaveAsPrefabAsset(frameRoot, path); Object.DestroyImmediate(frameRoot); gm.artworkFramePrefab = prefab; Debug.Log($"Prefab saved: {path}"); // ── Player ──────────────────────────────────────────────────────────── var player = new GameObject("Player"); player.tag = "Player"; var cc = player.AddComponent(); cc.height = 1.8f; cc.radius = 0.3f; cc.center = new Vector3(0, 0.9f, 0); var fps = player.AddComponent(); var camGO = new GameObject("PlayerCamera"); camGO.transform.SetParent(player.transform); camGO.transform.localPosition = new Vector3(0, 1.65f, 0); camGO.tag = "MainCamera"; var cam = camGO.AddComponent(); cam.fieldOfView = 75f; cam.nearClipPlane = 0.1f; cam.farClipPlane = 80f; camGO.AddComponent(); fps.playerCamera = cam; Debug.Log("[HOY Gallery V2] Scene built. Now assign Materials in GalleryManager Inspector, then Play."); Selection.activeGameObject = root; EditorUtility.SetDirty(root); } } #endif