public IEnumerator Restore(RRCSManager manager) { Dictionary <string, GameObject> typeMap = new Dictionary <string, GameObject>(); typeMap.Add(typeof(RRButtonUi).FullName, manager.NodeUiPrefabRoot.GetComponentInChildren <RRButtonUi>(true).gameObject); typeMap.Add(typeof(StageLightUi).FullName, manager.NodeUiPrefabRoot.GetComponentInChildren <StageLightUi>(true).gameObject); typeMap.Add(typeof(SignUi).FullName, manager.NodeUiPrefabRoot.GetComponentInChildren <SignUi>(true).gameObject); var chipPrefabs = manager.NodeUiPrefabRoot.GetComponentsInChildren <ChipUi>(true); foreach (var prefab in chipPrefabs) { typeMap.Add(Enum.GetName(typeof(ChipUi.ChipType), prefab.type), prefab.gameObject); } var gizmoPrefabs = manager.NodeUiPrefabRoot.GetComponentsInChildren <GizmoUi>(true); foreach (var prefab in gizmoPrefabs) { typeMap.Add(Enum.GetName(typeof(GizmoUi.GizmoType), prefab.type), prefab.gameObject); } Dictionary <NodeSetting.SettingType, int> settingsTypeIndex = new Dictionary <NodeSetting.SettingType, int>(); foreach (StorageNode storageNode in graph) { settingsTypeIndex.Clear(); var typeKey = storageNode.uiType; if (typeKey == typeof(ChipUi).FullName) { typeKey = storageNode.typeParams; } if (typeKey == typeof(GizmoUi).FullName) { typeKey = storageNode.typeParams; } if (!typeMap.ContainsKey(typeKey)) { throw new InvalidOperationException("Invalid node type " + typeKey + "."); } GameObject go = GameObject.Instantiate(typeMap[typeKey], manager.WorldCanvas.transform); go.transform.SetAsFirstSibling(); NodeUi ui = go.GetComponent <NodeUi>(); ui.ParseParams(storageNode.typeParams); go.transform.position = storageNode.position; CircuitNode node = ui.Node; foreach (NodeSettingContainer settingContainer in storageNode.settings) { int offset; settingsTypeIndex.TryGetValue(settingContainer.type, out offset); int index = Array.FindIndex(node.settings, offset, s => s.type == settingContainer.type); if (index < 0) { Debug.Log("Stored setting " + settingContainer.type + " for type " + typeKey + " not found with offset " + offset + "."); continue; } NodeSetting setting = node.settings[index]; DebugUtils.Assert(settingContainer.type == setting.type); setting.ParseValue(settingContainer.value); settingsTypeIndex[settingContainer.type] = index + 1; } } DebugUtils.Assert(manager.circuitManager.Nodes.Count == graph.Length); yield return(0); List <CircuitNode> nodes = manager.circuitManager.Nodes; for (int nodeIndex = 0; nodeIndex < graph.Length; nodeIndex++) { CircuitNode node = nodes[nodeIndex]; StorageNode storageNode = graph[nodeIndex]; for (int portIndex = 0; portIndex < storageNode.connections.Length; portIndex++) { NodeConnection connection = storageNode.connections[portIndex]; if (connection.nodeIndex >= 0 && connection.portIndex >= 0) { InputPort port = node.inputPorts[portIndex]; OutputPort connectedPort = nodes[connection.nodeIndex].outputPorts[connection.portIndex]; port.Connect(connectedPort); } } if (storageNode.transitions != null) { foreach (var transition in storageNode.transitions) { var sourceStatePort = nodes[transition.sourceNodeIndex].statePort; sourceStatePort.Connect(nodes[transition.targetNodeIndex].statePort); if (transition.transitionEnabledConnection != null && transition.transitionEnabledConnection.nodeIndex >= 0 && transition.transitionEnabledConnection.portIndex >= 0) { StateMachineTransition newTransition = (StateMachineTransition)sourceStatePort.connections[ sourceStatePort.connections.Count - 1]; var connectedNode = nodes[transition.transitionEnabledConnection.nodeIndex]; var connectedPort = connectedNode.outputPorts[transition.transitionEnabledConnection.portIndex]; newTransition.TransitionEnabledPort.Connect(connectedPort); } } } } }