private IList <GameObject> FindCovers(AISuspectController owner) { IList <GameObject> covers = new List <GameObject>(); const float maxDistance = 30f; GameObject[] allCovers = GameObject.FindGameObjectsWithTag("Cover"); foreach (GameObject cover in allCovers) { float distance = Vector3.Distance(cover.transform.position, owner.transform.position); if (distance > maxDistance) { continue; } Vector3 playerPos = owner.Player.transform.position; Vector3 suspectPos = owner.transform.position; Vector3 dirToPlayer = new Vector3(playerPos.x - suspectPos.x, playerPos.y - suspectPos.y, playerPos.z - suspectPos.z); dirToPlayer.Normalize(); float dot = Vector3.Dot(cover.transform.forward, dirToPlayer); if (dot < 0.7) { continue; } covers.Add(cover); } return(covers); }
/// <summary> /// Logic of the NPC's movement, aim and animations. /// </summary> private void SetMovement(AISuspectController owner) { float distanceToPlayer = Vector3.Distance(owner.Player.transform.position, owner.transform.position); //Reached a destination if (owner.NavAgent.pathStatus == NavMeshPathStatus.PathComplete) { owner.NavAgent.SamplePathPosition(NavMesh.AllAreas, 0f, out owner.CurrentNavMesh); } }
// tmp way to adjust gun transform to shoot in the player direction private void AdjustGun(AISuspectController owner) { Vector3 headPos = owner.transform.position; // change to head pos owner.Item.transform.position = new Vector3(headPos.x, headPos.y + 1f, headPos.z); Vector3 suspectRotation = owner.transform.rotation.eulerAngles; //Debug.Log(headPos + " " + owner.Item.transform.position); owner.Item.transform.localEulerAngles = new Vector3(suspectRotation.x, suspectRotation.y - 45, suspectRotation.z); owner.Item.transform.Rotate(CalculateShotOffset()); }
public static bool IsPlayerVisible(AISuspectController suspect) { Vector3 playerHeadPos = suspect.Player.transform.position; Vector3 suspectHeadPos = suspect.transform.position; Vector3 toPlayer = new Vector3(playerHeadPos.x, playerHeadPos.y, playerHeadPos.z) - suspectHeadPos; const float searchRadius = 50f; Physics.Raycast(suspectHeadPos, toPlayer.normalized, out RaycastHit hit, searchRadius); if (hit.transform == null) { return(false); } return(hit.transform.Equals(suspect.Player.transform)); }
private void MoveTowardsPlayer(AIController owner) { const float targetDistanceToPlayer = 10f; // desired distance to player AISuspectController owner2 = (AISuspectController)owner; Vector3 playerPos = owner2.Player.transform.position; Vector3 aiPos = owner2.transform.position; // Calculate destination in a straight line from the player Vector3 offset = new Vector3(playerPos.x - aiPos.x, playerPos.y - aiPos.y, playerPos.z - aiPos.z); offset.Normalize(); offset *= targetDistanceToPlayer; Vector3 destination = new Vector3(playerPos.x, playerPos.y, playerPos.z); destination -= offset; NavMeshPath path = new NavMeshPath(); owner2.NavAgent.CalculatePath(destination, path); if (path.status == NavMeshPathStatus.PathInvalid || path.status == NavMeshPathStatus.PathPartial) { return; // try other destination if this is invalid } //{ // int tries = 0; // const int maxTries = 10; // do // { // // check random positions around player // destination.Set(Random.Range(-targetDistanceToPlayer, targetDistanceToPlayer), // Random.Range(-targetDistanceToPlayer, targetDistanceToPlayer), // Random.Range(-targetDistanceToPlayer, targetDistanceToPlayer)); // destination += playerPos; // owner2.NavAgent.CalculatePath(destination, path); // tries++; // } // while ((path.status == NavMeshPathStatus.PathInvalid || path.status == NavMeshPathStatus.PathPartial) && tries <= maxTries); //} owner2.NavAgent.SetDestination(destination); }
/// <summary> /// Initialize and spawn a suspect /// </summary> private void SpawnSuspect() { int spawnPoint = Random.Range(0, SpawnPoints.Count); GameObject suspect = Instantiate(NPC, SuspectObject.transform); suspect.transform.position = SpawnPoints[spawnPoint].position; suspect.transform.parent = SuspectObject.transform; suspect.AddComponent <AISuspectController>(); int weaponindex = Random.Range(0, Weapons.Length); Weapon weapon = Instantiate(Weapons[weaponindex], suspect.transform); weapon.transform.parent = suspect.transform; weapon.transform.SetAsFirstSibling(); //Add the gun to the NPC GameObject's script AISuspectController suspectController = suspect.GetComponent <AISuspectController>(); suspectController.Item = weapon; suspectController.StateMachine.ChangeState(Patrol.Instance); SuspectList.Add(suspect); }