Пример #1
0
 int checkToSeeDead(GameObject currChar, MasterBehaviour mb, float sightAngle)
 {
     Vector3 deadPos;
     RaycastHit hit;
     int updatedSeen = 0;
     List<int> wasRemoved = new List<int> ();
     int i = 0;
     foreach (GameObject deadChar in deadSet) {
         deadPos = deadChar.transform.position;
         Debug.DrawRay(currChar.transform.position, deadPos - currChar.transform.position, Color.yellow);
         if (Vector3.Angle(currChar.transform.forward, deadPos - currChar.transform.position) <= sightAngle){
             if (Physics.Raycast(currChar.transform.position, deadPos - currChar.transform.position, out hit, sightDist)){
                 if (hit.collider.gameObject == deadChar){
                     seenDeadSet.Add(deadPos);
                     wasRemoved.Add(i);
                     updatedSeen += 1;
                     //he's seen a dead patrol man so he starts going to hide, and while hes going he tells others to hide
                     //this takes a while
                 }
             }
         }
         i++;
     }
     foreach (int j in wasRemoved) {
         deadSet.RemoveAt(j);
     }
     return updatedSeen;
 }
Пример #2
0
    // Use this for initialization
    void Start()
    {
        timer    = 0.0f;
        numChars = characters.transform.childCount;
        Debug.Log(numChars);
        behaviourScripts = new MasterBehaviour[numChars];

        for (int i = 0; i < numChars; i++)
        {
            MasterBehaviour mb = characters.transform.GetChild(i).GetComponent <MasterBehaviour>();
            mb.Starta(plane, swamps, nodeSize);
            behaviourScripts[i] = mb;
        }

        pathfinder       = new PathfindingScheduler();
        pathFindingChars = new LinkedList <GameObject> ();


        //get rid of swamp colliders
        if (swamps != null)
        {
            int swampCount = swamps.transform.childCount;
            for (int k = 0; k < swampCount; k++)
            {
                swamps.transform.GetChild(k).GetComponent <MeshCollider> ().enabled = false;
            }
        }
        shootDistance = 10f;
    }
Пример #3
0
    // Update is called once per frame
    void Update()
    {
        timer += Time.deltaTime;
        //loop through the characters, update their status (ie senses, poi, etc)
        //if the character is not reaching a goal, then wipe it's search state clean

        //loop through chatacters again and do behavior.Updatea

        //finally, pass in array of characters to pathfinding scheduler and let it do its thing

        for (int i = 0; i < numChars; i++)
        {
            GameObject      currChar = characters.transform.GetChild(i).gameObject;
            MasterBehaviour mb       = behaviourScripts[i];
            updateStatus(currChar, mb);
            mb.Updatea();
            bool contained    = pathFindingChars.Contains(currChar);
            bool findingAPath = mb.isReachingGoal();
            if (findingAPath && !contained)
            {
                LinkedListNode <GameObject> c = new LinkedListNode <GameObject>(currChar);
                pathFindingChars.AddLast(c);
                if (currCharForPath == null)
                {
                    currCharForPath = c;
                }
            }
            else if (!findingAPath && contained)
            {
                if (currCharForPath != null && (currChar.name == currCharForPath.Value.name))
                {
                    currCharForPath = currCharForPath.Next;
                }
                pathFindingChars.Remove(currChar);                 //not sure if it finds the actualy character though
                //if we're doing continue search thing, need to reinit the characters search state
            }
        }

//		//perform the behaviors now that their staus is updated
//		for (int j = 0; j < numChars; j++) {
//			behaviourScripts[j].Updatea();
//		}

        pathfinder.characters   = pathFindingChars;
        pathfinder.currCharNode = currCharForPath;
        //do pathfinding stuff
        pathfinder.Updatea();
        if (currCharForPath != null)
        {
            currCharForPath = currCharForPath.Next;
        }
        if (currCharForPath == null)
        {
            currCharForPath = pathFindingChars.First;
        }
    }
