using UnityEngine; using UnityEngine.UI; public class CAPS : MonoBehaviour { public static Camera[] IslandCameras; // flag: non-null while island view is active public static void ShowFRONT(string C1, GameObject O, float PosX, float PosY, float PosZ, Color Color) { GameObject cap = Instantiate(Get.o1("CODETXT")); cap.transform.Find("CAP/Btn/TXT").GetComponent().text = C1; cap.transform.Find("CAP/Btn").GetComponent().color = Color; cap.tag = "capsfront"; cap.name = "CAPS_NUMBER"; cap.transform.position = new(PosX, PosY, PosZ - 1); cap.transform.SetParent(O.transform); cap.transform.Find("CAP").gameObject.SetActive(false); cap.AddComponent(); } public static void ShowTOP(string C1, GameObject O, float PosX, float PosY, float PosZ, Color Color) { string Model=_G.OBJs[int.Parse(C1)][4]; if(Model.Contains("W") || Model=="T1")PosZ=0; GameObject cap = Instantiate(Get.o1("CODETXT")); cap.transform.Find("CAP/Btn/TXT").GetComponent().text = C1; cap.transform.Find("CAP/Btn").GetComponent().color = Color; cap.tag = "capstop"; cap.name = "CAPS_NUMBER"; cap.transform.eulerAngles = new(90, 0, 0); cap.transform.position = new(PosX, PosY + 1, PosZ + 1); cap.transform.SetParent(O.transform); cap.transform.Find("CAP").gameObject.SetActive(false); } public static void SHOW_TOP(bool isShow, float scale) { foreach (GameObject obj in GameObject.FindGameObjectsWithTag("capstop")) { obj.transform.Find("CAP").gameObject.SetActive(isShow); obj.transform.Find("CAP").localScale = new Vector3(scale, scale, 0); } } public static void SHOW_FRONT(bool isShow, float scale) { foreach (GameObject obj in GameObject.FindGameObjectsWithTag("capsfront")) { if (obj.TryGetComponent(out CapFacingCamera facing)) facing.SetVisible(isShow, scale); else { obj.transform.Find("CAP").gameObject.SetActive(isShow); obj.transform.Find("CAP").localScale = new Vector3(scale, scale, 0); } } } // One-shot render for a RenderTexture camera: apply facing → capture → restore → disable public static void RenderIslandCamera(Camera cam, float scale) { SHOW_FRONT(true, scale); var caps = FindObjectsByType(FindObjectsInactive.Exclude); foreach (var c in caps) c.ApplyFacing(cam); SetCapsForeground(true); cam.Render(); SetCapsForeground(false); foreach (var c in caps) c.RestoreVisibility(); cam.gameObject.SetActive(false); } static void SetCapsForeground(bool foreground) { foreach (GameObject obj in GameObject.FindGameObjectsWithTag("capsfront")) { Transform capT = obj.transform.Find("CAP"); if (capT == null) continue; Canvas canvas = capT.GetComponent(); if (canvas == null) continue; canvas.overrideSorting = foreground; canvas.sortingOrder = foreground ? 999 : 0; } } // One-shot facing for a live camera (elevation): apply facing once, no render/disable public static void ApplyFacingForElevation(Camera cam, float scale) { SHOW_FRONT(true, scale); var caps = FindObjectsByType(FindObjectsInactive.Exclude); foreach (var c in caps) c.ApplyFacing(cam); } } public class CapFacingCamera : MonoBehaviour { Transform _cap; bool _intendedVisible; Vector3 _visibleScale; void Awake() => _cap = transform.Find("CAP"); public void SetVisible(bool visible, float scale) { _intendedVisible = visible; _visibleScale = new Vector3(scale, scale, 0); if (_cap == null) return; _cap.gameObject.SetActive(visible); if (visible) _cap.localScale = _visibleScale; } // Called before each explicit Camera.Render() — show only if facing that camera public void ApplyFacing(Camera cam) { if (_cap == null) return; bool show = _intendedVisible && Facing(cam); _cap.gameObject.SetActive(show); if (show) _cap.localScale = _visibleScale; } // Called after Camera.Render() — restore to intended visibility public void RestoreVisibility() { if (_cap == null) return; _cap.gameObject.SetActive(_intendedVisible); if (_intendedVisible) _cap.localScale = _visibleScale; } // 3D interactive view: update every frame with Camera.main // Island view skips this — caps are set once per explicit Camera.Render() void Update() { if (CAPS.IslandCameras != null || !_intendedVisible || _cap == null) return; Camera cam = Camera.main; if (cam == null) return; bool show = Facing(cam); _cap.gameObject.SetActive(show); if (show) _cap.localScale = _visibleScale; } // Direction from cabinet center to cap world pos = outward face normal // More reliable than parent.forward which depends on prefab orientation bool Facing(Camera cam) { if (transform.parent == null) return false; Vector3 outward = transform.position - transform.parent.position; if (outward.sqrMagnitude < 0.001f) return true; return Vector3.Dot(outward.normalized, cam.transform.position - transform.position) > 0f; } }