중간 저장
This commit is contained in:
8
Assets/AGVLift.cs
Normal file
8
Assets/AGVLift.cs
Normal file
@@ -0,0 +1,8 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace XED
|
||||
{
|
||||
public class AGVLift : MonoBehaviour
|
||||
{
|
||||
}
|
||||
}
|
||||
2
Assets/AGVLift.cs.meta
Normal file
2
Assets/AGVLift.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5fb7059a769257346badd43882bceb27
|
||||
@@ -1,3 +1,4 @@
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor;
|
||||
@@ -10,29 +11,6 @@ namespace XED.VirtualFactory
|
||||
{
|
||||
public List<AGVNode> nodes = new();
|
||||
|
||||
public bool TryGetPath(AGVNode currentLocation, AGVNodeType targetType)
|
||||
{
|
||||
if (currentLocation == null)
|
||||
return false;
|
||||
List<AGVNode> path = new();
|
||||
return TryGetPathRecursive(currentLocation, targetType, path);
|
||||
}
|
||||
|
||||
private bool TryGetPathRecursive(AGVNode currentLocation, AGVNodeType targetType, List<AGVNode> path)
|
||||
{
|
||||
if (currentLocation.nodeType == targetType)
|
||||
return true;
|
||||
path.Add(currentLocation);
|
||||
foreach (var n in currentLocation.linkedNodes)
|
||||
{
|
||||
if (n == null || path.Contains(n))
|
||||
continue;
|
||||
if (TryGetPathRecursive(n, targetType, path))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
public void OnDrawGizmos()
|
||||
{
|
||||
@@ -42,7 +20,7 @@ namespace XED.VirtualFactory
|
||||
{
|
||||
if (n == null)
|
||||
continue;
|
||||
|
||||
Handles.Label(n.transform.position + Vector3.up * 0.5f, n.name);
|
||||
foreach (var l in n.linkedNodes)
|
||||
{
|
||||
Vector3 start = n.transform.position;
|
||||
@@ -63,20 +41,78 @@ namespace XED.VirtualFactory
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
internal bool GetEmptyNode(AGVNodeType t, out AGVNode result)
|
||||
#endif
|
||||
public List<AGVPortNode> GetPortNodes()
|
||||
{
|
||||
var result = new List<AGVPortNode>();
|
||||
foreach(var n in nodes)
|
||||
{
|
||||
if (n.nodeType == t && n.cargo == null)
|
||||
if (n is AGVPortNode pn)
|
||||
{
|
||||
result.Add(pn);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public bool TryGetEmptyInputPortNode(out AGVPortNode portNode)
|
||||
{
|
||||
foreach (var n in nodes)
|
||||
{
|
||||
if (n is not AGVPortNode pn)
|
||||
continue;
|
||||
|
||||
if (pn.portType != AGVPortNode.PortType.Input)
|
||||
continue;
|
||||
|
||||
if (pn.loader is not InputPort)
|
||||
continue;
|
||||
|
||||
Debug.Log($"TryGetEmptyInputPortNode: {pn.name}");
|
||||
if (pn.loader.isEmpty)
|
||||
{
|
||||
portNode = pn;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
portNode = null;
|
||||
return false;
|
||||
}
|
||||
internal List<AGVNode> FindPath(AGVNode startNode, AGVNode targetNode)
|
||||
{
|
||||
var visited = new HashSet<AGVNode>();
|
||||
var path = new List<AGVNode>();
|
||||
if (DFS(startNode, targetNode, visited, path))
|
||||
{
|
||||
return path;
|
||||
}
|
||||
return null; // °æ·Î¸¦ ãÀ» ¼ö ¾øÀ½
|
||||
}
|
||||
|
||||
private bool DFS(AGVNode current, AGVNode target, HashSet<AGVNode> visited, List<AGVNode> path)
|
||||
{
|
||||
visited.Add(current);
|
||||
path.Add(current);
|
||||
|
||||
if (current == target)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
foreach (var neighbor in current.linkedNodes)
|
||||
{
|
||||
if (neighbor == null || visited.Contains(neighbor))
|
||||
continue;
|
||||
|
||||
if (DFS(neighbor, target, visited, path))
|
||||
{
|
||||
result = n;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
result = null;
|
||||
path.RemoveAt(path.Count - 1);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
@@ -27,16 +28,23 @@ namespace XED.EditorUtil
|
||||
for (int i = 0; i < map.nodes.Count; i++)
|
||||
{
|
||||
var node = map.nodes[i];
|
||||
node.entity.id = i.ToString();
|
||||
node.entity.linkedNodeIDs.Clear();
|
||||
|
||||
foreach (var linkedNode in node.linkedNodes)
|
||||
{
|
||||
node.entity.linkedNodeIDs.Add(linkedNode.entity.id);
|
||||
}
|
||||
node.entity = new AGVNodeEntity();
|
||||
var entity = node.entity as AGVNodeEntity;
|
||||
entity.id = i.ToString();
|
||||
|
||||
map.nodes[i].gameObject.name = node.entity.id;
|
||||
}
|
||||
|
||||
for (int i = 0; i < map.nodes.Count; i++)
|
||||
{
|
||||
var node = map.nodes[i];
|
||||
var entity = node.entity as AGVNodeEntity;
|
||||
entity.linkedNodeIDs.Clear();
|
||||
foreach (var linkedNode in node.linkedNodes)
|
||||
{
|
||||
entity.linkedNodeIDs.Add(linkedNode.entity.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LoadNodes()
|
||||
|
||||
@@ -99,3 +99,751 @@ Time,AGV_ID,Task,Target,Success
|
||||
2025-03-20 오후 3:08:23,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:08:23,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:17:52,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:17:52,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:17:59,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:17:59,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:18:03,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:18:03,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:18:10,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:18:10,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:18:17,,UnLoadCargo,1 (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:18:17,,UnLoadCargo,1 (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:18:26,,SpinToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:18:26,,SpinToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:18:33,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:18:33,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:18:42,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:18:42,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:18:49,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:18:49,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:18:53,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:18:53,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:18:56,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:18:56,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:18:56,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:18:56,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:19:00,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:19:00,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:19:05,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:19:05,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:19:11,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:19:11,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:19:16,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:19:16,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:19:20,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:19:20,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:19:25,,SpinToTarget,(3.91, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:19:25,,SpinToTarget,(3.91, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:19:27,,MoveToTarget,(3.91, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:19:27,,MoveToTarget,(3.91, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:21:45,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:21:45,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:21:52,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:21:52,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:21:56,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:21:56,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:22:03,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:22:03,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:22:10,,UnLoadCargo,1 (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:22:10,,UnLoadCargo,1 (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:22:15,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:22:15,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:22:15,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:22:15,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:22:24,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:22:24,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:22:26,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:22:26,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:22:26,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:22:26,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:22:31,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:22:31,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:22:35,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:22:35,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:22:41,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:22:41,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:22:45,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:22:45,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:22:50,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:22:50,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:23:24,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:23:24,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:23:31,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:23:31,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:23:35,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:23:35,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:23:42,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:23:42,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:23:49,,UnLoadCargo,1 (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:23:49,,UnLoadCargo,1 (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:23:54,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:23:54,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:23:54,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:23:54,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:26:38,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:26:38,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:26:45,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:26:45,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:27:50,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:27:50,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:27:57,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:27:57,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:28:02,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:28:02,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:28:09,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:28:09,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:28:16,,UnLoadCargo,1 (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:28:16,,UnLoadCargo,1 (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:28:25,,SpinToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:28:25,,SpinToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:28:31,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:28:31,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:28:36,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:28:36,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:30:55,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:30:55,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:31:02,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:31:02,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:31:06,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:31:06,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:31:13,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:31:13,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:31:20,,UnLoadCargo,1 (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:31:20,,UnLoadCargo,1 (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:31:29,,SpinToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:31:29,,SpinToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:36:48,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:36:48,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:36:55,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:36:55,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:37:04,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:37:04,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:37:07,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:37:07,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:37:07,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:37:07,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:37:11,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:37:11,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:37:16,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:37:16,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:37:23,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:37:23,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:37:27,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:37:27,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:37:31,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:37:31,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:37:31,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:37:31,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:37:34,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:37:34,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:37:41,,UnLoadCargo,1 (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:37:41,,UnLoadCargo,1 (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:37:46,,SpinToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:37:46,,SpinToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:37:52,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:37:52,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:37:57,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:37:57,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:38:00,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:38:00,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:38:00,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:38:00,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:38:04,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:38:04,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:38:09,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:38:09,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:38:15,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:38:15,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:38:20,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:38:20,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:38:24,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:38:24,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:38:29,,SpinToTarget,(-3.88, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:38:29,,SpinToTarget,(-3.88, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:38:32,,MoveToTarget,(-3.88, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:38:32,,MoveToTarget,(-3.88, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:39:02,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:39:02,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:39:09,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:39:09,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:39:18,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:39:18,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:39:20,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:39:20,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:39:20,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:39:20,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:39:25,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:39:25,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:39:29,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:39:29,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:39:36,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:39:36,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:39:40,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:39:40,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:39:45,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:39:45,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:39:45,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:39:45,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:39:47,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:39:47,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:39:54,,UnLoadCargo,1 (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:39:54,,UnLoadCargo,1 (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:55:08,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:55:08,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:55:16,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:55:16,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:55:25,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:55:25,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:55:28,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:55:28,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:55:28,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:55:28,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:55:32,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:55:32,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:55:37,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:55:37,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:55:43,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:55:43,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:55:48,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:55:48,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:55:52,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:55:52,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:55:52,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:55:52,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:55:55,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:55:55,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:56:02,,UnLoadCargo,1 (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:56:02,,UnLoadCargo,1 (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 3:56:06,,SpinToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:56:06,,SpinToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:56:13,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:56:13,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 3:56:18,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:56:18,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:56:20,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:56:20,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:56:20,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:56:20,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:56:25,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:56:25,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:56:29,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:56:29,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:56:36,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:56:36,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 3:56:40,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:56:40,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:56:45,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:56:45,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:56:49,,SpinToTarget,(-3.88, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:56:49,,SpinToTarget,(-3.88, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:56:52,,MoveToTarget,(-3.88, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 3:56:52,,MoveToTarget,(-3.88, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:54:01,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 4:54:01,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 4:54:08,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 4:54:08,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 4:54:17,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:54:17,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:54:20,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:54:20,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:54:20,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:54:20,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:54:24,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:54:24,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:54:29,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:54:29,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:54:36,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:54:36,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:54:40,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:54:40,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:54:44,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:54:44,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:54:44,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 4:54:44,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 4:54:47,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 4:54:47,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 4:54:54,,UnLoadCargo,1 (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 4:54:54,,UnLoadCargo,1 (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 4:54:59,,SpinToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 4:54:59,,SpinToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 4:55:06,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 4:55:06,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 4:55:10,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:55:10,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:55:13,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:55:13,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:55:13,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:55:13,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:55:17,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:55:17,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:55:22,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:55:22,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:55:28,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:55:28,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:55:33,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:55:33,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:55:37,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:55:37,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:55:42,,SpinToTarget,(-3.88, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:55:42,,SpinToTarget,(-3.88, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:55:45,,MoveToTarget,(-3.88, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:55:45,,MoveToTarget,(-3.88, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:56:40,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 4:56:40,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 4:56:47,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 4:56:47,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 4:56:56,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:56:56,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:56:58,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:56:58,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:56:58,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:56:58,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:57:03,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:57:03,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:57:07,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:57:07,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:57:14,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:57:14,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:57:18,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:57:18,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:57:23,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:57:23,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:57:23,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 4:57:23,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 4:57:26,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 4:57:26,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 4:57:33,,UnLoadCargo,1 (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 4:57:33,,UnLoadCargo,1 (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 4:57:37,,SpinToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 4:57:37,,SpinToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 4:57:44,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 4:57:44,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 4:57:48,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:57:48,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:57:51,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:57:51,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:57:51,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:57:51,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:57:55,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:57:55,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:58:00,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:58:00,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:58:07,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:58:07,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 4:58:11,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:58:11,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:58:16,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:58:16,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:58:20,,SpinToTarget,(-3.88, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:58:20,,SpinToTarget,(-3.88, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:58:23,,MoveToTarget,(-3.88, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 4:58:23,,MoveToTarget,(-3.88, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 5:00:07,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 5:00:07,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 5:00:14,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 5:00:14,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 5:00:33,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 5:00:33,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 5:00:40,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 5:00:40,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 5:00:52,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 5:00:52,,MoveToTarget,(6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 5:00:59,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 5:00:59,,LoadCargo,LoadSocket (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 5:01:08,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 5:01:08,,SpinToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 5:01:11,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 5:01:11,,MoveToTarget,(6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 5:01:11,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 5:01:11,,SpinToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 5:01:15,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 5:01:15,,MoveToTarget,(6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 5:01:20,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 5:01:20,,SpinToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 5:01:26,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 5:01:26,,MoveToTarget,(-6.00, -0.35, -10.00),True
|
||||
|
||||
2025-03-20 오후 5:01:31,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 5:01:31,,SpinToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 5:01:35,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 5:01:35,,MoveToTarget,(-6.00, -0.35, -5.00),True
|
||||
|
||||
2025-03-20 오후 5:01:35,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 5:01:35,,SpinToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 5:01:38,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 5:01:38,,MoveToTarget,(-6.00, -0.35, -3.00),True
|
||||
|
||||
2025-03-20 오후 5:01:45,,UnLoadCargo,1 (UnityEngine.GameObject),True
|
||||
|
||||
2025-03-20 오후 5:01:45,,UnLoadCargo,1 (UnityEngine.GameObject),True
|
||||
|
||||
|
@@ -17,11 +17,11 @@ namespace XED
|
||||
#if UNITY_EDITOR
|
||||
static List<TwinContainer> twinContainerList = new();
|
||||
|
||||
[MenuItem("Tools/TwinObjectsSetting")]
|
||||
public static void TwinObjectsSetting()
|
||||
{
|
||||
AutomateTwinObjectSetup();
|
||||
}
|
||||
//[MenuItem("Tools/TwinObjectsSetting")]
|
||||
//public static void TwinObjectsSetting()
|
||||
//{
|
||||
// AutomateTwinObjectSetup();
|
||||
//}
|
||||
|
||||
//존재하지 않은 폴더의 경우 해당 폴더를 생성해주는 메서드
|
||||
static void CreateFolder(string folderPath)
|
||||
|
||||
@@ -48,22 +48,23 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: 84fe5a7ef78a7af498da388fc7c38ac3, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
agvTask: 0
|
||||
agvState: 0
|
||||
senseObstacleState: 0
|
||||
specData: {fileID: 11400000, guid: 3124e65e4d238e24aa9f78f93282ff84, type: 2}
|
||||
agvBattery:
|
||||
physics:
|
||||
areabox: {fileID: 0}
|
||||
metaData:
|
||||
address:
|
||||
modeling: {fileID: 0}
|
||||
portrait: {fileID: 0}
|
||||
assetLabel: 0
|
||||
IsDisplayable: 0
|
||||
IsInteractible: 0
|
||||
state: 0
|
||||
spec: {fileID: 0}
|
||||
battery:
|
||||
currentBatteryState: 0
|
||||
bc: 100
|
||||
id:
|
||||
moveSpeed: 10
|
||||
lift: {fileID: 6204755932358581132}
|
||||
pickupSocket: {fileID: 7175446550791974323}
|
||||
chargeZone: {fileID: 0}
|
||||
charging: 0
|
||||
obstacleLayer:
|
||||
serializedVersion: 2
|
||||
m_Bits: 0
|
||||
currentNode: {fileID: 0}
|
||||
currentMovePath: []
|
||||
lift: {fileID: 6814672540003804564}
|
||||
--- !u!54 &3077797501209030249
|
||||
Rigidbody:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -270,7 +271,10 @@ PrefabInstance:
|
||||
- targetCorrespondingSourceObject: {fileID: 7154835845995298155, guid: 586ca79ec44844746b347929276fc0e6, type: 3}
|
||||
insertIndex: -1
|
||||
addedObject: {fileID: 8278436267998297966}
|
||||
m_AddedComponents: []
|
||||
m_AddedComponents:
|
||||
- targetCorrespondingSourceObject: {fileID: 6070737613420926900, guid: 586ca79ec44844746b347929276fc0e6, type: 3}
|
||||
insertIndex: -1
|
||||
addedObject: {fileID: 5083700428396174471}
|
||||
m_SourcePrefab: {fileID: 100100000, guid: 586ca79ec44844746b347929276fc0e6, type: 3}
|
||||
--- !u!4 &3909547189796084948 stripped
|
||||
Transform:
|
||||
@@ -282,6 +286,23 @@ GameObject:
|
||||
m_CorrespondingSourceObject: {fileID: 6070737613420926900, guid: 586ca79ec44844746b347929276fc0e6, type: 3}
|
||||
m_PrefabInstance: {fileID: 154300052577553464}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
--- !u!114 &5083700428396174471
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 6204755932358581132}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 5fb7059a769257346badd43882bceb27, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
--- !u!4 &6814672540003804564 stripped
|
||||
Transform:
|
||||
m_CorrespondingSourceObject: {fileID: 6680733278384466348, guid: 586ca79ec44844746b347929276fc0e6, type: 3}
|
||||
m_PrefabInstance: {fileID: 154300052577553464}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
--- !u!4 &7020894527220248915 stripped
|
||||
Transform:
|
||||
m_CorrespondingSourceObject: {fileID: 7154835845995298155, guid: 586ca79ec44844746b347929276fc0e6, type: 3}
|
||||
|
||||
@@ -12,8 +12,6 @@ GameObject:
|
||||
- component: {fileID: 5988852842637789614}
|
||||
- component: {fileID: 2978737778036895904}
|
||||
- component: {fileID: 1452792198060998428}
|
||||
- component: {fileID: 9141033690985600288}
|
||||
- component: {fileID: 1525400758423176862}
|
||||
m_Layer: 0
|
||||
m_Name: Node
|
||||
m_TagString: Node
|
||||
@@ -114,41 +112,6 @@ CapsuleCollider:
|
||||
m_Height: 2
|
||||
m_Direction: 1
|
||||
m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697}
|
||||
--- !u!114 &9141033690985600288
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 2579942234611465176}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 0d1092f586cc6e34e991814d701c66ce, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
nodeClass:
|
||||
id: 0
|
||||
x: 0
|
||||
y: 0
|
||||
z: 0
|
||||
linkedNodID: []
|
||||
loadSocket: {fileID: 6320514756136129531}
|
||||
unLoadSocket: {fileID: 7996001147720691937}
|
||||
cargoPrefab: {fileID: 7765465869871364134, guid: 8daddfb03f8c9f0469b89edf75aa1fad, type: 3}
|
||||
Cargo: {fileID: 0}
|
||||
--- !u!114 &1525400758423176862
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 2579942234611465176}
|
||||
m_Enabled: 0
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: ac7bbf2eaa67a7b4ab83ad40f118a81a, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
chargePerSecond: 1
|
||||
--- !u!1 &6320514756136129531
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
|
||||
@@ -160,6 +160,7 @@ GameObject:
|
||||
m_Component:
|
||||
- component: {fileID: 109703751}
|
||||
- component: {fileID: 109703752}
|
||||
- component: {fileID: 109703753}
|
||||
m_Layer: 0
|
||||
m_Name: AGVMap
|
||||
m_TagString: Untagged
|
||||
@@ -205,16 +206,28 @@ MonoBehaviour:
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
nodes:
|
||||
- {fileID: 691233192}
|
||||
- {fileID: 1992156869}
|
||||
- {fileID: 691233197}
|
||||
- {fileID: 1992156875}
|
||||
- {fileID: 1554807644}
|
||||
- {fileID: 1172928290}
|
||||
- {fileID: 2097314996}
|
||||
- {fileID: 1082030770}
|
||||
- {fileID: 146771354}
|
||||
- {fileID: 1590019367}
|
||||
- {fileID: 617492811}
|
||||
- {fileID: 1084391824}
|
||||
- {fileID: 617492817}
|
||||
- {fileID: 1084391830}
|
||||
--- !u!114 &109703753
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 109703750}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: b693fd1017fb97f478a690e30a0f1c42, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
--- !u!1 &116334308
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -262,8 +275,15 @@ MonoBehaviour:
|
||||
stackerCranes: []
|
||||
agvManager: {fileID: 0}
|
||||
agvMap: {fileID: 0}
|
||||
portMap: {fileID: 0}
|
||||
loads: []
|
||||
prf_Load: {fileID: 2713012076675240762, guid: 7cbbdba660dbd38479c561c09e38ec11, type: 3}
|
||||
startNode: {fileID: 1172928290}
|
||||
stackerHasEmptyCell: 0
|
||||
maxAGVCount: 1
|
||||
agvIsLack: 0
|
||||
loadIsLack: 0
|
||||
needs:
|
||||
--- !u!1001 &125296021
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -372,6 +392,22 @@ PrefabInstance:
|
||||
propertyPath: m_AnchoredPosition.y
|
||||
value: 0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 5433983453336379086, guid: e90993d6f27e3844eaa33168853e6c7d, type: 3}
|
||||
propertyPath: m_LocalPosition.z
|
||||
value: -1.68
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 5836257196704929345, guid: e90993d6f27e3844eaa33168853e6c7d, type: 3}
|
||||
propertyPath: autoInput
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6539674356208821794, guid: e90993d6f27e3844eaa33168853e6c7d, type: 3}
|
||||
propertyPath: m_LocalPosition.x
|
||||
value: -0
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6539674356208821794, guid: e90993d6f27e3844eaa33168853e6c7d, type: 3}
|
||||
propertyPath: m_LocalPosition.z
|
||||
value: 1.72
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 6604900196319183848, guid: e90993d6f27e3844eaa33168853e6c7d, type: 3}
|
||||
propertyPath: m_AnchorMax.y
|
||||
value: 0
|
||||
@@ -395,7 +431,10 @@ PrefabInstance:
|
||||
m_RemovedComponents: []
|
||||
m_RemovedGameObjects: []
|
||||
m_AddedGameObjects: []
|
||||
m_AddedComponents: []
|
||||
m_AddedComponents:
|
||||
- targetCorrespondingSourceObject: {fileID: 8107138202495161764, guid: e90993d6f27e3844eaa33168853e6c7d, type: 3}
|
||||
insertIndex: -1
|
||||
addedObject: {fileID: 1039833823}
|
||||
m_SourcePrefab: {fileID: 100100000, guid: e90993d6f27e3844eaa33168853e6c7d, type: 3}
|
||||
--- !u!1 &146771353
|
||||
GameObject:
|
||||
@@ -410,7 +449,6 @@ GameObject:
|
||||
- component: {fileID: 146771358}
|
||||
- component: {fileID: 146771357}
|
||||
- component: {fileID: 146771354}
|
||||
- component: {fileID: 146771356}
|
||||
m_Layer: 0
|
||||
m_Name: 6
|
||||
m_TagString: Node
|
||||
@@ -430,17 +468,20 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: 0d1092f586cc6e34e991814d701c66ce, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
entity:
|
||||
linkedNodeIDs:
|
||||
- 1
|
||||
- 7
|
||||
- 2
|
||||
physics:
|
||||
areabox: {fileID: 0}
|
||||
metaData:
|
||||
address:
|
||||
modeling: {fileID: 0}
|
||||
portrait: {fileID: 0}
|
||||
assetLabel: 0
|
||||
IsDisplayable: 0
|
||||
IsInteractible: 0
|
||||
linkedNodes:
|
||||
- {fileID: 1992156869}
|
||||
- {fileID: 1590019367}
|
||||
- {fileID: 1554807644}
|
||||
nodeType: 0
|
||||
reserved: 0
|
||||
nextConveyor: {fileID: 0}
|
||||
nodeClass:
|
||||
id: 0
|
||||
x: 0
|
||||
@@ -449,7 +490,6 @@ MonoBehaviour:
|
||||
linkedNodID: []
|
||||
loadSocket: {fileID: 1942261059}
|
||||
unLoadSocket: {fileID: 6157020}
|
||||
cargo: {fileID: 0}
|
||||
--- !u!4 &146771355
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -467,19 +507,6 @@ Transform:
|
||||
- {fileID: 1942261060}
|
||||
m_Father: {fileID: 109703751}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &146771356
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 146771353}
|
||||
m_Enabled: 0
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: ac7bbf2eaa67a7b4ab83ad40f118a81a, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
chargePerSecond: 1
|
||||
--- !u!136 &146771357
|
||||
CapsuleCollider:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -642,8 +669,8 @@ Transform:
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 161581743}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 1, z: -10}
|
||||
m_LocalRotation: {x: 0.3173999, y: 0.59771526, z: -0.27844498, w: 0.6815146}
|
||||
m_LocalPosition: {x: -13.905856, y: 17.881578, z: -8.9192915}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
@@ -782,23 +809,27 @@ PrefabInstance:
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 9141033690985600288, guid: 5b3355ff1ae888e428ebf6ad2853e303, type: 3}
|
||||
propertyPath: nodeType
|
||||
value: 2
|
||||
value: 4
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 9141033690985600288, guid: 5b3355ff1ae888e428ebf6ad2853e303, type: 3}
|
||||
propertyPath: nextConveyor
|
||||
value:
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 9141033690985600288, guid: 5b3355ff1ae888e428ebf6ad2853e303, type: 3}
|
||||
propertyPath: linkedNodes.Array.size
|
||||
value: 2
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 9141033690985600288, guid: 5b3355ff1ae888e428ebf6ad2853e303, type: 3}
|
||||
propertyPath: 'linkedNodes.Array.data[0]'
|
||||
value:
|
||||
objectReference: {fileID: 1992156869}
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 9141033690985600288, guid: 5b3355ff1ae888e428ebf6ad2853e303, type: 3}
|
||||
propertyPath: 'linkedNodes.Array.data[1]'
|
||||
value:
|
||||
objectReference: {fileID: 2097314996}
|
||||
- target: {fileID: 9141033690985600288, guid: 5b3355ff1ae888e428ebf6ad2853e303, type: 3}
|
||||
propertyPath: entity.linkedNodeIDs.Array.size
|
||||
value: 2
|
||||
value: 1
|
||||
objectReference: {fileID: 0}
|
||||
- target: {fileID: 9141033690985600288, guid: 5b3355ff1ae888e428ebf6ad2853e303, type: 3}
|
||||
propertyPath: nodeClass.linkedNodID.Array.size
|
||||
@@ -812,10 +843,15 @@ PrefabInstance:
|
||||
propertyPath: 'entity.linkedNodeIDs.Array.data[1]'
|
||||
value: 4
|
||||
objectReference: {fileID: 0}
|
||||
m_RemovedComponents: []
|
||||
m_RemovedComponents:
|
||||
- {fileID: 9141033690985600288, guid: 5b3355ff1ae888e428ebf6ad2853e303, type: 3}
|
||||
- {fileID: 1525400758423176862, guid: 5b3355ff1ae888e428ebf6ad2853e303, type: 3}
|
||||
m_RemovedGameObjects: []
|
||||
m_AddedGameObjects: []
|
||||
m_AddedComponents: []
|
||||
m_AddedComponents:
|
||||
- targetCorrespondingSourceObject: {fileID: 2579942234611465176, guid: 5b3355ff1ae888e428ebf6ad2853e303, type: 3}
|
||||
insertIndex: -1
|
||||
addedObject: {fileID: 691233197}
|
||||
m_SourcePrefab: {fileID: 100100000, guid: 5b3355ff1ae888e428ebf6ad2853e303, type: 3}
|
||||
--- !u!1 &394740631
|
||||
GameObject:
|
||||
@@ -981,8 +1017,8 @@ GameObject:
|
||||
- component: {fileID: 617492816}
|
||||
- component: {fileID: 617492815}
|
||||
- component: {fileID: 617492814}
|
||||
- component: {fileID: 617492811}
|
||||
- component: {fileID: 617492813}
|
||||
- component: {fileID: 617492817}
|
||||
- component: {fileID: 617492818}
|
||||
m_Layer: 0
|
||||
m_Name: 8
|
||||
m_TagString: Node
|
||||
@@ -990,34 +1026,6 @@ GameObject:
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!114 &617492811
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 617492810}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 0d1092f586cc6e34e991814d701c66ce, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
entity:
|
||||
linkedNodeIDs:
|
||||
- 3
|
||||
linkedNodes:
|
||||
- {fileID: 1172928290}
|
||||
nodeType: 1
|
||||
reserved: 0
|
||||
nodeClass:
|
||||
id: 0
|
||||
x: 0
|
||||
y: 0
|
||||
z: 0
|
||||
linkedNodID: []
|
||||
loadSocket: {fileID: 1704515058}
|
||||
unLoadSocket: {fileID: 1324543929}
|
||||
cargo: {fileID: 0}
|
||||
--- !u!4 &617492812
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -1035,19 +1043,6 @@ Transform:
|
||||
- {fileID: 1704515059}
|
||||
m_Father: {fileID: 109703751}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &617492813
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 617492810}
|
||||
m_Enabled: 0
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: ac7bbf2eaa67a7b4ab83ad40f118a81a, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
chargePerSecond: 1
|
||||
--- !u!136 &617492814
|
||||
CapsuleCollider:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -1124,22 +1119,108 @@ MeshFilter:
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 617492810}
|
||||
m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
|
||||
--- !u!114 &691233192 stripped
|
||||
--- !u!114 &617492817
|
||||
MonoBehaviour:
|
||||
m_CorrespondingSourceObject: {fileID: 9141033690985600288, guid: 5b3355ff1ae888e428ebf6ad2853e303, type: 3}
|
||||
m_PrefabInstance: {fileID: 242396287}
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_GameObject: {fileID: 617492810}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 0d1092f586cc6e34e991814d701c66ce, type: 3}
|
||||
m_Script: {fileID: 11500000, guid: daa06027f79476c49a6c2fab86fc4ae1, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
physics:
|
||||
areabox: {fileID: 0}
|
||||
metaData:
|
||||
address:
|
||||
modeling: {fileID: 0}
|
||||
portrait: {fileID: 0}
|
||||
assetLabel: 0
|
||||
IsDisplayable: 0
|
||||
IsInteractible: 0
|
||||
linkedNodes:
|
||||
- {fileID: 1172928290}
|
||||
reserved: 0
|
||||
nextConveyor: {fileID: 0}
|
||||
nodeClass:
|
||||
id: 0
|
||||
x: 0
|
||||
y: 0
|
||||
z: 0
|
||||
linkedNodID: []
|
||||
loadSocket: {fileID: 0}
|
||||
unLoadSocket: {fileID: 0}
|
||||
portType: 0
|
||||
loader: {fileID: 0}
|
||||
--- !u!114 &617492818
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 617492810}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 54f4e708da2ac8240ad1cb360aebb204, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
physics:
|
||||
areabox: {fileID: 0}
|
||||
metaData:
|
||||
address:
|
||||
modeling: {fileID: 0}
|
||||
portrait: {fileID: 0}
|
||||
assetLabel: 0
|
||||
IsDisplayable: 0
|
||||
IsInteractible: 0
|
||||
currentLoad: {fileID: 0}
|
||||
--- !u!1 &691233190 stripped
|
||||
GameObject:
|
||||
m_CorrespondingSourceObject: {fileID: 2579942234611465176, guid: 5b3355ff1ae888e428ebf6ad2853e303, type: 3}
|
||||
m_PrefabInstance: {fileID: 242396287}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
--- !u!4 &691233196 stripped
|
||||
Transform:
|
||||
m_CorrespondingSourceObject: {fileID: 5408679464857153134, guid: 5b3355ff1ae888e428ebf6ad2853e303, type: 3}
|
||||
m_PrefabInstance: {fileID: 242396287}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
--- !u!114 &691233197
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 691233190}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: daa06027f79476c49a6c2fab86fc4ae1, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
physics:
|
||||
areabox: {fileID: 0}
|
||||
metaData:
|
||||
address:
|
||||
modeling: {fileID: 0}
|
||||
portrait: {fileID: 0}
|
||||
assetLabel: 0
|
||||
IsDisplayable: 0
|
||||
IsInteractible: 0
|
||||
linkedNodes:
|
||||
- {fileID: 1992156875}
|
||||
reserved: 0
|
||||
nextConveyor: {fileID: 0}
|
||||
nodeClass:
|
||||
id: 0
|
||||
x: 0
|
||||
y: 0
|
||||
z: 0
|
||||
linkedNodID: []
|
||||
loadSocket: {fileID: 0}
|
||||
unLoadSocket: {fileID: 0}
|
||||
portType: 0
|
||||
loader: {fileID: 1832015431}
|
||||
--- !u!1 &736132299
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -1264,6 +1345,33 @@ Transform:
|
||||
m_Children: []
|
||||
m_Father: {fileID: 1172928291}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1 &1039833818 stripped
|
||||
GameObject:
|
||||
m_CorrespondingSourceObject: {fileID: 8107138202495161764, guid: e90993d6f27e3844eaa33168853e6c7d, type: 3}
|
||||
m_PrefabInstance: {fileID: 125296021}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
--- !u!114 &1039833823
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1039833818}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 1a308d559e458b94aadec13b64a11ef2, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
physics:
|
||||
areabox: {fileID: 0}
|
||||
metaData:
|
||||
address:
|
||||
modeling: {fileID: 0}
|
||||
portrait: {fileID: 0}
|
||||
assetLabel: 0
|
||||
IsDisplayable: 0
|
||||
IsInteractible: 0
|
||||
currentLoad: {fileID: 0}
|
||||
--- !u!1 &1082030769
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -1277,7 +1385,6 @@ GameObject:
|
||||
- component: {fileID: 1082030774}
|
||||
- component: {fileID: 1082030773}
|
||||
- component: {fileID: 1082030770}
|
||||
- component: {fileID: 1082030772}
|
||||
m_Layer: 0
|
||||
m_Name: 5
|
||||
m_TagString: Node
|
||||
@@ -1297,13 +1404,19 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: 0d1092f586cc6e34e991814d701c66ce, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
entity:
|
||||
linkedNodeIDs:
|
||||
- 4
|
||||
physics:
|
||||
areabox: {fileID: 0}
|
||||
metaData:
|
||||
address:
|
||||
modeling: {fileID: 0}
|
||||
portrait: {fileID: 0}
|
||||
assetLabel: 0
|
||||
IsDisplayable: 0
|
||||
IsInteractible: 0
|
||||
linkedNodes:
|
||||
- {fileID: 2097314996}
|
||||
nodeType: 3
|
||||
reserved: 0
|
||||
nextConveyor: {fileID: 0}
|
||||
nodeClass:
|
||||
id: 0
|
||||
x: 0
|
||||
@@ -1312,7 +1425,6 @@ MonoBehaviour:
|
||||
linkedNodID: []
|
||||
loadSocket: {fileID: 394740631}
|
||||
unLoadSocket: {fileID: 2015597917}
|
||||
cargo: {fileID: 0}
|
||||
--- !u!4 &1082030771
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -1330,19 +1442,6 @@ Transform:
|
||||
- {fileID: 394740632}
|
||||
m_Father: {fileID: 109703751}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &1082030772
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1082030769}
|
||||
m_Enabled: 0
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: ac7bbf2eaa67a7b4ab83ad40f118a81a, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
chargePerSecond: 1
|
||||
--- !u!136 &1082030773
|
||||
CapsuleCollider:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -1431,8 +1530,8 @@ GameObject:
|
||||
- component: {fileID: 1084391829}
|
||||
- component: {fileID: 1084391828}
|
||||
- component: {fileID: 1084391827}
|
||||
- component: {fileID: 1084391824}
|
||||
- component: {fileID: 1084391826}
|
||||
- component: {fileID: 1084391830}
|
||||
- component: {fileID: 1084391831}
|
||||
m_Layer: 0
|
||||
m_Name: 9
|
||||
m_TagString: Node
|
||||
@@ -1440,34 +1539,6 @@ GameObject:
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!114 &1084391824
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1084391823}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 0d1092f586cc6e34e991814d701c66ce, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
entity:
|
||||
linkedNodeIDs:
|
||||
- 2
|
||||
linkedNodes:
|
||||
- {fileID: 1554807644}
|
||||
nodeType: 2
|
||||
reserved: 0
|
||||
nodeClass:
|
||||
id: 0
|
||||
x: 0
|
||||
y: 0
|
||||
z: 0
|
||||
linkedNodID: []
|
||||
loadSocket: {fileID: 216124008}
|
||||
unLoadSocket: {fileID: 1824210708}
|
||||
cargo: {fileID: 0}
|
||||
--- !u!4 &1084391825
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -1485,19 +1556,6 @@ Transform:
|
||||
- {fileID: 216124009}
|
||||
m_Father: {fileID: 109703751}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &1084391826
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1084391823}
|
||||
m_Enabled: 0
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: ac7bbf2eaa67a7b4ab83ad40f118a81a, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
chargePerSecond: 1
|
||||
--- !u!136 &1084391827
|
||||
CapsuleCollider:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -1574,6 +1632,63 @@ MeshFilter:
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1084391823}
|
||||
m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
|
||||
--- !u!114 &1084391830
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1084391823}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: daa06027f79476c49a6c2fab86fc4ae1, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
physics:
|
||||
areabox: {fileID: 0}
|
||||
metaData:
|
||||
address:
|
||||
modeling: {fileID: 0}
|
||||
portrait: {fileID: 0}
|
||||
assetLabel: 0
|
||||
IsDisplayable: 0
|
||||
IsInteractible: 0
|
||||
linkedNodes:
|
||||
- {fileID: 1554807644}
|
||||
reserved: 0
|
||||
nextConveyor: {fileID: 0}
|
||||
nodeClass:
|
||||
id: 0
|
||||
x: 0
|
||||
y: 0
|
||||
z: 0
|
||||
linkedNodID: []
|
||||
loadSocket: {fileID: 0}
|
||||
unLoadSocket: {fileID: 0}
|
||||
portType: 0
|
||||
loader: {fileID: 0}
|
||||
--- !u!114 &1084391831
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1084391823}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 51a49aa3db137494c96cb9bf1a83989f, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
physics:
|
||||
areabox: {fileID: 0}
|
||||
metaData:
|
||||
address:
|
||||
modeling: {fileID: 0}
|
||||
portrait: {fileID: 0}
|
||||
assetLabel: 0
|
||||
IsDisplayable: 0
|
||||
IsInteractible: 0
|
||||
currentLoad: {fileID: 0}
|
||||
--- !u!1 &1133980571
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -1618,9 +1733,9 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: 43c2fa2860dfa344d856558ec881bb8a, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
agvPrefab: {fileID: 3521821355188594447, guid: 03eb7e95fc0cb334d848d40c49b4110e, type: 3}
|
||||
agvs: []
|
||||
fileName: Assets/AGVsLog.csv
|
||||
prf_AGV: {fileID: 3521821355188594447, guid: 03eb7e95fc0cb334d848d40c49b4110e, type: 3}
|
||||
prf_Spec: {fileID: 11400000, guid: 3124e65e4d238e24aa9f78f93282ff84, type: 2}
|
||||
autoIndexing: 1
|
||||
--- !u!1 &1172928289
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -1634,7 +1749,6 @@ GameObject:
|
||||
- component: {fileID: 1172928294}
|
||||
- component: {fileID: 1172928293}
|
||||
- component: {fileID: 1172928290}
|
||||
- component: {fileID: 1172928292}
|
||||
m_Layer: 0
|
||||
m_Name: 3
|
||||
m_TagString: Node
|
||||
@@ -1654,17 +1768,20 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: 0d1092f586cc6e34e991814d701c66ce, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
entity:
|
||||
linkedNodeIDs:
|
||||
- 2
|
||||
- 4
|
||||
- 8
|
||||
physics:
|
||||
areabox: {fileID: 0}
|
||||
metaData:
|
||||
address:
|
||||
modeling: {fileID: 0}
|
||||
portrait: {fileID: 0}
|
||||
assetLabel: 0
|
||||
IsDisplayable: 0
|
||||
IsInteractible: 0
|
||||
linkedNodes:
|
||||
- {fileID: 1554807644}
|
||||
- {fileID: 2097314996}
|
||||
- {fileID: 617492811}
|
||||
nodeType: 0
|
||||
- {fileID: 617492817}
|
||||
reserved: 0
|
||||
nextConveyor: {fileID: 0}
|
||||
nodeClass:
|
||||
id: 0
|
||||
x: 0
|
||||
@@ -1673,7 +1790,6 @@ MonoBehaviour:
|
||||
linkedNodID: []
|
||||
loadSocket: {fileID: 891010309}
|
||||
unLoadSocket: {fileID: 1310341712}
|
||||
cargo: {fileID: 0}
|
||||
--- !u!4 &1172928291
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -1691,19 +1807,6 @@ Transform:
|
||||
- {fileID: 891010310}
|
||||
m_Father: {fileID: 109703751}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &1172928292
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1172928289}
|
||||
m_Enabled: 0
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: ac7bbf2eaa67a7b4ab83ad40f118a81a, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
chargePerSecond: 1
|
||||
--- !u!136 &1172928293
|
||||
CapsuleCollider:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -2047,7 +2150,6 @@ GameObject:
|
||||
- component: {fileID: 1554807648}
|
||||
- component: {fileID: 1554807647}
|
||||
- component: {fileID: 1554807644}
|
||||
- component: {fileID: 1554807646}
|
||||
m_Layer: 0
|
||||
m_Name: 2
|
||||
m_TagString: Node
|
||||
@@ -2067,17 +2169,20 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: 0d1092f586cc6e34e991814d701c66ce, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
entity:
|
||||
linkedNodeIDs:
|
||||
- 3
|
||||
- 6
|
||||
-
|
||||
physics:
|
||||
areabox: {fileID: 0}
|
||||
metaData:
|
||||
address:
|
||||
modeling: {fileID: 0}
|
||||
portrait: {fileID: 0}
|
||||
assetLabel: 0
|
||||
IsDisplayable: 0
|
||||
IsInteractible: 0
|
||||
linkedNodes:
|
||||
- {fileID: 1172928290}
|
||||
- {fileID: 146771354}
|
||||
- {fileID: 1084391824}
|
||||
nodeType: 0
|
||||
- {fileID: 1084391830}
|
||||
reserved: 0
|
||||
nextConveyor: {fileID: 0}
|
||||
nodeClass:
|
||||
id: 0
|
||||
x: 0
|
||||
@@ -2086,7 +2191,6 @@ MonoBehaviour:
|
||||
linkedNodID: []
|
||||
loadSocket: {fileID: 884415325}
|
||||
unLoadSocket: {fileID: 736132299}
|
||||
cargo: {fileID: 0}
|
||||
--- !u!4 &1554807645
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -2104,19 +2208,6 @@ Transform:
|
||||
- {fileID: 884415326}
|
||||
m_Father: {fileID: 109703751}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &1554807646
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1554807643}
|
||||
m_Enabled: 0
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: ac7bbf2eaa67a7b4ab83ad40f118a81a, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
chargePerSecond: 1
|
||||
--- !u!136 &1554807647
|
||||
CapsuleCollider:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -2206,7 +2297,6 @@ GameObject:
|
||||
- component: {fileID: 1590019371}
|
||||
- component: {fileID: 1590019370}
|
||||
- component: {fileID: 1590019367}
|
||||
- component: {fileID: 1590019369}
|
||||
m_Layer: 0
|
||||
m_Name: 7
|
||||
m_TagString: Node
|
||||
@@ -2226,13 +2316,19 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: 0d1092f586cc6e34e991814d701c66ce, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
entity:
|
||||
linkedNodeIDs:
|
||||
- 6
|
||||
physics:
|
||||
areabox: {fileID: 0}
|
||||
metaData:
|
||||
address:
|
||||
modeling: {fileID: 0}
|
||||
portrait: {fileID: 0}
|
||||
assetLabel: 0
|
||||
IsDisplayable: 0
|
||||
IsInteractible: 0
|
||||
linkedNodes:
|
||||
- {fileID: 146771354}
|
||||
nodeType: 3
|
||||
reserved: 0
|
||||
nextConveyor: {fileID: 0}
|
||||
nodeClass:
|
||||
id: 0
|
||||
x: 0
|
||||
@@ -2241,7 +2337,6 @@ MonoBehaviour:
|
||||
linkedNodID: []
|
||||
loadSocket: {fileID: 1349873324}
|
||||
unLoadSocket: {fileID: 1191611793}
|
||||
cargo: {fileID: 0}
|
||||
--- !u!4 &1590019368
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -2259,19 +2354,6 @@ Transform:
|
||||
- {fileID: 1349873325}
|
||||
m_Father: {fileID: 109703751}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &1590019369
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1590019366}
|
||||
m_Enabled: 0
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: ac7bbf2eaa67a7b4ab83ad40f118a81a, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
chargePerSecond: 1
|
||||
--- !u!136 &1590019370
|
||||
CapsuleCollider:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -2410,6 +2492,17 @@ Transform:
|
||||
m_Children: []
|
||||
m_Father: {fileID: 1084391825}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &1832015431 stripped
|
||||
MonoBehaviour:
|
||||
m_CorrespondingSourceObject: {fileID: 5062054334540688330, guid: e90993d6f27e3844eaa33168853e6c7d, type: 3}
|
||||
m_PrefabInstance: {fileID: 125296021}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 00bad124f10f0e44fab7f4f507ecf764, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
--- !u!1 &1858000804
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -2497,8 +2590,7 @@ GameObject:
|
||||
- component: {fileID: 1992156874}
|
||||
- component: {fileID: 1992156873}
|
||||
- component: {fileID: 1992156872}
|
||||
- component: {fileID: 1992156869}
|
||||
- component: {fileID: 1992156871}
|
||||
- component: {fileID: 1992156875}
|
||||
m_Layer: 0
|
||||
m_Name: 1
|
||||
m_TagString: Node
|
||||
@@ -2506,36 +2598,6 @@ GameObject:
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!114 &1992156869
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1992156868}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 0d1092f586cc6e34e991814d701c66ce, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
entity:
|
||||
linkedNodeIDs:
|
||||
- 0
|
||||
- 6
|
||||
linkedNodes:
|
||||
- {fileID: 691233192}
|
||||
- {fileID: 146771354}
|
||||
nodeType: 1
|
||||
reserved: 0
|
||||
nodeClass:
|
||||
id: 0
|
||||
x: 0
|
||||
y: 0
|
||||
z: 0
|
||||
linkedNodID: []
|
||||
loadSocket: {fileID: 2052880161}
|
||||
unLoadSocket: {fileID: 1391611792}
|
||||
cargo: {fileID: 0}
|
||||
--- !u!4 &1992156870
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -2553,19 +2615,6 @@ Transform:
|
||||
- {fileID: 2052880162}
|
||||
m_Father: {fileID: 109703751}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &1992156871
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1992156868}
|
||||
m_Enabled: 0
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: ac7bbf2eaa67a7b4ab83ad40f118a81a, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
chargePerSecond: 1
|
||||
--- !u!136 &1992156872
|
||||
CapsuleCollider:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -2642,6 +2691,41 @@ MeshFilter:
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1992156868}
|
||||
m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0}
|
||||
--- !u!114 &1992156875
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1992156868}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: daa06027f79476c49a6c2fab86fc4ae1, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
physics:
|
||||
areabox: {fileID: 0}
|
||||
metaData:
|
||||
address:
|
||||
modeling: {fileID: 0}
|
||||
portrait: {fileID: 0}
|
||||
assetLabel: 0
|
||||
IsDisplayable: 0
|
||||
IsInteractible: 0
|
||||
linkedNodes:
|
||||
- {fileID: 146771354}
|
||||
reserved: 0
|
||||
nextConveyor: {fileID: 0}
|
||||
nodeClass:
|
||||
id: 0
|
||||
x: 0
|
||||
y: 0
|
||||
z: 0
|
||||
linkedNodID: []
|
||||
loadSocket: {fileID: 0}
|
||||
unLoadSocket: {fileID: 0}
|
||||
portType: 1
|
||||
loader: {fileID: 0}
|
||||
--- !u!1 &2015597917
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -2717,7 +2801,6 @@ GameObject:
|
||||
- component: {fileID: 2097315000}
|
||||
- component: {fileID: 2097314999}
|
||||
- component: {fileID: 2097314996}
|
||||
- component: {fileID: 2097314998}
|
||||
m_Layer: 0
|
||||
m_Name: 4
|
||||
m_TagString: Node
|
||||
@@ -2737,15 +2820,20 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: 0d1092f586cc6e34e991814d701c66ce, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
entity:
|
||||
linkedNodeIDs:
|
||||
- 3
|
||||
- 5
|
||||
physics:
|
||||
areabox: {fileID: 0}
|
||||
metaData:
|
||||
address:
|
||||
modeling: {fileID: 0}
|
||||
portrait: {fileID: 0}
|
||||
assetLabel: 0
|
||||
IsDisplayable: 0
|
||||
IsInteractible: 0
|
||||
linkedNodes:
|
||||
- {fileID: 1172928290}
|
||||
- {fileID: 1082030770}
|
||||
nodeType: 0
|
||||
- {fileID: 691233197}
|
||||
reserved: 0
|
||||
nextConveyor: {fileID: 0}
|
||||
nodeClass:
|
||||
id: 0
|
||||
x: 0
|
||||
@@ -2754,7 +2842,6 @@ MonoBehaviour:
|
||||
linkedNodID: []
|
||||
loadSocket: {fileID: 1353975497}
|
||||
unLoadSocket: {fileID: 878306402}
|
||||
cargo: {fileID: 0}
|
||||
--- !u!4 &2097314997
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -2772,19 +2859,6 @@ Transform:
|
||||
- {fileID: 1353975498}
|
||||
m_Father: {fileID: 109703751}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &2097314998
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 2097314995}
|
||||
m_Enabled: 0
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: ac7bbf2eaa67a7b4ab83ad40f118a81a, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
chargePerSecond: 1
|
||||
--- !u!136 &2097314999
|
||||
CapsuleCollider:
|
||||
m_ObjectHideFlags: 0
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
36
Assets/Scripts/Studio/Machine/AGV/AGVAction.cs
Normal file
36
Assets/Scripts/Studio/Machine/AGV/AGVAction.cs
Normal file
@@ -0,0 +1,36 @@
|
||||
using System.Collections.Generic;
|
||||
using XED.VirtualFactory;
|
||||
|
||||
public class AGVAction
|
||||
{
|
||||
}
|
||||
|
||||
public class AGVMoveAction : AGVAction
|
||||
{
|
||||
public List<AGVNode> path;
|
||||
|
||||
public AGVMoveAction(List<AGVNode> path)
|
||||
{
|
||||
this.path = path;
|
||||
}
|
||||
}
|
||||
|
||||
public class AGVLoadAction : AGVAction
|
||||
{
|
||||
public Loader targetLoader;
|
||||
|
||||
public AGVLoadAction(Loader targetLoader)
|
||||
{
|
||||
this.targetLoader = targetLoader;
|
||||
}
|
||||
}
|
||||
|
||||
public class AGVUnloadAction : AGVAction
|
||||
{
|
||||
public Loader targetLoader;
|
||||
|
||||
public AGVUnloadAction(Loader targetLoader)
|
||||
{
|
||||
this.targetLoader = targetLoader;
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/Studio/Machine/AGV/AGVAction.cs.meta
Normal file
2
Assets/Scripts/Studio/Machine/AGV/AGVAction.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 18cd343e58c5d8f4b9e8f214b57ccf63
|
||||
@@ -1,184 +1,46 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
using XRLib;
|
||||
|
||||
namespace XED.VirtualFactory
|
||||
{
|
||||
public class AGVManager : MonoBehaviour,ISingle
|
||||
public class AGVManager : MonoBehaviour, ISingle
|
||||
{
|
||||
public AGV agvPrefab;
|
||||
|
||||
public List<AGV> agvs = new List<AGV>();
|
||||
Dictionary<AGV, List<AGVNode>> orderDict = new Dictionary<AGV, List<AGVNode>>();
|
||||
public event Action<List<AGVNode>> onOrderStarted;
|
||||
|
||||
public string fileName = "Assets/AGVsLog.csv";
|
||||
|
||||
private void Start()
|
||||
public AGV prf_AGV;
|
||||
public AGVSpec prf_Spec;
|
||||
public HashSet<AGV> agvs = new();
|
||||
public bool autoIndexing;
|
||||
public bool TryGetIdleAGV(out AGV result)
|
||||
{
|
||||
agvs = FindObjectsByType<AGV>(FindObjectsSortMode.None).ToList();
|
||||
foreach(var a in agvs)
|
||||
//Debug.Log($"Try Get Idle AGV");
|
||||
foreach (var agv in agvs)
|
||||
{
|
||||
a.onTaskComplete += WriteLog;
|
||||
}
|
||||
|
||||
CreateLogFile();
|
||||
}
|
||||
|
||||
void CreateLogFile()
|
||||
{
|
||||
if (!File.Exists(fileName))
|
||||
{
|
||||
using (StreamWriter sw = File.CreateText(fileName))
|
||||
if (!agv.isBusy)
|
||||
{
|
||||
sw.WriteLine("Time,AGV_ID,Task,Target,Success");
|
||||
Debug.Log($"Find Idle AGV");
|
||||
result = agv;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
result = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
public AGV SpawnAGV(Vector3 position,Quaternion rotation)
|
||||
public AGV CreateEmptyAGV()
|
||||
{
|
||||
var agv = Instantiate(agvPrefab,position, rotation);
|
||||
agv.onTaskComplete += WriteLog;
|
||||
var agv = Instantiate(prf_AGV);
|
||||
agvs.Add(agv);
|
||||
|
||||
if (autoIndexing)
|
||||
{
|
||||
agv.entity = new AGVEntity();
|
||||
agv.entity.id = agvs.Count.ToString();
|
||||
agv.name = $"AGV_{agv.entity.id}";
|
||||
}
|
||||
agv.spec = prf_Spec;
|
||||
return agv;
|
||||
}
|
||||
|
||||
AGV SpawnEmptyAGV()
|
||||
{
|
||||
var result = Instantiate(agvPrefab);
|
||||
result.onTaskComplete += WriteLog;
|
||||
agvs.Add(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
public void OrderToAGV(AGV AGV, AGVTaskType order, GameObject Target,Component comp)
|
||||
{
|
||||
AGV.AddOrder(new AGVOrderClass(order, Target,comp));
|
||||
}
|
||||
|
||||
public void OrderToAGV(int AGVindex,AGVTaskType order, GameObject Target)
|
||||
{
|
||||
agvs[AGVindex].AddOrder(new AGVOrderClass(order, Target));
|
||||
}
|
||||
|
||||
public void OrderToAGV(AGV AGV, AGVTaskType order, GameObject Target)
|
||||
{
|
||||
AGV.AddOrder(new AGVOrderClass(order, Target));
|
||||
}
|
||||
|
||||
public void OrderToAGV(AGV AGV, AGVTaskType order, Vector3 Target)
|
||||
{
|
||||
AGV.AddOrder(new AGVOrderClass(order, Target));
|
||||
}
|
||||
|
||||
public void OrderToAGV(int AGVindex, AGVTaskType order, GameObject Target1, GameObject Target2)
|
||||
{
|
||||
agvs[AGVindex].AddOrder(new AGVOrderClass(order, Target1,Target2));
|
||||
}
|
||||
|
||||
public void OrderToAGV(AGV AGV, AGVTaskType order)
|
||||
{
|
||||
AGV.AddOrder(new AGVOrderClass(order));
|
||||
}
|
||||
|
||||
void WriteLog(AGV agv, AGVTaskType task, string target,bool success)
|
||||
{
|
||||
using (StreamWriter sw = File.AppendText(fileName))
|
||||
{
|
||||
string logLine = $"{DateTime.Now},{agv.id},{task},{target},{success}";
|
||||
sw.WriteLine();
|
||||
sw.WriteLine(logLine);
|
||||
sw.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
public void ordertoAGV(List<AGVNode> OrderList)
|
||||
{
|
||||
Vector3 direction = (OrderList[1].transform.position - OrderList[0].transform.position);
|
||||
direction = new Vector3(direction.x, 0, direction.z);
|
||||
Quaternion lookRotation = Quaternion.LookRotation(direction);
|
||||
var agv=SpawnAGV(OrderList[0].transform.position, lookRotation);
|
||||
for (int i = 0; i < OrderList.Count; i++)
|
||||
{
|
||||
if (i != 0)
|
||||
{
|
||||
OrderToAGV(agv, AGVTaskType.SpinToTarget, OrderList[i].gameObject);
|
||||
OrderToAGV(agv, AGVTaskType.MoveToTarget, OrderList[i].gameObject);
|
||||
}
|
||||
if (OrderList[i].nodeClass.type == AGVNodeType.charge)
|
||||
{
|
||||
OrderToAGV(agv, AGVTaskType.Charging);
|
||||
}
|
||||
if (OrderList[i].nodeClass.type == AGVNodeType.Load)
|
||||
{
|
||||
OrderToAGV(agv, AGVTaskType.LoadCargo, OrderList[i].loadSocket, OrderList[i]);
|
||||
//OrderToAGV(agv, AGVTaskType.LiftUpDown, OrderList[i].loadSocket.transform.position + new Vector3(0, 0.2f, 0));
|
||||
}
|
||||
if (OrderList[i].nodeClass.type == AGVNodeType.unLoad)
|
||||
{
|
||||
OrderToAGV(agv, AGVTaskType.UnLoadCargo, OrderList[i].unLoadSocket, OrderList[i]);
|
||||
OrderToAGV(agv, AGVTaskType.LiftReset);
|
||||
}
|
||||
}
|
||||
orderDict.Add(agv, OrderList);
|
||||
onOrderStarted?.Invoke(OrderList);
|
||||
agv.onOrderCompleted += OrderReplay;
|
||||
agv.onOrderStoped += StopOrder;
|
||||
}
|
||||
|
||||
public void ordertoAGV(List<AGVNode> OrderList,AGV agv)
|
||||
{
|
||||
for (int i = 0; i < OrderList.Count; i++)
|
||||
{
|
||||
OrderToAGV(agv, AGVTaskType.SpinToTarget, OrderList[i].gameObject);
|
||||
OrderToAGV(agv, AGVTaskType.MoveToTarget, OrderList[i].gameObject);
|
||||
if (OrderList[i].nodeClass.type == AGVNodeType.charge)
|
||||
{
|
||||
OrderToAGV(agv, AGVTaskType.Charging);
|
||||
}
|
||||
if (OrderList[i].nodeClass.type == AGVNodeType.Load)
|
||||
{
|
||||
OrderToAGV(agv, AGVTaskType.LoadCargo, OrderList[i].loadSocket, OrderList[i]);
|
||||
//OrderToAGV(agv, AGVTaskType.LiftUpDown, OrderList[i].loadSocket.transform.position+new Vector3(0,0.2f,0));
|
||||
}
|
||||
if (OrderList[i].nodeClass.type == AGVNodeType.unLoad)
|
||||
{
|
||||
OrderToAGV(agv, AGVTaskType.UnLoadCargo, OrderList[i].unLoadSocket, OrderList[i]);
|
||||
OrderToAGV(agv, AGVTaskType.LiftReset);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void OrderReplay(AGV agv)
|
||||
{
|
||||
ordertoAGV(orderDict[agv], agv);
|
||||
}
|
||||
|
||||
public void StopOrder(AGV agv)
|
||||
{
|
||||
agv.onOrderCompleted -= OrderReplay;
|
||||
orderDict.Remove(agv);
|
||||
}
|
||||
|
||||
internal AGV GetIdleAGV()
|
||||
{
|
||||
|
||||
foreach (var a in agvs)
|
||||
{
|
||||
if (a.agvState == AGVState.Idle)
|
||||
return a;
|
||||
}
|
||||
|
||||
var result = SpawnEmptyAGV();
|
||||
var newEntity = new AGVEntity();
|
||||
newEntity.id= agvs.Count.ToString();
|
||||
result.Binding(newEntity);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
@@ -5,12 +6,14 @@ using UnityEngine;
|
||||
|
||||
namespace XED.VirtualFactory
|
||||
{
|
||||
public class AGVNode : MonoBehaviour
|
||||
public class AGVNode : TwinObject
|
||||
{
|
||||
public AGVNodeEntity entity;
|
||||
public event Action onEnterEvent;
|
||||
public event Action onExitEvent;
|
||||
|
||||
public List<AGVNode> linkedNodes = new();
|
||||
public AGVNodeType nodeType;
|
||||
public bool reserved;
|
||||
public Transform nextConveyor;
|
||||
|
||||
#region legacy
|
||||
public AGVNodeClass nodeClass;
|
||||
@@ -18,7 +21,6 @@ namespace XED.VirtualFactory
|
||||
List<Renderer> meshRendererList = new List<Renderer>();
|
||||
public GameObject loadSocket;
|
||||
public GameObject unLoadSocket;
|
||||
public Load cargo;
|
||||
#endregion
|
||||
|
||||
public void Initialize(AGVNodeClass data)
|
||||
@@ -35,7 +37,6 @@ namespace XED.VirtualFactory
|
||||
meshRendererList.Add(child.gameObject.GetComponent<Renderer>());
|
||||
}
|
||||
}
|
||||
nodeClass.onTypeChanged += ChangeType;
|
||||
}
|
||||
|
||||
public void SetColor(Color color)
|
||||
@@ -55,39 +56,5 @@ namespace XED.VirtualFactory
|
||||
r.SetPropertyBlock(null);
|
||||
}
|
||||
}
|
||||
|
||||
void ChangeType(AGVNodeType type)
|
||||
{
|
||||
var chargezone=gameObject.GetComponent<ChargeZone>();
|
||||
chargezone.enabled = false;
|
||||
if (cargo)
|
||||
{
|
||||
Destroy(cargo);
|
||||
}
|
||||
if (cargo)
|
||||
{
|
||||
Destroy(cargo);
|
||||
}
|
||||
if (type == AGVNodeType.charge)
|
||||
{
|
||||
chargezone.enabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void LoadCargo()
|
||||
{
|
||||
cargo = null;
|
||||
}
|
||||
|
||||
public void UnLoadCargo(Load cargo)
|
||||
{
|
||||
this.cargo = cargo;
|
||||
}
|
||||
|
||||
internal void Load(Load cargo)
|
||||
{
|
||||
this.cargo = cargo;
|
||||
cargo.transform.position = loadSocket.transform.position;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,34 +4,10 @@ using System;
|
||||
|
||||
namespace XED.VirtualFactory
|
||||
{
|
||||
[Serializable]
|
||||
public enum AGVNodeType
|
||||
{
|
||||
normal,
|
||||
Load,
|
||||
unLoad,
|
||||
charge
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public class AGVNodeClass
|
||||
{
|
||||
public event Action<AGVNodeType> onTypeChanged;
|
||||
public AGVNodeType type
|
||||
{
|
||||
get
|
||||
{
|
||||
return _type;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (value != _type)
|
||||
{
|
||||
_type = value;
|
||||
onTypeChanged?.Invoke(_type);
|
||||
}
|
||||
}
|
||||
}
|
||||
AGVNodeType _type=AGVNodeType.normal;
|
||||
public string id="0";
|
||||
public string x="0";
|
||||
public string y="0";
|
||||
|
||||
@@ -328,12 +328,12 @@ namespace XED.VirtualFactory
|
||||
|
||||
public void NodeTypeChange(int index)
|
||||
{
|
||||
if (currentlySelectedNode)
|
||||
{
|
||||
currentlySelectedNode.nodeClass.type = (AGVNodeType)index;
|
||||
nodeTable[currentlySelectedNode.nodeClass.id].nodeClass.type = (AGVNodeType)index;
|
||||
agvNodeMap.agvNodeData.Find(n => n.id == currentlySelectedNode.nodeClass.id).type = (AGVNodeType)index;
|
||||
}
|
||||
//if (currentlySelectedNode)
|
||||
//{
|
||||
// currentlySelectedNode.nodeClass.type = (AGVNodeType)index;
|
||||
// nodeTable[currentlySelectedNode.nodeClass.id].nodeClass.type = (AGVNodeType)index;
|
||||
// agvNodeMap.agvNodeData.Find(n => n.id == currentlySelectedNode.nodeClass.id).type = (AGVNodeType)index;
|
||||
//}
|
||||
}
|
||||
|
||||
public void RemoveNode(AGVNode node)
|
||||
|
||||
@@ -47,7 +47,7 @@ namespace XED.VirtualFactory
|
||||
gameObject.GetComponent<RectTransform>().position = Camera.main.WorldToScreenPoint(target.transform.position) + new Vector3(0, 5f, 0);
|
||||
gameObject.GetComponent<CanvasGroup>().interactable = true;
|
||||
gameObject.GetComponent<CanvasGroup>().alpha = 1f;
|
||||
DropDown_AGVNodeType.value = (int)selectedNode.GetComponent<AGVNode>().nodeClass.type;
|
||||
//DropDown_AGVNodeType.value = (int)selectedNode.GetComponent<AGVNode>().nodeClass.type;
|
||||
gameObject.SetActive(true);
|
||||
}
|
||||
|
||||
|
||||
18
Assets/Scripts/Studio/Machine/AGV/AGVNode/AGVPortNode.cs
Normal file
18
Assets/Scripts/Studio/Machine/AGV/AGVNode/AGVPortNode.cs
Normal file
@@ -0,0 +1,18 @@
|
||||
using System;
|
||||
|
||||
namespace XED.VirtualFactory
|
||||
{
|
||||
public class AGVPortNode : AGVNode
|
||||
{
|
||||
public enum PortType
|
||||
{
|
||||
Input,
|
||||
Output
|
||||
}
|
||||
public PortType portType;
|
||||
public Loader loader;
|
||||
|
||||
public event Action onLoadEvent;
|
||||
public event Action onUnloadEvent;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: daa06027f79476c49a6c2fab86fc4ae1
|
||||
7
Assets/Scripts/Studio/Machine/AGV/AGVNode/DestroyPort.cs
Normal file
7
Assets/Scripts/Studio/Machine/AGV/AGVNode/DestroyPort.cs
Normal file
@@ -0,0 +1,7 @@
|
||||
namespace XED.VirtualFactory
|
||||
{
|
||||
public class DestroyPort : OutputPort
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 51a49aa3db137494c96cb9bf1a83989f
|
||||
15
Assets/Scripts/Studio/Machine/AGV/AGVNode/GeneratePort.cs
Normal file
15
Assets/Scripts/Studio/Machine/AGV/AGVNode/GeneratePort.cs
Normal file
@@ -0,0 +1,15 @@
|
||||
|
||||
using UnityEngine;
|
||||
|
||||
namespace XED.VirtualFactory
|
||||
{
|
||||
public class GeneratePort : OutputPort
|
||||
{
|
||||
|
||||
public override void AfterAwake()
|
||||
{
|
||||
base.AfterAwake();
|
||||
Debug.Log("GeneratePort AfterAwake");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 54f4e708da2ac8240ad1cb360aebb204
|
||||
9
Assets/Scripts/Studio/Machine/AGV/AGVNode/InputPort.cs
Normal file
9
Assets/Scripts/Studio/Machine/AGV/AGVNode/InputPort.cs
Normal file
@@ -0,0 +1,9 @@
|
||||
using System;
|
||||
|
||||
namespace XED.VirtualFactory
|
||||
{
|
||||
//뭔가 놓고 나가는 경우
|
||||
public class InputPort : Port
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b899aa78db0b9f446a26478a44d9d5e8
|
||||
34
Assets/Scripts/Studio/Machine/AGV/AGVNode/Loader.cs
Normal file
34
Assets/Scripts/Studio/Machine/AGV/AGVNode/Loader.cs
Normal file
@@ -0,0 +1,34 @@
|
||||
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace XED.VirtualFactory
|
||||
{
|
||||
public class Loader : TwinObject
|
||||
{
|
||||
public Product currentLoad;
|
||||
protected virtual Transform loadPivot => transform;
|
||||
public bool isEmpty => currentLoad == null;
|
||||
public event Action onLoadEvent;
|
||||
public event Action onUnloadEvent;
|
||||
public virtual void Load(Product load)
|
||||
{
|
||||
Debug.Log($"{name} is load");
|
||||
load.transform.SetParent(loadPivot);
|
||||
load.transform.localPosition= Vector3.zero;
|
||||
currentLoad = load;
|
||||
load.LocationUpdate(this);
|
||||
onLoadEvent?.Invoke();
|
||||
}
|
||||
|
||||
public virtual void Unload(Loader getter)
|
||||
{
|
||||
Debug.Log($"{name} is unload");
|
||||
if (getter != null)
|
||||
getter.Load(currentLoad);
|
||||
|
||||
currentLoad = null;
|
||||
onUnloadEvent?.Invoke();
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/Studio/Machine/AGV/AGVNode/Loader.cs.meta
Normal file
2
Assets/Scripts/Studio/Machine/AGV/AGVNode/Loader.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3eaa66bb148b11b46acc7760a5495c63
|
||||
8
Assets/Scripts/Studio/Machine/AGV/AGVNode/OutputPort.cs
Normal file
8
Assets/Scripts/Studio/Machine/AGV/AGVNode/OutputPort.cs
Normal file
@@ -0,0 +1,8 @@
|
||||
namespace XED.VirtualFactory
|
||||
{
|
||||
//뭔가 들고 나가는 경우
|
||||
public class OutputPort : Port
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 12fb04b0bfacc524ea2170a660857d7b
|
||||
11
Assets/Scripts/Studio/Machine/AGV/AGVNode/Port.cs
Normal file
11
Assets/Scripts/Studio/Machine/AGV/AGVNode/Port.cs
Normal file
@@ -0,0 +1,11 @@
|
||||
namespace XED.VirtualFactory
|
||||
{
|
||||
public class Port : Loader
|
||||
{
|
||||
public override void AfterAwake()
|
||||
{
|
||||
base.AfterAwake();
|
||||
FindSingle<PortMap>().Regist(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/Scripts/Studio/Machine/AGV/AGVNode/Port.cs.meta
Normal file
2
Assets/Scripts/Studio/Machine/AGV/AGVNode/Port.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 012a83125126a164493cda401dd26e45
|
||||
66
Assets/Scripts/Studio/Machine/AGV/AGVNode/PortMap.cs
Normal file
66
Assets/Scripts/Studio/Machine/AGV/AGVNode/PortMap.cs
Normal file
@@ -0,0 +1,66 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using XRLib;
|
||||
|
||||
namespace XED.VirtualFactory
|
||||
{
|
||||
public class PortMap : MonoBehaviour, ISingle
|
||||
{
|
||||
HashSet<Port> ports = new();
|
||||
|
||||
public bool TryGetEmptyGeneratePort(out GeneratePort result)
|
||||
{
|
||||
foreach (var p in ports)
|
||||
{
|
||||
if (p is GeneratePort pt && p.isEmpty)
|
||||
{
|
||||
result = pt;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
result = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
internal bool TryGetFullGeneratePort(out Port targetPort)
|
||||
{
|
||||
foreach (var p in ports)
|
||||
{
|
||||
if (p is GeneratePort pt && !pt.isEmpty)
|
||||
{
|
||||
targetPort = pt;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
targetPort = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
public void Regist(Port port)
|
||||
{
|
||||
if(!ports.Add(port))
|
||||
{
|
||||
Debug.LogError("Port already exists");
|
||||
return;
|
||||
}
|
||||
|
||||
ports.Add(port);
|
||||
}
|
||||
|
||||
internal bool TryGetEmptyInputPort(out Port inputPort)
|
||||
{
|
||||
foreach(var p in ports)
|
||||
{
|
||||
if (p is InputPort pt && pt.isEmpty)
|
||||
{
|
||||
inputPort = pt;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
inputPort = null;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b693fd1017fb97f478a690e30a0f1c42
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace XED.VirtualFactory
|
||||
{
|
||||
public class StackerInputPort : InputPort
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 00bad124f10f0e44fab7f4f507ecf764
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace XED.VirtualFactory
|
||||
{
|
||||
public class StackerOutputPort : OutputPort
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4fce4835cb2aae74da849f6efffd5997
|
||||
@@ -14,7 +14,7 @@ namespace XED.VirtualFactory
|
||||
}
|
||||
public class AGVOrderClass
|
||||
{
|
||||
public AGVTaskType agvTaskType=AGVTaskType.Waiting;
|
||||
//public AGVTaskType agvTaskType=AGVTaskType.Waiting;
|
||||
public TargetCase targetCase = TargetCase.None;
|
||||
public Vector3 target = new Vector3();
|
||||
public Vector3 target2 = new Vector3();
|
||||
@@ -22,42 +22,5 @@ namespace XED.VirtualFactory
|
||||
public GameObject targetObject;
|
||||
public Quaternion targetQuaternion;
|
||||
|
||||
public AGVOrderClass(AGVTaskType task)
|
||||
{
|
||||
agvTaskType = task;
|
||||
targetCase = TargetCase.None;
|
||||
}
|
||||
|
||||
public AGVOrderClass(AGVTaskType task,GameObject targetObject)
|
||||
{
|
||||
agvTaskType = task;
|
||||
target = targetObject.transform.position;
|
||||
this.targetObject = targetObject;
|
||||
targetCase = TargetCase.One;
|
||||
}
|
||||
|
||||
public AGVOrderClass(AGVTaskType task, Vector3 targetVector)
|
||||
{
|
||||
agvTaskType = task;
|
||||
target = targetVector;
|
||||
targetCase = TargetCase.One;
|
||||
}
|
||||
|
||||
public AGVOrderClass(AGVTaskType task, GameObject targetObject, GameObject target2Object)
|
||||
{
|
||||
agvTaskType = task;
|
||||
target = targetObject.transform.position;
|
||||
target2 = target2Object.transform.position;
|
||||
targetCase = TargetCase.Two;
|
||||
}
|
||||
|
||||
public AGVOrderClass(AGVTaskType task, GameObject targetObject, Component comp)
|
||||
{
|
||||
agvTaskType = task;
|
||||
this.targetObject = targetObject;
|
||||
targetcomp = comp;
|
||||
targetCase = TargetCase.Two;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,6 @@ namespace XED.VirtualFactory
|
||||
return;
|
||||
|
||||
inAGV = amr;
|
||||
inAGV.charging = true;
|
||||
}
|
||||
|
||||
private void OnTriggerStay(Collider other)
|
||||
@@ -33,10 +32,7 @@ namespace XED.VirtualFactory
|
||||
return;
|
||||
if (inAGV == null)
|
||||
return;
|
||||
if (inAGV.charging)
|
||||
{
|
||||
inAGV.agvBattery.batteryCapacity += chargePerSecond * Time.deltaTime;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void OnTriggerExit(Collider other)
|
||||
@@ -48,7 +44,6 @@ namespace XED.VirtualFactory
|
||||
if (!other.TryGetComponent(out AGV amr))
|
||||
return;
|
||||
|
||||
inAGV.charging = false;
|
||||
inAGV = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,15 +12,15 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: 24cfa40753282b845b69548571a1a451, type: 3}
|
||||
m_Name: AGVSpecData
|
||||
m_EditorClassIdentifier:
|
||||
maxSpeed: 20
|
||||
maxCurveSpeed: 10
|
||||
maxSpeed: 2
|
||||
maxCurveSpeed: 2
|
||||
slowSpeed: 5
|
||||
slowCurveSpeed: 3
|
||||
maxLiftUp: 10
|
||||
maxLiftDown: -10
|
||||
maxLiftPush: 10
|
||||
liftSpeed: 0.1
|
||||
spinSpeed: 20
|
||||
liftSpeed: 1
|
||||
spinSpeed: 0.01
|
||||
accelerate: 1
|
||||
decelerate: 1
|
||||
emergencyDecelerate: 5
|
||||
|
||||
@@ -4,23 +4,14 @@ using UnityEngine;
|
||||
|
||||
namespace XED.VirtualFactory
|
||||
{
|
||||
public class Cell : MonoBehaviour
|
||||
public class Cell : Loader
|
||||
{
|
||||
public bool isLoad;
|
||||
public Load load;
|
||||
|
||||
public void Load(Load load)
|
||||
public override void Load(Product load)
|
||||
{
|
||||
this.load = load;
|
||||
base.Load(load);
|
||||
isLoad = true;
|
||||
}
|
||||
|
||||
public Load Unload()
|
||||
{
|
||||
var result = load;
|
||||
load = null;
|
||||
isLoad = false;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
namespace XED.VirtualFactory
|
||||
{
|
||||
public class Load : TwinObject
|
||||
{
|
||||
public LoadEntity entity;
|
||||
|
||||
}
|
||||
}
|
||||
@@ -30,7 +30,7 @@ Transform:
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: -0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_LocalScale: {x: 1, y: 0.2, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
@@ -121,4 +121,12 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: cbf5cadd5a55b594bbe325dfebe6e8f1, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
id:
|
||||
physics:
|
||||
areabox: {fileID: 0}
|
||||
metaData:
|
||||
address:
|
||||
modeling: {fileID: 0}
|
||||
portrait: {fileID: 0}
|
||||
assetLabel: 0
|
||||
IsDisplayable: 0
|
||||
IsInteractible: 0
|
||||
|
||||
15
Assets/Scripts/Studio/Machine/StackerCrane/Product.cs
Normal file
15
Assets/Scripts/Studio/Machine/StackerCrane/Product.cs
Normal file
@@ -0,0 +1,15 @@
|
||||
|
||||
using UnityEngine;
|
||||
|
||||
namespace XED.VirtualFactory
|
||||
{
|
||||
public class Product : TwinObject
|
||||
{
|
||||
public Loader currentLocation;
|
||||
public void LocationUpdate(Loader loader)
|
||||
{
|
||||
currentLocation = loader;
|
||||
Debug.Log($"{name} is in {loader.name}({this})");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,559 +1,305 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEditor.Localization.Plugins.XLIFF.V12;
|
||||
using UnityEngine;
|
||||
using XRLib;
|
||||
|
||||
namespace XED.VirtualFactory
|
||||
{
|
||||
public class StackerCrane : MonoBehaviour, ISingle
|
||||
public class StackerCrane : TwinObject
|
||||
{
|
||||
public Transform Storage;
|
||||
public Transform VerticalPillar;
|
||||
public Transform Bucket;
|
||||
public Transform Fork;
|
||||
[Label(typeof(StackerCraneFork), "Fork")]
|
||||
public StackerCraneFork fork;
|
||||
[Label(typeof(StackerInputPort),"InComingPos")]
|
||||
public StackerInputPort inputPort;
|
||||
[Label(typeof(StackerOutputPort),"OutgoingPos")]
|
||||
public StackerOutputPort outputPort;
|
||||
|
||||
private float forkRange = 1.5f;
|
||||
public StackerCraneState currentState;
|
||||
public event Action updateAction;
|
||||
public Queue<StackerCraneTask> taskQueue = new();
|
||||
public float forkSpeed = 1f;
|
||||
Vector3 forkStart;
|
||||
Vector3 forkEnd;
|
||||
float forkProgress;
|
||||
public StackerCraneAction currentAction;
|
||||
public StackerCraneTask currentTask;
|
||||
public Queue<StackerCraneAction> actionQueue = new();
|
||||
public List<Loader> cells = new();
|
||||
public bool autoInput;
|
||||
public float pillarMoveSpeed = 1f;
|
||||
public float bucketMoveSpeed = 1f;
|
||||
public Loader moveTarget;
|
||||
Vector3 pillarStart;
|
||||
float bucketStart;
|
||||
Vector3 pillarEnd;
|
||||
float bucketEnd;
|
||||
float pillarMoveProgress;
|
||||
float bucketMoveProgress;
|
||||
internal bool hasEmptyCell => cells.Any(cell => cell.isEmpty);
|
||||
|
||||
public Queue<StackerCraneTask> taskQueue = new Queue<StackerCraneTask>();
|
||||
public StackerCraneTask currentTask = new StackerCraneTask(ETaskType.None);
|
||||
public StackerCraneTask previousTask = new StackerCraneTask(ETaskType.None);
|
||||
|
||||
[Label(typeof(Cell), "InComingPos")]
|
||||
public Cell incomeCell;
|
||||
[Label(typeof(Cell), "OriginPos")]
|
||||
public Cell originPos;
|
||||
[Label(typeof(Cell), "OutgoingPos")]
|
||||
public Cell outCell;
|
||||
|
||||
public Cell currentTargetCell;
|
||||
|
||||
public Transform Storage;
|
||||
public Transform ForkLoadPlaceRoot;
|
||||
|
||||
private Vector3 VerticalPillarLerpStartPos;
|
||||
private Vector3 BucketLerpStartPos;
|
||||
private Vector3 ForkLerpStartPos;
|
||||
|
||||
private float verticalpillarT;
|
||||
private float bucketT;
|
||||
private float forkT;
|
||||
|
||||
private float verticalpollarTargetDistance;
|
||||
private float bucketTargetDistance;
|
||||
|
||||
public event Action<StackerCrane> onAddTaskCompletedEvent;
|
||||
public event Action<StackerCrane> onTaskReadyCompletedEvent;
|
||||
public event Action<StackerCrane> onLoadCompletedEvent;
|
||||
public event Action<StackerCrane> onTaskEndCompletedEvent;
|
||||
public event Action<StackerCrane> onStateChangeEvent;
|
||||
|
||||
private List<Cell> cellList = new List<Cell>();
|
||||
|
||||
private float moveSpeed = 6f;
|
||||
|
||||
private float stackerCraneMove;
|
||||
private bool IsBodyMoveCompleted => verticalpillarT >= 1f && bucketT >= 1f;
|
||||
private bool IsForkMoveCompleted => forkT >= 1f;
|
||||
|
||||
public enum EStackeCraneState
|
||||
public enum StackerCraneState
|
||||
{
|
||||
Idle,
|
||||
TaskReady,
|
||||
Move,
|
||||
MoveReady,
|
||||
Move,
|
||||
MoveEnd,
|
||||
ActionReady,
|
||||
LoadReady,
|
||||
UnloadReady,
|
||||
ForkIn,
|
||||
ForkInEnd,
|
||||
ForkOut,
|
||||
ForkOutEnd,
|
||||
Load,
|
||||
LoadEnd,
|
||||
UnLoad,
|
||||
UnLoadEnd,
|
||||
TaskEnd,
|
||||
Unload,
|
||||
UnloadEnd,
|
||||
}
|
||||
|
||||
public EStackeCraneState _stackeCraneState = EStackeCraneState.Idle;
|
||||
|
||||
public EStackeCraneState stackeCraneState
|
||||
private void Update()
|
||||
{
|
||||
get { return _stackeCraneState; }
|
||||
set
|
||||
{
|
||||
_stackeCraneState = value;
|
||||
onStateChangeEvent?.Invoke(this);
|
||||
ChangeStateAction();
|
||||
}
|
||||
updateAction.Invoke();
|
||||
}
|
||||
|
||||
public override void AfterAwake()
|
||||
{
|
||||
FindSingle<StackerCraneManager>().InitStackerCrane(this);
|
||||
|
||||
InitStackerCell();
|
||||
InitStackerCrane();
|
||||
ChangeState(StackerCraneState.Idle);
|
||||
cells = Storage.GetComponentsInChildren<Loader>().ToList();
|
||||
inputPort.onLoadEvent += OnLoadInputPort;
|
||||
}
|
||||
|
||||
private void InitStackerCell()
|
||||
private void OnLoadInputPort()
|
||||
{
|
||||
for (int i = 0; i < Storage.childCount; i++)
|
||||
Debug.Log($"On Load Stacker InputPort");
|
||||
if (autoInput)
|
||||
{
|
||||
Transform cells = Storage.GetChild(i);
|
||||
|
||||
for (int j = 0; j < cells.childCount; j++)
|
||||
{
|
||||
Cell cell = cells.GetChild(j).GetComponent<Cell>();
|
||||
cellList.Add(cell);
|
||||
}
|
||||
AddTask(new InputTask());
|
||||
}
|
||||
|
||||
cellList = cellList
|
||||
.OrderBy(cell => Vector3.Distance(cell.transform.position,outCell.transform.position))
|
||||
.ToList();
|
||||
}
|
||||
|
||||
public void AddTask(StackerCraneTask task)
|
||||
{
|
||||
taskQueue.Enqueue(task);
|
||||
onAddTaskCompletedEvent?.Invoke(this);
|
||||
|
||||
if (stackeCraneState == EStackeCraneState.Idle)
|
||||
ChangeStateAction();
|
||||
}
|
||||
|
||||
private void ChangeStateAction()
|
||||
private void ChangeState(StackerCraneState newState)
|
||||
{
|
||||
switch (stackeCraneState)
|
||||
switch (newState)
|
||||
{
|
||||
case EStackeCraneState.Idle:
|
||||
Idle();
|
||||
case StackerCraneState.Idle:
|
||||
updateAction = Idle;
|
||||
break;
|
||||
case EStackeCraneState.TaskReady:
|
||||
TaskReady();
|
||||
case StackerCraneState.TaskReady:
|
||||
updateAction = TaskReady;
|
||||
break;
|
||||
case EStackeCraneState.Move:
|
||||
StartCoroutine(Move());
|
||||
case StackerCraneState.ActionReady:
|
||||
updateAction = ActionReady;
|
||||
break;
|
||||
case EStackeCraneState.MoveEnd:
|
||||
MoveEnd();
|
||||
case StackerCraneState.MoveReady:
|
||||
updateAction = MoveReady;
|
||||
break;
|
||||
case EStackeCraneState.Load:
|
||||
StartCoroutine(Load());
|
||||
case StackerCraneState.Move:
|
||||
updateAction = Move;
|
||||
break;
|
||||
case EStackeCraneState.LoadEnd:
|
||||
LoadEnd();
|
||||
case StackerCraneState.MoveEnd:
|
||||
updateAction = MoveEnd;
|
||||
break;
|
||||
case EStackeCraneState.UnLoad:
|
||||
StartCoroutine(UnLoad());
|
||||
case StackerCraneState.LoadReady:
|
||||
updateAction = LoadReady;
|
||||
break;
|
||||
case EStackeCraneState.UnLoadEnd:
|
||||
UnLoadEnd();
|
||||
case StackerCraneState.ForkIn:
|
||||
updateAction = ForkIn;
|
||||
break;
|
||||
case EStackeCraneState.TaskEnd:
|
||||
TaskEnd();
|
||||
case StackerCraneState.ForkInEnd:
|
||||
updateAction = ForkInEnd;
|
||||
break;
|
||||
case StackerCraneState.ForkOut:
|
||||
updateAction = ForkOut;
|
||||
break;
|
||||
case StackerCraneState.ForkOutEnd:
|
||||
updateAction = ForkOutEnd;
|
||||
break;
|
||||
case StackerCraneState.Load:
|
||||
updateAction = Load;
|
||||
break;
|
||||
case StackerCraneState.LoadEnd:
|
||||
updateAction = LoadEnd;
|
||||
break;
|
||||
case StackerCraneState.UnloadReady:
|
||||
updateAction = UnloadReady;
|
||||
break;
|
||||
case StackerCraneState.Unload:
|
||||
updateAction = Unload;
|
||||
break;
|
||||
case StackerCraneState.UnloadEnd:
|
||||
updateAction = UnloadEnd;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void Idle()
|
||||
private void UnloadEnd()
|
||||
{
|
||||
if (taskQueue.Count > 0)
|
||||
{
|
||||
stackeCraneState = EStackeCraneState.TaskReady;
|
||||
}
|
||||
ChangeState(StackerCraneState.ForkOut);
|
||||
}
|
||||
|
||||
private void TaskReady()
|
||||
private void Unload()
|
||||
{
|
||||
if (taskQueue.Count == 0)
|
||||
{
|
||||
stackeCraneState = EStackeCraneState.Idle;
|
||||
return;
|
||||
}
|
||||
|
||||
if(taskQueue.Peek().taskType == ETaskType.Incoming)
|
||||
{
|
||||
if (GetInComeCellLoadCount() == 0)
|
||||
{
|
||||
Debug.LogWarning("시작 지점에 Load가 없습니다");
|
||||
taskQueue.Dequeue();
|
||||
currentTargetCell = originPos;
|
||||
stackeCraneState = EStackeCraneState.Move;
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (GetLoadCellCount() == 0)
|
||||
{
|
||||
Debug.LogWarning("stacker에 로드된 cell이 없습니다.");
|
||||
taskQueue.Dequeue();
|
||||
currentTargetCell = originPos;
|
||||
stackeCraneState = EStackeCraneState.Move;
|
||||
return;
|
||||
}
|
||||
}
|
||||
//PredictWorkEndTime(taskQueue.Count);
|
||||
|
||||
previousTask = currentTask;
|
||||
currentTask = taskQueue.Dequeue();
|
||||
|
||||
stackerCellIndex = -1;
|
||||
InitStackerCrane();
|
||||
|
||||
switch (currentTask.taskType)
|
||||
{
|
||||
case ETaskType.Incoming:
|
||||
currentTargetCell = incomeCell;
|
||||
break;
|
||||
case ETaskType.Outgoing:
|
||||
currentTargetCell = GetFullCell();
|
||||
break;
|
||||
}
|
||||
|
||||
onTaskReadyCompletedEvent?.Invoke(this);
|
||||
stackeCraneState = EStackeCraneState.Move;
|
||||
}
|
||||
|
||||
private IEnumerator Move()
|
||||
{
|
||||
while (!IsBodyMoveCompleted)
|
||||
{
|
||||
stackerCraneMove = Time.deltaTime * moveSpeed;
|
||||
MoveVerticalpollarToTarget();
|
||||
MoveBucketToTarget();
|
||||
|
||||
yield return null;
|
||||
}
|
||||
stackeCraneState = EStackeCraneState.MoveEnd;
|
||||
}
|
||||
|
||||
private void MoveEnd()
|
||||
{
|
||||
InitStackerCrane();
|
||||
|
||||
//TODO:: 위치 선정방식 변경
|
||||
if (currentTargetCell == originPos)
|
||||
{
|
||||
elapsedDistance = 0f;
|
||||
currentTask = new StackerCraneTask(ETaskType.None);
|
||||
onTaskEndCompletedEvent?.Invoke(this);
|
||||
stackeCraneState = EStackeCraneState.TaskReady;
|
||||
}
|
||||
else if (currentTargetCell == outCell)
|
||||
{
|
||||
stackeCraneState = EStackeCraneState.UnLoad;
|
||||
}
|
||||
else if(currentTargetCell == incomeCell)
|
||||
{
|
||||
stackeCraneState = EStackeCraneState.Load;
|
||||
}
|
||||
else if(currentTargetCell == GetEmptyCell())
|
||||
{
|
||||
if (currentTask.taskType == ETaskType.Incoming)
|
||||
stackeCraneState = EStackeCraneState.UnLoad;
|
||||
}
|
||||
else// if(currentTargetCell == GetFullCell())
|
||||
{
|
||||
stackeCraneState = EStackeCraneState.Load;
|
||||
}
|
||||
}
|
||||
|
||||
private IEnumerator Load()
|
||||
{
|
||||
while (!IsForkMoveCompleted)
|
||||
{
|
||||
stackerCraneMove = Time.deltaTime * moveSpeed;
|
||||
MoveForkToTarget();
|
||||
|
||||
yield return null;
|
||||
}
|
||||
|
||||
currentTargetCell.load.transform.parent = ForkLoadPlaceRoot;
|
||||
currentTargetCell.load.transform.localPosition = Vector3.zero;
|
||||
currentTargetCell.isLoad = false;
|
||||
currentTargetCell.load = null;
|
||||
|
||||
onLoadCompletedEvent.Invoke(this);
|
||||
|
||||
if (currentTask.taskType == ETaskType.Outgoing)
|
||||
stackerCellIndex = cellList.IndexOf(currentTargetCell);
|
||||
|
||||
InitStackerCrane();
|
||||
|
||||
while (!IsForkMoveCompleted)
|
||||
{
|
||||
stackerCraneMove = Time.deltaTime * moveSpeed;
|
||||
MoveForkToOrigin();
|
||||
|
||||
yield return null;
|
||||
}
|
||||
|
||||
InitStackerCrane();
|
||||
stackeCraneState = EStackeCraneState.LoadEnd;
|
||||
fork.Unload(moveTarget);
|
||||
ChangeState(StackerCraneState.UnloadEnd);
|
||||
}
|
||||
|
||||
private void LoadEnd()
|
||||
{
|
||||
if (currentTask.taskType == ETaskType.Incoming)
|
||||
currentTargetCell = GetEmptyCell();
|
||||
forkProgress = 0f;
|
||||
ChangeState(StackerCraneState.ForkOut);
|
||||
}
|
||||
|
||||
private void Load()
|
||||
{
|
||||
moveTarget.Unload(fork);
|
||||
ChangeState(StackerCraneState.LoadEnd);
|
||||
}
|
||||
|
||||
private void ForkOutEnd()
|
||||
{
|
||||
forkProgress = 0f;
|
||||
ChangeState(StackerCraneState.ActionReady);
|
||||
}
|
||||
|
||||
private void ForkOut()
|
||||
{
|
||||
forkProgress += forkSpeed * Time.deltaTime / forkSpeed;
|
||||
fork.transform.position = Vector3.Lerp(forkEnd, forkStart, forkProgress);
|
||||
if (forkProgress >= 1)
|
||||
{
|
||||
ChangeState(StackerCraneState.ForkOutEnd);
|
||||
}
|
||||
}
|
||||
|
||||
private void ForkInEnd()
|
||||
{
|
||||
forkProgress = 0f;
|
||||
if (fork.isEmpty)
|
||||
ChangeState(StackerCraneState.Load);
|
||||
else
|
||||
currentTargetCell = outCell;
|
||||
|
||||
InitStackerCrane();
|
||||
stackeCraneState = EStackeCraneState.Move;
|
||||
ChangeState(StackerCraneState.Unload);
|
||||
}
|
||||
|
||||
private IEnumerator UnLoad()
|
||||
private void ForkIn()
|
||||
{
|
||||
while (!IsForkMoveCompleted)
|
||||
forkProgress += forkSpeed* Time.deltaTime /forkSpeed;
|
||||
fork.transform.position = Vector3.Lerp(forkStart, forkEnd, forkProgress);
|
||||
if (forkProgress >= 1)
|
||||
{
|
||||
MoveForkToTarget();
|
||||
|
||||
yield return null;
|
||||
}
|
||||
|
||||
Load load = ForkLoadPlaceRoot.GetChild(0).gameObject.GetComponent<Load>();
|
||||
load.transform.parent = currentTargetCell.transform;
|
||||
load.transform.localPosition = Vector3.zero;
|
||||
currentTargetCell.isLoad = true;
|
||||
currentTargetCell.load = load;
|
||||
|
||||
if (currentTask.taskType == ETaskType.Incoming)
|
||||
stackerCellIndex = cellList.IndexOf(currentTargetCell);
|
||||
|
||||
InitStackerCrane();
|
||||
|
||||
while (!IsForkMoveCompleted)
|
||||
{
|
||||
MoveForkToOrigin();
|
||||
|
||||
yield return null;
|
||||
}
|
||||
|
||||
InitStackerCrane();
|
||||
stackeCraneState = EStackeCraneState.UnLoadEnd;
|
||||
}
|
||||
|
||||
private void UnLoadEnd()
|
||||
{
|
||||
stackeCraneState = EStackeCraneState.TaskEnd;
|
||||
}
|
||||
|
||||
private void TaskEnd()
|
||||
{
|
||||
if (taskQueue.Count == 0)
|
||||
{
|
||||
//goto home
|
||||
InitStackerCrane();
|
||||
currentTargetCell = originPos;
|
||||
stackeCraneState = EStackeCraneState.Move;
|
||||
}
|
||||
else
|
||||
{
|
||||
elapsedDistance = 0f;
|
||||
currentTask = new StackerCraneTask(ETaskType.None);
|
||||
onTaskEndCompletedEvent?.Invoke(this);
|
||||
stackeCraneState = EStackeCraneState.TaskReady;
|
||||
ChangeState(StackerCraneState.ForkInEnd);
|
||||
}
|
||||
}
|
||||
|
||||
public int GetInComeCellLoadCount()
|
||||
private void UnloadReady()
|
||||
{
|
||||
return incomeCell.transform.childCount;
|
||||
forkStart = fork.transform.position;
|
||||
forkEnd = moveTarget.transform.position;
|
||||
ChangeState(StackerCraneState.ForkIn);
|
||||
}
|
||||
|
||||
public int GetLoadCellCount()
|
||||
private void LoadReady()
|
||||
{
|
||||
return cellList.Count(cell => cell.isLoad);
|
||||
forkStart = fork.transform.position;
|
||||
forkEnd = moveTarget.transform.position;
|
||||
ChangeState(StackerCraneState.ForkIn);
|
||||
}
|
||||
|
||||
Cell GetEmptyCell()
|
||||
private void ActionReady()
|
||||
{
|
||||
var emptyCells = cellList.Where(cell => !cell.isLoad);
|
||||
return emptyCells.FirstOrDefault();
|
||||
}
|
||||
|
||||
Cell GetFullCell()
|
||||
{
|
||||
var fullCells = cellList.Where(cell => cell.isLoad);
|
||||
return fullCells.FirstOrDefault();
|
||||
}
|
||||
|
||||
private void InitStackerCrane()
|
||||
{
|
||||
verticalpillarT = 0f;
|
||||
bucketT = 0f;
|
||||
forkT = 0f;
|
||||
|
||||
VerticalPillarLerpStartPos = VerticalPillar.position;
|
||||
BucketLerpStartPos = Bucket.position;
|
||||
ForkLerpStartPos = Fork.position;
|
||||
}
|
||||
|
||||
private void MoveVerticalpollarToTarget()
|
||||
{
|
||||
verticalpollarTargetDistance = Mathf.Abs(VerticalPillarLerpStartPos.x - currentTargetCell.transform.position.x);
|
||||
verticalpillarT += stackerCraneMove / verticalpollarTargetDistance;
|
||||
Vector3 verticalPillarPos = VerticalPillar.position;
|
||||
verticalPillarPos.x = Mathf.Lerp(VerticalPillarLerpStartPos.x, currentTargetCell.transform.position.x, verticalpillarT);
|
||||
VerticalPillar.position = verticalPillarPos;
|
||||
if(verticalpollarTargetDistance >= bucketTargetDistance)
|
||||
elapsedDistance += stackerCraneMove;
|
||||
}
|
||||
|
||||
private void MoveBucketToTarget()
|
||||
{
|
||||
bucketTargetDistance = Mathf.Abs(BucketLerpStartPos.y - currentTargetCell.transform.position.y);
|
||||
bucketT += stackerCraneMove / bucketTargetDistance;
|
||||
Vector3 bucketPos = Bucket.position;
|
||||
bucketPos.y = Mathf.Lerp(BucketLerpStartPos.y, currentTargetCell.transform.position.y, bucketT);
|
||||
Bucket.position = bucketPos;
|
||||
if (bucketTargetDistance >= verticalpollarTargetDistance)
|
||||
elapsedDistance += stackerCraneMove;
|
||||
}
|
||||
|
||||
private void MoveForkToTarget()
|
||||
{
|
||||
forkT += stackerCraneMove / forkRange;
|
||||
Vector3 forkPos = Fork.position;
|
||||
forkPos.z = Mathf.Lerp(ForkLerpStartPos.z, currentTargetCell.transform.position.z >= 0 ? forkRange : -forkRange, forkT);
|
||||
Fork.position = forkPos;
|
||||
elapsedDistance += stackerCraneMove;
|
||||
}
|
||||
|
||||
private void MoveForkToOrigin()
|
||||
{
|
||||
forkT += stackerCraneMove / forkRange;
|
||||
Vector3 forkPos = Fork.position;
|
||||
forkPos.z = Mathf.Lerp(ForkLerpStartPos.z, 0f, forkT);
|
||||
Fork.position = forkPos;
|
||||
elapsedDistance += stackerCraneMove;
|
||||
}
|
||||
|
||||
private float totalDistance = 0f;
|
||||
private float elapsedDistance = 0f;
|
||||
int stackerCellIndex = -1;
|
||||
List<Cell> modifiedCellList = new List<Cell>();
|
||||
Cell targetStackerCell = null;
|
||||
|
||||
public void PredictWorkEndTime(StackerCraneTask targetTask)
|
||||
{
|
||||
if (!IsTaskValid(targetTask))
|
||||
if (actionQueue.Count == 0)
|
||||
{
|
||||
Debug.LogWarning("잘못된 task가 포함되어 있습니다.");
|
||||
ChangeState(StackerCraneState.Idle);
|
||||
return;
|
||||
}
|
||||
currentAction = actionQueue.Dequeue();
|
||||
switch (currentAction)
|
||||
{
|
||||
case StackerCraneMoveToInputAction moveToInputAction:
|
||||
moveTarget = inputPort;
|
||||
ChangeState(StackerCraneState.MoveReady);
|
||||
break;
|
||||
case StackerCraneMoveToOutputAction moveToOutputAction:
|
||||
moveTarget = outputPort;
|
||||
ChangeState(StackerCraneState.MoveReady);
|
||||
break;
|
||||
case StackerCraneMoveToEmptyCellAction moveToEmptyCellAction:
|
||||
moveTarget = cells.FirstOrDefault(cell => cell.isEmpty);
|
||||
ChangeState(StackerCraneState.MoveReady);
|
||||
break;
|
||||
case StackerCraneMoveToFullCellAction moveToFullCellAction:
|
||||
moveTarget = cells.FirstOrDefault(cell => !cell.isEmpty);
|
||||
ChangeState(StackerCraneState.MoveReady);
|
||||
break;
|
||||
case StackerCraneLoadAction loadAction:
|
||||
ChangeState(StackerCraneState.LoadReady);
|
||||
break;
|
||||
case StackerCraneUnloadAction unloadAction:
|
||||
ChangeState(StackerCraneState.UnloadReady);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
StackerCraneTask tempPreviousTask = previousTask;
|
||||
StackerCraneTask tempCurrentTask = currentTask;
|
||||
private void MoveEnd()
|
||||
{
|
||||
pillarMoveProgress = 0f;
|
||||
bucketMoveProgress = 0f;
|
||||
ChangeState(StackerCraneState.ActionReady);
|
||||
}
|
||||
|
||||
private void Move()
|
||||
{
|
||||
pillarMoveProgress += pillarMoveSpeed *Time.deltaTime / pillarMoveSpeed;
|
||||
bucketMoveProgress += bucketMoveSpeed * Time.deltaTime / bucketMoveSpeed;
|
||||
VerticalPillar.position = Vector3.Lerp(pillarStart, pillarEnd, pillarMoveProgress);
|
||||
var bPos = Bucket.position;
|
||||
bPos.y= Mathf.Lerp(bucketStart, bucketEnd, bucketMoveProgress);
|
||||
Bucket.position = bPos;
|
||||
if (pillarMoveProgress >= 1 && bucketMoveProgress >= 1)
|
||||
{
|
||||
ChangeState(StackerCraneState.MoveEnd);
|
||||
}
|
||||
}
|
||||
|
||||
private void MoveReady()
|
||||
{
|
||||
pillarStart = VerticalPillar.position;
|
||||
bucketStart = Bucket.position.y;
|
||||
pillarEnd = VerticalPillar.position;
|
||||
pillarEnd.x = moveTarget.transform.position.x;
|
||||
|
||||
bucketEnd = moveTarget.transform.position.y;
|
||||
ChangeState(StackerCraneState.Move);
|
||||
}
|
||||
|
||||
private void TaskReady()
|
||||
{
|
||||
currentTask = taskQueue.Dequeue();
|
||||
|
||||
totalDistance = 0;
|
||||
|
||||
ProcessTask(tempPreviousTask, tempCurrentTask);
|
||||
tempPreviousTask = tempCurrentTask;
|
||||
|
||||
foreach (StackerCraneTask task in taskQueue)
|
||||
for (int i = 0; i < currentTask.actions.Count; i++)
|
||||
{
|
||||
tempCurrentTask = task;
|
||||
ProcessTask(tempPreviousTask, tempCurrentTask);
|
||||
tempPreviousTask = tempCurrentTask;
|
||||
|
||||
if (targetTask == tempCurrentTask)
|
||||
{
|
||||
print("소요예정시간 " + (totalDistance - elapsedDistance) / moveSpeed);
|
||||
break;
|
||||
}
|
||||
actionQueue.Enqueue(currentTask.actions[i]);
|
||||
}
|
||||
|
||||
for (int i = 0; i < modifiedCellList.Count; i++)
|
||||
{
|
||||
modifiedCellList[i].isLoad = !modifiedCellList[i].isLoad;
|
||||
}
|
||||
modifiedCellList.Clear();
|
||||
ChangeState(StackerCraneState.ActionReady);
|
||||
}
|
||||
|
||||
private bool IsTaskValid(StackerCraneTask targetTask)
|
||||
private void Idle()
|
||||
{
|
||||
int outgoingTaskCount = 0;
|
||||
bool isLoadOrUnloadComplete = stackerCellIndex != -1;
|
||||
int loadCountAdjustment = currentTask.taskType == ETaskType.Incoming ? 1 : -1;
|
||||
|
||||
foreach (StackerCraneTask task in taskQueue)
|
||||
if(taskQueue.Count > 0)
|
||||
{
|
||||
outgoingTaskCount += task.taskType == ETaskType.Outgoing ? 1 : -1;
|
||||
|
||||
int totalLoadCount = GetLoadCellCount() + (isLoadOrUnloadComplete ? 0 : loadCountAdjustment);
|
||||
|
||||
if (totalLoadCount < outgoingTaskCount)
|
||||
{
|
||||
print("소요예정시간 " + float.MaxValue);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (task == targetTask)
|
||||
break;
|
||||
ChangeState(StackerCraneState.TaskReady);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void ProcessTask(StackerCraneTask previousTask, StackerCraneTask currentTask)
|
||||
{
|
||||
List<(Cell, Cell)> pathList = new List<(Cell, Cell)>();
|
||||
Cell previousEndPos = originPos;
|
||||
|
||||
switch (previousTask.taskType)
|
||||
{
|
||||
case ETaskType.Incoming:
|
||||
previousEndPos = stackerCellIndex != -1 ? cellList[stackerCellIndex] : targetStackerCell;
|
||||
stackerCellIndex = -1;
|
||||
break;
|
||||
case ETaskType.Outgoing:
|
||||
previousEndPos = outCell;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (currentTask.taskType)
|
||||
{
|
||||
case ETaskType.Incoming:
|
||||
targetStackerCell = GetEmptyCell();
|
||||
pathList = new List<(Cell, Cell)>
|
||||
{
|
||||
(previousEndPos, incomeCell),
|
||||
(incomeCell, targetStackerCell)
|
||||
};
|
||||
targetStackerCell.isLoad = true;
|
||||
break;
|
||||
case ETaskType.Outgoing:
|
||||
targetStackerCell = GetFullCell();
|
||||
pathList = new List<(Cell, Cell)>
|
||||
{
|
||||
(previousEndPos, targetStackerCell),
|
||||
(targetStackerCell, outCell)
|
||||
};
|
||||
targetStackerCell.isLoad = false;
|
||||
break;
|
||||
}
|
||||
modifiedCellList.Add(targetStackerCell);
|
||||
totalDistance += CalculatePathDistance(pathList) + forkRange * 4;
|
||||
}
|
||||
|
||||
private float CalculatePathDistance(List<(Cell, Cell)> pathList)
|
||||
{
|
||||
float distance = 0f;
|
||||
foreach (var path in pathList)
|
||||
{
|
||||
distance += CalculateDistance(path);
|
||||
}
|
||||
return distance;
|
||||
}
|
||||
|
||||
private float CalculateDistance((Cell, Cell) value)
|
||||
{
|
||||
float xDistance = Mathf.Abs(value.Item1.transform.position.x - value.Item2.transform.position.x);
|
||||
float yDistance = Mathf.Abs(value.Item1.transform.position.y - value.Item2.transform.position.y);
|
||||
return Mathf.Max(xDistance, yDistance);
|
||||
}
|
||||
|
||||
internal object Select(Func<object, object> value)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
namespace XED.VirtualFactory
|
||||
{
|
||||
public class StackerCraneAction
|
||||
{
|
||||
}
|
||||
|
||||
public class StackerCraneMoveToInputAction : StackerCraneAction
|
||||
{
|
||||
}
|
||||
|
||||
public class StackerCraneMoveToOutputAction : StackerCraneAction
|
||||
{
|
||||
}
|
||||
|
||||
public class StackerCraneMoveToEmptyCellAction : StackerCraneAction
|
||||
{
|
||||
}
|
||||
|
||||
public class StackerCraneMoveToFullCellAction : StackerCraneAction
|
||||
{
|
||||
}
|
||||
|
||||
public class StackerCraneLoadAction: StackerCraneAction
|
||||
{
|
||||
}
|
||||
public class StackerCraneUnloadAction : StackerCraneAction
|
||||
{
|
||||
}
|
||||
public class StackerCraneMoveToHomeAction : StackerCraneAction
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 470b868bb22514947aa4b2f92746b46e
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace XED.VirtualFactory
|
||||
{
|
||||
public class StackerCraneFork: Loader
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1a308d559e458b94aadec13b64a11ef2
|
||||
@@ -1,7 +1,6 @@
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using XRLib;
|
||||
using static XED.VirtualFactory.StackerCrane;
|
||||
|
||||
namespace XED.VirtualFactory
|
||||
{
|
||||
@@ -50,14 +49,15 @@ namespace XED.VirtualFactory
|
||||
|
||||
private string DefaultLogForm(StackerCrane sc, string message)
|
||||
{
|
||||
logCount++;
|
||||
long currentTick = stopwatch.ElapsedTicks;
|
||||
ETaskType currentTask = sc.currentTask.taskType;
|
||||
EStackeCraneState currentState = sc.stackeCraneState;
|
||||
int stackerLoadCellCount = sc.GetLoadCellCount();
|
||||
//logCount++;
|
||||
//long currentTick = stopwatch.ElapsedTicks;
|
||||
//ETaskType currentTask = sc.currentTask.taskType;
|
||||
//StackerCraneState currentState = sc.stackeCraneState;
|
||||
//int stackerLoadCellCount = sc.GetLoadCellCount();
|
||||
|
||||
string log = $"{logCount.ToString("D8")}:message={message}/task={currentTask}/state={currentState}/LoadCellCount={stackerLoadCellCount}[{currentTick.ToString("D16")}]";
|
||||
return log;
|
||||
//string log = $"{logCount.ToString("D8")}:message={message}/task={currentTask}/state={currentState}/LoadCellCount={stackerLoadCellCount}[{currentTick.ToString("D16")}]";
|
||||
//return log;
|
||||
return "";
|
||||
}
|
||||
|
||||
void OnDisable()
|
||||
|
||||
@@ -19,13 +19,14 @@ namespace XED.VirtualFactory
|
||||
{
|
||||
bool added = stackerCranes.Add(stackerCrane);
|
||||
|
||||
if (added)
|
||||
{
|
||||
stackerCrane.onTaskReadyCompletedEvent += stackerCraneLog.TaskReadyLog;
|
||||
stackerCrane.onTaskEndCompletedEvent += stackerCraneLog.TaskEndLogLog;
|
||||
stackerCrane.onStateChangeEvent += stackerCraneLog.StateChangeLog;
|
||||
stackerCrane.onAddTaskCompletedEvent += stackerCraneLog.TaskAddLog;
|
||||
}
|
||||
//if (added)
|
||||
//{
|
||||
// stackerCrane.onTaskReadyCompletedEvent += stackerCraneLog.TaskReadyLog;
|
||||
// stackerCrane.onTaskEndCompletedEvent += stackerCraneLog.TaskEndLogLog;
|
||||
// stackerCrane.onStateChangeEvent += stackerCraneLog.StateChangeLog;
|
||||
// stackerCrane.onAddTaskCompletedEvent += stackerCraneLog.TaskAddLog;
|
||||
//}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,18 +6,30 @@ namespace XED.VirtualFactory
|
||||
{
|
||||
public class StackerCraneTask
|
||||
{
|
||||
public ETaskType taskType;
|
||||
public List<StackerCraneAction> actions = new();
|
||||
}
|
||||
|
||||
public StackerCraneTask(ETaskType taskType)
|
||||
public class InputTask : StackerCraneTask
|
||||
{
|
||||
public InputTask()
|
||||
{
|
||||
this.taskType = taskType;
|
||||
actions.Add(new StackerCraneMoveToInputAction());
|
||||
actions.Add(new StackerCraneLoadAction());
|
||||
actions.Add(new StackerCraneMoveToEmptyCellAction());
|
||||
actions.Add(new StackerCraneUnloadAction());
|
||||
actions.Add(new StackerCraneMoveToHomeAction());
|
||||
}
|
||||
}
|
||||
|
||||
public enum ETaskType
|
||||
public class OutputTask : StackerCraneTask
|
||||
{
|
||||
None,
|
||||
Incoming,
|
||||
Outgoing,
|
||||
public OutputTask()
|
||||
{
|
||||
actions.Add(new StackerCraneMoveToFullCellAction());
|
||||
actions.Add(new StackerCraneLoadAction());
|
||||
actions.Add(new StackerCraneMoveToOutputAction());
|
||||
actions.Add(new StackerCraneUnloadAction());
|
||||
actions.Add(new StackerCraneMoveToHomeAction());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ GameObject:
|
||||
- component: {fileID: 4856276352014148663}
|
||||
- component: {fileID: 2153441290638738476}
|
||||
- component: {fileID: 5777722818375630786}
|
||||
- component: {fileID: 6917507228578421749}
|
||||
m_Layer: 0
|
||||
m_Name: OutgoingPos
|
||||
m_TagString: Untagged
|
||||
@@ -46,8 +47,17 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: 7c66d88dac8b35f4d9aeeb44d2d3d955, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
physics:
|
||||
areabox: {fileID: 0}
|
||||
metaData:
|
||||
address:
|
||||
modeling: {fileID: 0}
|
||||
portrait: {fileID: 0}
|
||||
assetLabel: 0
|
||||
IsDisplayable: 0
|
||||
IsInteractible: 0
|
||||
currentLoad: {fileID: 0}
|
||||
isLoad: 0
|
||||
load: {fileID: 0}
|
||||
--- !u!33 &2153441290638738476
|
||||
MeshFilter:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -101,6 +111,28 @@ MeshRenderer:
|
||||
m_SortingLayer: 0
|
||||
m_SortingOrder: 0
|
||||
m_AdditionalVertexStreams: {fileID: 0}
|
||||
--- !u!114 &6917507228578421749
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 166620110472332507}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 4fce4835cb2aae74da849f6efffd5997, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
physics:
|
||||
areabox: {fileID: 0}
|
||||
metaData:
|
||||
address:
|
||||
modeling: {fileID: 0}
|
||||
portrait: {fileID: 0}
|
||||
assetLabel: 0
|
||||
IsDisplayable: 0
|
||||
IsInteractible: 0
|
||||
currentLoad: {fileID: 0}
|
||||
--- !u!1 &305061147023869161
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -616,16 +648,27 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: 4520bd875396ea544824f64eae4953d2, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
VerticalPillar: {fileID: 0}
|
||||
Bucket: {fileID: 0}
|
||||
Fork: {fileID: 0}
|
||||
incomeCell: {fileID: 0}
|
||||
originPos: {fileID: 0}
|
||||
outCell: {fileID: 0}
|
||||
currentTargetCell: {fileID: 0}
|
||||
physics:
|
||||
areabox: {fileID: 0}
|
||||
metaData:
|
||||
address:
|
||||
modeling: {fileID: 0}
|
||||
portrait: {fileID: 0}
|
||||
assetLabel: 0
|
||||
IsDisplayable: 0
|
||||
IsInteractible: 0
|
||||
Storage: {fileID: 0}
|
||||
ForkLoadPlaceRoot: {fileID: 0}
|
||||
_stackeCraneState: 0
|
||||
VerticlaPillar: {fileID: 0}
|
||||
Bucket: {fileID: 0}
|
||||
fork: {fileID: 0}
|
||||
inputPort: {fileID: 0}
|
||||
outputPort: {fileID: 0}
|
||||
currentState: 0
|
||||
cells: []
|
||||
autoInput: 0
|
||||
pillarMoveSpeed: 1
|
||||
bucketMoveSpeed: 1
|
||||
moveTarget: {fileID: 0}
|
||||
--- !u!1 &2609216119150044126
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -974,8 +1017,17 @@ MonoBehaviour:
|
||||
m_Script: {fileID: 11500000, guid: 7c66d88dac8b35f4d9aeeb44d2d3d955, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
physics:
|
||||
areabox: {fileID: 0}
|
||||
metaData:
|
||||
address:
|
||||
modeling: {fileID: 0}
|
||||
portrait: {fileID: 0}
|
||||
assetLabel: 0
|
||||
IsDisplayable: 0
|
||||
IsInteractible: 0
|
||||
currentLoad: {fileID: 0}
|
||||
isLoad: 0
|
||||
load: {fileID: 0}
|
||||
--- !u!1 &3689563023103516014
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -1281,7 +1333,7 @@ GameObject:
|
||||
m_Component:
|
||||
- component: {fileID: 2678014717373080131}
|
||||
- component: {fileID: 4426401912820879313}
|
||||
- component: {fileID: 1932890394157396209}
|
||||
- component: {fileID: 5062054334540688330}
|
||||
m_Layer: 0
|
||||
m_Name: InComingPos
|
||||
m_TagString: Untagged
|
||||
@@ -1312,7 +1364,7 @@ MeshFilter:
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 5067924305745637229}
|
||||
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
|
||||
--- !u!114 &1932890394157396209
|
||||
--- !u!114 &5062054334540688330
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
@@ -1321,11 +1373,19 @@ MonoBehaviour:
|
||||
m_GameObject: {fileID: 5067924305745637229}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 7c66d88dac8b35f4d9aeeb44d2d3d955, type: 3}
|
||||
m_Script: {fileID: 11500000, guid: 00bad124f10f0e44fab7f4f507ecf764, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
isLoad: 0
|
||||
load: {fileID: 0}
|
||||
physics:
|
||||
areabox: {fileID: 0}
|
||||
metaData:
|
||||
address:
|
||||
modeling: {fileID: 0}
|
||||
portrait: {fileID: 0}
|
||||
assetLabel: 0
|
||||
IsDisplayable: 0
|
||||
IsInteractible: 0
|
||||
currentLoad: {fileID: 0}
|
||||
--- !u!1 &5130920285189644132
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
|
||||
@@ -18,42 +18,42 @@ namespace XED.VirtualFactory
|
||||
|
||||
void Start()
|
||||
{
|
||||
stackerCrane = FindSingle<StackerCrane>();
|
||||
//stackerCrane = FindSingle<StackerCrane>();
|
||||
}
|
||||
|
||||
void Update()
|
||||
{
|
||||
workqueue = stackerCrane.taskQueue;
|
||||
time += Time.deltaTime;
|
||||
text_currentWork.text = stackerCrane.currentTask.taskType.ToString();
|
||||
text_time.text = time.ToString("N2");
|
||||
text_work.text = "";
|
||||
foreach (StackerCraneTask task in workqueue)
|
||||
{
|
||||
text_work.text += task.taskType + "\n";
|
||||
}
|
||||
//workqueue = stackerCrane.taskQueue;
|
||||
//time += Time.deltaTime;
|
||||
//text_currentWork.text = stackerCrane.currentTask.taskType.ToString();
|
||||
//text_time.text = time.ToString("N2");
|
||||
//text_work.text = "";
|
||||
//foreach (StackerCraneTask task in workqueue)
|
||||
//{
|
||||
// text_work.text += task.taskType + "\n";
|
||||
//}
|
||||
|
||||
for (int i = 0; i <= 9; i++)
|
||||
{
|
||||
if (Input.GetKeyDown((KeyCode)Enum.Parse(typeof(KeyCode), "Alpha" + i)))
|
||||
{
|
||||
if (i > workqueue.Count)
|
||||
{
|
||||
Debug.LogWarning("Á¸ÀçÇÏÁö ¾Ê´Â taskÀÔ´Ï´Ù.");
|
||||
return;
|
||||
}
|
||||
//for (int i = 0; i <= 9; i++)
|
||||
//{
|
||||
// if (Input.GetKeyDown((KeyCode)Enum.Parse(typeof(KeyCode), "Alpha" + i)))
|
||||
// {
|
||||
// if (i > workqueue.Count)
|
||||
// {
|
||||
// Debug.LogWarning("Á¸ÀçÇÏÁö ¾Ê´Â taskÀÔ´Ï´Ù.");
|
||||
// return;
|
||||
// }
|
||||
|
||||
int currentIndex = 0;
|
||||
foreach (StackerCraneTask work in workqueue)
|
||||
{
|
||||
currentIndex++;
|
||||
if (currentIndex == i)
|
||||
{
|
||||
stackerCrane.PredictWorkEndTime(work);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// int currentIndex = 0;
|
||||
// foreach (StackerCraneTask work in workqueue)
|
||||
// {
|
||||
// currentIndex++;
|
||||
// if (currentIndex == i)
|
||||
// {
|
||||
// stackerCrane.PredictWorkEndTime(work);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
using XRLib;
|
||||
|
||||
namespace XED.VirtualFactory
|
||||
{
|
||||
public class WorkController : MonoBehaviour, ISingle
|
||||
{
|
||||
StackerCrane stackerCrane;
|
||||
|
||||
[SerializeField]
|
||||
private Load loadPrefab;
|
||||
|
||||
public override void AfterAwake()
|
||||
{
|
||||
stackerCrane = FindSingle<StackerCrane>();
|
||||
stackerCrane.onLoadCompletedEvent += ReArrangeCargo;
|
||||
}
|
||||
|
||||
void Update()
|
||||
{
|
||||
if (Input.GetKeyDown(KeyCode.C))
|
||||
{
|
||||
SpawnCargo();
|
||||
}
|
||||
if (Input.GetKeyDown(KeyCode.I))
|
||||
{
|
||||
stackerCrane.AddTask(new StackerCraneTask(ETaskType.Incoming));
|
||||
}
|
||||
if (Input.GetKeyDown(KeyCode.O))
|
||||
{
|
||||
stackerCrane.AddTask(new StackerCraneTask(ETaskType.Outgoing));
|
||||
}
|
||||
|
||||
if (stackerCrane.incomeCell.load == null)
|
||||
{
|
||||
if(readyCargos.Count == 0)
|
||||
return;
|
||||
|
||||
readyCargos.RemoveAt(0);
|
||||
|
||||
if (readyCargos.Count == 0)
|
||||
return;
|
||||
|
||||
var cargo = readyCargos.First();
|
||||
stackerCrane.incomeCell.load = cargo;
|
||||
}
|
||||
}
|
||||
List<Load> readyCargos = new();
|
||||
int index = 0;
|
||||
private void SpawnCargo()
|
||||
{
|
||||
Load cargo = Instantiate(loadPrefab);
|
||||
cargo.name = index.ToString();
|
||||
index++;
|
||||
cargo.transform.parent = stackerCrane.incomeCell.transform;
|
||||
cargo.transform.localPosition = new Vector3(0f, stackerCrane.incomeCell.transform.childCount - 0.5f, 0f);
|
||||
if (stackerCrane.incomeCell.load == null)
|
||||
stackerCrane.incomeCell.load = cargo;
|
||||
readyCargos.Add(cargo);
|
||||
}
|
||||
|
||||
public void ReArrangeCargo(StackerCrane sc)
|
||||
{
|
||||
for (int i = 0; i < stackerCrane.incomeCell.transform.childCount; i++)
|
||||
{
|
||||
stackerCrane.incomeCell.transform.GetChild(i).transform.localPosition = new Vector3(0f, i + 0.5f, 0f);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7f04208229125ce4f9ef15b712a31bd7
|
||||
@@ -70,10 +70,10 @@ namespace XED.Manage
|
||||
agvNodeManager.onNodeDeselected += nodeGizmoController.Detach;
|
||||
agvNodeManager.onNodeSettingSelected += canvas_Popup.agvnodepopup.Popup;
|
||||
agvNodeManager.onNodeDeselected += canvas_Popup.agvnodepopup.Popdown;
|
||||
agvNodeManager.onNodeSequenceOrdered += agvManager.ordertoAGV;
|
||||
//agvNodeManager.onNodeSequenceOrdered += agvManager.ordertoAGV;
|
||||
agvNodeManager.onNodeSequenceUpdated += canvas_Popup.agvnodemodepopup.UpdateTextSelectedAGVNode;
|
||||
|
||||
agvManager.onOrderStarted += agvNodeLinkManager.AddLines;
|
||||
//agvManager.onOrderStarted += agvNodeLinkManager.AddLines;
|
||||
}
|
||||
|
||||
void UIConnection()
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using Newtonsoft.Json;
|
||||
using UnityEngine;
|
||||
using XED.Attributes;
|
||||
using XED.VirtualFactory;
|
||||
@@ -52,5 +53,10 @@ namespace XED
|
||||
public virtual void MaterialChange(Material mat)
|
||||
{
|
||||
}
|
||||
|
||||
public virtual string ToJson()
|
||||
{
|
||||
return JsonConvert.SerializeObject(entity);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
using XED.VirtualFactory;
|
||||
|
||||
namespace XED
|
||||
@@ -9,41 +11,164 @@ namespace XED
|
||||
public List<StackerCrane> stackerCranes = new();
|
||||
public AGVManager agvManager;
|
||||
public AGVMap agvMap;
|
||||
public List<Load> loads = new();
|
||||
public Load prf_Load;
|
||||
public PortMap portMap;
|
||||
public List<Product> loads = new();
|
||||
public Product prf_Load;
|
||||
public AGVNode startNode;
|
||||
|
||||
public bool stackerHasEmptyCell;
|
||||
public int maxAGVCount = 4;
|
||||
public enum FactoryNeeds
|
||||
{
|
||||
NeedAGV,
|
||||
NeedLoad,
|
||||
NeedStackerInputLoad,
|
||||
NeedStackerInput,
|
||||
}
|
||||
|
||||
public bool agvIsLack;
|
||||
public bool loadIsLack;
|
||||
public List<FactoryNeeds> needs = new();
|
||||
public event Action scanningAction;
|
||||
public event Action solutionAction;
|
||||
public override void AfterAwake()
|
||||
{
|
||||
agvMap = FindSingle<AGVMap>();
|
||||
portMap = FindSingle<PortMap>();
|
||||
agvManager = FindSingle<AGVManager>();
|
||||
stackerCranes = FindObjectsByType<StackerCrane>(UnityEngine.FindObjectsSortMode.None).ToList();
|
||||
FactoryStatusCheck();
|
||||
|
||||
scanningAction += CheckAGVCount;
|
||||
scanningAction += CheckStackerSpace;
|
||||
scanningAction += CheckStackerInput;
|
||||
}
|
||||
|
||||
void FactoryStatusCheck()
|
||||
private void CheckStackerInput()
|
||||
{
|
||||
if (loads.Count == 0)
|
||||
foreach (var stacker in stackerCranes)
|
||||
{
|
||||
if(agvMap.GetEmptyNode(AGVNodeType.Load, out var node))
|
||||
if (!stacker.hasEmptyCell)
|
||||
continue;
|
||||
|
||||
if (stacker.inputPort.isEmpty)
|
||||
{
|
||||
var worker = agvManager.GetIdleAGV();
|
||||
node.Load(CreateEmptyLoad());
|
||||
worker.transform.position = node.transform.position;
|
||||
worker.AddOrder(new AGVOrderClass(AGVTaskType.MoveToTarget, node.gameObject));
|
||||
worker.AddOrder(new AGVOrderClass(AGVTaskType.LoadCargo, node.loadSocket, node));
|
||||
worker.AddOrder(new AGVOrderClass(AGVTaskType.SpinToTarget, node.linkedNodes[0].gameObject));
|
||||
worker.AddOrder(new AGVOrderClass(AGVTaskType.MoveToTarget, node.linkedNodes[0].gameObject));
|
||||
//worker.AddOrder(new AGVOrderClass(AGVTaskType.MoveToTarget, node.linkedNodes[0].gameObject));
|
||||
Debug.Log("Need Stacker Input Load");
|
||||
needs.Add(FactoryNeeds.NeedStackerInputLoad);
|
||||
return;
|
||||
}
|
||||
|
||||
Debug.Log($"Need Stacker Input");
|
||||
needs.Add(FactoryNeeds.NeedStackerInput);
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
ScanningVirtualFactory();
|
||||
Solutioning();
|
||||
}
|
||||
|
||||
void ScanningVirtualFactory()
|
||||
{
|
||||
scanningAction?.Invoke();
|
||||
}
|
||||
|
||||
void Solutioning()
|
||||
{
|
||||
foreach(var n in needs)
|
||||
{
|
||||
switch (n)
|
||||
{
|
||||
case FactoryNeeds.NeedAGV:
|
||||
solutionAction += GenerateAGV;
|
||||
break;
|
||||
case FactoryNeeds.NeedLoad:
|
||||
solutionAction += GenerateLoad;
|
||||
break;
|
||||
case FactoryNeeds.NeedStackerInputLoad:
|
||||
solutionAction += DeliveryStackerInputLoad;
|
||||
break;
|
||||
}
|
||||
}
|
||||
solutionAction?.Invoke();
|
||||
solutionAction = null;
|
||||
needs.Clear();
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
void CheckStackerSpace()
|
||||
{
|
||||
if (stackerCranes.Sum(sc => sc.cells.Count()) == loads.Count)
|
||||
return;
|
||||
|
||||
foreach (var stacker in stackerCranes)
|
||||
{
|
||||
if (stacker.hasEmptyCell)
|
||||
{
|
||||
Debug.Log($"Need Stacker Load");
|
||||
needs.Add(FactoryNeeds.NeedLoad);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Load CreateEmptyLoad()
|
||||
void CheckAGVCount()
|
||||
{
|
||||
var load = Instantiate(prf_Load);
|
||||
loads.Add(load);
|
||||
load.entity = new LoadEntity();
|
||||
load.entity.id = loads.Count.ToString();
|
||||
return load;
|
||||
Debug.Log($"CheckAGVCount");
|
||||
if (maxAGVCount > agvManager.agvs.Count)
|
||||
{
|
||||
needs.Add(FactoryNeeds.NeedAGV);
|
||||
}
|
||||
else
|
||||
{
|
||||
scanningAction -= CheckAGVCount;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user