Пример #4
0
    void updateStatus(GameObject currChar, MasterBehaviour mb)
    {
//		if (timer < 5.0f) {
//			mb.seesPlayer = false;
//			mb.seesDeadPeople = false;
//			mb.hearsSomething = false;
//			mb.health = 100.0f;
//			Debug.Log(timer);
//		} else if (timer < 25.0f) {
//			Debug.Log ("pathfinding time... " + player.transform.position);
//			mb.seesPlayer = true;
//			mb.poi = player.transform.position;
//			Debug.Log ("pathfinding time start... " + currChar.transform.position);
//		} else {
//			timer = 0.0f;
//		}
        if (mb.isDead)
        {
            return;
        }
        mb.isShooting = false;
        RaycastHit hit;
        float      angle;

        if (mb.seesPlayer)
        {
            angle = 360.0f;
        }
        else
        {
            angle = 30.0f;
        }
        Debug.DrawRay(currChar.transform.position, (Mathf.Sqrt(3) * currChar.transform.forward + currChar.transform.right).normalized * 100.0f, Color.red);
        Debug.DrawRay(currChar.transform.position, (Mathf.Sqrt(3) * currChar.transform.forward - currChar.transform.right).normalized * 100.0f, Color.red);
        if (Vector3.Angle(currChar.transform.forward, player.transform.position - currChar.transform.position) <= angle)
        {
            if (Physics.Raycast(currChar.transform.position, player.transform.position - currChar.transform.position, out hit, 100.0f))
            {
                if (hit.collider.gameObject == player)
                {
                    if (!mb.seesPlayer)
                    {
                        currChar.GetComponents <AudioSource> ()[1].Play();
                    }
                    mb.seesPlayer = true;
                    mb.seenTime  += Time.deltaTime;
                    if (mb.seenTime > 1f)
                    {
                        mb.isShooting = true;
                        mb.seenTime   = 0f;
                    }
                    mb.poi       = player.transform.position;
                    mb.disturbed = true;
                }
                else if (Vector3.Distance(currChar.transform.position, mb.poi) < 10f)
                {
                    mb.seesPlayer     = false;
                    mb.seenTime       = 0f;
                    mb.seesDeadPeople = false;
                    mb.hearsSomething = false;
                    mb.health         = 100.0f;
                }
                else
                {
                }
            }
            else if (Vector3.Distance(currChar.transform.position, mb.poi) < 10f)
            {
                mb.seesPlayer     = false;
                mb.seenTime       = 0f;
                mb.seesDeadPeople = false;
                mb.hearsSomething = false;
                mb.health         = 100.0f;
            }
            else
            {
            }
        }
    }
Пример #5
0
 void updateStatus(GameObject currChar, MasterBehaviour mb)
 {
     //		if (timer < 5.0f) {
     //			mb.seesPlayer = false;
     //			mb.seesDeadPeople = false;
     //			mb.hearsSomething = false;
     //			mb.health = 100.0f;
     //			Debug.Log(timer);
     //		} else if (timer < 25.0f) {
     //			Debug.Log ("pathfinding time... " + player.transform.position);
     //			mb.seesPlayer = true;
     //			mb.poi = player.transform.position;
     //			Debug.Log ("pathfinding time start... " + currChar.transform.position);
     //		} else {
     //			timer = 0.0f;
     //		}
     if (mb.isDead) {
         return;
     }
     mb.isShooting = false;
     RaycastHit hit;
     float angle;
     if (mb.seesPlayer)
         angle = 360.0f;
     else
         angle = 30.0f;
     Debug.DrawRay (currChar.transform.position, (Mathf.Sqrt (3) * currChar.transform.forward + currChar.transform.right).normalized * 100.0f, Color.red);
     Debug.DrawRay (currChar.transform.position, (Mathf.Sqrt (3) * currChar.transform.forward - currChar.transform.right).normalized * 100.0f, Color.red);
     if (Vector3.Angle (currChar.transform.forward, player.transform.position - currChar.transform.position) <= angle) {
         if (Physics.Raycast (currChar.transform.position, player.transform.position - currChar.transform.position, out hit, 100.0f)) {
             if (hit.collider.gameObject == player) {
                 if(!mb.seesPlayer) {
                     currChar.GetComponents <AudioSource> ()[1].Play ();
                 }
                 mb.seesPlayer = true;
                 mb.seenTime += Time.deltaTime;
                 if(mb.seenTime > 1f) {
                     mb.isShooting = true;
                     mb.seenTime = 0f;
                 }
                 mb.poi = player.transform.position;
                 mb.disturbed = true;
             } else if (Vector3.Distance (currChar.transform.position, mb.poi) < 10f) {
                 mb.seesPlayer = false;
                 mb.seenTime = 0f;
                 mb.seesDeadPeople = false;
                 mb.hearsSomething = false;
                 mb.health = 100.0f;
             } else {
             }
         } else if (Vector3.Distance (currChar.transform.position, mb.poi) < 10f) {
             mb.seesPlayer = false;
             mb.seenTime = 0f;
             mb.seesDeadPeople = false;
             mb.hearsSomething = false;
             mb.health = 100.0f;
         } else {
         }
     }
 }
