Files
XRLib/Assets/Scripts/Factory/CLAUDE.md
2026-01-08 20:15:57 +09:00

6.0 KiB

Factory 모듈 가이드

Factory는 스마트 팩토리 3D 시각화 애플리케이션입니다. MQTT를 통해 실시간 설비 데이터를 수신하고, 3D 공간에서 설비 상태를 시각화합니다.


모듈 구조

Factory/
├── Alarm/              # 알람 관리 (UI 생성/업데이트)
├── AGV/                # AGV(자율주행차량) 시뮬레이션
├── Camera/             # 카메라 제어
├── Component/          # FactoryObject 계층 (설비 3D 객체)
├── Config/             # 앱 설정 (API, MQTT, 창)
├── LNB/                # Left Navigation Bar
├── Modal/              # 정보창 (InfoWindow)
├── Path/               # AGV 경로 시각화
├── Playback/           # 데이터 재생 시스템
├── POI/                # Point of Interest
├── Port/               # 포트 설비
└── UI/                 # 하단 바, 옵션 등 UI

핵심 클래스

1. FactoryAppMain - 앱 진입점

// 싱글톤 앱 메인
public class FactoryAppMain : SingletonApp<FactoryAppMain>
{
    public Action Initialized; // 초기화 완료 이벤트
}

초기화 흐름:

  1. Init() → 설정 로드, 로깅 설정
  2. SettupConfigAsync() → 설정 파일, 다국어, 창 설정
  3. SetNetworkConfig() → MQTT 토픽 구독 (AGV, ALARM, PORT)

2. FactoryObject - 3D 설비 객체

// 상호작용 가능한 팩토리 객체 기본 클래스
public abstract class FactoryObject : MonoBehaviour,
    IPointerClickHandler, IPointerEnterHandler, IPointerExitHandler
{
    public FactoryObjectInfo? Info { get; set; }     // 객체 식별 정보
    public UserSetting? DataOrderedMask { get; set; } // 표시할 데이터 필터

    // 데이터 변경 시 재정의하여 상태 업데이트
    protected virtual void ProcessData(DataObject newData) { }
}

사용 예시:

public class MachineObject : FactoryObject
{
    protected override void ProcessData(DataObject newData)
    {
        string status = newData.GetString("status", "off");
        switch (status)
        {
            case "running": SetColor(Color.green); break;
            case "warning": SetColor(Color.yellow); break;
            case "error":   SetColor(Color.red); break;
        }
    }
}

3. AlarmManager - 알람 관리

public class AlarmManager : SingletonScene<AlarmManager>
{
    // MQTT "ALARM" 토픽 데이터 처리
    public void OnUpdateData(IDataObject data);

    // 알람 UI 생성/수정/제거
    public void HandleNewAlarm(DataObject data);
    public void HandleModifyAlarm(DataObject data);
    public void HandleClearedAlarm(DataObject data);
}

알람 처리 흐름:

  1. MQTT로 알람 데이터 수신
  2. TRANSPORT_EQP_ID로 대상 설비 검색
  3. 설비에 알람 UI (AlarmIconManager) 부착
  4. CLEAR_TIME 설정 시 알람 해제

4. PlaybackService - 데이터 재생

// 과거 데이터 재생 서비스 (싱글톤)
public class PlaybackService
{
    public float TimeScale { get; set; }  // 재생 배속

    // 재생 목록 요청
    public async UniTask<Dictionary<...>?> RequestDataAsync();

    // 재생 시작
    public async UniTask StartAsync(UIPlaybackListItemData data);

    // 데이터 파일 다운로드 및 준비
    public HTTPRequest? ReadyData(string date, string time, string fileName, ...);

    // 특정 시간대 데이터 디스패치
    public async UniTask DispatchRealTimeData(int second, int speed);
}

데이터 흐름

┌─────────────┐     ┌────────────────┐     ┌─────────────────┐
│   MQTT      │────▶│ DataRepository │────▶│ FactoryObject   │
│  (실시간)   │     │                │     │ - ProcessData() │
└─────────────┘     │  MqttReceiver  │     └─────────────────┘
                    │  - AGV 토픽    │              │
┌─────────────┐     │  - ALARM 토픽  │              ▼
│  SQLite     │────▶│  - PORT 토픽   │     ┌─────────────────┐
│ (Playback)  │     │                │     │  UI 업데이트    │
└─────────────┘     └────────────────┘     │  - InfoWindow   │
                                           │  - AlarmIcon    │
                                           └─────────────────┘

설정 파일

FactoryAppConfig

{
  "TargetFrameRate": 60,
  "Language": "ko",
  "Api": "https://api.example.com",
  "Mqtt": {
    "Domain": "mqtt.example.com",
    "Port": 1883,
    "DataKey": "data",
    "MessagePack": false
  },
  "Window": { ... }
}

FactoryConstants

public static class FactoryConstants
{
    public static string API_DOMAIN;
    public static string MQTT_DOMAIN;
    public static int MQTT_PORT;
    public static string MQTT_DATA_KEY;
    public static bool MQTT_MESSAGEPACK_ENABLED;
}

MQTT 데이터 매핑

알람 데이터 구조

var alarmDataMask = new DataMask();
alarmDataMask.ObjectName = "ALARM";
alarmDataMask.ObjectIdKey = "ID";
// 주요 필드:
// - ID, ALARM_TYPE, LEVEL, STATE, MESSAGE, CODE
// - TRANSPORT_EQP_ID, TRANSPORT_EQP_NAME
// - SET_TIME, CLEAR_TIME, UPDATE_TIME

확장 방법

새 설비 타입 추가

  1. FactoryObject 상속 클래스 생성
  2. ProcessData() 재정의하여 상태 처리
  3. FactoryObjectManager에 등록됨 (Info 설정 시 자동)

새 MQTT 토픽 구독

// AppMain에서
DataRepository.Instance.MqttReceiver.AddTopic("NEW_TOPIC");

// 데이터 핸들러 등록
DataRepository.Instance.AddDataUpdateHandler("NEW_TOPIC", OnNewTopicData);

의존성

  • UVC 라이브러리: Core, Data, Pool, UI, Locale, Util
  • 외부: Best.HTTP (HTTP/WebSocket), DOTween