private void closeTheDrawer() { needToMovePlayerToSafeZone = false; if (playSounds && drawerCloseSounds) { drawerCloseSounds.Play(drawerSpeaker); } resetHitHelpers(); currentDrawerState = eDrawerState.CLOSING; }
private void openTheDrawer() { needToMovePlayerToSafeZone = true; putPlayerInSafeZone(safeZone); if (playSounds && drawerOpenSounds) { drawerOpenSounds.Play(drawerSpeaker); } resetHitHelpers(); currentDrawerState = eDrawerState.OPENING; }
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; } }
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 } }
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 } }