Files
Studio/Assets/VirtualFactoryManager.cs
2025-03-28 09:06:47 +09:00

225 lines
6.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
using XED.VirtualFactory;
namespace XED
{
public enum FactoryNeeds
{
GenerateAGV,
StackerInputLoad,
Stacking,
GenerateLoad,
StackerLoadOut,
}
public class VirtualFactoryManager : MonoBehaviour
{
public List<StackerCrane> stackerCranes = new();
public AGVManager agvManager;
public AGVMap agvMap;
public PortMap portMap;
public List<Product> loads = new();
public Product prf_Load;
public AGVNode startNode;
public bool stackerHasEmptyCell;
public int maxAGVCount = 4;
public List<FactoryNeeds> needs = new();
public AGVNeedsScanner agvNeedScanner;
public ResourceNeedsScanner resourceNeedsChecker;
public StackerCraneNeedsScanner stackerNeedsChecker;
public List<NeedsScanner> scanners = new();
HashSet<StackerCrane> stackingReadys = new();
private StackerCraneManager stackerCraneManager;
public override void AfterAwake()
{
agvMap = FindSingle<AGVMap>();
portMap = FindSingle<PortMap>();
agvManager = FindSingle<AGVManager>();
stackerCranes = FindObjectsByType<StackerCrane>(UnityEngine.FindObjectsSortMode.None).ToList();
agvNeedScanner = new AGVNeedsScanner(this, agvManager);
resourceNeedsChecker = new ResourceNeedsScanner(portMap);
stackerNeedsChecker = new StackerCraneNeedsScanner(this, stackerCraneManager);
scanners.Add(agvNeedScanner);
scanners.Add(resourceNeedsChecker);
scanners.Add(stackerNeedsChecker);
agvNeedScanner.onScanningComplete += OnScanningComplete;
resourceNeedsChecker.onScanningComplete += OnScanningComplete;
stackerNeedsChecker.onScanningComplete += OnScanningComplete;
Scanning();
}
void Scanning()
{
Debug.Log("Needs Scanning");
foreach (var scanner in scanners)
{
scanner.Scanning();
}
}
private void OnScanningComplete(NeedsScanner scanner, List<FactoryNeeds> list)
{
Debug.Log($"On Needs Scanning Complete {scanner.GetType().Name}");
switch (scanner)
{
case AGVNeedsScanner _:
AGVNeedsSolutioning(list);
break;
case ResourceNeedsScanner _:
ResourceNeedsSolutioning(list);
break;
case StackerCraneNeedsScanner _:
StackerNeedsSolutioning(list);
break;
}
list.Clear();
}
private void StackerNeedsSolutioning(List<FactoryNeeds> list)
{
foreach (var needs in list)
{
switch (needs)
{
case FactoryNeeds.StackerInputLoad:
DeliveryStackerInputLoad();
break;
case FactoryNeeds.Stacking:
StackerStacking();
break;
case FactoryNeeds.StackerLoadOut:
StackerLoadOut();
break;
}
}
}
private void StackerLoadOut()
{
foreach (var stacker in stackerCranes)
{
stacker.AddTask(new OutputTask());
}
}
private void ResourceNeedsSolutioning(List<FactoryNeeds> list)
{
foreach (var needs in list)
{
switch (needs)
{
case FactoryNeeds.GenerateLoad:
GenerateLoad();
break;
}
}
}
private void AGVNeedsSolutioning(List<FactoryNeeds> list)
{
foreach (var needs in list)
{
switch (needs)
{
case FactoryNeeds.GenerateAGV:
GenerateAGV();
break;
}
}
}
private void StackerStacking()
{
foreach (var stacker in stackerCranes)
{
if (stackingReadys.Add(stacker) && !stacker.inputPort.isEmpty)
{
Debug.Log("Stacker Stacking");
stacker.onCompleteTask += OnStackerStackingComplete;
stacker.AddTask(new InputTask());
}
}
}
private void OnStackerStackingComplete(StackerCrane crane)
{
stackingReadys.Remove(crane);
crane.onCompleteTask -= OnStackerStackingComplete;
resourceNeedsChecker.Scanning();
stackerNeedsChecker.Scanning();
}
private void OnStackerInputLoad(StackerCrane stacker)
{
Debug.Log($"Stacker {stacker.name} is On Input Load");
stacker.inputPort.onLoadEvent -= () => OnStackerInputLoad(stacker);
}
private void DeliveryStackerInputLoad()
{
if (!agvManager.TryGetIdleAGV(out var agvWorker))
{
return;
}
if(!portMap.TryGetFullGeneratePort(out var generatePort))
{
return;
}
if(!agvMap.TryGetEmptyInputPortNode(out var inputPortNode))
{
return;
}
var startNode = agvWorker.currentNode;
var generateNode = generatePort.GetComponent<AGVNode>();
var getLoadPath = agvMap.FindPath(startNode, generateNode);
var inputLoadPath = agvMap.FindPath(generateNode, inputPortNode);
agvWorker.AddAction(new AGVMoveAction(getLoadPath));
agvWorker.AddAction(new AGVLoadAction(generatePort));
agvWorker.AddAction(new AGVMoveAction(inputLoadPath));
agvWorker.AddAction(new AGVUnloadAction(inputPortNode.loader));
agvWorker.onCompleteTask += OnAGVIdle;
}
void OnAGVIdle(AGV worker)
{
Debug.Log($"{worker.name} is On Enter idle");
stackerNeedsChecker.Scanning();
worker.onCompleteTask -= OnAGVIdle;
}
private void GenerateLoad()
{
if(portMap.TryGetEmptyGeneratePort(out var port))
{
Debug.Log($"GenerateLoad");
var newLoad = Instantiate(prf_Load);
port.Load(newLoad);
loads.Add(newLoad);
}
}
private void GenerateAGV()
{
Debug.Log($"GenerateAGV");
var newAGV = agvManager.CreateEmptyAGV();
newAGV.ForceSet(startNode);
}
}
}