This repository has been archived on 2026-01-20. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
SH-INT/Assets/Scripts/FacilityManager.cs
정영민 f4cf556cde update
2025-02-20 10:30:18 +09:00

133 lines
4.2 KiB
C#

using System.Collections.Generic;
using UnityEngine;
using SHINT.UI;
using SHINT.MQTT;
using System.Linq;
using WI;
using System;
using Best.MQTT;
using Best.MQTT.Packets;
using System.Text;
using Newtonsoft.Json;
namespace SHINT
{
public class FacilityManager : MonoBehaviour, ISingle
{
public Facility[] facilities;
UI_FacilityInfo[] facilityUIs;
public Dictionary<string, Facility> facilityTable = new();
public Dictionary<string, UI_FacilityInfo> uiTable = new();
FacilityInfo[] allFacilityInfos;
public List<Facility> assemblyFacilities;
public List<Facility> injectionFacilities;
public event Action<FacilityManager> onInitEnd;
Dictionary<string, Facility> topicTable = new();
public void Subscribe(MQTTClient client)
{
foreach(var f in facilities)
{
if (f.info.topic == "")
continue;
using (new PacketBufferHelper(client))
{
//client.AddTopicAlias(f.info.topic);
client.CreateSubscriptionBuilder(f.info.topic)
.WithMessageCallback(OnMessage)
.WithMaximumQoS(QoSLevels.ExactlyOnceDelivery)
.BeginSubscribe();
topicTable.Add(f.info.topic, f);
}
}
}
private void OnMessage(MQTTClient client, SubscriptionTopic topic, string topicName, ApplicationMessage message)
{
var payload = Encoding.UTF8.GetString(message.Payload.Data, message.Payload.Offset, message.Payload.Count);
//Debug.Log(payload.Length);
//if (payload.Last() != ']')
//{
// Debug.Log($"Crash Packet!");
// return;
//}
var data = JsonConvert.DeserializeObject<List<TopicContainer>>(payload);
foreach(var d in data)
{
d.name = d.name.ToUpper();
}
topicTable[topicName].RefreshTopicData(data);
}
public override void AfterAwake()
{
facilities = FindObjectsOfType<Facility>();
facilityUIs = GetComponentsInChildren<UI_FacilityInfo>();
foreach(var f in facilities)
{
f.Initialize();
if (!facilityTable.TryAdd(f.name, f))
{
Debug.LogError($"Same Name Facility! {f.name}");
}
}
foreach(var f in facilityUIs)
{
f.gameObject.SetActive(false);
if (!uiTable.TryAdd(f.name, f))
{
Debug.LogError($"Same Name FacilityUI! {f.name}");
}
}
FacilitySetting();
}
public override void AfterStart()
{
onInitEnd(this);
}
public void FacilitySetting()
{
allFacilityInfos = Resources.LoadAll<FacilityInfo>("FacilityInfos");
foreach(var fi in allFacilityInfos)
{
var infoID = fi.name;
if (facilityTable.TryGetValue(infoID, out var facility))
{
facility.SetInfo(fi);
if (facility.info.buildingType == BuildingType.Injection)
{
injectionFacilities.Add(facility);
}
else if (facility.info.buildingType == BuildingType.Assembly)
{
assemblyFacilities.Add(facility);
}
if (uiTable.TryGetValue(infoID, out var ui))
{
facility.SetUI(ui);
}
else
{
Debug.LogError($"Not Found FacilityUI! {infoID}");
}
}
else
{
Debug.LogError($"Not Found Facility! {infoID}");
}
}
}
public List<Facility> FacilityList()
{
return facilities.ToList();
}
}
}