Esempio n. 1
0
        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
                }
            }
        }
Esempio n. 2
0
        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
                }
            }
        }
Esempio n. 3
0
 public Vector3?LocateObjectFromNoise(AudibleObject audibleObject)
 {
     return(audibleObject.LocateFromNoise(gameObject));
 }
Esempio n. 4
0
        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
                }
            }
        }