Пример #1
0
    // 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);
        }
    }
Пример #2
0
    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;
    }
Пример #3
0
    //==============================
    //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 + ".");
        }
    }
Пример #4
0
    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;
                }
            }
        }
    }
Пример #7
0
    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;
    }