using InfallibleCode; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; using UnityEngine.Playables; using UnityStandardAssets.Characters.ThirdPerson; public class MedeaDemonicEnemyBehaviour : MonoBehaviour { private static MedeaDemonicEnemyBehaviour _instance; public static MedeaDemonicEnemyBehaviour GetInstance() { return _instance; } #region Medea & Player useful variables public Animator medeaAnimator; [SerializeField] public NavMeshAgent _medeaAI; [SerializeField] private ThirdPersonCharacter thirdPerson; [SerializeField] bool _followPlayer; [SerializeField] bool _playerReached; [SerializeField] Transform _player; [SerializeField] public Transform _medea; public List _medeaSkinnedMeshRenderer; //[SerializeField] private Animator _MedeaAnimations; #endregion #region Alerted or not variables [SerializeField] private float _viewRadius; [SerializeField] private float _viewAngle; [SerializeField] private float _hearingRadius; [SerializeField] private float _hearingAngle; [SerializeField] private float _alertedViewRadius; [SerializeField] private float _alertedViewAngle; private float _defaultViewRadius; private float _defaultViewAngle; #endregion public LayerMask playerMask; public LayerMask obstacleMask; [SerializeField] private float _movementSpeed = 5f; private float _defaultMovementSpeed = 20; [SerializeField] private float _currentRotSpeed; private float _defaulfRotSpeed = 120; private float _defaultMovingTurnSpeed; private float _defaultStationaryTurnSpeed; [SerializeField] private Transform _closet; [SerializeField] private Transform _bed; public ClosetHideBehaviour closetHideBehaviour; #region Timers //private Coroutine _medeaDespawnTimer; #endregion #region Audio private AudioSource _MedeaDangerAudioSource; [SerializeField] private AudioClip _DangerAudioClip; private bool _playingMusic; #endregion private Coroutine _playerLostContinueChasingTimer; bool hasLostPlayer; bool medeaMeshRenderersAreDisabled; public enum medeaState { Default, Spawn, ChasePlayer, Patroling, SearchingForHiddenPlayer, TakingOutPlayerFromHiddingSpot, KillingPlayer, Disabled, TrafficPuzzle, OrangeLights } public medeaState state = medeaState.Spawn; private void Awake() { if (!_instance) { _instance = this; } _MedeaDangerAudioSource = GetComponent(); _defaultViewAngle = _viewAngle; _defaultViewRadius = _viewRadius; _medeaAI.angularSpeed = _defaulfRotSpeed; _currentRotSpeed = _defaulfRotSpeed; _defaultStationaryTurnSpeed = thirdPerson.m_StationaryTurnSpeed; _defaultMovingTurnSpeed = thirdPerson.m_MovingTurnSpeed; } void Start() { _medeaAI.updateRotation = false; _medeaAI = GetComponent(); _player = PlayerManager.GetInstance().playerGameObj.transform; _defaultMovementSpeed = _medeaAI.speed; } #region Audio public void PlayDangerMusic() { if (_playingMusic) { _MedeaDangerAudioSource.clip = _DangerAudioClip; _MedeaDangerAudioSource.Play(); _playingMusic = false; } if (_MedeaDangerAudioSource.isPlaying == false) { _playingMusic = true; } } public void StopDangerMusic() { _MedeaDangerAudioSource.Stop(); _MedeaDangerAudioSource.clip = null; _playingMusic = false; } #endregion #region Call States public void GoToDefaultMedeaState() { state = medeaState.Default; } public void GoToSpawnMedeaState() { state = medeaState.Spawn; } public void GoToTrafficPuzzleState() { state = medeaState.TrafficPuzzle; } public void GoToChasePlayerState() { state = medeaState.ChasePlayer; } public void GoToDisabledMedeaState() { state = medeaState.Disabled; } public void TrafficLightPuzzleSolved() { _medeaAI.speed = _defaultMovementSpeed; medeaAnimator.SetBool("IsWalkingBackwards", false); state = medeaState.Disabled; } #endregion public void MedeaIsStopped() { _medeaAI.isStopped = true; } public void MedeaIsNoLongerStopped() { _medeaAI.isStopped = false; } /// /// If was chasing player and player is lost from the field of view. /// public void StartPlayerLostContinueChasingTimer() { if (!hasLostPlayer) { if (!IsPlayerHidden()) //12.8.24 { _playerLostContinueChasingTimer = StartCoroutine(PlayerLostContinueChasingTimer()); //that was here 12.8.24 } else //12.8.24 { StopAllCoroutines(); } //_medeaAI.SetDestination(_player.transform.localPosition); //16.7.24 } } IEnumerator PlayerLostContinueChasingTimer() { hasLostPlayer = true; StartCoroutine(UpdatePlayerPositionForMedeaWhilePlayerIsLost()); print("Update player destination while medea lot player"); yield return new WaitForSeconds(20f); print("Ten seconds since enemy lost player has passed"); //if (state != medeaState.SearchingForHiddenPlayer || state != medeaState.TakingOutPlayerFromHiddingSpot) //{ // print("Was not in searching for hidden player"); // PatrolManager.GetInstance()._canChangePoint = true; //13.8.24 // state = medeaState.Patroling; //} //else //{ // state = medeaState.Spawn; // print("20 seconds since enemy lost the player and now the enemy is searching"); //} //hasLostPlayer = false; SecondsPassedSinceEnemyLostPlayer(); } public void StopPlayerLostContinueChasingTimer() { if (_playerLostContinueChasingTimer != null) { StopCoroutine(_playerLostContinueChasingTimer); _playerLostContinueChasingTimer = null; SecondsPassedSinceEnemyLostPlayer(); print("Stopped PlayerLostContinuechasing timer"); } } public void SecondsPassedSinceEnemyLostPlayer() { print("Ten seconds since enemy lost player has passed"); if (state != medeaState.SearchingForHiddenPlayer || state != medeaState.TakingOutPlayerFromHiddingSpot) { print("Was not in searching for hidden player"); PatrolManager.GetInstance()._canChangePoint = true; //13.8.24 state = medeaState.Patroling; } else { state = medeaState.Spawn; print("20 seconds since enemy lost the player and now the enemy is searching"); } hasLostPlayer = false; } IEnumerator UpdatePlayerPositionForMedeaWhilePlayerIsLost() { while (hasLostPlayer) { _medeaAI.SetDestination(_player.transform.localPosition); //16.7.24 print("Is updating player destination while player is out of sight from Medea"); yield return null; } } void Update() { // FindPlayer(); if (PlayerDeath.GetInstance().playerIsDead == false) { //If agent has not reached the desired destination : UpdateEnemyMovement(); if (CanSeePlayer() || CanHearPlayer()/*&& !PlayerDeath.GetInstance().playerIsDead*/) { PlayDangerMusic(); } else { StopDangerMusic(); } } UpdateEnemyBehaviour(); } void UpdateEnemyBehaviour() { #region Medea's animations handling float speed = _medeaAI.velocity.magnitude; // Map NavMeshAgent's speed to blend tree parameter float normalizedSpeed = speed / _medeaAI.speed; // Adjust the divisor to match your maximum NavMeshAgent speed medeaAnimator.SetFloat("speedPercent", normalizedSpeed); #endregion switch (state) { case medeaState.Default: // PatrolManager.GetInstance().CanPatrol = true; //Check player state if (medeaMeshRenderersAreDisabled) { EnableMedeaMeshRenderers(); _medeaAI.isStopped = false; } break; case medeaState.Spawn: // PatrolManager.GetInstance().CanPatrol = true; //Check player state _medeaAI.speed = _defaultMovementSpeed; _currentRotSpeed = _defaulfRotSpeed; _medeaAI.angularSpeed = _defaulfRotSpeed; thirdPerson.m_StationaryTurnSpeed = _defaultStationaryTurnSpeed ; thirdPerson.m_MovingTurnSpeed = _defaultMovingTurnSpeed; // if (!_medeaAI.isActiveAndEnabled) { this.gameObject.SetActive(true); PatrolManager.GetInstance()._canChangePoint = false; //tocheck this EnableMedeaMeshRenderers(); _medeaAI.isStopped = false; if (CanHearPlayer() || CanSeePlayer()) { state = medeaState.ChasePlayer; } else if(!IsPlayerHidden()) { PatrolManager.GetInstance().content = PatrolManager.Rute.LostPlayerPath; state = medeaState.Patroling; } else { PatrolManager.GetInstance().content = PatrolManager.Rute.LostPlayerPath; state = medeaState.SearchingForHiddenPlayer; } } else { if (CanHearPlayer() || CanSeePlayer()) { PatrolManager.GetInstance()._canChangePoint = false; //13.08.2024 state = medeaState.ChasePlayer; } else if (!IsPlayerHidden()) { PatrolManager.GetInstance()._canChangePoint = true; //13.08.2024 state = medeaState.Patroling; } else { PatrolManager.GetInstance()._canChangePoint = true; //13.08.2024 state = medeaState.SearchingForHiddenPlayer; } } break; case medeaState.ChasePlayer: if (CanSeePlayer()) { PatrolManager.GetInstance().CanPatrol = false; _medeaAI.SetDestination(_player.position); IsAlerted(); if (Vector3.Distance(_player.position, _medea.position) <= 0.5) { state = medeaState.KillingPlayer; } if (IsPlayerHidden()) { Debug.Log("Kriftike eno ton kinigouse"); //Updates the spot for the enemy to go to: PatrolManager.GetInstance().SetNearbyRoomsPatrolPoints(); PatrolManager.GetInstance().UpdateTakeOutPlayerSpot(); //Goes to the spot: PatrolManager.GetInstance().content = PatrolManager.Rute.GoesToTakeOutPlayerFromHiddingSpotPath; state = medeaState.TakingOutPlayerFromHiddingSpot; } else { Debug.Log("Einai mprosta tis kai ton vlepei"); //state = medeaState.ChasePlayer; } } else if (!CanSeePlayer()) { IsAlerted(); //PatrolManager.GetInstance().CanPatrol = true; if (IsPlayerHidden()) { Debug.Log("Kriftike kai den ton eide"); PatrolManager.GetInstance().SetNearbyRoomsPatrolPoints(); PatrolManager.GetInstance().UpdatePatrolHidingSpots(); PatrolManager.GetInstance()._destinationPoint = 0; PatrolManager.GetInstance().content = PatrolManager.Rute.SearchingForHiddenPlayerPath; state = medeaState.SearchingForHiddenPlayer; } else { Debug.Log("Den ton vlepei kai den einai krimenos"); StartPlayerLostContinueChasingTimer(); //state = medeaState.Patroling; } } break; case medeaState.Patroling: StopAllCoroutines(); if (!IsPlayerHidden()) { if (CanSeePlayer()) { //Yiannis added: 19/02/2023 _medeaAI.isStopped = false; PatrolManager.GetInstance()._canChangePoint = true; //--------------------------------------------------- PatrolManager.GetInstance().CanPatrol = false; IsAlerted(); if (IsPlayerHidden()) { Debug.Log("Kriftike eno ton kinigouse"); //Updates the spot for the enemy to go to: PatrolManager.GetInstance().SetNearbyRoomsPatrolPoints(); PatrolManager.GetInstance().UpdateTakeOutPlayerSpot(); //Goes to the spot: PatrolManager.GetInstance().content = PatrolManager.Rute.GoesToTakeOutPlayerFromHiddingSpotPath; state = medeaState.TakingOutPlayerFromHiddingSpot; } else { Debug.Log("Einai mprosta tis kai ton vlepei"); StopSearchingAnimation(); state = medeaState.ChasePlayer; } } //I commented out: else if (!CanSeePlayer()) { IsAlerted(); //PatrolManager.GetInstance().CanPatrol = false; if (IsPlayerHidden()) { Debug.Log("Kriftike kai den ton eide"); PatrolManager.GetInstance().SetNearbyRoomsPatrolPoints(); PatrolManager.GetInstance().UpdatePatrolHidingSpots(); PatrolManager.GetInstance()._destinationPoint = 0; PatrolManager.GetInstance().content = PatrolManager.Rute.SearchingForHiddenPlayerPath; PatrolManager.GetInstance().CanPatrol = true; // 10.8.24 state = medeaState.SearchingForHiddenPlayer; } else { //PatrolManager.GetInstance().CanPatrol = true; Debug.Log("Den ton vlepei kai den einai krimenos"); //StartPlayerLostContinueChasingTimer(); //Added 12.7.24 PatrolManager.GetInstance().content = PatrolManager.Rute.DefinedPath; state = medeaState.Patroling; } } if (CanHearPlayer()) { PatrolManager.GetInstance().CanPatrol = false; _medeaAI.SetDestination(_player.position); IsAlerted(); Debug.Log("TON AKOUO TON MALAKA"); StopSearchingAnimation(); state = medeaState.ChasePlayer; } } break; case medeaState.SearchingForHiddenPlayer: //IsAlerted(); PatrolManager.GetInstance().CanPatrol = true; //Take the hidden spots of the room the player is in //See the closest to the player //Dont search there //Dont forget that is medea sees the player she is chasing //If player is not hiding anymore THEN CanSeePlayer. if (!IsPlayerHidden()) { if (CanSeePlayer()) { PatrolManager.GetInstance().CanPatrol = false; IsAlerted(); if (IsPlayerHidden()) { Debug.Log("Kriftike eno ton kinigouse"); //Updates the spot for the enemy to go to: PatrolManager.GetInstance().SetNearbyRoomsPatrolPoints(); PatrolManager.GetInstance().UpdateTakeOutPlayerSpot(); //Goes to the spot: PatrolManager.GetInstance().content = PatrolManager.Rute.GoesToTakeOutPlayerFromHiddingSpotPath; state = medeaState.TakingOutPlayerFromHiddingSpot; } else { Debug.Log("Einai mprosta tis kai ton vlepei"); StopSearchingAnimation(); state = medeaState.ChasePlayer; } } else if (!CanSeePlayer()) { IsAlerted(); PatrolManager.GetInstance().CanPatrol = false; if (IsPlayerHidden()) { Debug.Log("Kriftike kai den ton eide"); PatrolManager.GetInstance().SetNearbyRoomsPatrolPoints(); PatrolManager.GetInstance().UpdatePatrolHidingSpots(); PatrolManager.GetInstance()._destinationPoint = 0; PatrolManager.GetInstance().content = PatrolManager.Rute.SearchingForHiddenPlayerPath; state = medeaState.SearchingForHiddenPlayer; // 10.8.24 I commented in(Maya) } else { PatrolManager.GetInstance().CanPatrol = true; Debug.Log("Den ton vlepei kai den einai krimenos"); PatrolManager.GetInstance().content = PatrolManager.Rute.DefinedPath; //state = medeaState.Patroling; //commented out 12.7.24 StartPlayerLostContinueChasingTimer(); // added 12.7.24 } } if (CanHearPlayer()) { PatrolManager.GetInstance().CanPatrol = false; _medeaAI.SetDestination(_player.position); IsAlerted(); StopSearchingAnimation(); state = medeaState.ChasePlayer; } } else { if (!CanSeePlayer()) { //14.08.24 Debug.Log("Kriftike eno ton kinigouse"); //Updates the spot for the enemy to go to: PatrolManager.GetInstance().SetNearbyRoomsPatrolPoints(); PatrolManager.GetInstance().UpdateTakeOutPlayerSpot(); //Goes to the spot: PatrolManager.GetInstance().content = PatrolManager.Rute.SearchingForHiddenPlayerPath; //state = medeaState.TakingOutPlayerFromHiddingSpot; } } //StopAllCoroutines(); break; case medeaState.TakingOutPlayerFromHiddingSpot: //Take the hidden spots of the room the player is in //see the closest to the player //Go there and play the animation //Dont forget that if medea sees the player she is chasing ////If can see player: //if (CanSeePlayer()) //{ IsAlerted(); if (!IsPlayerHidden()) //If player is not hidden anymore: { PatrolManager.GetInstance().CanPatrol = false; PatrolManager.GetInstance()._canChangePoint = true; Debug.Log("Einai mprosta tis kai ton vlepei"); PatrolManager.GetInstance().content = PatrolManager.Rute.LostPlayerPath; _medeaAI.destination = _player.position; state = medeaState.ChasePlayer; } else { PatrolManager.GetInstance().isPatroling(); } #region OLD //} //else //If cant see: //{ // IsAlerted(); // //PatrolManager.GetInstance().CanPatrol = true; // if (!IsPlayerHidden()) //If player is not hidden anymore: // { // //Even if the enemy can't see the player (Because for example he goes behind a wall) we still need to force the Enemy to go to his direction. // PatrolManager.GetInstance().CanPatrol = false; // PatrolManager.GetInstance()._canChangePoint = true; // Debug.Log("The player is lost from Medeas gaze"); // PatrolManager.GetInstance().content = PatrolManager.Rute.LostPlayerPath; // state = medeaState.ChasePlayer; // } //} #endregion break; case medeaState.KillingPlayer: _medeaAI.enabled = false; //_medea.gameObject.GetComponent().enabled = false; DisableMedeaMeshRenderers(); PlayerDeath.GetInstance().LowSanityGhostKillsPlayer(); Debug.Log("I killed him"); break; case medeaState.Disabled: _medeaAI.isStopped = true; _medeaAI.ResetPath(); //this clears the current path PatrolManager.GetInstance()._canChangePoint = false;// medeaAnimator.SetBool("IsLookingAround", false); medeaAnimator.StopPlayback(); StopAllCoroutines(); DisableMedeaMeshRenderers(); this.gameObject.SetActive(false); break; case medeaState.TrafficPuzzle: _currentRotSpeed = 0; _medeaAI.angularSpeed = _currentRotSpeed; thirdPerson.m_StationaryTurnSpeed = _currentRotSpeed; thirdPerson.m_MovingTurnSpeed = _currentRotSpeed; if (PlayerManager.GetInstance()._PlayerMovement._isRunning) { Debug.Log("you run you gdet killed"); DisableMedeaMeshRenderers(); state = medeaState.KillingPlayer; } if (PuzzlesManager.GetInstance().trafficLightsPuzzleData.lightsAreGreen) { _medeaAI.speed = 1.5f; ////If green she moves backwards //_medeaAI.updatePosition = false; //_medeaAI.isStopped = true; //If green and the player gets too close to her then she disappears. if (Vector3.Distance(_player.position, _medea.position) <= 0.5) { //Despawn _medeaAI.speed = _defaultMovementSpeed; medeaAnimator.SetBool("IsWalkingBackwards", false); state = medeaState.Disabled; //_medea.gameObject.SetActive(false); } if (PlayerManager.GetInstance()._PlayerMovement.isMoving) { //_medeaAI.updateRotation = false; _medeaAI.isStopped = false; _medeaAI.updatePosition = true; _medeaAI.destination = PuzzlesManager.GetInstance().trafficLightsPuzzleData.medeaTrafficLightsStartPos.position; medeaAnimator.SetBool("IsWalkingBackwards", true); } else { medeaAnimator.SetBool("IsWalkingBackwards", false); //_medeaAI.updateRotation = true; _medeaAI.updatePosition = false; _medeaAI.isStopped = true; } } else //if red { //if the player moves then medea moves as well in his direction. //if he stops then medea stops. //else the player doesn't move then medea doesn't move if (PlayerManager.GetInstance()._PlayerMovement.isMoving) { /* _medeaAI.updateRotation = true;*/ _medeaAI.updatePosition = true; _medeaAI.isStopped = false; _medeaAI.speed = PlayerManager.GetInstance()._PlayerMovement._CurrentSpeed * 1.5f; //player speed=2.5// _medeaAI.destination = _player.position; } else { //_medeaAI.updateRotation = true; _medeaAI.speed = _defaultMovementSpeed; _medeaAI.isStopped = true; //_medeaAI.destination = _medeaAI.transform.position; } //if the player is too close to her, she kills the player if (Vector3.Distance(_player.position, _medea.position) <= 0.5) { _medeaAI.speed = _defaultMovementSpeed; _currentRotSpeed = _defaulfRotSpeed; _medeaAI.angularSpeed = _defaulfRotSpeed; thirdPerson.m_StationaryTurnSpeed = _defaultStationaryTurnSpeed; thirdPerson.m_MovingTurnSpeed = _defaultMovingTurnSpeed; state = medeaState.KillingPlayer; } } break; case medeaState.OrangeLights: _currentRotSpeed = 0; _medeaAI.angularSpeed = _currentRotSpeed; thirdPerson.m_StationaryTurnSpeed = _currentRotSpeed; thirdPerson.m_MovingTurnSpeed = _currentRotSpeed; if (PlayerManager.GetInstance()._PlayerMovement._isRunning) { Debug.Log("You run, you get killed"); DisableMedeaMeshRenderers(); state = medeaState.KillingPlayer; } if (PuzzlesManager.GetInstance().trafficLightsPuzzleData.lightsAreGreen) { _medeaAI.speed = 1.5f; if (Vector3.Distance(_player.position, _medea.position) <= 0.5) { _medeaAI.speed = _defaultMovementSpeed; medeaAnimator.SetBool("IsWalkingBackwards", false); state = medeaState.Disabled; } if (PlayerManager.GetInstance()._PlayerMovement.isMoving) { _medeaAI.isStopped = false; _medeaAI.updatePosition = true; _medeaAI.destination = PuzzlesManager.GetInstance().trafficLightsPuzzleData.medeaTrafficLightsStartPos.position; medeaAnimator.SetBool("IsWalkingBackwards", true); } else { medeaAnimator.SetBool("IsWalkingBackwards", false); _medeaAI.updatePosition = false; _medeaAI.isStopped = true; } } else if (PuzzlesManager.GetInstance().trafficLightsPuzzleData.lightsAreOrange) // New Orange Light State { _medeaAI.isStopped = true; _medeaAI.speed = 0; medeaAnimator.SetBool("IsFrozen", true); // Implement logic to highlight the correct door //PuzzlesManager.GetInstance().ShowCorrectDoor(); } else // If Red Light { if (PlayerManager.GetInstance()._PlayerMovement.isMoving) { _medeaAI.updatePosition = true; _medeaAI.isStopped = false; _medeaAI.speed = PlayerManager.GetInstance()._PlayerMovement._CurrentSpeed * 1.5f; _medeaAI.destination = _player.position; } else { _medeaAI.speed = _defaultMovementSpeed; _medeaAI.isStopped = true; } if (Vector3.Distance(_player.position, _medea.position) <= 0.5) { _medeaAI.speed = _defaultMovementSpeed; _currentRotSpeed = _defaulfRotSpeed; _medeaAI.angularSpeed = _defaulfRotSpeed; thirdPerson.m_StationaryTurnSpeed = _defaultStationaryTurnSpeed; thirdPerson.m_MovingTurnSpeed = _defaultMovingTurnSpeed; state = medeaState.KillingPlayer; } } break; default: state = medeaState.Spawn; break; } } void UpdateEnemyMovement() { //If agent has not reached the desired destination : if (_medeaAI.remainingDistance > _medeaAI.stoppingDistance) { thirdPerson.Move(_medeaAI.desiredVelocity, false, false); //Agent is moving. } else //If agent has reached the desired destination : { thirdPerson.Move(Vector3.zero, false, false); //Agent stops moving. } } public Vector3 DirFromAngle(float angleInDegrees, bool angleIsGlobal) // This calculate the angle of the viewpoint { if (!angleIsGlobal) { angleInDegrees += transform.eulerAngles.y; } return new Vector3(Mathf.Sin(angleInDegrees * Mathf.Deg2Rad), 0, Mathf.Cos(angleInDegrees * Mathf.Deg2Rad)); } // This method is checking if pplayer is inside the view angle and callculates is there isnt any obstacle between the player and Medea public bool CanSeePlayer() { Collider[] targetInViewRadius = Physics.OverlapSphere(transform.position, _viewRadius, playerMask); if (targetInViewRadius.Length > 0) { _player = targetInViewRadius[0].transform; Vector3 dirToTarget = (_player.position - transform.position).normalized; if (Vector3.Angle(transform.forward, dirToTarget) < _viewAngle / 2) { float distToTarget = Vector3.Distance(transform.position, _player.position); if (!Physics.Raycast(transform.position, dirToTarget, distToTarget, obstacleMask)) { return true; } else { return false; } } } return false; } public bool CanHearPlayer() { Collider[] targetInHearingRadius = Physics.OverlapSphere(transform.position, _hearingRadius, playerMask); if (targetInHearingRadius.Length > 0) { _player = targetInHearingRadius[0].transform; Vector3 dirToTarget = (_player.position - transform.position).normalized; if (Vector3.Angle(transform.forward, dirToTarget) < _hearingAngle / 2) { float distToTarget = Vector3.Distance(transform.position, _player.position); if (!Physics.Raycast(transform.position, dirToTarget, distToTarget, obstacleMask)) { print("Ton akouw ton kariolh"); return true; } else { print("eimai koufh"); return false; } } } return false; } /// /// This method checks if Medea is alerted and Updates her view /// /// public bool IsAlerted() { if (CanSeePlayer()) { _viewRadius = _alertedViewRadius; _viewAngle = _alertedViewAngle; return true; } else { _viewAngle = _defaultViewAngle; _viewRadius = _defaultViewRadius; return false; } } //This method checks if the player is inside a hidding spot public bool IsPlayerHidden() { if (HideManager.GetInstance().InCloset) { return true; } else if (HideManager.GetInstance().UnderBed) { return true; } else if (HideManager.GetInstance().UnderTable) { return true; } return false; } public void DisableMedeaMeshRenderers() { foreach (SkinnedMeshRenderer medeaSkinnedMeshRenderer in _medeaSkinnedMeshRenderer) { medeaSkinnedMeshRenderer.enabled = false; medeaMeshRenderersAreDisabled = true; } } public void EnableMedeaMeshRenderers() { foreach (SkinnedMeshRenderer medeaSkinnedMeshRenderer in _medeaSkinnedMeshRenderer) { medeaSkinnedMeshRenderer.enabled = true; medeaMeshRenderersAreDisabled = false; } } public void StopSearchingAnimation() { //PatrolManager.GetInstance().HidePatrolPoints[PatrolManager.GetInstance()._destinationPoint - 1].parent.transform.parent.TryGetComponent(out ClosetHideBehaviour _closetHideBehaviour); //PatrolManager.GetInstance().HidePatrolPoints[PatrolManager.GetInstance()._destinationPoint -1].parent.transform.parent.TryGetComponent(out BedHideBehaviourBase _bedHideBehaviour); Debug.Log("Is trying to stop search cutscene circus!!!1"); if (PatrolManager.GetInstance().medeasCurrentPlayableDirector != null) { PatrolManager.GetInstance().medeasCurrentPlayableDirector.Stop(); PatrolManager.GetInstance().medeasCurrentPlayableDirector = null; } //if (_closetHideBehaviour != null) //{ // _closetHideBehaviour.StopEnemyClosetSearchCutscene(); //} //else if (_bedHideBehaviour != null) //{ // _bedHideBehaviour.StopEnemyBedSearchCutscene(); //} } #region MedeaDespawn? //IEnumerator MedeaDespawnAfterLosingPlayer() //{ // Debug.Log("Medea will despawn"); // yield return new WaitForSeconds(300f); // if(CanSeePlayer()) // { // StopMedeaDespawn(); // } //} //public void StartMedeaDespawn() //{ // _medeaDespawnTimer = StartCoroutine(MedeaDespawnAfterLosingPlayer()); //} //public void StopMedeaDespawn() //{ // StopCoroutine(_medeaDespawnTimer); //} #endregion private void OnDrawGizmos() { #region GizmosForView Gizmos.color = Color.yellow; Gizmos.DrawWireSphere(transform.position, _viewRadius); Vector3 viewAngleA = DirFromAngle(-_viewAngle / 2, false); Vector3 viewAngleB = DirFromAngle(_viewAngle / 2, false); Gizmos.DrawLine(transform.position, transform.position + viewAngleA * _viewRadius); Gizmos.DrawLine(transform.position, transform.position + viewAngleB * _viewRadius); Gizmos.DrawLine(transform.position, _player.position); #endregion #region GizmosForHearing Gizmos.color = Color.blue; Gizmos.DrawWireSphere(transform.position, _hearingRadius); Vector3 hearingAngleA = DirFromAngle(-_hearingAngle / 2, false); Vector3 hearingAngleB = DirFromAngle(_hearingAngle / 2, false); Gizmos.DrawLine(transform.position, transform.position + hearingAngleA * _hearingRadius); Gizmos.DrawLine(transform.position, transform.position + hearingAngleB * _hearingRadius); Gizmos.DrawLine(transform.position, _player.position); #endregion } }