void Update() { wherePlayerAt = new Vector3(player.position.x, transform.position.y, player.position.z); distanceToPlayer = Vector3.Distance(transform.position, wherePlayerAt); pointToPlayer = wherePlayerAt - transform.position; pointToPlayer.Normalize(); // Important information gathering! CheckBeingLit(); CheckSeePlayer(); /* ============================ * MORDERENs STATE-MACHINE!!! * ============================ */ // PATROL STATE // Morderen wanders randomly, hoping to bump into the player. if(myState == MorderState.PATROL_STATE) { if(enterState || arrivedAtPathEnd || pathIsImpossible || amStuck || distanceToPlayer > maximumDistanceFromPlayer * 1.5F) { if(arrivedAtPathEnd) { waitToMove = shortWait; } while(true) { int randomIndex = Random.Range(0, nodeList.Count - 1); if((nodeList[randomIndex].position - player.position).magnitude < maximumDistanceFromPlayer) { FindPathTo(nodeList[randomIndex].gameobject.transform); break; } } } FollowPath(); WalkForward(); enterState = false; // Transitions if(beingLit && distanceToPlayer < flashlightFreezeRange) { myState = MorderState.BACK_OFF_STATE; enterState = true; } else if(seePlayer) { myState = MorderState.SEE_PLAYER_STATE; enterState = true; } else if(sawOrHeardPlayer) { myState = MorderState.SEARCH_FOR_PLAYER_STATE; enterState = true; } } // SEE PLAYER STATE // Morderen can see the player, and walks towards them. else if(myState == MorderState.SEE_PLAYER_STATE) { sawOrHeardPlayer = true; waitToMove = 0; movementDestination = wherePlayerAt; if(beingLit && distanceToPlayer < flashlightKillRange && flashlightKills && Flashlight.batteryLife > 0) { Flashlight.batteryLife -= flashlightKillDrain; // TeleportToSafety(); } if(distanceToPlayer<=killRange && seePlayer) { rigidbody.velocity = Vector3.zero; // MURDER DEATH KILL!!!!!!! //if(canKill) //PlayerScript.LoadLastCheckpoint(); }else{ WalkForward(); } enterState = false; // Transitions if(beingLit && distanceToPlayer < flashlightFreezeRange) { myState = MorderState.BACK_OFF_STATE; enterState = true; } else if(!seePlayer) { myState = MorderState.SEARCH_FOR_PLAYER_STATE; enterState = true; } } // SEARCH FOR PLAYER STATE // Morderen has some idea of where the player is, and proceeds to search for them. else if(myState == MorderState.SEARCH_FOR_PLAYER_STATE) { if(enterState) { FindPathTo(player); //ExtendCurrentPathTowards(player.position); // No no, write a function that logically guess a path extension! Take number of extensions as param. } // If Morderen couldn't find player. if(arrivedAtPathEnd || pathIsImpossible || amStuck) sawOrHeardPlayer = false; FollowPath(); WalkForward(); enterState = false; // Transitions if(beingLit && distanceToPlayer < flashlightFreezeRange) { myState = MorderState.BACK_OFF_STATE; enterState = true; sawOrHeardPlayer = false; } else if(seePlayer) { myState = MorderState.SEE_PLAYER_STATE; enterState = true; } else if(!sawOrHeardPlayer) { myState = MorderState.PATROL_STATE; enterState = true; waitToMove = shortWait * 2; } } // BACK OFF STATE // Morderen is sad and scared, and backs away from the player. else if(myState == MorderState.BACK_OFF_STATE) { // walk away from player... Flashlight.batteryLife -= Time.deltaTime * flashlightFreezeDrain; enterState = false; // Transitions if(!beingLit && distanceToPlayer < flashlightFreezeRange) { myState = MorderState.SEE_PLAYER_STATE; enterState = true; } } /* ============= * OTHER STUFF * ============= */ // Mute / play walking sound and animation if standing still / walking AnimateMurderer(); PlaySounds(); rigidbody.AddForce(0, extraGravity, 0); // Update wait time if(waitToMove > 0) { waitToMove -= (int)(Time.deltaTime * 1000); if(waitToMove < 0) waitToMove = 0; } // Update the timer that checks if morderen is stuck if(beingStuckTimer > 2000 && waitToMove == 0) { if((stuckCheckPosition - transform.position).sqrMagnitude < 0.5F) { amStuck = true; } stuckCheckPosition = transform.position; beingStuckTimer = 0; } else { amStuck = false; beingStuckTimer += (int)(Time.deltaTime * 1000); } // ****** DEBUG STUFF ****** for(int i = 0; i < currentPath.Count; i++) { //Debug.DrawLine(currentPath[i].position, currentPath[i].position + Vector3.up * 20, Color.green); if(!(i >= currentPath.Count - 1)) Debug.DrawLine(currentPath[i].position, currentPath[i+1].position, Color.red); } // Draws ALL connections between nodes. for(int i = 0; i < nodeList.Count; i++) { for(int j = 0; j < nodeList[i].neighbours.Count; j++) { Debug.DrawLine(nodeList[i].position, nodeList[i].neighbours[j].position, Color.blue); } } // *** END OF DEBUG STUFF *** }
void Update() { wherePlayerAt = new Vector3(player.position.x, transform.position.y, player.position.z); distanceToPlayer = Vector3.Distance(transform.position, wherePlayerAt); pointToPlayer = wherePlayerAt - transform.position; pointToPlayer.Normalize(); // Important information gathering! CheckBeingLit(); CheckSeePlayer(); /* ============================ * MORDERENs STATE-MACHINE!!! * ============================ */ // PATROL STATE // Morderen wanders randomly, hoping to bump into the player. if (myState == MorderState.PATROL_STATE) { if (enterState || arrivedAtPathEnd || pathIsImpossible || amStuck || distanceToPlayer > maximumDistanceFromPlayer * 1.5F) { if (arrivedAtPathEnd) { waitToMove = shortWait; } while (true) { int randomIndex = Random.Range(0, nodeList.Count - 1); if ((nodeList[randomIndex].position - player.position).magnitude < maximumDistanceFromPlayer) { FindPathTo(nodeList[randomIndex].gameobject.transform); break; } } } FollowPath(); WalkForward(); enterState = false; // Transitions if (beingLit && distanceToPlayer < flashlightFreezeRange) { myState = MorderState.BACK_OFF_STATE; enterState = true; } else if (seePlayer) { myState = MorderState.SEE_PLAYER_STATE; enterState = true; } else if (sawOrHeardPlayer) { myState = MorderState.SEARCH_FOR_PLAYER_STATE; enterState = true; } } // SEE PLAYER STATE // Morderen can see the player, and walks towards them. else if (myState == MorderState.SEE_PLAYER_STATE) { sawOrHeardPlayer = true; waitToMove = 0; movementDestination = wherePlayerAt; if (beingLit && distanceToPlayer < flashlightKillRange && flashlightKills && Flashlight.batteryLife > 0) { Flashlight.batteryLife -= flashlightKillDrain; // TeleportToSafety(); } if (distanceToPlayer <= killRange && seePlayer) { rigidbody.velocity = Vector3.zero; // MURDER DEATH KILL!!!!!!! //if(canKill) //PlayerScript.LoadLastCheckpoint(); } else { WalkForward(); } enterState = false; // Transitions if (beingLit && distanceToPlayer < flashlightFreezeRange) { myState = MorderState.BACK_OFF_STATE; enterState = true; } else if (!seePlayer) { myState = MorderState.SEARCH_FOR_PLAYER_STATE; enterState = true; } } // SEARCH FOR PLAYER STATE // Morderen has some idea of where the player is, and proceeds to search for them. else if (myState == MorderState.SEARCH_FOR_PLAYER_STATE) { if (enterState) { FindPathTo(player); //ExtendCurrentPathTowards(player.position); // No no, write a function that logically guess a path extension! Take number of extensions as param. } // If Morderen couldn't find player. if (arrivedAtPathEnd || pathIsImpossible || amStuck) { sawOrHeardPlayer = false; } FollowPath(); WalkForward(); enterState = false; // Transitions if (beingLit && distanceToPlayer < flashlightFreezeRange) { myState = MorderState.BACK_OFF_STATE; enterState = true; sawOrHeardPlayer = false; } else if (seePlayer) { myState = MorderState.SEE_PLAYER_STATE; enterState = true; } else if (!sawOrHeardPlayer) { myState = MorderState.PATROL_STATE; enterState = true; waitToMove = shortWait * 2; } } // BACK OFF STATE // Morderen is sad and scared, and backs away from the player. else if (myState == MorderState.BACK_OFF_STATE) { // walk away from player... Flashlight.batteryLife -= Time.deltaTime * flashlightFreezeDrain; enterState = false; // Transitions if (!beingLit && distanceToPlayer < flashlightFreezeRange) { myState = MorderState.SEE_PLAYER_STATE; enterState = true; } } /* ============= * OTHER STUFF * ============= */ // Mute / play walking sound and animation if standing still / walking AnimateMurderer(); PlaySounds(); rigidbody.AddForce(0, extraGravity, 0); // Update wait time if (waitToMove > 0) { waitToMove -= (int)(Time.deltaTime * 1000); if (waitToMove < 0) { waitToMove = 0; } } // Update the timer that checks if morderen is stuck if (beingStuckTimer > 2000 && waitToMove == 0) { if ((stuckCheckPosition - transform.position).sqrMagnitude < 0.5F) { amStuck = true; } stuckCheckPosition = transform.position; beingStuckTimer = 0; } else { amStuck = false; beingStuckTimer += (int)(Time.deltaTime * 1000); } // ****** DEBUG STUFF ****** for (int i = 0; i < currentPath.Count; i++) { //Debug.DrawLine(currentPath[i].position, currentPath[i].position + Vector3.up * 20, Color.green); if (!(i >= currentPath.Count - 1)) { Debug.DrawLine(currentPath[i].position, currentPath[i + 1].position, Color.red); } } // Draws ALL connections between nodes. for (int i = 0; i < nodeList.Count; i++) { for (int j = 0; j < nodeList[i].neighbours.Count; j++) { Debug.DrawLine(nodeList[i].position, nodeList[i].neighbours[j].position, Color.blue); } } // *** END OF DEBUG STUFF *** }