public void Update(Guard owner) { owner.transform.Rotate(Vector3.up, 2f); /* * Checking if the guard can see player, and switching to chasing state, if so. */ GameObject playerGameObject = LevelManager.Instance.GetPlayerGameObject(); if (owner.IsObjectInSight(playerGameObject)) { owner.StartChasing(playerGameObject.transform); } else { AudibleObject playerAudibleObject = playerGameObject.GetComponent <AudibleObject>(); Vector3? playerLocation = owner.LocateObjectFromNoise(playerAudibleObject); if (playerLocation != null) { owner.StartChasing(playerGameObject.transform); owner.ChaseStateData.LastKnownPosition = playerLocation.Value; // Just in case, if we add approximation to noise location } } }
public void Update(Guard owner) { StateData stateData = owner.PatrolStateData; int targetWaypointIndex = stateData.TargetWaypointIndex; if (targetWaypointIndex != -1) { Vector3 targetPosition = owner.DefaultPatrolCircuit.GetWaypoint(targetWaypointIndex).position; if (!stateData.IsMoving) { owner.MoveTowards(targetPosition); stateData.IsMoving = true; } else { float distanceLeft = Vector3.Distance(owner.transform.position, targetPosition); if (distanceLeft < ArrivalDistance) { stateData.IsMoving = false; stateData.TargetWaypointIndex = owner.DefaultPatrolCircuit.GetNextWaypointIndex(targetWaypointIndex); } } } /* * Checking if the guard can see player, and switching to chasing state, if so. */ GameObject playerGameObject = LevelManager.Instance.GetPlayerGameObject(); if (owner.IsObjectInSight(playerGameObject)) { owner.StartChasing(playerGameObject.transform); } else { AudibleObject playerAudibleObject = playerGameObject.GetComponent <AudibleObject>(); Vector3? playerLocation = owner.LocateObjectFromNoise(playerAudibleObject); if (playerLocation != null) { owner.StartChasing(playerGameObject.transform); owner.ChaseStateData.LastKnownPosition = playerLocation.Value; // Just in case, if we add approximation to noise location } } }
public Vector3?LocateObjectFromNoise(AudibleObject audibleObject) { return(audibleObject.LocateFromNoise(gameObject)); }
public void Update(Guard owner) { StateData stateData = owner.ChaseStateData; bool targetOnSight = false, targetAudible = false; if (owner.IsObjectInSight(stateData.TargetTransform.gameObject)) { targetOnSight = true; stateData.LastKnownPosition = stateData.TargetTransform.position; } else { AudibleObject targetAudibleObject = stateData.TargetTransform.GetComponent <AudibleObject>(); if (targetAudibleObject != null) { Vector3?targetLocation = owner.LocateObjectFromNoise(targetAudibleObject); if (targetLocation != null) { targetAudible = true; stateData.LastKnownPosition = targetLocation.Value; } } } if (targetOnSight) { Player player = stateData.TargetTransform.GetComponent <Player>(); if (player != null && !player.IsInfected) { float distance = Vector3.Distance(owner.transform.position, stateData.TargetTransform.position); if (distance <= owner.MaxInfectionRadius) { float infectionValue = StaticTools.Remap(distance, 0, owner.MaxInfectionRadius, owner.MaxInfection, 0); player.Infect(infectionValue); } } } if (Vector3.Distance(owner.transform.position, stateData.LastKnownPosition) > owner.LostDistance) { owner.MoveTowards(stateData.LastKnownPosition); /*if (!owner.MoveTowards(stateData.LastKnownPosition)) * { * StateMachine<Guard> stateMachine = owner.GetStateMachine(); * stateMachine.SwitchState(stateMachine.GetPreviousState() ?? GuardStates.Idle.Instance); * }*/ } else { if (!targetOnSight && !targetAudible) { // Lost target StateMachine <Guard> stateMachine = owner.GetStateMachine(); stateMachine.SwitchState(stateMachine.GetPreviousState() ?? GuardStates.Idle.Instance); } else { // Too Close to target owner.StopMoving(); Vector3 lookAtPos = stateData.TargetTransform.position; lookAtPos.y = owner.transform.position.y; owner.transform.LookAt(lookAtPos); //TODO: Switch state or do something } } }