public ZombieAI(Creature owner) : base(owner) { rnd = Randomizer.GetRandomizer(); state = ZombieStates.Wander; SensoryDistance = 5; }
private void ChangeState(ZombieStates newState) { activeState = newState; switch (activeState) { case ZombieStates.Stand: zombieMovement.SetPatrol(true); break; case ZombieStates.Move: path.enabled = true; zombieMovement.SetAngry(false); zombieMovement.SetPatrol(false); StopAllCoroutines(); break; case ZombieStates.Attack: zombieMovement.SetAngry(true); StartCoroutine(SetDamage(damage, attackRate)); break; default: throw new ArgumentOutOfRangeException(); } }
private void Awake() { _movement = GetComponentInChildren <Movement>(); _playerTracker = GetComponentInChildren <PlayerTracker>(); _playerTracker.PlayerEntered += () => { _currentZombieState = ZombieStates.Chasing; }; _playerTracker.PlayerLeft += () => { _currentZombieState = ZombieStates.Idle; }; }
public void Alert(GameObject alerter) { targetEnemy = alerter; state = ZombieController.ZombieStates.Pursuit; wanderingToPosition = false; anim.SetInteger("ZombieState", (int)ZombieStates.Pursuit); agent.speed = stats.attackMovementSpeed; }
private void Awake() { _movement = GetComponentInChildren <Movement>(); _jumping = GetComponentInChildren <Jumping>(); _playerTracker = GetComponentInChildren <PlayerTracker>(); _playerTracker.PlayerEntered += () => { _currentZombieState = Vector3.Distance(transform.position, _playerTracker.Position) <= _jumpThreshold ? ZombieStates.Jumping : ZombieStates.Approaching; }; _playerTracker.PlayerLeft += () => { _currentZombieState = ZombieStates.Idle; }; }
private void Wander() { //continually search for enemy to attack Collider[] hitColliders = Physics.OverlapSphere(transform.position, alertRadius); int highestAggroPriority = -1; foreach (Collider hit in hitColliders) { IFFTag otherAgent = hit.GetComponentInParent <IFFTag>(); if (otherAgent == null) { continue; } if (otherAgent.IFF_channel != iff_channel) { if (otherAgent.aggroPriority >= highestAggroPriority) { targetEnemy = otherAgent.gameObject; } } } //if previous goal has been achieved (enemy death or wander point reached) then make a new wander point if (targetEnemy == null) { if (wanderingToPosition) { //check if position has been reached wanderPosition.y = transform.position.y; if (Vector3.Distance(wanderPosition, transform.position) <= wanderReachedRadius) { wanderingToPosition = false; } } //select new wander position if (!wanderingToPosition) { wanderPosition = RandomNavmeshLocation(wanderRadius); Debug.DrawRay(wanderPosition, Vector3.up * 10f, Color.blue, 10f); wanderingToPosition = true; agent.SetDestination(wanderPosition); agent.speed = stats.wanderMovementSpeed; } } else { wanderingToPosition = false; state = ZombieStates.Pursuit; anim.SetInteger("ZombieState", (int)ZombieStates.Pursuit); agent.speed = stats.attackMovementSpeed; } }
public void DeathState() { CurrentState = ZombieStates.Dead; //For zombie dead state GetComponent <BoxCollider> ().enabled = false; box.size = new Vector3(0, 0, 0); //for Zombie collider size Destroy(gameObject, 1f); //for destroy Zombie GameObject obj = Instantiate(FireEffect, transform.position, Quaternion.identity) as GameObject; //for Zombie dead Effect instantiate Destroy(obj, 1f); //destroy Zombie dead effect Ace_IngameUiControl.Static.inGameScoreCount++; //for Counting score SoundController.Static.playSoundFromName("Dead2"); //for Zombie dead sound }
void MakeDecisions() { float distanceToPlayer = Vector3.Distance(transform.position, _player.position); AnimatorStateInfo stateInfo = _animator.GetCurrentAnimatorStateInfo(0); if (_state == ZombieStates.idle) { //si lastiman al zombie o el player entra en rango de deteccion if (_healthScript._currentHealth < _healthScript._maxHealth || distanceToPlayer <= _detectRange) { //comenzamos a perseguir al player _state = ZombieStates.pursue; _animator.SetTrigger("move"); } } else if (_state == ZombieStates.pursue && distanceToPlayer <= _attackRange && !stateInfo.IsName("Base Layer.zombieAttack")) { _state = ZombieStates.attack; _rigidbody.velocity = Vector2.zero; _rigidbody.isKinematic = true; _animator.SetTrigger("attack"); } else if (_state == ZombieStates.attack) { if (stateInfo.IsName("Base Layer.zombieAttack")) { if (stateInfo.normalizedTime >= 0.97f) { //si despues de atacar el player ya no esta en rango... //pasas a perseguirlo if (distanceToPlayer > _attackRange) { _state = ZombieStates.pursue; _rigidbody.isKinematic = false; _animator.SetTrigger("move"); } } } } }
void ChangeState(ZombieStates newState) { activeState = newState; switch (activeState) { case ZombieStates.STAND: movement.enabled = false; //movement.StopMovement(); break; case ZombieStates.MOVE: movement.enabled = true; break; case ZombieStates.ATTACK: movement.enabled = false; // movement.StopMovement(); break; } }
void ChangeState(ZombieStates newState) { activeState = newState; switch (activeState) { case ZombieStates.Stand: // если активный шаг == Стэнд, то отключить движение зомби _zombieMovement.enabled = false; _zombieMovement.StopMovement(); break; case ZombieStates.Move: // если активный шаг == Мув, то включить движение зомби _zombieMovement.enabled = true; break; case ZombieStates.Attack: // если активный шаг == Аттак, то отключить движение зомби _zombieMovement.enabled = false; _zombieMovement.StopMovement(); break; } }
void ChangeState(ZombieStates newState) { activeState = newState; switch (activeState) { case ZombieStates.STAND: // выключаем выполнение скрипта мувмента movement.enabled = false; //movement.StopMovement(); transform.up = startGuardRotation; break; case ZombieStates.MOVE: movement.enabled = true; target.target = player.transform; movement.maxSpeed = followSpeed; break; case ZombieStates.ATTACK: movement.enabled = false; //movement.StopMovement(); break; case ZombieStates.RETURN: movement.enabled = true; target.target = previousPoint.transform; movement.maxSpeed = returnSpeed; Rotate(previousPoint); break; case ZombieStates.PATROL: movement.enabled = true; nextPoint = patrolPoints[currentPatrolPoint]; target.target = nextPoint.transform; movement.maxSpeed = patrolSpeed; Rotate(nextPoint); break; case ZombieStates.DEATH: movement.enabled = false; //movement.StopMovement(); //movement.StopMovement(); player.onDeath -= onPlayerDeath; anim.SetTrigger("Death"); if (finalBoss) { ActivateRescueZone(true); } Destroy(gameObject, corpsTime); DropItem(); break; default: break; } }
internal override void Update() { switch (state) { case ZombieStates.Wander: { bool isCloseToEnemy = false; foreach (Creature c in owner.manager.creatures) { if (c != owner && c.Faction != owner.Faction) // do not detect yourself or friends { if (DistanceTo(c.X_pos, c.Y_pos) < SensoryDistance) { isCloseToEnemy = true; } } } if (isCloseToEnemy) { closest_enemy = FindClosestEnemyInSensoryRange(); Creature_Target = closest_enemy; state = ZombieStates.Attack; } if (closest_enemy != null) { Creature_Target = closest_enemy; state = ZombieStates.Attack; } if (rnd.Next(100) > 50) { Position_Target_X = rnd.Next(0, owner.manager.worldManager.WorldWidth); Position_Target_Y = rnd.Next(0, owner.manager.worldManager.WorldHeight); Send(new CPMessage() { type = CPMessageType.TARGET, x_position = Position_Target_X, y_position = Position_Target_Y }); } break; } case ZombieStates.Attack: { if (Creature_Target != null) { if (!Creature_Target.body.IsAlive) { Creature_Target = null; state = ZombieStates.Wander; break; } // job done! if (DistanceTo(Creature_Target.X_pos, Creature_Target.Y_pos) < 2) { Send(new CPMessage() { type = CPMessageType.MELEE_ATTACK, x_position = Creature_Target.X_pos, y_position = Creature_Target.Y_pos }); // TEST CODE break; } else { Send(new CPMessage() { type = CPMessageType.TARGET, x_position = Creature_Target.X_pos, y_position = Creature_Target.Y_pos }); } } break; } } }