[한수빈] 기존 코드로 변경

26.01.29
- 시작 시 설비 애니메이션 멈추고 층 별로 동작하게 만드는 로직 우선 스태시
- TopMenuPanel은 홈 화면으로 돌아가는 로직 추가한 버전으로 업로드
This commit is contained in:
SOOBEEN HAN
2026-01-29 09:43:30 +09:00
parent 8338973c62
commit 2eac2d9f6c
3 changed files with 26 additions and 17 deletions

View File

@@ -33,7 +33,7 @@ namespace ChunilENG.Management
[Range(0.1f, 2f)] public float scaleClamp;
private List<RectTransform> activeUIElements = new();
private Vector3[] worldCorners = new Vector3[4]; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: GC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>Ҵ<EFBFBD>
private Vector3[] worldCorners = new Vector3[4]; // 개선사항: GC 방지용 미리 할당
public override async UniTask Init()
{
@@ -50,7 +50,7 @@ namespace ChunilENG.Management
private System.Collections.IEnumerator UpdateLoop()
{
var wait = new WaitForSeconds(updateInterval); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> updateInterval<61><6C><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> <20><><EFBFBD><EFBFBD>
var wait = new WaitForSeconds(updateInterval); // 개선사항: 매 프레임 실행하던 로직을 updateInterval마다 실행하도록 변경
while (true)
{
Profiler.BeginSample("MachineKPI_TotalUpdate");
@@ -60,7 +60,7 @@ namespace ChunilENG.Management
GroupOverlappingUIElements();
}
Profiler.EndSample();
yield return wait; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD> <20>ۿ<EFBFBD><DBBF><EFBFBD> <20><> <20>ѹ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> ij<><C4B3><EFBFBD>ص<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> -> <20>޸<EFBFBD> <20>Ҵ<EFBFBD> 0
yield return wait; // 개선사항: 루프 밖에서 딱 한번 생성하여 캐싱해둔 것을 재사용 -> 메모리 할당 0
}
}
@@ -94,14 +94,14 @@ namespace ChunilENG.Management
machine.machineKPI = kpi;
matchingMachines.Add(machine);
kpiToMachines.Add(kpi, machine);
machine.SetAnimationSpeed();
// machine.SetAnimationSpeed();
}
}
}
private void UpdateMachineVisibilityAndScale()
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD> RangeDetection <EFBFBD>Լ<EFBFBD> -> <EFBFBD>ڷ<EFBFBD>ƾ <20>ȿ<EFBFBD><C8BF><EFBFBD> <20><><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><><EFBFBD>ü<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// 개선사항: 기존 RangeDetection 함수 -> 코루틴 안에서 실행되는 가시성 업데이트 루프에 포함
int layerMask = LayerMask.GetMask("Camera", "Floor Wall");
float t = Mathf.InverseLerp(cam.maxDistance, 0f, cam.currentDistance);
float scaleValue = Mathf.Lerp(minScale, maxScale, t);
@@ -118,7 +118,7 @@ namespace ChunilENG.Management
{
machine.machineKPI.Active();
machine.machineKPI.transform.localScale = newScale;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǥ<EFBFBD><C7A5> <20><>ũ<EFBFBD><C5A9> <20><>ǥ<EFBFBD><C7A5> <20><>ȯ<EFBFBD>Ͽ<EFBFBD> 1<><31> <20><>ġ
// 월드 좌표를 스크린 좌표로 변환하여 1차 배치
Vector3 screenPos = Camera.main.WorldToScreenPoint(machine.centerPos + Vector3.up * defaultNameHeight);
machine.machineKPI.transform.position = screenPos;
activeUIElements.Add(machine.machineKPI.rectTransform);
@@ -143,11 +143,11 @@ namespace ChunilENG.Management
{
if (activeUIElements.Count == 0) return;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: uncheckedElements.Where(...) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> -> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׷<EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Y<><59>ǥ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <20>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (LINQ <EFBFBD><EFBFBD><EFBFBD> List.Sort<EFBFBD><EFBFBD> <20>Ҵ<EFBFBD> <20><><EFBFBD><EFBFBD>)
// 개선사항: uncheckedElements.Where(...) 같은 할당 연산 제거 -> 복잡한 그룹 계산 없이 정렬
// 정렬: Y좌표 기준으로 정렬하여 아래서부터 쌓음 (LINQ 대신 List.Sort로 할당 방지)
activeUIElements.Sort((a, b) => a.position.y.CompareTo(b.position.y));
// <EFBFBD>ܼ<EFBFBD>ȭ<EFBFBD><EFBFBD> <20><>ø <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28>׸<EFBFBD><D7B8><20>׷<EFBFBD><D7B7><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ)
// 단순화된 중첩 방지 로직 (그리드나 그룹핑 대신 순차적 체크)
for (int i = 0; i < activeUIElements.Count; i++)
{
for (int j = i + 1; j < activeUIElements.Count; j++)
@@ -157,7 +157,7 @@ namespace ChunilENG.Management
if (AreRectsOverlapping(rectA, rectB))
{
// <EFBFBD><EFBFBD>ġ<EFBFBD><EFBFBD> B<><42> A <20><><EFBFBD><EFBFBD> <20>ø<EFBFBD>
// 겹치면 B를 A 위로 올림
float offset = rectA.rect.height * rectA.lossyScale.y;
rectB.position = new Vector3(rectB.position.x, rectA.position.y + offset, rectB.position.z);
}
@@ -170,7 +170,7 @@ namespace ChunilENG.Management
}
private Rect GetWorldRect(RectTransform rectTransform)
{
rectTransform.GetWorldCorners(worldCorners); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: worldCorners<EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ij<><C4B3> -> GetWorldRect ȣ<><C8A3> <20>ø<EFBFBD><C3B8><EFBFBD> <20>߻<EFBFBD><DFBB>ϴ<EFBFBD> <20><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
rectTransform.GetWorldCorners(worldCorners); // 개선사항: worldCorners를 멤버 변수로 캐싱 -> GetWorldRect 호출 시마다 발생하는 배열 생성 막음
return new Rect(worldCorners[0], worldCorners[2] - worldCorners[0]);
}

View File

@@ -10,7 +10,7 @@ namespace ChunilENG
public class Machine : MonoBehaviour
{
public string machineName;
public string code;
public string code;
public string[] typeOptions;
public MachineInfoItem machineKPI;
public Sprite previewImage;
@@ -58,13 +58,13 @@ namespace ChunilENG
animSpeed = 0f;
}
foreach(var animator in animators)
foreach (var animator in animators)
{
animator.speed = animSpeed;
}
}
}
public void ActiveHighLighter()
{
if (highLighter == null)
@@ -79,7 +79,7 @@ namespace ChunilENG
highLighter.gameObject.SetActive(false);
}
public int GetMachineFloorIndex()
{
@@ -98,6 +98,6 @@ namespace ChunilENG
return 0;
}
}
}

View File

@@ -2,6 +2,7 @@ using ChunilENG.Constants;
using ChunilENG.UI;
using ChunilENG.UI.Command;
using Cysharp.Threading.Tasks;
using OCTOPUS_TWIN;
using UnityEngine;
using UVC.UI.Commands;
using UVC.UI.Menu;
@@ -62,7 +63,15 @@ namespace ChunilENG
//홈 화면 돌아가기
toolbarModel.AddStandardButton("홈 화면 돌아가기",
$"{ResourceURL.uiSpriteFolderPath}TopToolBar/IMG_Exit",
new ActionCommand(() => Debug.Log("홈 화면 돌아가기 창 열기")),
new ActionCommand(() => {
Debug.Log("홈 화면 돌아가기 창 열기");
var controller = FindFirstObjectByType<ProjectListController>(FindObjectsInactive.Include);
if (controller != null)
{
controller.ReturnHome();
}
}
),
"홈 화면 돌아가기 창을 엽니다.");
topToolBox.SetData(toolbarModel);