示例#1
0
    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);
    }
示例#2
0
    /// <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);
        }
    }
示例#3
0
    // 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());
    }
示例#4
0
    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));
    }
示例#5
0
    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);
    }
示例#6
0
    /// <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);
    }