// Name: OnTriggerEnter2D() // Description: Processes reactions to entering trigger regions on the map. // Including: Doors/exits // Parameters: Collider2D triggerZone - The trigger region entered. protected void OnTriggerEnter2D(Collider2D triggerZone) { if (triggerZone.tag == "Lock") { Keyhole theLock = triggerZone.GetComponentInParent <Keyhole>(); theLock.Unlock(this); } }
public void detachKey() //Detach this key from the current keyhole. { if (currentKeyhole != null) { Keyhole k = currentKeyhole.GetComponent <Keyhole>(); k.currentKey = null; k.checkCorrectKey(); currentKeyhole = null; } RB.isKinematic = false; RB.useGravity = false; RB.velocity = Vector3.zero; RB.angularVelocity = Vector3.zero; }
//============================== //KEYHOLE //============================== public static void Keyhole(Keyhole keyholePrefab, Transform targetTransform, Color colorTint, float time, AnimationCurve animCurve, MonoBehaviour runOnInstance, bool isEntering = true) { if (!effectActive) { currentlyRunningEffectOnInstance = runOnInstance; Initialise(); Clear(); effectActive = true; runOnInstance.StartCoroutine(KeyholeCor(keyholePrefab, targetTransform, colorTint, time, animCurve, isEntering)); } else { Debug.LogWarning("Keyhole() called by " + runOnInstance + " but an effect is already running on " + currentlyRunningEffectOnInstance + "."); } }
public void placeKey() //Places this key in the closest keyhole. { if (keyholesInRange.Count > 0) //Only run if there is any keyholes in range. { //Set a standard to compare with other keyholes if any. GameObject closestKeyhole = keyholesInRange[0]; float shortestDistance = Vector3.Distance(transform.position, closestKeyhole.transform.position); for (int i = 1; i < keyholesInRange.Count; i++) //Running through the list. { if (shortestDistance > Vector3.Distance(transform.position, keyholesInRange[i].transform.position)) //If the distance is less then the previus distance then the new closest keyhole is the current keyhole. { closestKeyhole = keyholesInRange[i]; //New closest keyhole from index. } } if (closestKeyhole.GetComponent <Keyhole>() != null) //If the currenct closest keyhole has the script keyhole. { Keyhole k = closestKeyhole.GetComponent <Keyhole>(); //Getting the keyhole script. if (k.currentKey == null) //If there already is a key in the current keyhole. { currentKeyhole = closestKeyhole; //The current keyhole is now where this key is placed. k.currentKey = this.gameObject; //This key is now the current key for the current keyhole. RB.isKinematic = true; //The key is now still. k.checkCorrectKey(); //Tell the current keyhole to check if this key is the correct key. //Removing this key from activating the highlight for all keyholes in range. for (int i = 0; i < keyholesInRange.Count; i++) { if (keyholesInRange[i].GetComponent <Keyhole>() != null) { k = keyholesInRange[i].GetComponent <Keyhole>(); k.keysInRange -= 1; if (k.keysInRange <= 0) { k.Visual.enabled = false; } } } } } } }
void Start() { sprite = GetComponent <SpriteRenderer>(); keyholeTransform = gameObject.transform.Find("Keyhole"); audioPlayer = GetComponent <AudioSource>(); //Check if the Door is locked or not if (keyholeTransform == null) { isLocked = false; } else { keyhole = keyholeTransform.gameObject.GetComponent <Keyhole>(); isLocked = true; } UpdateDoorColor(); }
private void Update() { // Pressing E while standing in front of an interactable enables the artifact viewer for that object if (Input.GetKeyDown(KeyCode.E)) { // remove any active tutorials meltTutorial.SetActive(false); createTutorial.SetActive(false); Vector3 camPos = playerCamera.position; RaycastHit hit; if (!pmScript.enabled) { DisableArtifactViewer(true); } else if (Physics.Raycast(camPos, playerCamera.TransformDirection(Vector3.forward), out hit, interactReach, interactableMask)) { Interactable interactable = hit.collider.GetComponent <Interactable>(); Key key = hit.collider.GetComponent <Key>(); Keyhole keyhole = hit.collider.GetComponent <Keyhole>(); Antidote antidote = hit.collider.GetComponent <Antidote>(); if (interactable != null) { InteractWithArtifact(hit.collider.gameObject); hit.collider.gameObject.SetActive(false); } else if (key != null) { key.Collect(); } else if (keyhole != null) { keyhole.PlaceKeyOnKeyhole(); } else if (antidote != null) { antidotePickupSource.clip = antidotePickupSound; antidotePickupSource.Play(); antidote.Collect(); } else if (hit.collider.CompareTag("gun")) { gunObject.SetActive(true); toolScript.enabled = true; meltTutorial.SetActive(true); menuManager.playerHasTool = true; hit.collider.gameObject.SetActive(false); } else if (hit.collider.CompareTag("Tool Component")) { toolScript.canFreeze = true; hit.collider.gameObject.SetActive(false); createTutorial.SetActive(true); freezerAttachment.SetActive(false); fuelBar.SetActive(true); toolScript.toolFuel = startingFuelPercent * toolScript.capacity; } } } }
private static IEnumerator KeyholeCor(Keyhole keyholePrefab, Transform targetTransform, Color colorTint, float time, AnimationCurve animCurve, bool isEntering) { //Play SFX here //Get screen extents Vector2 extents = new Vector2(targetCanvas.pixelRect.width, targetCanvas.pixelRect.height); //Instantiate keyhole Keyhole keyHole = Instantiate(keyholePrefab, targetCanvas.transform); //Position keyhole centered over target Vector2 viewportPosition = Camera.main.WorldToViewportPoint(targetTransform.position); Vector2 screenPos = new Vector2((viewportPosition.x * extents.x) - (extents.x * 0.5f), (viewportPosition.y * extents.y) - (extents.y * 0.5f)); keyHole.centre.rectTransform.localPosition = screenPos; //Set color tint SetImageColor(keyHole.fillerBL, colorTint); SetImageColor(keyHole.fillerB, colorTint); SetImageColor(keyHole.fillerBR, colorTint); SetImageColor(keyHole.fillerL, colorTint); SetImageColor(keyHole.centre, colorTint); SetImageColor(keyHole.fillerR, colorTint); SetImageColor(keyHole.fillerTL, colorTint); SetImageColor(keyHole.fillerT, colorTint); SetImageColor(keyHole.fillerTR, colorTint); //Get largest horizontal distance and largest vertical distance from centre of keyhole to edge of screen float maxXDist = Mathf.Max(extents.x - keyHole.centre.rectTransform.anchoredPosition.x, keyHole.centre.rectTransform.anchoredPosition.x); float maxYDist = Mathf.Max(extents.y - keyHole.centre.rectTransform.anchoredPosition.y, keyHole.centre.rectTransform.anchoredPosition.y); //maxDist is the largest distance from the centre of the keyhole to the edge of the screen in the directions up, down, left, right float maxDist = Mathf.Max(maxXDist, maxYDist); //Get maxWidth of keyhole as twice largest distance to edge float maxWidth = 2 * maxDist; //Determine initial and final keyhole sizes Vector2 initialSizeDelta = isEntering ? new Vector2(maxWidth, maxWidth) : Vector2.zero; Vector2 finalSizeDelta = isEntering ? Vector2.zero : new Vector2(maxWidth, maxWidth); //Compute magnitude of change float changeInSizeDeltaMagnitude = (finalSizeDelta - initialSizeDelta).magnitude; //Set initial size keyHole.centre.rectTransform.sizeDelta = initialSizeDelta; //Get total animation curve time, will be normalized to fit into time parameter float totalCurveTime = animCurve.keys[animCurve.length - 1].time; float elapsedTime = 0f; while (elapsedTime < time) { //Change size of keyhole, scaled by animation curve keyHole.centre.rectTransform.sizeDelta = Vector2.MoveTowards(initialSizeDelta, finalSizeDelta, changeInSizeDeltaMagnitude * animCurve.Evaluate(totalCurveTime * elapsedTime / time)); //Compute distances to edges of screen float distToRightEdge = Mathf.Max(extents.x - keyHole.centre.rectTransform.anchoredPosition.x - keyHole.centre.rectTransform.sizeDelta.x * 0.5f, 0); float distToLeftEdge = Mathf.Max(keyHole.centre.rectTransform.anchoredPosition.x - keyHole.centre.rectTransform.sizeDelta.x * 0.5f, 0); float distToTopEdge = Mathf.Max(extents.y - keyHole.centre.rectTransform.anchoredPosition.y - keyHole.centre.rectTransform.sizeDelta.y * 0.5f, 0); float distToBottomEdge = Mathf.Max(keyHole.centre.rectTransform.anchoredPosition.y - keyHole.centre.rectTransform.sizeDelta.y * 0.5f, 0); //Fill rest of screen with filler keyHole.fillerBL.rectTransform.sizeDelta = new Vector2(distToLeftEdge, distToBottomEdge); keyHole.fillerB.rectTransform.sizeDelta = new Vector2(keyHole.fillerB.rectTransform.sizeDelta.x, distToBottomEdge); keyHole.fillerBR.rectTransform.sizeDelta = new Vector2(distToRightEdge, distToBottomEdge); keyHole.fillerL.rectTransform.sizeDelta = new Vector2(distToLeftEdge, keyHole.fillerB.rectTransform.sizeDelta.x); keyHole.fillerR.rectTransform.sizeDelta = new Vector2(distToRightEdge, keyHole.fillerB.rectTransform.sizeDelta.x); keyHole.fillerTL.rectTransform.sizeDelta = new Vector2(distToLeftEdge, distToTopEdge); keyHole.fillerT.rectTransform.sizeDelta = new Vector2(keyHole.fillerB.rectTransform.sizeDelta.x, distToTopEdge); keyHole.fillerTR.rectTransform.sizeDelta = new Vector2(distToRightEdge, distToTopEdge); //Advance time elapsedTime += Time.deltaTime; yield return(null); } if (isEntering) { //Replace with solid color keyHole.gameObject.SetActive(false); GameObject gameObject = new GameObject(); gameObject.transform.parent = targetCanvas.transform; RawImage image = gameObject.AddComponent <RawImage>(); image.rectTransform.localPosition = Vector2.zero; SetImageColor(image, colorTint); SetImageSize(image, extents.x, extents.y); } else { Destroy(keyHole.gameObject); } //Turn off effect effectActive = false; }