コード例 #1
0
        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);
                        }
                    }
                }
            }
        }