Files
HDRobotics/Assets/Scripts/View/TCPView.cs
2025-12-03 21:19:07 +09:00

74 lines
2.6 KiB
C#

using TMPro;
using UnityEngine;
using System;
/// <summary>
/// 로봇의 Tool Center Point (TCP) 좌표(X, Y, Z, Rx, Ry, Rz)를
/// Unity UI(TextMeshPro)에 표시하는 뷰(View) 클래스
/// 불필요한 UI 갱신을 방지하는 최적화 로직이 포함되어 있음
/// </summary>
public class TCPView : MonoBehaviour
{
/// <summary>
/// 매 프레임마다 ProgramPresenter에게 "최신 데이터를 보내달라"고 요청하는 이벤트
/// Presenter는 이 이벤트를 구독하여 데이터 모델의 값을 View로 전달합니다.
/// </summary>
public event Action OnTCPupdateRequested;
// 이전 데이터를 기억할 변수 (캐싱)
private float lastX, lastY, lastZ, lastRx, lastRy, lastRz;
private bool isFirstUpdate = true; // 첫 번째 업데이트인지 여부 (처음엔 무조건 갱신)
// --- TCP 좌표들 ---
[SerializeField] private TextMeshProUGUI x;
[SerializeField] private TextMeshProUGUI Y;
[SerializeField] private TextMeshProUGUI Z;
[SerializeField] private TextMeshProUGUI Rx;
[SerializeField] private TextMeshProUGUI Ry;
[SerializeField] private TextMeshProUGUI Rz;
[SerializeField] public GameObject tcpPanel; // TCP 정보를 담고 있는 전체 패널
void Update()
{
/// <summary>
/// 매 프레임마다 데이터 갱신 요청 이벤트를 발생
/// (참고: 너무 잦은 호출이 부담될 경우, 여기에 타이머를 두어 호출 빈도를 조절할 수 있음.)
/// </summary>
OnTCPupdateRequested?.Invoke();
}
// UI 텍스트 갱신
public void SetCoordinates(RobotData data)
{
if (data == null) return;
// 첫 업데이트가 아니고, 6개의 모든 좌표값이 이전 값과 거의 동일하다면(부동소수점 오차 감안)
// 텍스트를 갱신하지 않고 함수를 종료
// -> 불필요한 String 메모리 할당과 가비지 컬렉션(GC)을 방지
if (!isFirstUpdate &&
Mathf.Approximately((float)data.x, lastX) &&
Mathf.Approximately((float)data.y, lastY) &&
Mathf.Approximately((float)data.z, lastZ) &&
Mathf.Approximately((float)data.rx, lastRx) &&
Mathf.Approximately((float)data.ry, lastRy) &&
Mathf.Approximately((float)data.rz, lastRz))
{
return;
}
// 값이 변경되었을 때만 실제 UI 텍스트 업데이트 수행
x.text = data.x.ToString("F2");
Y.text = data.y.ToString("F2");
Z.text = data.z.ToString("F2");
Rx.text = data.rx.ToString("F2");
Ry.text = data.ry.ToString("F2");
Rz.text = data.rz.ToString("F2");
// 캐시 업데이트
lastX = (float)data.x; lastY = (float)data.y; lastZ = (float)data.z;
lastRx = (float)data.rx; lastRy = (float)data.ry; lastRz = (float)data.rz;
// 첫 업데이트 완료
isFirstUpdate = false;
}
}