// Use this for initialization void Start() { Animator anim = GetComponentInChildren <Animator>(); AnimatorStateInfo state = anim.GetCurrentAnimatorStateInfo(0); anim.Play(state.fullPathHash, -1, Random.Range(0f, 1f)); rb = GetComponent <Rigidbody>(); currentState = 0; timer = 2f; walkSpeed = 4; runSpeed = 13; stateOfMind = State_Of_Mind.IDLE; int personalityGen = Random.Range(1, 101); if (personalityGen < 60) { personality = Enemy_Personality.NORMAL; } else if (personalityGen >= 60 && personalityGen < 89) { personality = Enemy_Personality.TIMID; } else if (personalityGen >= 89 && personalityGen < 100) { personality = Enemy_Personality.FRIENDLY; } else { personality = Enemy_Personality.SPECIAL; } player1Found = false; player2Found = false; panicCycles = 0; health = 100; dropType = 0; }
void doNormalPanicBehavior() { if (personality == Enemy_Personality.FRIENDLY) { //You monster. personality = Enemy_Personality.TIMID; } switch (currentState) { case 0: //Calculate turn angle. //Also, break out of panic mode if the enemy has been panicking for a bit and has lost sight of the player. if (!player1Found && !player2Found && panicCycles > 10) { stateOfMind = State_Of_Mind.IDLE; panicCycles = 0; break; } turn = Random.Range(-150f, 150f); turnSpeed = Random.Range(15f, 20f); currentState = 1; break; case 1: //Turn. float angleToTurn = turnSpeed * Mathf.Sign(turn); turn -= angleToTurn; Vector3 rotation = new Vector3(0, angleToTurn, 0); transform.rotation = Quaternion.Euler(transform.rotation.eulerAngles + rotation); if (Mathf.Abs(turn) - turnSpeed < 0) { currentState = 2; timer = Random.Range(3f, 6f); } break; case 2: //Move forward. if (Physics.Raycast(transform.position, transform.forward, 1f, 1 << 0)) { turn = Random.Range(90f, 270f) * (Random.Range(0, 1) == 0 ? -1 : 1); turnSpeed = Random.Range(3f, 5f); currentState = 1; } //Layer 8 is going to be the Enemy Layer else if (Physics.Raycast(transform.position, transform.forward, 1f, 1 << 8)) { turn = Random.Range(30f, 60f) * (Random.Range(0, 1) == 0 ? -1 : 1); turnSpeed = Random.Range(3f, 5f); currentState = 1; } else { rb.MovePosition(transform.position + transform.forward * runSpeed * Time.deltaTime); } break; } panicCycles++; timer -= Time.deltaTime; if (timer < 0 && currentState == 2) { currentState++; if (currentState > 2) { currentState = 0; } timer = 1f; } }