Пример #1
0
        private void closeTheDrawer()
        {
            needToMovePlayerToSafeZone = false;

            if (playSounds && drawerCloseSounds)
            {
                drawerCloseSounds.Play(drawerSpeaker);
            }

            resetHitHelpers();
            currentDrawerState = eDrawerState.CLOSING;
        }
Пример #2
0
        private void openTheDrawer()
        {
            needToMovePlayerToSafeZone = true;
            putPlayerInSafeZone(safeZone);

            if (playSounds && drawerOpenSounds)
            {
                drawerOpenSounds.Play(drawerSpeaker);
            }

            resetHitHelpers();
            currentDrawerState = eDrawerState.OPENING;
        }
Пример #3
0
        public void restoreSaveGameData(FPEDrawerSaveData data)
        {
            currentDrawerState = data.DrawerState;
            internallyLocked   = data.IsInternallyLocked;
            externallyLocked   = data.IsExternallyLocked;
            setDrawerPullInteractionStrings(data.DrawerPullString);

            switch (currentDrawerState)
            {
            case eDrawerState.CLOSING:
            case eDrawerState.CLOSED:
            case eDrawerState.BLOCKED_PARTLY_CLOSED:
            case eDrawerState.OPENING:
            case eDrawerState.OPEN:
            case eDrawerState.BLOCKED_PARTLY_OPEN:
                slidingPart.localPosition = data.CustomDrawerVector;
                break;

            default:
                Debug.LogError("FPEDrawer.restoreSaveGameData():: Given bad drawer state '" + currentDrawerState + "'");
                break;
            }
        }
Пример #4
0
        void Update()
        {
            if (currentDrawerState == eDrawerState.CLOSED)
            {
                // Do nothing
            }
            else if (currentDrawerState == eDrawerState.CLOSING)
            {
                if ((stopIfDrawerHitsSomething == true && drawerCloseHitHelperHitSomething() == false) || stopIfDrawerHitsSomething == false)
                {
                    slidingPart.localPosition = Vector3.MoveTowards(slidingPart.localPosition, closedPosition, drawerSlideDistancePerSecond * Time.deltaTime);

                    if (Mathf.Abs(Vector3.Distance(slidingPart.localPosition, closedPosition)) <= drawerSlideSnapDistance)
                    {
                        slidingPart.localPosition = closedPosition;
                        currentDrawerState        = eDrawerState.CLOSED;
                        setDrawerPullInteractionStrings(openDrawerString);
                    }
                }
                else
                {
                    if (playSounds && drawerBlockedSounds)
                    {
                        drawerBlockedSounds.Play(drawerSpeaker);
                    }

                    // Yes. We want drawers that hit something on closing to have their next interaction open them away from the thing
                    // they hit. This will give objects stuck in drawer a chance to fall back into the drawer
                    currentDrawerState = eDrawerState.BLOCKED_PARTLY_OPEN;
                    setDrawerPullInteractionStrings(openDrawerString);
                }
            }
            else if (currentDrawerState == eDrawerState.OPENING)
            {
                if ((stopIfDrawerHitsSomething == true && drawerOpenHitHelperHitSomething() == false) || stopIfDrawerHitsSomething == false)
                {
                    movePlayerCloserToSafeZone();
                    slidingPart.localPosition = Vector3.MoveTowards(slidingPart.localPosition, openedPosition, drawerSlideDistancePerSecond * Time.deltaTime);

                    if (Mathf.Abs(Vector3.Distance(slidingPart.localPosition, openedPosition)) <= drawerSlideSnapDistance)
                    {
                        slidingPart.localPosition = openedPosition;
                        currentDrawerState        = eDrawerState.OPEN;
                        setDrawerPullInteractionStrings(closeDrawerString);
                        releasePlayerFromSafeZone();
                    }
                }
                else
                {
                    if (playSounds && drawerBlockedSounds)
                    {
                        drawerBlockedSounds.Play(drawerSpeaker);
                    }

                    // Yes. We want drawers that hit something on opening to have their next interaction close them away from the thing they hit
                    currentDrawerState = eDrawerState.BLOCKED_PARTLY_CLOSED;
                    setDrawerPullInteractionStrings(closeDrawerString);
                    releasePlayerFromSafeZone();
                }
            }
            else if (currentDrawerState == eDrawerState.OPEN)
            {
                // Do nothing
            }
            else if (currentDrawerState == eDrawerState.BLOCKED_PARTLY_OPEN)
            {
                // Do nothing
            }
            else if (currentDrawerState == eDrawerState.BLOCKED_PARTLY_CLOSED)
            {
                // Do nothing
            }
        }
