diff --git a/Assets/Scripts/UVC/Data/Core/IDataObject.cs b/Assets/Scripts/UVC/Data/Core/IDataObject.cs index 335d1180..96fda04a 100644 --- a/Assets/Scripts/UVC/Data/Core/IDataObject.cs +++ b/Assets/Scripts/UVC/Data/Core/IDataObject.cs @@ -57,7 +57,7 @@ namespace UVC.Data.Core /// 업데이트가 즉시 적용되어야 하는지 여부를 나타냅니다. /// /// - public bool IsUpdateImmediately { get; } + public bool IsUpdateImmediately { get; set; } } } diff --git a/Assets/Scripts/UVC/Data/DataRepository.cs b/Assets/Scripts/UVC/Data/DataRepository.cs index 76ffb71b..369f9d2f 100644 --- a/Assets/Scripts/UVC/Data/DataRepository.cs +++ b/Assets/Scripts/UVC/Data/DataRepository.cs @@ -86,17 +86,11 @@ namespace UVC.Data dataObject.MarkAllAsUpdated(); var newData = dataObject.Clone(fromPool: false); //데이터 즉시 업데이트 여부 설정 - if (newData is DataObject dataObj) - { - dataObj.IsUpdateImmediately = dataObject.IsUpdateImmediately; - } - else if (newData is DataArray dataArray) - { - dataArray.IsUpdateImmediately = dataObject.IsUpdateImmediately; - } - + newData.IsUpdateImmediately = dataObject.IsUpdateImmediately; dataObjects.Add(key, newData); - NotifyDataUpdate(key, newData.Clone(false)); + var notifiedDataObject = newData.Clone(false); + notifiedDataObject.IsUpdateImmediately = dataObject.IsUpdateImmediately; + NotifyDataUpdate(key, notifiedDataObject); return dataObject; } else @@ -112,17 +106,21 @@ namespace UVC.Data { newDataObject = dataObject; } + //데이터 즉시 업데이트 여부 설정 - if (newDataObject is DataObject dataObj) - { - dataObj.IsUpdateImmediately = dataObject.IsUpdateImmediately; - } - else if (newDataObject is DataArray dataArray) - { - dataArray.IsUpdateImmediately = dataObject.IsUpdateImmediately; - } + newDataObject.IsUpdateImmediately = dataObject.IsUpdateImmediately; + bool shouldInvoke = !updatedDataOnly || newDataObject.UpdatedCount > 0; - if (shouldInvoke) NotifyDataUpdate(key, newDataObject == dataObject ? newDataObject.Clone(false) : newDataObject); + if (shouldInvoke) + { + var notifiedDataObject = newDataObject; + if (newDataObject == dataObject) + { + notifiedDataObject = newDataObject.Clone(false); + notifiedDataObject.IsUpdateImmediately = dataObject.IsUpdateImmediately; + } + NotifyDataUpdate(key, notifiedDataObject); + } return newDataObject; } } diff --git a/Assets/Scripts/UVC/Data/Http/HttpDataProcessor.cs b/Assets/Scripts/UVC/Data/Http/HttpDataProcessor.cs index 18c33434..de505b61 100644 --- a/Assets/Scripts/UVC/Data/Http/HttpDataProcessor.cs +++ b/Assets/Scripts/UVC/Data/Http/HttpDataProcessor.cs @@ -208,14 +208,7 @@ namespace UVC.Data.Http continue; } - if (subMappedObject is DataObject dataObj) - { - dataObj.IsUpdateImmediately = isUpdateImmediately; - } - else if (subMappedObject is DataArray dataArray) - { - dataArray.IsUpdateImmediately = isUpdateImmediately; - } + subMappedObject.IsUpdateImmediately = isUpdateImmediately; // 분할된 데이터를 `subKey`를 키로 사용하여 DataRepository에 저장합니다. var repoObject = DataRepository.Instance.AddOrUpdateData(subKey, subMappedObject, info.UpdatedDataOnly); diff --git a/Assets/Scripts/UVC/Data/Mqtt/MqttDataReceiver.cs b/Assets/Scripts/UVC/Data/Mqtt/MqttDataReceiver.cs index b4cad7ac..f3dd7f60 100644 --- a/Assets/Scripts/UVC/Data/Mqtt/MqttDataReceiver.cs +++ b/Assets/Scripts/UVC/Data/Mqtt/MqttDataReceiver.cs @@ -243,7 +243,9 @@ namespace UVC.Data.Mqtt firstMessageReceived[topic] = true; // 첫 번째 메시지를 수신했음을 기록합니다. isFirstMessage = true; // 첫 번째 메시지로 처리합니다. } + + IDataObject? mappedObject = null; message = message.Trim(); LastMessage = message; // 마지막 메시지를 저장하여 나중에 사용할 수 있습니다. @@ -263,15 +265,8 @@ namespace UVC.Data.Mqtt if (mappedObject == null) return; //즉시 업데이트 여부를 설정합니다. - if (mappedObject is DataObject dataObj) - { - dataObj.IsUpdateImmediately = isFirstMessage; - } - else if (mappedObject is DataArray dataArray) - { - dataArray.IsUpdateImmediately = isFirstMessage; - } - + mappedObject.IsUpdateImmediately = isFirstMessage; + // DataRepository는 내부적으로 데이터를 복사/업데이트하므로, mappedObject는 여기서 임시 객체가 됩니다. var repoObject = DataRepository.Instance.AddOrUpdateData(topic, mappedObject, config.UpdatedDataOnly); if (repoObject == mappedObject) repoObject = mappedObject.Clone(fromPool: false); @@ -280,6 +275,7 @@ namespace UVC.Data.Mqtt if (shouldInvoke && config.Handler != null) { var handlerData = repoObject; + handlerData.IsUpdateImmediately = isFirstMessage; // 첫 번째 메시지 여부를 핸들러 데이터에 설정합니다. // 핸들러를 메인 스레드에서 안전하게 호출 UniTask.Post(() => config.Handler?.Invoke(handlerData)); } diff --git a/Assets/Scripts/UVC/Factory/Component/AGVManager.cs b/Assets/Scripts/UVC/Factory/Component/AGVManager.cs index 5023c229..8de6722a 100644 --- a/Assets/Scripts/UVC/Factory/Component/AGVManager.cs +++ b/Assets/Scripts/UVC/Factory/Component/AGVManager.cs @@ -163,6 +163,7 @@ namespace UVC.Factory.Component DataArray? arr = data as DataArray; if (arr == null || arr.Count == 0) return; + // 데이터 배열에서 추가, 제거, 수정된 항목 리스트를 가져옵니다. var AddedItems = arr.AddedItems; var RemovedItems = arr.RemovedItems;