private void PlaceAction_Hover() { if (ic != null && ic.IcType == ICType.wire) { PlaceActionWire_Hover(); return; } if (ic != null && (ic.IcType == ICType.breadboard || ic.IcType == ICType.powerrail)) { PlaceActionBreadboard_Hover(); return; } int layer_mask = LayerMask.GetMask("Pin"); Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit, 500, layer_mask) && !EventSystem.current.IsPointerOverGameObject()) { string nodeId = hit.transform.gameObject.name; int index = CircuitHelper.GetIndexFromNode(nodeId, hit.point); int x = Mathf.RoundToInt(hit.point.x); int z = Mathf.RoundToInt(hit.point.z); if (ic != null && icModel != null) { Vector3 location = new Vector3(x, 0, z); switch (ic.IcType) { case ICType.dual: break; default: icModel.transform.position = location; icModel.transform.rotation = Quaternion.Euler(0, CircuitHelper.IsNodeRotated(nodeId) ? 90 : 0, 0); break; } if (circuitPool.CanPlace(ic.IcType, ic.Pins, nodeId, index)) { if (showsError) { showsError = false; RemoveOutline(icModel.GetComponentsInChildren <Renderer>()); } } else { if (!showsError) { showsError = true; AddOutline(icModel.GetComponentsInChildren <Renderer>(), outlineMat); } } } }
private void LoadComponents(ZipArchive archive) { int index = GetZipArchiveEntryIndex("components.json", archive); if (index == -1) { return; } ZipArchiveEntry entry = archive.Entries[index]; using (StreamReader file = new StreamReader(entry.Open())) { JsonSerializer serializer = new JsonSerializer { TypeNameHandling = TypeNameHandling.Auto, ObjectCreationHandling = ObjectCreationHandling.Replace, Converters = { new BitArrayConverter(), new BitArrayArrayConverter(), new Vector3Converter(), new WireConverter() } }; Dictionary <Guid, IntegratedCircuit> components = (Dictionary <Guid, IntegratedCircuit>)serializer.Deserialize(file, typeof(Dictionary <Guid, IntegratedCircuit>)); foreach (Guid g in components.Keys) { IntegratedCircuit ic = components[g]; ic.PostDeserialize(); GameObject obj; switch (ic.IcType) { case ICType.solo: obj = cp.PlaceIntegratedCircuit(ic, ic.GetPinNode(0), ic.GetPinNodeIndex(0), true); obj.transform.position = CircuitHelper.GetPositionFromNode(ic.GetPinNode(0), ic.GetPinNodeIndex(0)); break; case ICType.dual: obj = cp.PlaceIntegratedCircuit(ic, ic.GetPinNode(0), ic.GetPinNodeIndex(0), ic.GetPinNode(1), ic.GetPinNodeIndex(1), true); Vector3 locationA = CircuitHelper.GetPositionFromNode(ic.GetPinNode(0), ic.GetPinNodeIndex(0)); Vector3 locationB = CircuitHelper.GetPositionFromNode(ic.GetPinNode(1), ic.GetPinNodeIndex(1)); obj.transform.position = new Vector3((locationA.x + locationB.x) / 2, 0, (locationA.z + locationB.z) / 2); obj.transform.localScale = new Vector3(Vector3.Distance(locationB, locationA) / 2, 1, 1); float angle = CircuitHelper.AngleBetweenVector3(locationB, locationA); angle = locationA.z > locationB.z ? -angle : angle; obj.transform.rotation = Quaternion.Euler(0, angle, 0); break; case ICType.ic4: case ICType.ic6: obj = cp.PlaceIntegratedCircuit(ic, ic.GetPinNode(0), ic.GetPinNodeIndex(0), true); obj.transform.position = CircuitHelper.GetPositionFromNode(ic.GetPinNode(0), ic.GetPinNodeIndex(0)); obj.transform.rotation = Quaternion.Euler(0, CircuitHelper.IsNodeRotated(ic.GetPinNode(0)) ? 90 : 0, 0); break; case ICType.wire: obj = cp.PlaceIntegratedCircuit(ic, ic.GetPinNode(0), ic.GetPinNodeIndex(0), ic.GetPinNode(1), ic.GetPinNodeIndex(1), true); Vector3[] vectors = ((Wire)ic).points; LineRenderer lineRenderer = obj.GetComponentInChildren <LineRenderer>(); lineRenderer.positionCount = vectors.Length; lineRenderer.SetPositions(vectors); CircuitHelper.CreateColliderChain(obj, vectors); break; default: break; } ic.CustomMethod(); } } }