Пример #5
0
        private void Awake()
        {
            Transform[] childTransforms = gameObject.GetComponentsInChildren <Transform>();
            drawerPulls = new List <Transform>();

            foreach (Transform t in childTransforms)
            {
                if (t.name == "SlidingPart")
                {
                    slidingPart = t;
                }
                else if (t.name.Contains("DrawerPull") && t.gameObject.GetComponent <FPEInteractableActivateScript>())
                {
                    drawerPulls.Add(t);
                }
                else if (t.name.Contains("OpenHitHelper") && t.gameObject.GetComponent <FPEDoorAndDrawerHitHelper>())
                {
                    openHitHelper = t.gameObject.GetComponent <FPEDoorAndDrawerHitHelper>();
                }
                else if (t.name.Contains("CloseHitHelper") && t.gameObject.GetComponent <FPEDoorAndDrawerHitHelper>())
                {
                    closeHitHelper = t.gameObject.GetComponent <FPEDoorAndDrawerHitHelper>();
                }
                else if (t.name == "SafeZone")
                {
                    safeZone = t;
                }
            }

            if (!slidingPart || drawerPulls.Count == 0)
            {
                Debug.Log("FPEDrawer:: Drawer '" + gameObject.name + "' was missing key component(s). Attempting to fix.", gameObject);

                // Attempt some automatic fixes
#if UNITY_EDITOR
                if (slidingPart == null)
                {
                    GameObject slidingPartFix = new GameObject("SlidingPart");
                    slidingPartFix.transform.parent        = gameObject.transform;
                    slidingPartFix.transform.localPosition = Vector3.zero;
                    slidingPart = slidingPartFix.transform;
                }

                if (drawerPulls.Count == 0)
                {
                    GameObject drawerPullFix = new GameObject("DrawerPull");
                    drawerPullFix.AddComponent <BoxCollider>();
                    drawerPullFix.AddComponent <FPEInteractableActivateScript>();
                    drawerPullFix.transform.parent        = slidingPart;
                    drawerPullFix.transform.localPosition = Vector3.zero;
                    drawerPulls.Add(drawerPullFix.transform);
                    Debug.LogWarning("FPEDrawer:: Drawer '" + gameObject.name + "' DrawerPull has no Activation Event. Drawer Pull interaction will do nothing until assigned. Also remember to make the Event Fire Type be 'EVERYTIME'.", gameObject);
                }
#endif
            }

            drawerSlideDistancePerSecond = Mathf.Abs(slideDistance / slideOpenTimeInSeconds);
            closedPosition   = slidingPart.localPosition;
            closedPosition.z = 0f;
            openedPosition   = closedPosition + new Vector3(0f, 0f, slideDistance);

            if (startOpened)
            {
                currentDrawerState = eDrawerState.OPEN;
                setDrawerPullInteractionStrings(closeDrawerString);
            }
            else
            {
                setDrawerPullInteractionStrings(openDrawerString);
            }

            if (startExternallyLocked)
            {
                externallyLocked = true;
            }

            if (startInternallyLocked)
            {
                internallyLocked = true;
            }

            drawerSpeaker = gameObject.GetComponent <AudioSource>();

            // Error Checking //
            if (stopIfDrawerHitsSomething && (openHitHelper == null || closeHitHelper == null))
            {
                Debug.LogError("FPEDrawer:: Drawer '" + gameObject.name + "' is configured to stop if drawer hits something, but it is missing child 'OpenHitHelper' or 'CloseHitHelper' FPEDoorAndDrawerHitHelper objects. Drawer will not stop when it hits something.", gameObject);
            }

            // Safe zone is optional, but is required if you've set the flag to auto move the player
            if (autoMovePlayerToSafeZone && !safeZone)
            {
                Debug.Log("FPEDrawer:: Drawer '" + gameObject.name + "' is configured to automatically move the player into safe zone, but has no safe zone defined. Attempting to fix");

                // Attempt some automatic fixes (assumes slide distance is 0.45, which is the default, which is likely
                // the value since these fixes really only happen if you just add this script to an empty game object)
#if UNITY_EDITOR
                GameObject safeZoneFix = new GameObject("SafeZone");
                safeZoneFix.transform.parent        = gameObject.transform;
                safeZoneFix.transform.localPosition = new Vector3(0.0f, 0.0f, 1.3f);
                safeZone = safeZoneFix.transform;
#endif
            }

            if (playSounds && drawerSpeaker == null)
            {
                Debug.Log("FPEDrawer:: Drawer '" + gameObject.name + "' was configured to play sounds but had no AudioSource. Adding AudioSource.", gameObject);

                // Attempt some automatic fixes
#if UNITY_EDITOR
                gameObject.AddComponent <AudioSource>();
                drawerSpeaker = gameObject.GetComponent <AudioSource>();
#endif
            }
        }