Пример #6
0
 void updateStatus(GameObject currChar, MasterBehaviour mb)
 {
     if (mb.isDead) {
         if (mb.addToDeadSet) {
             //just died, need to make a noise when dying
             mb.addToDeadSet = false;
             deadSet.Add (currChar);
         }
         return;
     }
     mb.isShooting = false;
     int oldAlertLevel = mb.alertLevel;
     float playerAngle;
     if (mb.seesPlayer)
         playerAngle = 360.0f;
     else
         playerAngle = 30.0f + (10.0f * mb.alertLevel);
     updateSniperInfoForChar (currChar, mb);
     updatePlayerInfoForChar (currChar, mb, playerAngle);
     updateSearchingStatus ();
 }
Пример #7
0
 void updateSniperInfoForChar(GameObject currChar, MasterBehaviour mb)
 {
     if (mb.dirSearchCountDown > 0)
         return;
     if (mb.knowsOfSniper ()) {
         if (!mb.seesPlayer)
             mb.takingCover = true;
         if (!mb.isGoingToSeenPlayerPos && !mb.reachedCover) {
             //going to cover
             mb.poi = mb.takeCover.coverPoint (currChar.transform.position);
             mb.isGoaling = true;
             mb.isGoingToCover = true;
             mb.isGoingToSeenPlayerPos = false;
             mb.coverSpot = mb.poi;
         }
         if (Vector3.Distance (mb.coverSpot, currChar.transform.position) <= nodeSize && !mb.seesPlayer){
             //reached cover, not seeing player
             mb.reachedCover = true;
             mb.isGoingToCover = false;
     //				Debug.Log(mb.gameObject.name + " reached cover");
             mb.isGoaling = false;
         } else {
     //				Debug.Log (mb.gameObject.name + " not reached cover");
             mb.reachedCover = false;
         }
     } else {
         mb.takingCover = false;
     }
 }
Пример #8
0
    void updatePlayerInfoForChar(GameObject currChar, MasterBehaviour mb, float playerAngle)
    {
        RaycastHit hit;
        Debug.DrawRay (currChar.transform.position, (Mathf.Sqrt (3) * currChar.transform.forward + currChar.transform.right).normalized * sightDist, Color.red);
        Debug.DrawRay (currChar.transform.position, (Mathf.Sqrt (3) * currChar.transform.forward - currChar.transform.right).normalized * sightDist, Color.red);
        if (Physics.Raycast (currChar.transform.position, player.transform.position - currChar.transform.position, out hit, sightDist)) {
            float angle = Vector3.Angle (currChar.transform.forward, player.transform.position - currChar.transform.position);
            if ((hit.collider.gameObject == player) && (angle <= playerAngle)) {
                if (!mb.seesPlayer) {
                    currChar.GetComponents <AudioSource> () [1].Play ();
                }
                mb.lastSeen = player.transform.position;
                mb.lastSeenForward = player.transform.forward;
                mb.needsToRaiseAlertLevel = true;
                mb.seesPlayer = true;
                mb.seenTime += Time.deltaTime;
                if (mb.seenTime > 2f) {
                    mb.isShooting = true;
                    mb.seenTime = 0f;
                }
                mb.poi = player.transform.position;
                mb.isGoaling = true;
                mb.isGoingToSeenPlayerPos = true;
                mb.isGoingToCover = false;
                mb.disturbed = true;
                mb.takingCover = false;
                makeEveryoneStopSearching(mb.lastSeen);
            } else {
                if(mb.seesPlayer) {
                    extendSearchInForwardDir(mb);
                }
                mb.seesPlayer = false;
            }
        } else {
            if(mb.seesPlayer) {
                extendSearchInForwardDir(mb);
            }
            mb.seesPlayer = false;
        }

        //reached the poi of where he last saw the player
        if (Vector3.Distance (mb.poi, currChar.transform.position) <= nodeSize && mb.isGoingToSeenPlayerPos && !mb.seesPlayer) {
            guessDirection(mb);
        }
    }
Пример #9
0
 void guessDirection(MasterBehaviour mb)
 {
     mb.isGoingToSeenPlayerPos = false;
     mb.isGoaling = false;
     mb.seenTime = 0f;
     mb.wanderDir = NB.pointsToSearch (mb.lastSeenForward, mb.lastSeen, mb.reachGoal.state.sGrid.grid);
     mb.dirSearchCountDown = 6.0f;
     currentlySearching.Add (mb);
 }
Пример #10
0
 void extendSearchInForwardDir(MasterBehaviour mb)
 {
     Vector3 gridCoords = mb.reachGoal.state.sGrid.getGridCoords(player.transform.position + player.transform.forward * 20f);
     Node potentialNode = mb.reachGoal.state.sGrid.grid[(int)gridCoords.x, (int)gridCoords.z];
     if (potentialNode.free)
         mb.poi = potentialNode.loc;
 }