Files
AZTECH_WB/Assets/Scripts/Manager/LibraryManager.cs
2026-01-16 09:23:25 +09:00

134 lines
4.1 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEngine;
namespace AZTECHWB
{
[Serializable]
public class StandardInfo
{
public string code;
public string name;
public string[] filterInfo;
}
public class LibraryManager : MonoBehaviour
{
public string sceneName;
private string machineInfoPath = "MachineStandardInfo.csv";
private Machine[] machines;
public List<StandardInfo> standardInfos = new();
public string[] machineFilters;
public Action<string[]> onUpdateMachineFilters;
public Action<HashSet<Machine>> onLibraryFilterigComplete;
public Action<HashSet<Machine>> onAllMachinesReady;
public HashSet<Machine> filteringMachine = new();
public Action<UI_LibraryButton> onClickButton;
public void Awake()
{
var path = $"./{machineInfoPath }";
ReadStandardInfo(new string[] { path });
}
public void Start()
{
MatchingMachine(standardInfos, machineFilters);
}
string[] ReadRawFile(string path, char separator)
{
FileInfo fileInfo = new FileInfo(path);
using (var fs = fileInfo.OpenRead())
{
var length = fs.Length;
var buffer = new byte[length];
fs.Read(buffer, 0, buffer.Length);
string str = System.Text.Encoding.Default.GetString(buffer);
return str.Split(separator);
}
}
void ReadStandardInfo(string[] file)
{
var path = file[0];
var rawData = ReadRawFile(path, '\n');
standardInfos.Clear();
bool warningChecker = false;
HashSet<string> filterSet = new();
for (int i = 1; i < rawData.Length - 1; ++i)
{
var r = rawData[i];
var data = r.Split(',');
if (data.Length < 2)
{
return;
}
var code = data[0];
var name = data[1];
if (code == "" || name == "")
{
warningChecker = true;
break;
}
data = data[2..];
int prevLength = data.Length;
data = data.Distinct().Where(d => d != "" && d != "\r").ToArray();
for (int a = 0; a < data.Length; ++a)
{
data[a] = data[a].Replace('\r', ' ');
}
var standardInfo = new StandardInfo() { code = code, name = name, filterInfo = data };
foreach (var f in standardInfo.filterInfo)
{
if (f != "")
filterSet.Add(f);
}
standardInfos.Add(standardInfo);
}
if (warningChecker)
{
return;
}
machineFilters = filterSet.ToArray();
}
public void MatchingMachine(List<StandardInfo> standardInfos, string[] machineFilters)
{
var building = FindAnyObjectByType<Building>();
machines = building.floors.SelectMany(f => f.machines).ToArray();
foreach (var info in standardInfos)
{
var p = machines.Where(x => x.machineName.Equals(info.code)).FirstOrDefault();
if (p == null)
continue;
p.typeOptions = info.filterInfo;
}
onUpdateMachineFilters?.Invoke(machineFilters);
onAllMachinesReady?.Invoke(machines.ToHashSet());
}
public void LibraryFiltering(string options)
{
filteringMachine.Clear();
foreach (var machine in machines)
{
if (machine.typeOptions.Contains(options))
{
filteringMachine.Add(machine);
}
}
onLibraryFilterigComplete?.Invoke(filteringMachine);
}
}
}