void shiftGroupScale(MaskPuzzleFragmentGroup group, float amount) { foreach (var fragment in grabbedFragmentGroup.fragments) { fragment.transform.localScale += Vector3.one * amount; } }
//Connect this group to another fragment group public void connectTo(MaskPuzzleFragmentGroup group) { if (group == this) { return; } group.assignedCamera.enabled = false; assignedCamera.cullingMask |= group.assignedCamera.cullingMask; fragments.AddRange(group.fragments); foreach (var fragment in group.fragments) { fragment.fragmentGroup = this; } }
// Check if two fragments can be connected directly public bool areConnectable(MaskPuzzleFragmentGroup group1, MaskPuzzleFragmentGroup group2) { if (overrideEdgeCheck) { return(true); } foreach (Edge edge in connectableEdges) { if ((group1 == edge.fragment1.fragmentGroup && group2 == edge.fragment2.fragmentGroup) || (group1 == edge.fragment2.fragmentGroup && group2 == edge.fragment1.fragmentGroup)) { return(true); } } return(false); }
void Start() { fragmentGroup = new MaskPuzzleFragmentGroup(this); }
// Handle dragging and dropping the fragments void HandleDragging() { // Grabbing a fragment if (grabbedFragmentGroup == null && Input.GetMouseButtonDown(0)) { // Get an array of all the fragments under the cursor Ray mouseRay = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit[] hits = Physics.RaycastAll(mouseRay, float.PositiveInfinity, 31 << 14); RaycastHit topHit = new RaycastHit(); MaskPuzzleMaskFragment fragmentHit, topHitFragment = null; float topHitDepth = -1f; float topHitDistance = 0f; // There might be multiple fragments under the cursor // We need to determine which one is on top - that one will be grabbed // We pick the one whose assigned camera has the highest depth // In case of equal depth we pick the fragment closest to the camera foreach (RaycastHit hit in hits) { fragmentHit = hit.collider.GetComponent <MaskPuzzleMaskFragment>(); if (fragmentHit.fragmentGroup.assignedCamera.depth <= topHitDepth) { continue; } if (fragmentHit.fragmentGroup.assignedCamera.depth == topHitDepth && hit.distance >= topHitDistance) { continue; } topHit = hit; topHitFragment = fragmentHit; topHitDepth = fragmentHit.fragmentGroup.assignedCamera.depth; topHitDistance = hit.distance; } if (topHitFragment) { grabbedFragmentGroup = topHitFragment.fragmentGroup; shiftGroupScale(grabbedFragmentGroup, grabScaleIncrease); // Grabbed fragment group should be on top grabbedFragmentGroup.assignedCamera.depth = (topDepth += .005f); // Save the grabbed point's coordinates needed for calculating position when dragging grabZ = topHit.point.z; grabOffset = topHitFragment.transform.position - CameraHelper.getCursorPosition(grabZ); print("Top hit=" + topHitFragment + "; depth=" + topHitDepth + "; dist=" + topHitDistance + "; z=" + topHit.point.z); MicrogameController.instance.playSFX( grabSound, volume: 1f, panStereo: AudioHelper.getAudioPan(topHitFragment.transform.position.x) ); } } // Dropping a fragment else if (grabbedFragmentGroup != null && !Input.GetMouseButton(0)) { shiftGroupScale(grabbedFragmentGroup, -grabScaleIncrease); MicrogameController.instance.playSFX( dropSound, volume: 1f, pitchMult: dropPitchMult, panStereo: AudioHelper.getAudioPan(grabbedFragmentGroup.fragments[0].transform.position.x) ); if (grabbedFragmentGroup.SnapToOtherFragments()) { MicrogameController.instance.playSFX( placeSound, volume: 1f, panStereo: AudioHelper.getAudioPan(grabbedFragmentGroup.fragments[0].transform.position.x) ); if (CheckVictory()) { MicrogameController.instance.playSFX( victorySound, volume: 1f, panStereo: 0f ); } } grabbedFragmentGroup = null; } // Dragging fragments else if (grabbedFragmentGroup != null) { Vector3 position = CameraHelper.getCursorPosition(grabZ); position += grabOffset; foreach (MaskPuzzleMaskFragment fragment in grabbedFragmentGroup.fragments) { fragment.transform.position = position; } } }