/// <summary> /// Creates an object from its serializable data /// </summary> /// <param name="data">The data (e.g. read from a file)</param> /// <param name="parent">The parent of component (for components on /// boards)</param> public static void Instantiate(Datum data, Transform parent = null) { string objType = ObjectType(data); GameObject obj = UnityInstantiate(objType, parent); SaveThisObject save = obj.AddComponent <SaveThisObject>(); save.ObjectType = objType; save.LocalPosition = data.localPosition; save.LocalEulerAngles = data.localAngles; save.transform.localPosition = save.LocalPosition; save.transform.localEulerAngles = save.LocalEulerAngles; var dict = new Dictionary <Type, Action> { { typeof(BoardDatum), () => OnBoard((BoardDatum)data, save, parent) }, { typeof(WireDatum), () => OnWire((WireDatum)data, save) }, { typeof(InverterDatum), () => OnInverter((InverterDatum)data, save) }, { typeof(PegDatum), () => OnPeg((PegDatum)data, save) }, { typeof(DelayerDatum), () => OnDelayer((DelayerDatum)data, save) }, { typeof(ThroughPegDatum), () => OnThroughPeg((ThroughPegDatum)data, save) }, { typeof(SwitchDatum), () => OnSwitch((SwitchDatum)data, save) }, { typeof(ButtonDatum), () => OnButton((ButtonDatum)data, save) }, { typeof(DisplayDatum), () => OnDisplay((DisplayDatum)data, save) }, { typeof(LabelDatum), () => OnLabel((LabelDatum)data, save) }, { typeof(BlotterDatum), () => OnBlotter((BlotterDatum)data, save) }, }; dict[data.GetType()](); }
// Loading functions for each type of component private static void OnBoard(BoardDatum datum, SaveThisObject save, Transform parent) { save.CustomDataArray = new object[] { datum.width, datum.height, (Color)datum.color }; CustomData.LoadCircuitBoard(save); foreach (Datum child in datum.children) { Instantiate(child, save.transform); } }
private static void OnInverter(InverterDatum datum, SaveThisObject save) { save.CustomDataArray = new object[] { datum.inputOn, datum.outputOn }; CustomData.LoadInverter(save); }
private static void OnWire(WireDatum datum, SaveThisObject save) { save.CustomDataArray = new object[] { datum.isInputInput, (Vector3)datum.localScale }; CustomData.LoadWire(save); }
private static void OnBlotter(BlotterDatum datum, SaveThisObject save) { save.CustomDataArray = new object[] { datum.inputOn, datum.outputON }; CustomData.LoadBlotter(save); }
private static void OnDisplay(DisplayDatum datum, SaveThisObject save) { save.CustomDataArray = new object[] { datum.isOn }; CustomData.LoadDisplay(save); }
private static void OnLabel(LabelDatum datum, SaveThisObject save) { save.CustomDataArray = new object[] { datum.text, datum.fontSize }; CustomData.LoadLabel(save); }
private static void OnButton(ButtonDatum datum, SaveThisObject save) { save.CustomDataArray = new object[] { datum.isOn, datum.downTime }; CustomData.LoadButton(save); }
private static void OnSwitch(SwitchDatum datum, SaveThisObject save) { save.CustomDataArray = new object[] { datum.isOn }; CustomData.LoadSwitch(save); }
private static void OnThroughPeg(ThroughPegDatum datum, SaveThisObject save) { save.CustomDataArray = new object[] { datum.isOn }; CustomData.LoadThroughPeg(save); }
private static void OnDelayer(DelayerDatum datum, SaveThisObject save) { save.CustomDataArray = new object[] { datum.inputOn, datum.outputOn, datum.delayCount }; CustomData.LoadDelayer(save); }
/// <summary> /// Converts SaveThisObject into serializable data structures /// </summary> /// <param name="obj">The SaveThisObject to convert</param> /// <returns>A serializable Datum containing the data in the SaveThisObject</returns> public static Datum Convert(SaveThisObject obj) { bool panel = obj.ObjectType.StartsWith("Panel") || obj.ObjectType == "Through Blotter"; Datum result = null; switch (obj.ObjectType) { case "CircuitBoard": List <Datum> children = new List <Datum>(obj.transform.childCount); CircuitBoard comp = obj.GetComponent <CircuitBoard>(); foreach (Transform child in obj.transform) { SaveThisObject save = child.GetComponent <SaveThisObject>(); if (save != null) { children.Add(Convert(save)); } } Renderer renderer = obj.GetComponent <Renderer>(); result = new BoardDatum { width = comp.x, height = comp.z, children = children.ToArray(), color = renderer.material.color }; break; case "Wire": result = new WireDatum { isInputInput = obj.GetComponent <InputInputConnection>() != null, localScale = obj.transform.localScale }; break; case "Inverter": NotGate gate = obj.GetComponent <NotGate>(); result = new InverterDatum { inputOn = gate.Input.On, outputOn = gate.Output.On }; break; case "Peg": result = new PegDatum { isOn = obj.GetComponent <CircuitInput>().On }; break; case "Delayer": Delayer delayer = obj.GetComponent <Delayer>(); result = new DelayerDatum { inputOn = delayer.Input.On, outputOn = delayer.Output.On, delayCount = delayer.DelayCount }; break; case "Through Peg": CircuitInput[] inputs = obj.GetComponentsInChildren <CircuitInput>(); result = new ThroughPegDatum { isOn = inputs[0].On }; break; case "Switch": case "Panel Switch": result = new SwitchDatum { panel = panel, isOn = obj.GetComponent <Switch>().On }; break; case "Button": case "Panel Button": Button button = obj.GetComponent <Button>(); result = new ButtonDatum { panel = panel, isOn = button.output.On, downTime = button.ButtonDownTime }; break; case "Display": case "Panel Display": result = new DisplayDatum { panel = panel, isOn = obj.GetComponent <global::Display>().Input.On }; break; case "Label": case "Panel Label": Label label = obj.GetComponent <Label>(); result = new LabelDatum { panel = panel, text = label.text.text, fontSize = label.text.fontSize }; break; case "Blotter": case "Through Blotter": Blotter blotter = obj.GetComponent <Blotter>(); result = new BlotterDatum { through = panel, inputOn = blotter.Input.On, outputON = blotter.Output.On }; break; } result.localPosition = obj.transform.localPosition; result.localAngles = obj.transform.localEulerAngles; return(result); }