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; }
// 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; }
// 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; } }
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 { } } }
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 { } } }
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 (); }
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; } }
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); } }
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); }
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; }