From 6f1c335c739422d85d2c13e75341f1c73c7d8517 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EC=98=81=EB=AF=BC?= <117150306+jym04@users.noreply.github.com> Date: Wed, 11 Mar 2026 16:52:24 +0900 Subject: [PATCH] =?UTF-8?q?[=EC=A0=95=EC=98=81=EB=AF=BC]=20=EC=84=A4?= =?UTF-8?q?=EB=B9=84=20=EA=B2=B9=EC=B9=A8=20=EC=A0=95=EB=A0=AC=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 26.03.11 설비 겹침 기능 수정 --- .vscode/extensions.json | 5 + .vscode/launch.json | 10 + .vscode/settings.json | 71 +++ AZTECH_WB.slnx | 15 + .../UI/Toolbar/images/ic_floor_active.png | Bin 0 -> 527 bytes .../Toolbar/images/ic_floor_active.png.meta | 117 +++++ .../UI/Toolbar/images/ic_floor_deactive.png | Bin 0 -> 527 bytes .../Toolbar/images/ic_floor_deactive.png.meta | 117 +++++ Assets/Scenes/Main.unity | 20 +- Assets/Scripts/Camera/OrbitalController.cs | 7 +- .../ScreenResetCommand.cs | 3 + Assets/Scripts/Manager/LibraryManager.cs | 2 +- .../Manager/MachineStatusItemManager.cs | 447 +++++++++--------- .../UI/AlarmSituation/AlarmSituationPanel.cs | 2 +- .../UI/ExitProgramPanel/ExitProgramPanel.cs | 3 - .../Scripts/UI/LeftSidePanel/LeftSidePanel.cs | 10 + Assets/Scripts/UI/Library/FilterButton.cs | 5 - .../UI/MachinStatusIcon/MachineStatusItem.cs | 48 +- Assets/Settings/PC_RPAsset.asset | 2 +- Option.ini | 2 +- Packages/manifest.json | 2 +- Packages/packages-lock.json | 2 +- 22 files changed, 620 insertions(+), 270 deletions(-) create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 AZTECH_WB.slnx create mode 100644 Assets/DownloadAssets/XRLib/Resources/Prefabs/UI/Toolbar/images/ic_floor_active.png create mode 100644 Assets/DownloadAssets/XRLib/Resources/Prefabs/UI/Toolbar/images/ic_floor_active.png.meta create mode 100644 Assets/DownloadAssets/XRLib/Resources/Prefabs/UI/Toolbar/images/ic_floor_deactive.png create mode 100644 Assets/DownloadAssets/XRLib/Resources/Prefabs/UI/Toolbar/images/ic_floor_deactive.png.meta diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..ddb6ff8 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "visualstudiotoolsforunity.vstuc" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..da60e25 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,10 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Attach to Unity", + "type": "vstuc", + "request": "attach" + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..95dae1b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,71 @@ +{ + "files.exclude": { + "**/.DS_Store": true, + "**/.git": true, + "**/.vs": true, + "**/.gitmodules": true, + "**/.vsconfig": true, + "**/*.booproj": true, + "**/*.pidb": true, + "**/*.suo": true, + "**/*.user": true, + "**/*.userprefs": true, + "**/*.unityproj": true, + "**/*.dll": true, + "**/*.exe": true, + "**/*.pdf": true, + "**/*.mid": true, + "**/*.midi": true, + "**/*.wav": true, + "**/*.gif": true, + "**/*.ico": true, + "**/*.jpg": true, + "**/*.jpeg": true, + "**/*.png": true, + "**/*.psd": true, + "**/*.tga": true, + "**/*.tif": true, + "**/*.tiff": true, + "**/*.3ds": true, + "**/*.3DS": true, + "**/*.fbx": true, + "**/*.FBX": true, + "**/*.lxo": true, + "**/*.LXO": true, + "**/*.ma": true, + "**/*.MA": true, + "**/*.obj": true, + "**/*.OBJ": true, + "**/*.asset": true, + "**/*.cubemap": true, + "**/*.flare": true, + "**/*.mat": true, + "**/*.meta": true, + "**/*.prefab": true, + "**/*.unity": true, + "build/": true, + "Build/": true, + "Library/": true, + "library/": true, + "obj/": true, + "Obj/": true, + "Logs/": true, + "logs/": true, + "ProjectSettings/": true, + "UserSettings/": true, + "temp/": true, + "Temp/": true + }, + "files.associations": { + "*.asset": "yaml", + "*.meta": "yaml", + "*.prefab": "yaml", + "*.unity": "yaml", + }, + "explorer.fileNesting.enabled": true, + "explorer.fileNesting.patterns": { + "*.sln": "*.csproj", + "*.slnx": "*.csproj" + }, + "dotnet.defaultSolution": "AZTECH_WB.slnx" +} \ No newline at end of file diff --git a/AZTECH_WB.slnx b/AZTECH_WB.slnx new file mode 100644 index 0000000..ea9ecb2 --- /dev/null +++ b/AZTECH_WB.slnx @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/Assets/DownloadAssets/XRLib/Resources/Prefabs/UI/Toolbar/images/ic_floor_active.png b/Assets/DownloadAssets/XRLib/Resources/Prefabs/UI/Toolbar/images/ic_floor_active.png new file mode 100644 index 0000000000000000000000000000000000000000..20832f574d92446bba1ab09e977b63ad1a15bedd GIT binary patch literal 527 zcmV+q0`UEbP)M94Vn$e26O|u0ofoU zFhWM4oq%reR&GU62s8#9@<-2|EPaH!aEzV*2xEHr8A0wsFlacCkg*~ z5dNDVId#}UCH-mfLE~qqD*VkN0npG?{6NTZ}a<)c( zzXo$te5kR%WJfupVEd%C4D#eJj50T+&X~$CvghCM&vouSFpRomKz&R#Bm5ODaIjOr z1+M?eE3Xy;YbN?K1DeYq6kd&tA|a`BQflY41j#4u=ou^9o}@%0XXS|1p(K1Y`b$w_ z;lC3^Y@1_;J6v`SKTby0=?-(Ct-(aez;*d4?y6Xzv)ZW^v09j67=~f2<{PxIG(~JQ R-Y)m&h%C3BJ}YGT5f zqJUR>E69^24dk16m35)N6U$@;IbOWhNgCQ3csj`*g?c&3rohulGMP*S{sFI(); raycaster.SetInteractable(false); + //var building = AZTECHSceneMain.Instance.building; + //building.ActiveRoof(true); + var machineStatusItemManager = AZTECHSceneMain.Instance.GetManager(); machineStatusItemManager.SetActiveIcons(false); machineStatusItemManager.SetInteractableIcons(true); diff --git a/Assets/Scripts/Manager/LibraryManager.cs b/Assets/Scripts/Manager/LibraryManager.cs index 3f95e2d..7956444 100644 --- a/Assets/Scripts/Manager/LibraryManager.cs +++ b/Assets/Scripts/Manager/LibraryManager.cs @@ -105,7 +105,7 @@ namespace AZTECHWB.Management machines = building.floors.SelectMany(f => f.machines).ToArray(); foreach (var info in standardInfos) { - var p = machines.Where(x => x.machineName.Equals(info.code)).FirstOrDefault(); + var p = machines.FirstOrDefault(x => x.machineName.Equals(info.code)); if (p == null) continue; p.typeOptions = info.filterInfo; diff --git a/Assets/Scripts/Manager/MachineStatusItemManager.cs b/Assets/Scripts/Manager/MachineStatusItemManager.cs index 191996a..4aaa4cf 100644 --- a/Assets/Scripts/Manager/MachineStatusItemManager.cs +++ b/Assets/Scripts/Manager/MachineStatusItemManager.cs @@ -1,7 +1,7 @@ using AZTECHWB.Command; using AZTECHWB.Constants; +using AZTECHWB.Core; using Cysharp.Threading.Tasks; -using System; using System.Collections.Generic; using System.Linq; using UnityEngine; @@ -10,111 +10,50 @@ namespace AZTECHWB.Management { public class MachineStatusItemManager : Manager { - public MachineStatusItem machineStatusItem; + [Header("References")] + private MachineStatusItem machineStatusItem; - private OrbitalController controller; - private Building building; - public Machine[] machines; - private List matchingMachines = new(); + [Header("Position Settings")] + public Vector3 worldOffset = new Vector3(0, 1.5f, 0); + public float verticalPadding = 5f; + public float overlapThreshold = 2f; + public float smoothSpeed = 10f; + [Header("Visibility Settings")] + public LayerMask occlusionLayer; + public float occlusionCheckInterval = 0.1f; + + private Dictionary smoothedPositions = new Dictionary(); + private float occlusionTimer; + + [Header("Scale Settings")] + public float minScale = 0.5f; // 가장 멀 때 크기 + public float maxScale = 1.2f; // 가장 가까울 때 크기 + public float scaleSmoothing = 5f; // 스케일 변화 스무딩 속도 + private float maxDistance = 50f; // 스케일 계산 기준 최대 거리 + + private Dictionary smoothedScales = new Dictionary(); private Dictionary machineIcons = new(); private Dictionary iconToMachines = new(); - - public float defaultNameHeight; - public Vector3 originScale; - - public bool activeIconEnable; - - [Range(0.1f, 0.8f)] - public float minScale; - [Range(0.5f, 1.5f)] - public float maxScale; - [Range(0.1f, 2f)] - public float scaleClamp; + private OrbitalController controller; + private Machine[] machines; + private bool activeIconEnable; public override async UniTask Init() { - controller = FindAnyObjectByType(); machineStatusItem = Resources.Load($"{ResourceURL.uiPrefabFolderPath}{nameof(MachineStatusItem)}"); - building = FindAnyObjectByType(); + controller = AZTECHAppMain.Instance.cameraController; + machines = AZTECHSceneMain.Instance.building.floors.SelectMany(f => f.machines).ToArray(); + + maxDistance = controller.maxDistance; await UniTask.CompletedTask; } - public void Clear() - { - uiElements.Clear(); - matchingMachines.Clear(); - iconToMachines.Clear(); - } - public void SetMachineData(List machineData) - { - Clear(); - - if (machines.Length <= 0) - { - machines = building.floors.SelectMany(f => f.machines).ToArray(); - } - - foreach (var data in machineData) - { - var machine = FindMachineWithCode(data.worknm); - - if (machine == null) - continue; - - if (machineIcons.ContainsKey(data.worknm)) - { - machineIcons[data.worknm].SetData(data, machine.machineName); - uiElements.Add(machineIcons[data.worknm].rectTransform); - continue; - } - - var machineIcon = Instantiate(machineStatusItem, transform); - machineIcon.Init(data.worknm); - machineIcon.SetData(data, machine.machineName); - machineIcon.onClickIcon += OnClickMachineKPI; - - machineIcon.gameObject.SetActive(false); - uiElements.Add(machineIcon.rectTransform); - - machineIcons.Add(data.worknm, machineIcon); - } - - foreach (var machine in machines) - { - if (machineIcons.ContainsKey(machine.machineName)) - { - machine.machineStatusItem = machineIcons[machine.machineName]; - matchingMachines.Add(machine); - iconToMachines.Add(machine.machineStatusItem, machine); - } - } - } - private Machine FindMachineWithCode(string worknm) - { - Machine machine = null; - for (int i = 0; i < machines.Length; i++) - { - if (machines[i].machineName == worknm) - { - machine = machines[i]; - break; - } - } - return machine; - } - private void OnClickMachineKPI(MachineStatusItem machineKPI) - { - machineKPI.transform.SetAsLastSibling(); - var currentMachine = iconToMachines[machineKPI]; - - new OpenMachineDetailDashboardPanelCommand(currentMachine, machineKPI.data).Execute(); - } public void SetInteractableIcons(bool isActive) { - foreach(var machineIcon in machineIcons.Values) + foreach (var machineIcon in machineIcons.Values) { machineIcon.isInteractable = isActive; } @@ -129,148 +68,232 @@ namespace AZTECHWB.Management } } + + public void SetMachineData(List machineData) + { + foreach (var data in machineData) + { + var machine = FindMachineWithCode(data.worknm); + + if (machine == null) + continue; + + if (machineIcons.ContainsKey(data.worknm)) + { + machineIcons[data.worknm].SetData(data); + continue; + } + + var machineIcon = Instantiate(machineStatusItem, transform); + machineIcon.Init(machine); + machineIcon.SetData(data); + machineIcon.onClickIcon += OnClickMachineKPI; + + machineIcons.Add(data.worknm, machineIcon); + machineIcon.gameObject.SetActive(false); + + machine.machineStatusItem = machineIcon; + iconToMachines.Add(machineIcon, machine); + } + } + + private void OnClickMachineKPI(MachineStatusItem machineKPI) + { + machineKPI.transform.SetAsLastSibling(); + var currentMachine = iconToMachines[machineKPI]; + + new OpenMachineDetailDashboardPanelCommand(currentMachine, machineKPI.data).Execute(); + } + + private Machine FindMachineWithCode(string worknm) + { + Machine machine = null; + for (int i = 0; i < machines.Length; i++) + { + if (machines[i].machineName == worknm) + { + machine = machines[i]; + break; + } + } + return machine; + } private void LateUpdate() { - GroupOverlappingUIElements(); - RangeDetection(); + if (machineIcons.Values.Count == 0 || controller.Camera == null) + return; + + List allLabels = new List(machineIcons.Values); + + // 1단계: 전체 라벨 스크린 위치 & 거리 계산 + UpdateScreenData(allLabels); + + // 2단계: 활성화 여부 판정 (화면 이탈 + 가려짐) + occlusionTimer += Time.deltaTime; + if (occlusionTimer >= occlusionCheckInterval) + { + UpdateVisibility(allLabels); + occlusionTimer = 0f; + } + // 3단계: 활성화된 라벨만 카메라 거리순 정렬 + List visibleLabels = allLabels.FindAll(l => l.gameObject.activeSelf); + visibleLabels.Sort((a, b) => a.distanceToCamera.CompareTo(b.distanceToCamera)); + + // 4단계: 거리에 따른 UI 크기 조정 + UpdateScales(visibleLabels); + // 5단계: 겹침 해소 → 목표 위치 계산 + Dictionary targetPositions = ResolveOverlaps(visibleLabels); + // 6단계: 스무딩 적용 후 RectTransform에 반영 + ApplyPositions(targetPositions); } - public List uiElements = new List(); - public List> groupedElements = new List>(); - void GroupOverlappingUIElements() + void UpdateScreenData(List labels) { - foreach (var matchingMachine in matchingMachines) + foreach (var label in labels) { - var machinePos = matchingMachine.centerPos; - var screenPos = controller.Camera.WorldToScreenPoint(new Vector3(machinePos.x, machinePos.y + defaultNameHeight, machinePos.z)); + if (label.targetTransform == null) continue; - matchingMachine.machineStatusItem.transform.position = screenPos; - } - groupedElements.Clear(); - var uncheckedElements = new List(uiElements); + Vector3 worldPos = label.targetTransform.position + worldOffset; + Vector3 screenPos = controller.Camera.WorldToScreenPoint(worldPos); - while (uncheckedElements.Count > 0) - { - var currentElement = uncheckedElements[0]; - uncheckedElements.RemoveAt(0); - var group = new List { currentElement }; - - for (int i = uncheckedElements.Count - 1; i >= 0; i--) - { - if (AreRectanglesOverlapping(currentElement, uncheckedElements[i])) - { - group.Add(uncheckedElements[i]); - uncheckedElements.RemoveAt(i); - } - } - - groupedElements.Add(group); - } - - foreach (var group in groupedElements) - { - var centerPos = GroupCenterCalculate(group); - - for (int i = 0; i < group.Count; i++) - { - var kpi = group[i]; - var newPos = new Vector3(centerPos.x, centerPos.y + kpi.rect.height * i * kpi.transform.localScale.y, centerPos.z); - - kpi.transform.localPosition = newPos; - } + label.screenPosition = new Vector2(screenPos.x, screenPos.y); + label.distanceToCamera = Vector3.Distance(controller.Camera.transform.position, label.targetTransform.position); } } - private bool AreRectanglesOverlapping(RectTransform rectA, RectTransform rectB) - { - if (!rectB.gameObject.activeSelf) - return false; - if (!rectA.gameObject.activeSelf) - return false; - - Rect rectAWorld = GetWorldRect(rectA); - Rect rectBWorld = GetWorldRect(rectB); - - return rectAWorld.Overlaps(rectBWorld); - } - private static Vector3[] worldCorners = new Vector3[4]; - private Rect GetWorldRect(RectTransform rectTransform) - { - rectTransform.GetWorldCorners(worldCorners); - Vector2 min = worldCorners[0]; - Vector2 max = worldCorners[2]; - return new Rect(min, max - min); - } - private Vector3 GroupCenterCalculate(List group) - { - var centerPos = Vector3.zero; - group.Sort((a, b) => a.transform.localPosition.y.CompareTo(b.transform.localPosition.y)); - - foreach (var kpi in group) - { - centerPos += kpi.transform.localPosition; - } - centerPos /= group.Count; - - return centerPos; - } - void RangeDetection() - { - var layerMask = LayerMask.GetMask("Camera", "Floor Wall"); - - float t = Mathf.InverseLerp(controller.maxDistance, 0f, controller.currentDistance); - float scale = Mathf.Lerp(minScale, maxScale, t); - var newScale = new Vector3(scale, scale, scale); - - float expandScale = Mathf.Lerp(1.6f, 1f, t); - var newExpandScale = new Vector3(expandScale, expandScale, expandScale); - - foreach (var machine in matchingMachines) - { - MachineKPIsActive(machine, layerMask); - var machineKPI = machine.machineStatusItem; - machineKPI.transform.localScale = newScale; - machineKPI.Expand_KPI.transform.localScale = newExpandScale; - } - } - bool IsScreenRange(Machine machine) - { - Vector3 viewPos = controller.Camera.WorldToViewportPoint(machine.centerPos); - - if (viewPos.x >= 0 && viewPos.x <= 1 && viewPos.y >= 0 && viewPos.y <= 1 && viewPos.z > 0) - { - return true; - } - return false; - } - void MachineKPIsActive(Machine machine, LayerMask layerMask) + void UpdateVisibility(List labels) { if (!activeIconEnable) return; - var dir = (controller.Camera.transform.position - machine.centerPos).normalized; - var radius = 1f; - var ray = new Ray(machine.centerPos, dir); - - if (Physics.SphereCast(ray, radius, out RaycastHit hit, Mathf.Infinity, layerMask)) + foreach (var label in labels) { - var hitCameraLayer = hit.collider.gameObject.layer.Equals(LayerMask.NameToLayer("Camera")); + // 카메라 뒤쪽 체크 + Vector3 screenPos = controller.Camera.WorldToScreenPoint(label.targetTransform.position + worldOffset); + if (screenPos.z < 0) + { + label.gameObject.SetActive(false); + continue; + } - if (hitCameraLayer) + // 화면 이탈 체크 + if (!IsOnScreen(label.screenPosition)) { - if (!IsScreenRange(machine)) - { - machine.machineStatusItem.Deactive(); - } - else - { - machine.machineStatusItem.Active(); - } + label.gameObject.SetActive(false); + continue; } - else + + // 특정 레이어에 가려짐 체크 + if (IsOccluded(label.targetTransform.position)) { - machine.machineStatusItem.Deactive(); + label.gameObject.SetActive(false); + continue; } + + label.gameObject.SetActive(true); } } + + bool IsOnScreen(Vector2 screenPos) + { + return screenPos.x >= 0 && screenPos.x <= Screen.width && screenPos.y >= 0 && screenPos.y <= Screen.height; + } + + bool IsOccluded(Vector3 targetWorldPos) + { + Vector3 camPos = controller.Camera.transform.position; + Vector3 direction = targetWorldPos - camPos; + float distance = direction.magnitude; + + return Physics.Raycast(camPos, direction.normalized, distance - 0.1f, occlusionLayer); + } + + Dictionary ResolveOverlaps(List visibleLabels) + { + Dictionary targetPositions = new Dictionary(); + List placedRects = new List(); + + foreach (var label in visibleLabels) + { + Vector2 size = label.GetSize(); + Vector2 targetPos = label.screenPosition; + + bool overlapping = true; + int maxIterations = 20; + + while (overlapping && maxIterations-- > 0) + { + overlapping = false; + Rect currentRect = GetRect(targetPos, size); + + foreach (Rect placed in placedRects) + { + if (IsOverlapping(currentRect, placed)) + { + // X는 겹친 라벨의 X로 고정, Y만 위로 밀어올림 + targetPos.x = placed.center.x; + targetPos.y = placed.yMax + verticalPadding + size.y * 0.5f; + overlapping = true; + break; + } + } + } + + targetPositions[label] = targetPos; + placedRects.Add(GetRect(targetPos, size)); + } + + return targetPositions; + } + + void ApplyPositions(Dictionary targetPositions) + { + foreach (var kvp in targetPositions) + { + MachineStatusItem label = kvp.Key; + Vector2 target = kvp.Value; + + if (!smoothedPositions.ContainsKey(label)) + smoothedPositions[label] = target; + + smoothedPositions[label] = Vector2.Lerp(smoothedPositions[label],target,Time.deltaTime * smoothSpeed); + + // Manager가 직접 RectTransform 조작 + label.rectTransform.position = new Vector3(smoothedPositions[label].x, smoothedPositions[label].y, 0); + } + } + + void UpdateScales(List visibleLabels) + { + foreach (var label in visibleLabels) + { + // 거리 비율 → 목표 스케일 계산 (원본과 동일한 방식) + float t = Mathf.InverseLerp(maxDistance, 0f, label.distanceToCamera); + float targetScale = Mathf.Lerp(minScale, maxScale, t); + + // 스무딩 초기값 설정 + if (!smoothedScales.ContainsKey(label)) + smoothedScales[label] = targetScale; + + // Lerp로 부드럽게 스케일 변화 + smoothedScales[label] = Mathf.Lerp( + smoothedScales[label], + targetScale, + Time.deltaTime * scaleSmoothing + ); + + label.transform.localScale = Vector3.one * smoothedScales[label]; + } + } + + Rect GetRect(Vector2 centerPos, Vector2 size) + { + return new Rect(centerPos.x - size.x * 0.5f, centerPos.y - size.y * 0.5f, size.x, size.y); + } + + bool IsOverlapping(Rect a, Rect b) + { + return a.xMin < b.xMax - overlapThreshold && a.xMax > b.xMin + overlapThreshold && + a.yMin < b.yMax - overlapThreshold && a.yMax > b.yMin + overlapThreshold; + } } } \ No newline at end of file diff --git a/Assets/Scripts/UI/AlarmSituation/AlarmSituationPanel.cs b/Assets/Scripts/UI/AlarmSituation/AlarmSituationPanel.cs index fb67dc6..8df8477 100644 --- a/Assets/Scripts/UI/AlarmSituation/AlarmSituationPanel.cs +++ b/Assets/Scripts/UI/AlarmSituation/AlarmSituationPanel.cs @@ -62,7 +62,7 @@ namespace AZTECHWB.UI { var building = AZTECHSceneMain.Instance.building; var machines = building.floors.SelectMany(f => f.machines); - var selectedMachine = machines.Where(m => m.machineName == alarmInfo.completeInfo.worknm).FirstOrDefault(); + var selectedMachine = machines.FirstOrDefault(m => m.machineName == alarmInfo.completeInfo.worknm); new SelectedMachineCommand(selectedMachine, false).Execute(); } diff --git a/Assets/Scripts/UI/ExitProgramPanel/ExitProgramPanel.cs b/Assets/Scripts/UI/ExitProgramPanel/ExitProgramPanel.cs index 9ee7a3e..3cf75d7 100644 --- a/Assets/Scripts/UI/ExitProgramPanel/ExitProgramPanel.cs +++ b/Assets/Scripts/UI/ExitProgramPanel/ExitProgramPanel.cs @@ -12,7 +12,6 @@ namespace AZTECHWB.UI public Button Button_Close; private LayerPanel layerPanel; - public Action isClickUI; public override async UniTask Init() { @@ -32,13 +31,11 @@ namespace AZTECHWB.UI gameObject.SetActive(true); layerPanel.Open(); gameObject.transform.SetAsLastSibling(); - isClickUI?.Invoke(true); } public override void Close() { layerPanel.Close(); gameObject.SetActive(false); - isClickUI?.Invoke(false); } private void OnClickExitButton() { diff --git a/Assets/Scripts/UI/LeftSidePanel/LeftSidePanel.cs b/Assets/Scripts/UI/LeftSidePanel/LeftSidePanel.cs index 136b367..8414597 100644 --- a/Assets/Scripts/UI/LeftSidePanel/LeftSidePanel.cs +++ b/Assets/Scripts/UI/LeftSidePanel/LeftSidePanel.cs @@ -99,6 +99,16 @@ namespace AZTECHWB.UI null, " UI Ȱȭ/Ȱȭ մϴ."); + toolbarModel.AddToggleButton("button_floor_control", true, + "Prefabs/UI/Toolbar/images/ic_floor_active", + "Prefabs/UI/Toolbar/images/ic_floor_deactive", + (isSelected) => + { + //AZTECHSceneMain.Instance.building.ActiveRoof(isSelected); + }, + null, + " Ȱȭ/Ȱȭ մϴ."); + // --- --- toolbar.SetData(toolbarModel); toolbar.Initialize(); diff --git a/Assets/Scripts/UI/Library/FilterButton.cs b/Assets/Scripts/UI/Library/FilterButton.cs index 84b132e..7ac7121 100644 --- a/Assets/Scripts/UI/Library/FilterButton.cs +++ b/Assets/Scripts/UI/Library/FilterButton.cs @@ -14,9 +14,6 @@ namespace AZTECHWB.UI private TextMeshProUGUI Text_Selected; private TextMeshProUGUI Text_Deselected; - public Color selectColor; - public Color origingColor; - public void SettingButton(string labelName) { transform.TryGetComponentInChildren(nameof(Text_Selected), out Text_Selected); @@ -24,8 +21,6 @@ namespace AZTECHWB.UI var button = transform.GetComponentInChildren