public void AggressiveFindTarget(float time, Vector3 currentPosition) { // Aggressive monster or summoned monster will find target to attacker if (monsterDatabase.characteristic != MonsterCharacteristic.Aggressive && CacheMonsterCharacterEntity.Summoner == null) { return; } BaseCharacterEntity targetCharacter; if (!CacheMonsterCharacterEntity.TryGetTargetEntity(out targetCharacter) || targetCharacter.IsDead()) { // If no target enenmy or target enemy is dead, Find nearby character by layer mask var foundObjects = new List <Collider2D>(Physics2D.OverlapCircleAll(currentPosition, monsterDatabase.visualRange, gameInstance.characterLayer.Mask)); foreach (var foundObject in foundObjects) { var characterEntity = foundObject.GetComponent <BaseCharacterEntity>(); // Attack target settings if (characterEntity != null && characterEntity.CanReceiveDamageFrom(CacheMonsterCharacterEntity)) { SetStartFollowTargetTime(time); CacheMonsterCharacterEntity.SetAttackTarget(characterEntity); return; } } } }
public void AggressiveFindTarget(float time, Vector3 currentPosition) { // Aggressive monster or summoned monster will find target to attack if (monsterDatabase.characteristic != MonsterCharacteristic.Aggressive && CacheMonsterCharacterEntity.Summoner == null) { return; } BaseCharacterEntity targetCharacter; if (!CacheMonsterCharacterEntity.TryGetTargetEntity(out targetCharacter) || targetCharacter.IsDead()) { // If no target enenmy or target enemy is dead, Find nearby character by layer mask List <Collider> foundObjects = new List <Collider>(Physics.OverlapSphere(currentPosition, monsterDatabase.visualRange, gameInstance.characterLayer.Mask)); foreach (Collider foundObject in foundObjects) { BaseCharacterEntity characterEntity = foundObject.GetComponent <BaseCharacterEntity>(); // Attack target settings if (characterEntity == null || !characterEntity.CanReceiveDamageFrom(CacheMonsterCharacterEntity)) { // If character is null or cannot receive damage from monster, skip it continue; } if (CacheMonsterCharacterEntity.Summoner != null && CacheMonsterCharacterEntity.Summoner != characterEntity.GetTargetEntity()) { // If character is not attacking summoner, skip it continue; } if (!CacheMonsterCharacterEntity.IsEnemy(characterEntity)) { // If character is not enemy, skip it continue; } // Found target, attack it SetStartFollowTargetTime(time); CacheMonsterCharacterEntity.SetAttackTarget(characterEntity); break; } } }
protected void UpdateActivity(float time) { if (!CacheMonsterCharacterEntity.IsServer || CacheMonsterCharacterEntity.Identity.CountSubscribers() == 0 || monsterDatabase == null) { return; } if (CacheNavMeshAgent.velocity.magnitude > 0) { CacheMonsterCharacterEntity.MovementState = MovementState.Forward | MovementState.IsGrounded; } else { CacheMonsterCharacterEntity.MovementState = MovementState.IsGrounded; } if (CacheMonsterCharacterEntity.IsDead()) { StopMove(); CacheMonsterCharacterEntity.SetTargetEntity(null); return; } Vector3 currentPosition = CacheMonsterCharacterEntity.CacheTransform.position; if (CacheMonsterCharacterEntity.Summoner != null && Vector3.Distance(currentPosition, CacheMonsterCharacterEntity.Summoner.CacheTransform.position) > gameInstance.minFollowSummonerDistance) { // Follow summoner with stat's move speed FollowSummoner(time); return; } if (CacheMonsterCharacterEntity.Summoner == null && CacheMonsterCharacterEntity.isInSafeArea) { // If monster move into safe area, wander to another place RandomWanderTarget(time); return; } BaseCharacterEntity targetEntity; if (CacheMonsterCharacterEntity.TryGetTargetEntity(out targetEntity)) { if (targetEntity.IsDead() || targetEntity.isInSafeArea) { // If target is dead or in safe area stop attacking CacheMonsterCharacterEntity.SetTargetEntity(null); return; } UpdateAttackTarget(time, currentPosition, targetEntity); } else { // Find target when it's time if (time >= findTargetTime) { SetFindTargetTime(time); AggressiveFindTarget(time, currentPosition); return; } // Wandering when it's time if (time >= wanderTime) { RandomNextWanderTime(time); RandomWanderTarget(time); return; } } }