Ai 테스트
This commit is contained in:
parent
fc65abc7b4
commit
b342cb3adf
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
BIN
BlueWater/Assets/01.Scenes/02.Main_TG/NavMesh-SecondMap.asset
Normal file
BIN
BlueWater/Assets/01.Scenes/02.Main_TG/NavMesh-SecondMap.asset
Normal file
Binary file not shown.
@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ed36e1064a49b084bac46d5debdc1de3
|
||||
guid: 86dead43324d7b44bbe8482319d1490f
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 23800000
|
BIN
BlueWater/Assets/01.Scenes/02.Main_TG/NavMesh-Water Object.asset
Normal file
BIN
BlueWater/Assets/01.Scenes/02.Main_TG/NavMesh-Water Object.asset
Normal file
Binary file not shown.
@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2fac3aeaa82ea9148ac35f80b65e67dc
|
||||
guid: 0dbad892c171e0b43b86934a3ac12789
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 23800000
|
@ -669,7 +669,7 @@ namespace BlueWaterProject
|
||||
protected virtual IEnumerator AttackAnimation()
|
||||
{
|
||||
closeWeapon.SetIsAttacked(false);
|
||||
closeWeapon.SetAttackerStat(AiStat);
|
||||
closeWeapon.SetWeaponStat(AiStat.Atk, AiStat.ShieldPenetrationRate, AiStat.AttackerType == EAttackerType.OFFENSE);
|
||||
aiAnimator.SetTrigger(AttackHash);
|
||||
|
||||
while (isAttacking)
|
||||
|
@ -1,26 +0,0 @@
|
||||
using BehaviorDesigner.Runtime.Tasks;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
{
|
||||
[TaskCategory("Custom/Action")]
|
||||
public class Attack : Action
|
||||
{
|
||||
private AiController aiController;
|
||||
|
||||
public override void OnAwake()
|
||||
{
|
||||
aiController = transform.GetComponent<AiController>();
|
||||
}
|
||||
|
||||
public override void OnStart()
|
||||
{
|
||||
aiController.Attack();
|
||||
}
|
||||
|
||||
public override TaskStatus OnUpdate()
|
||||
{
|
||||
return aiController.IsAttackCoroutine ? TaskStatus.Running : TaskStatus.Success;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
// using BehaviorDesigner.Runtime;
|
||||
// using BehaviorDesigner.Runtime.Tasks;
|
||||
// using UnityEngine;
|
||||
//
|
||||
// // ReSharper disable once CheckNamespace
|
||||
// namespace BlueWaterProject
|
||||
// {
|
||||
// [TaskCategory("Custom/Conditional")]
|
||||
// public class CanAttackInOffense : Conditional
|
||||
// {
|
||||
// [RequiredField] public SharedAiStat aiStat;
|
||||
// [RequiredField] public SharedIslandInfo islandInfo;
|
||||
// [RequiredField] public SharedTransform targetTransform;
|
||||
//
|
||||
// public override TaskStatus OnUpdate()
|
||||
// {
|
||||
// if (!targetTransform.Value || !islandInfo.Value.TargetAllList.Contains(targetTransform.Value)) return TaskStatus.Failure;
|
||||
//
|
||||
// var targetToDistance = Vector3.Distance(targetTransform.Value.position, transform.position);
|
||||
// var targetInAttackRange = targetToDistance <= aiStat.Value.AtkRange;
|
||||
//
|
||||
// return targetInAttackRange ? TaskStatus.Success : TaskStatus.Failure;
|
||||
// }
|
||||
// }
|
||||
// }
|
@ -1,5 +1,6 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a55ee4efaad27d948ba5f03fc6d7bc80
|
||||
guid: ec88ff1593c266f4bacdac246851500a
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
@ -1,5 +1,6 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ed9b95dc6ed6d0647ad7f1a8f305385d
|
||||
guid: 1b2c1ea1e8ca8894eb1c93a20ae6bdcb
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
@ -0,0 +1,19 @@
|
||||
using BehaviorDesigner.Runtime.Tasks;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
{
|
||||
[TaskCategory("Custom/CombatAction")]
|
||||
public class DieOfCombat : CombatAction
|
||||
{
|
||||
public override void OnStart()
|
||||
{
|
||||
combatAi.Die();
|
||||
}
|
||||
|
||||
public override TaskStatus OnUpdate()
|
||||
{
|
||||
return TaskStatus.Success;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6875a9897212c2f45ac34352aa8b64ef
|
||||
guid: 248ee1686bf00ad43951a1296978b09d
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
@ -1,5 +1,6 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3d7c4217783978e4abe6496ac71eee94
|
||||
guid: b95f16cdd3b71dc48bd7fc20493b6b35
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
@ -1,5 +1,6 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4ff1f29eab234cf4490d9bb383892c44
|
||||
guid: ce7fd23e7154da9409e4c8e9b8709535
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
@ -0,0 +1,24 @@
|
||||
using BehaviorDesigner.Runtime.Tasks;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
{
|
||||
[TaskCategory("Custom/EnemyAction")]
|
||||
public class AttackOfEnemy : EnemyAction
|
||||
{
|
||||
public override void OnStart()
|
||||
{
|
||||
enemyAi.Attack();
|
||||
}
|
||||
|
||||
public override TaskStatus OnUpdate()
|
||||
{
|
||||
return enemyAi.GetIsAttackCoroutine() ? TaskStatus.Running : TaskStatus.Success;
|
||||
}
|
||||
|
||||
public override void OnEnd()
|
||||
{
|
||||
StopAllCoroutines();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f726c5737f44a1544b57c5f62cec144c
|
||||
guid: f3c05fd3087c0bb479afcc8212a74cc1
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
@ -0,0 +1,19 @@
|
||||
using BehaviorDesigner.Runtime.Tasks;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
{
|
||||
[TaskCategory("Custom/EnemyAction")]
|
||||
public class FindTargetOfEnemy : EnemyAction
|
||||
{
|
||||
public override void OnStart()
|
||||
{
|
||||
enemyAi.FindTarget();
|
||||
}
|
||||
|
||||
public override TaskStatus OnUpdate()
|
||||
{
|
||||
return TaskStatus.Success;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
using BehaviorDesigner.Runtime;
|
||||
using BehaviorDesigner.Runtime.Tasks;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
{
|
||||
[TaskCategory("Custom/EnemyAction")]
|
||||
public class InitBaseEnemy : EnemyAction
|
||||
{
|
||||
[RequiredField] public SharedAttackerType attackerType;
|
||||
|
||||
public override void OnStart()
|
||||
{
|
||||
attackerType.Value = enemyAi.EnemyStat.AttackerType;
|
||||
}
|
||||
|
||||
public override TaskStatus OnUpdate()
|
||||
{
|
||||
return TaskStatus.Success;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0f16bfce0fda1394aa75287d1197deff
|
||||
guid: 6b7c7916c685bf741ad0c84618c3ef00
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
@ -0,0 +1,22 @@
|
||||
using BehaviorDesigner.Runtime;
|
||||
using BehaviorDesigner.Runtime.Tasks;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
{
|
||||
[TaskCategory("Custom/EnemyAction")]
|
||||
public class InitDefenseEnemy : EnemyAction
|
||||
{
|
||||
[RequiredField] public SharedGameObject myObj;
|
||||
|
||||
public override void OnStart()
|
||||
{
|
||||
myObj.Value = gameObject;
|
||||
}
|
||||
|
||||
public override TaskStatus OnUpdate()
|
||||
{
|
||||
return TaskStatus.Success;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cac9370c446b93e4e8a596c75db1ba1d
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,19 @@
|
||||
using BehaviorDesigner.Runtime.Tasks;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
{
|
||||
[TaskCategory("Custom/EnemyAction")]
|
||||
public class MoveTargetOfEnemy : EnemyAction
|
||||
{
|
||||
public override void OnStart()
|
||||
{
|
||||
enemyAi.MoveTargetInDefense(enemyAi.GetTargetTransform().position);
|
||||
}
|
||||
|
||||
public override TaskStatus OnUpdate()
|
||||
{
|
||||
return TaskStatus.Success;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8228d4b74ab4bcd47a4c2acfbb49441d
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6a1ba3fb8915d4048a7151e5e4bdd8f0
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,14 @@
|
||||
using BehaviorDesigner.Runtime.Tasks;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
{
|
||||
[TaskCategory("Custom/EnemyConditional")]
|
||||
public class CanAttackOfEnemy : EnemyConditional
|
||||
{
|
||||
public override TaskStatus OnUpdate()
|
||||
{
|
||||
return enemyAi.CanAttack() ? TaskStatus.Success : TaskStatus.Failure;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2ce7d209551b49e4e802d662e4ca90eb
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,14 @@
|
||||
using BehaviorDesigner.Runtime.Tasks;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
{
|
||||
[TaskCategory("Custom/EnemyConditional")]
|
||||
public class CanComebackDefensePosOfEnemy : EnemyConditional
|
||||
{
|
||||
public override TaskStatus OnUpdate()
|
||||
{
|
||||
return enemyAi.transform.position != enemyAi.GetDefensePos() ? TaskStatus.Success : TaskStatus.Failure;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 272b142d6b035b948b8315474050f48b
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,158 +0,0 @@
|
||||
// using System;
|
||||
// using System.Collections;
|
||||
// using BehaviorDesigner.Runtime;
|
||||
// using BehaviorDesigner.Runtime.Tasks;
|
||||
// using Sirenix.OdinInspector;
|
||||
// using UnityEngine;
|
||||
// using UnityEngine.AI;
|
||||
// using Action = BehaviorDesigner.Runtime.Tasks.Action;
|
||||
//
|
||||
// // ReSharper disable once CheckNamespace
|
||||
// namespace BlueWaterProject
|
||||
// {
|
||||
// [TaskCategory("Custom/Action")]
|
||||
// public class FindTarget : Action
|
||||
// {
|
||||
// [Title("Common variable")]
|
||||
// [RequiredField] public SharedAiStat aiStat;
|
||||
// [RequiredField] public SharedNavMeshAgent navMeshAgent;
|
||||
// [RequiredField] public SharedTransform targetTransform;
|
||||
//
|
||||
// [Title("Offense Variable")]
|
||||
// public SharedIslandInfo islandInfo;
|
||||
//
|
||||
// [Title("Defense Variable")]
|
||||
// public SharedVector3 defensePos;
|
||||
//
|
||||
// private AiController aiController;
|
||||
// private bool isFindTargetCoroutine;
|
||||
//
|
||||
// private static readonly WaitForSeconds FindTargetWaitTime = new(0.5f);
|
||||
//
|
||||
// public override void OnAwake()
|
||||
// {
|
||||
// aiController = GetComponent<AiController>();
|
||||
// }
|
||||
//
|
||||
// public override void OnStart()
|
||||
// {
|
||||
// switch (aiStat.Value.AttackerType)
|
||||
// {
|
||||
// case EAttackerType.NONE:
|
||||
// Debug.Log("AiStat.AttackerType == NONE Error");
|
||||
// break;
|
||||
// case EAttackerType.OFFENSE:
|
||||
// isFindTargetCoroutine = true;
|
||||
// StartCoroutine(nameof(FindTargetInOffense));
|
||||
// break;
|
||||
// case EAttackerType.DEFENSE:
|
||||
// isFindTargetCoroutine = true;
|
||||
// StartCoroutine(nameof(FindTargetInDefense));
|
||||
// break;
|
||||
// default:
|
||||
// throw new ArgumentOutOfRangeException();
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// public override TaskStatus OnUpdate()
|
||||
// {
|
||||
// return isFindTargetCoroutine ? TaskStatus.Running : TaskStatus.Success;
|
||||
// }
|
||||
//
|
||||
// public IEnumerator FindTargetInOffense()
|
||||
// {
|
||||
// switch (aiStat.Value.OffenseType)
|
||||
// {
|
||||
// case EOffenseType.NONE:
|
||||
// Debug.Log("AiStat.OffenseType == NONE Error");
|
||||
// break;
|
||||
// case EOffenseType.NORMAL:
|
||||
// if (islandInfo.Value.EnemyList.Count > 0)
|
||||
// {
|
||||
// aiController.SetNearestTargetInOffense(islandInfo.Value.EnemyList);
|
||||
// }
|
||||
// else if (islandInfo.Value.HouseList.Count > 0)
|
||||
// {
|
||||
// aiController.SetNearestTargetInOffense(islandInfo.Value.HouseList);
|
||||
// }
|
||||
// break;
|
||||
// case EOffenseType.ONLY_HOUSE:
|
||||
// if (navMeshAgent.Value.pathStatus == NavMeshPathStatus.PathPartial)
|
||||
// {
|
||||
// aiController.SetNearestTargetInOffense(islandInfo.Value.TargetAllList);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// if (islandInfo.Value.HouseList.Count > 0)
|
||||
// {
|
||||
// aiController.SetNearestTargetInOffense(islandInfo.Value.HouseList);
|
||||
// }
|
||||
// else if (islandInfo.Value.EnemyList.Count > 0)
|
||||
// {
|
||||
// aiController.SetNearestTargetInOffense(islandInfo.Value.EnemyList);
|
||||
// }
|
||||
// }
|
||||
// break;
|
||||
// default:
|
||||
// throw new ArgumentOutOfRangeException();
|
||||
// }
|
||||
//
|
||||
// if (targetTransform.Value && navMeshAgent.Value.enabled)
|
||||
// {
|
||||
// var distanceToTarget = Vector3.Distance(transform.position, targetTransform.Value.position);
|
||||
//
|
||||
// navMeshAgent.Value.isStopped = distanceToTarget <= navMeshAgent.Value.stoppingDistance;
|
||||
// if (distanceToTarget > navMeshAgent.Value.stoppingDistance)
|
||||
// {
|
||||
// navMeshAgent.Value.SetDestination(targetTransform.Value.position);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// yield return FindTargetWaitTime;
|
||||
// isFindTargetCoroutine = false;
|
||||
// }
|
||||
//
|
||||
// public IEnumerator FindTargetInDefense()
|
||||
// {
|
||||
// switch (aiStat.Value.DefenseType)
|
||||
// {
|
||||
// case EDefenseType.NONE:
|
||||
// Debug.Log("AiStat.DefenseType == NONE Error");
|
||||
// break;
|
||||
// case EDefenseType.STRIKER:
|
||||
// aiController.SetNearestTargetInDefense(transform.position, aiStat.Value.ViewRange);
|
||||
// break;
|
||||
// case EDefenseType.MIDFIELDER:
|
||||
// aiController.SetNearestTargetInDefense(transform.position, aiStat.Value.ViewRange);
|
||||
// break;
|
||||
// case EDefenseType.DEFENDER:
|
||||
// aiController.SetNearestTargetInDefense(defensePos.Value, aiStat.Value.DefenseRange);
|
||||
// break;
|
||||
// case EDefenseType.KEEPER:
|
||||
// aiController.SetNearestTargetInDefense(transform.position, aiStat.Value.ViewRange);
|
||||
// break;
|
||||
// default:
|
||||
// throw new ArgumentOutOfRangeException();
|
||||
// }
|
||||
//
|
||||
// if (targetTransform.Value && navMeshAgent.Value.enabled)
|
||||
// {
|
||||
// var distanceToTarget = Vector3.Distance(transform.position, targetTransform.Value.position);
|
||||
//
|
||||
// navMeshAgent.Value.isStopped = distanceToTarget <= navMeshAgent.Value.stoppingDistance;
|
||||
// if (distanceToTarget > navMeshAgent.Value.stoppingDistance)
|
||||
// {
|
||||
// navMeshAgent.Value.SetDestination(targetTransform.Value.position);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// yield return FindTargetWaitTime;
|
||||
// isFindTargetCoroutine = false;
|
||||
// }
|
||||
//
|
||||
// public override void OnEnd()
|
||||
// {
|
||||
// StopAllCoroutines();
|
||||
// }
|
||||
// }
|
||||
// }
|
@ -1,43 +0,0 @@
|
||||
// using BehaviorDesigner.Runtime;
|
||||
// using BehaviorDesigner.Runtime.Tasks;
|
||||
// using Sirenix.OdinInspector;
|
||||
//
|
||||
// // ReSharper disable once CheckNamespace
|
||||
// namespace BlueWaterProject
|
||||
// {
|
||||
// [TaskCategory("Custom/Action")]
|
||||
// public class InitVariable : Action
|
||||
// {
|
||||
// [Title("Common variable")]
|
||||
// [RequiredField] public SharedAiStat aiStat;
|
||||
// [RequiredField] public SharedNavMeshAgent agent;
|
||||
//
|
||||
// [Title("Offense variable")]
|
||||
// public SharedIslandInfo islandInfo;
|
||||
// public SharedBool isCommanded;
|
||||
//
|
||||
// [Title("Defense variable")]
|
||||
// public SharedVector3 defensePos;
|
||||
//
|
||||
// private AiController aiController;
|
||||
//
|
||||
// public override void OnStart()
|
||||
// {
|
||||
// aiController = GetComponent<AiController>();
|
||||
//
|
||||
// aiStat.Value = aiController.AiStat;
|
||||
// agent.Value = aiController.GetNavMeshAgent();
|
||||
//
|
||||
// if (aiStat.Value.AttackerType == EAttackerType.OFFENSE)
|
||||
// {
|
||||
// islandInfo.Value = aiController.GetIslandInfo();
|
||||
// isCommanded.Value = aiController.IsCommanded;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// public override TaskStatus OnUpdate()
|
||||
// {
|
||||
// return TaskStatus.Success;
|
||||
// }
|
||||
// }
|
||||
// }
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fb74fe89de7396d4d8d4aa1400b262f9
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 631b6319d10351a4392d0b692de598d7
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,24 @@
|
||||
using BehaviorDesigner.Runtime.Tasks;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
{
|
||||
[TaskCategory("Custom/PirateAction")]
|
||||
public class AttackOfPirate : PirateAction
|
||||
{
|
||||
public override void OnStart()
|
||||
{
|
||||
pirateAi.Attack();
|
||||
}
|
||||
|
||||
public override TaskStatus OnUpdate()
|
||||
{
|
||||
return pirateAi.GetIsAttackCoroutine() ? TaskStatus.Running : TaskStatus.Success;
|
||||
}
|
||||
|
||||
public override void OnEnd()
|
||||
{
|
||||
StopAllCoroutines();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 152eaa40581591946884634c29014ed1
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,19 @@
|
||||
using BehaviorDesigner.Runtime.Tasks;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
{
|
||||
[TaskCategory("Custom/PirateAction")]
|
||||
public class FindTargetOfPirate : PirateAction
|
||||
{
|
||||
public override void OnStart()
|
||||
{
|
||||
pirateAi.FindTarget();
|
||||
}
|
||||
|
||||
public override TaskStatus OnUpdate()
|
||||
{
|
||||
return TaskStatus.Success;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 67078393a27b3414fb475b36e0787001
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,23 @@
|
||||
using BehaviorDesigner.Runtime;
|
||||
using BehaviorDesigner.Runtime.Tasks;
|
||||
using UnityEngine;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
{
|
||||
[TaskCategory("Custom/PirateAction")]
|
||||
public class InitBasePirate : PirateAction
|
||||
{
|
||||
[RequiredField] public SharedAttackerType attackerType;
|
||||
|
||||
public override void OnStart()
|
||||
{
|
||||
attackerType.Value = pirateAi.PirateStat.AttackerType;
|
||||
}
|
||||
|
||||
public override TaskStatus OnUpdate()
|
||||
{
|
||||
return TaskStatus.Success;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 86c2cf9f56d3adf4ebadf9a0e1915e9a
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,22 @@
|
||||
using BehaviorDesigner.Runtime;
|
||||
using BehaviorDesigner.Runtime.Tasks;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
{
|
||||
[TaskCategory("Custom/PirateAction")]
|
||||
public class InitOffensePirate : PirateAction
|
||||
{
|
||||
[RequiredField] public SharedGameObject myObj;
|
||||
|
||||
public override void OnStart()
|
||||
{
|
||||
myObj.Value = gameObject;
|
||||
}
|
||||
|
||||
public override TaskStatus OnUpdate()
|
||||
{
|
||||
return TaskStatus.Success;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cfedbfa8c252b5648b9faf49acff2222
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,19 @@
|
||||
using BehaviorDesigner.Runtime.Tasks;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
{
|
||||
[TaskCategory("Custom/PirateAction")]
|
||||
public class MoveTargetOfPirate : PirateAction
|
||||
{
|
||||
public override void OnStart()
|
||||
{
|
||||
pirateAi.MoveTarget(pirateAi.GetTargetTransform().position);
|
||||
}
|
||||
|
||||
public override TaskStatus OnUpdate()
|
||||
{
|
||||
return TaskStatus.Success;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b3be30dac4ab81d47a4313e506fbf7b8
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f225dd6308d308d47ac7aa75de28c5da
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,14 @@
|
||||
using BehaviorDesigner.Runtime.Tasks;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
{
|
||||
[TaskCategory("Custom/PirateConditional")]
|
||||
public class CanAttackOfPirate : PirateConditional
|
||||
{
|
||||
public override TaskStatus OnUpdate()
|
||||
{
|
||||
return pirateAi.CanAttack() ? TaskStatus.Success : TaskStatus.Failure;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 68fbf203f20f0444694fc0cd87678685
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 18e4f63224214fb48af158d76b500c31
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,15 @@
|
||||
using BehaviorDesigner.Runtime.Tasks;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
{
|
||||
public class CombatAction : Action
|
||||
{
|
||||
protected CombatAi combatAi;
|
||||
|
||||
public override void OnAwake()
|
||||
{
|
||||
combatAi = GetComponent<CombatAi>();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7f96e64d7dffad149835e1501b362e91
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,15 @@
|
||||
using BehaviorDesigner.Runtime.Tasks;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
{
|
||||
public class EnemyAction : Action
|
||||
{
|
||||
protected EnemyAi enemyAi;
|
||||
|
||||
public override void OnAwake()
|
||||
{
|
||||
enemyAi = GetComponent<EnemyAi>();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 84f9fa3fad1de6640a44b43f28baf46f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,15 @@
|
||||
using BehaviorDesigner.Runtime.Tasks;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
{
|
||||
public class EnemyConditional : Conditional
|
||||
{
|
||||
protected EnemyAi enemyAi;
|
||||
|
||||
public override void OnAwake()
|
||||
{
|
||||
enemyAi = GetComponent<EnemyAi>();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0ac6714e1a3da5e42b2433907ceace0c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,15 @@
|
||||
using BehaviorDesigner.Runtime.Tasks;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
{
|
||||
public class PirateAction : Action
|
||||
{
|
||||
protected PirateAi pirateAi;
|
||||
|
||||
public override void OnAwake()
|
||||
{
|
||||
pirateAi = GetComponent<PirateAi>();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ecb029565680f1d4694b164292599545
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,15 @@
|
||||
using BehaviorDesigner.Runtime.Tasks;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
{
|
||||
public class PirateConditional : Conditional
|
||||
{
|
||||
protected PirateAi pirateAi;
|
||||
|
||||
public override void OnAwake()
|
||||
{
|
||||
pirateAi = GetComponent<PirateAi>();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 775faef187f436241b9bf4fae9115d48
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,18 @@
|
||||
using BehaviorDesigner.Runtime;
|
||||
using BehaviorDesigner.Runtime.Tasks;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
{
|
||||
public class IncreaseSharedInt : Action
|
||||
{
|
||||
public SharedInt targetInt;
|
||||
|
||||
public override TaskStatus OnUpdate()
|
||||
{
|
||||
targetInt.Value++;
|
||||
|
||||
return TaskStatus.Success;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 94aaede23a4430d42ae8ef55a1b21e9b
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using BehaviorDesigner.Runtime;
|
||||
using UnityEngine;
|
||||
using UnityEngine.AI;
|
||||
using UnityEngine.Animations;
|
||||
@ -11,18 +11,23 @@ namespace BlueWaterProject
|
||||
#region Properties and variables
|
||||
|
||||
// 일반 변수
|
||||
protected bool isDrawGizmosInFieldOfView = true;
|
||||
protected LayerMask targetLayer;
|
||||
protected Vector3 defensePos;
|
||||
[SerializeField] protected bool isDrawGizmosInFieldOfView = true;
|
||||
[SerializeField] protected bool isAttacking;
|
||||
[SerializeField] protected LayerMask targetLayer;
|
||||
[SerializeField] protected Vector3 defensePos;
|
||||
|
||||
protected IslandInfo attackingIslandInfo;
|
||||
[SerializeField] protected Transform targetTransform;
|
||||
[SerializeField] protected Collider[] colliderWithinRange = new Collider[TARGET_MAX_SIZE];
|
||||
[SerializeField] protected IslandInfo attackingIslandInfo;
|
||||
[SerializeField] protected IslandInfo defendingIslandInfo;
|
||||
|
||||
// 컴포넌트 관련 변수
|
||||
protected Animator combatAnimator;
|
||||
protected NavMeshAgent humanAgent;
|
||||
protected NavMeshAgent combatAgent;
|
||||
protected CapsuleCollider myCollider;
|
||||
protected CapsuleCollider hitBoxCollider;
|
||||
protected LookAtConstraint lookAtConstraint;
|
||||
protected BehaviorTree behaviorTree;
|
||||
|
||||
// 애니메이션 관련 변수
|
||||
protected static readonly int SpeedHash = Animator.StringToHash("Speed");
|
||||
@ -32,14 +37,19 @@ namespace BlueWaterProject
|
||||
protected static readonly int DeathHash = Animator.StringToHash("Death");
|
||||
protected static readonly int ShieldHash = Animator.StringToHash("Shield");
|
||||
protected static readonly int OutlineColorHash = Shader.PropertyToID("_OutlineColor");
|
||||
|
||||
protected const int TARGET_MAX_SIZE = 30;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Abstract methods
|
||||
|
||||
protected abstract void SetLayer();
|
||||
|
||||
protected abstract void SetCurrentHp(float value);
|
||||
protected abstract void RemoveAiListElement();
|
||||
public abstract void FindTarget();
|
||||
public abstract bool CanAttack();
|
||||
public abstract void Attack();
|
||||
|
||||
#endregion
|
||||
|
||||
@ -53,6 +63,15 @@ namespace BlueWaterProject
|
||||
SetLayer();
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
if (combatAnimator.runtimeAnimatorController != null && combatAnimator.isActiveAndEnabled)
|
||||
{
|
||||
combatAnimator.SetFloat(SpeedHash, combatAgent.velocity.normalized.magnitude);
|
||||
}
|
||||
UpdateLookAtTarget();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Custom methods
|
||||
@ -62,7 +81,7 @@ namespace BlueWaterProject
|
||||
base.InitComponent();
|
||||
|
||||
combatAnimator = Utils.GetComponentAndAssert<Animator>(transform);
|
||||
humanAgent = Utils.GetComponentAndAssert<NavMeshAgent>(transform);
|
||||
combatAgent = Utils.GetComponentAndAssert<NavMeshAgent>(transform);
|
||||
myCollider = Utils.GetComponentAndAssert<CapsuleCollider>(transform);
|
||||
hitBoxCollider = Utils.GetComponentAndAssert<CapsuleCollider>(transform.Find("HitBox"));
|
||||
lookAtConstraint = Utils.GetComponentAndAssert<LookAtConstraint>(flagContainer);
|
||||
@ -82,11 +101,89 @@ namespace BlueWaterProject
|
||||
|
||||
lookAtConstraint.constraintActive = true;
|
||||
}
|
||||
|
||||
protected void SetBehaviorTree(ExternalBehaviorTree externalBehaviorTree)
|
||||
{
|
||||
if (!externalBehaviorTree)
|
||||
{
|
||||
print("externalBehaviorTree == null error");
|
||||
}
|
||||
|
||||
var bt = gameObject.GetComponent<BehaviorTree>();
|
||||
if (bt != null)
|
||||
{
|
||||
Destroy(bt);
|
||||
}
|
||||
|
||||
behaviorTree = gameObject.AddComponent<BehaviorTree>();
|
||||
behaviorTree.StartWhenEnabled = false;
|
||||
behaviorTree.ExternalBehavior = externalBehaviorTree;
|
||||
|
||||
behaviorTree.EnableBehavior();
|
||||
}
|
||||
|
||||
public void MoveTarget(Vector3 targetPos)
|
||||
{
|
||||
if (Vector3.Distance(combatAgent.destination, targetPos) < 0.1f) return;
|
||||
|
||||
combatAgent.SetDestination(targetPos);
|
||||
}
|
||||
|
||||
private void UpdateLookAtTarget()
|
||||
{
|
||||
if (CanAttack())
|
||||
{
|
||||
combatAgent.updateRotation = false;
|
||||
|
||||
var targetPos = targetTransform.position;
|
||||
targetPos.y = transform.position.y;
|
||||
transform.LookAt(targetPos);
|
||||
}
|
||||
else
|
||||
{
|
||||
combatAgent.updateRotation = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void SetTargetTransform(Transform value)
|
||||
{
|
||||
targetTransform = value;
|
||||
|
||||
var btTargetTransform = behaviorTree.GetVariable("TargetTransform");
|
||||
btTargetTransform?.SetValue(value);
|
||||
}
|
||||
|
||||
public void Die()
|
||||
{
|
||||
RemoveIslandInfo();
|
||||
RemoveAiListElement();
|
||||
|
||||
StopAllCoroutines();
|
||||
combatAgent.enabled = false;
|
||||
myCollider.enabled = false;
|
||||
hitBoxCollider.enabled = false;
|
||||
|
||||
var randomValue = Random.Range(0, 2);
|
||||
combatAnimator.SetInteger(DeathTypeHash, randomValue);
|
||||
|
||||
// TODO : 죽었을 때 처리(죽는 애니메이션 이후 사라지는 효과 등)
|
||||
combatAnimator.SetTrigger(DeathHash);
|
||||
}
|
||||
|
||||
private void RemoveIslandInfo()
|
||||
{
|
||||
if (defendingIslandInfo == null) return;
|
||||
|
||||
defendingIslandInfo.RemoveListElement(defendingIslandInfo.EnemyList, transform);
|
||||
}
|
||||
|
||||
protected void SetAnimatorController(string controllerName) => combatAnimator.runtimeAnimatorController =
|
||||
UnitManager.Inst.AIAnimatorControllerList.Find(obj => obj.name == controllerName);
|
||||
protected void SetMoveSpeed(float value) => humanAgent.speed = value;
|
||||
public void SetIslandInfo(IslandInfo info) => attackingIslandInfo = info;
|
||||
protected void SetMoveSpeed(float value) => combatAgent.speed = value;
|
||||
public void SetAttackingIslandInfo(IslandInfo info) => attackingIslandInfo = info;
|
||||
public void SetDefendingIslandInfo(IslandInfo info) => defendingIslandInfo = info;
|
||||
public Transform GetTargetTransform() => targetTransform;
|
||||
public Vector3 GetDefensePos() => defensePos;
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
@ -1,26 +1,126 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
using Random = UnityEngine.Random;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
{
|
||||
public class EnemyAi : CombatAi
|
||||
public abstract class EnemyAi : CombatAi, IDamageable
|
||||
{
|
||||
#region Properties and variables
|
||||
|
||||
[field: SerializeField] public EnemyStat EnemyStat { get; set; }
|
||||
|
||||
protected bool isAttackCoroutine;
|
||||
private EnemyUnit enemyUnit;
|
||||
private int childNum;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Unit Built-in methods
|
||||
|
||||
protected virtual void OnDrawGizmosSelected()
|
||||
{
|
||||
if (!isDrawGizmosInFieldOfView) return;
|
||||
|
||||
if (EnemyStat.AttackerType == EAttackerType.OFFENSE)
|
||||
{
|
||||
if (!targetTransform) return;
|
||||
|
||||
Gizmos.color = Color.red;
|
||||
Gizmos.DrawLine(transform.position, targetTransform.position);
|
||||
}
|
||||
else if (EnemyStat.AttackerType == EAttackerType.DEFENSE)
|
||||
{
|
||||
if (EnemyStat.DefenseType == EDefenseType.DEFENDER)
|
||||
{
|
||||
Gizmos.color = Color.red;
|
||||
Gizmos.DrawWireSphere(defensePos, EnemyStat.DefenseRange);
|
||||
}
|
||||
|
||||
Gizmos.color = Color.blue;
|
||||
Gizmos.DrawWireSphere(transform.position, EnemyStat.ViewRange);
|
||||
|
||||
if (!targetTransform) return;
|
||||
|
||||
Gizmos.color = Color.red;
|
||||
Gizmos.DrawLine(transform.position, targetTransform.position);
|
||||
}
|
||||
}
|
||||
|
||||
private void Start()
|
||||
{
|
||||
InitStart();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IDamageable interface
|
||||
|
||||
public void TakeDamage(float attackerPower, float attackerShieldPenetrationRate, Vector3? attackPos = null)
|
||||
{
|
||||
if (attackPos != null && combatAgent.enabled && EnemyStat.AttackerType == EAttackerType.DEFENSE && !targetTransform)
|
||||
{
|
||||
BeAttackedMovement((Vector3)attackPos);
|
||||
}
|
||||
|
||||
// 회피 성공 체크
|
||||
if (Random.Range(0, 100) < EnemyStat.AvoidanceRate)
|
||||
{
|
||||
// TODO : 회피 처리
|
||||
return;
|
||||
}
|
||||
|
||||
var finalDamage = 0f;
|
||||
|
||||
if (EnemyStat.UsingShield)
|
||||
{
|
||||
var penetrationChance = attackerShieldPenetrationRate -
|
||||
(attackerShieldPenetrationRate * EnemyStat.PenetrationResistivity * 0.01f);
|
||||
|
||||
// 방패를 관통했다면,
|
||||
if (Random.Range(0, 100) < penetrationChance)
|
||||
{
|
||||
finalDamage = attackerPower - EnemyStat.Def;
|
||||
finalDamage = Mathf.Max(finalDamage, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
finalDamage = 0f;
|
||||
}
|
||||
}
|
||||
|
||||
finalDamage = attackerPower - EnemyStat.Def;
|
||||
finalDamage = Mathf.Max(finalDamage, 0);
|
||||
|
||||
// 방패 막기 체크
|
||||
if (finalDamage == 0f)
|
||||
{
|
||||
combatAnimator.SetTrigger(ShieldHash);
|
||||
return;
|
||||
}
|
||||
var changeHp = Mathf.Max(EnemyStat.CurrentHp - finalDamage, 0);
|
||||
SetCurrentHp(changeHp);
|
||||
|
||||
// 죽었는지 체크
|
||||
if (changeHp == 0f) return;
|
||||
|
||||
combatAnimator.SetTrigger(DamageHash);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Custom methods
|
||||
|
||||
protected override void InitComponent()
|
||||
{
|
||||
base.InitComponent();
|
||||
|
||||
enemyUnit = Utils.GetComponentAndAssert<EnemyUnit>(transform.parent);
|
||||
}
|
||||
|
||||
protected override void SetLayer()
|
||||
{
|
||||
@ -44,8 +144,6 @@ namespace BlueWaterProject
|
||||
InitComponent();
|
||||
SetLayer();
|
||||
InitViewModel(enemyViewData);
|
||||
SetCurrentHp(EnemyStat.MaxHp);
|
||||
SetMoveSpeed(EnemyStat.MoveSpd);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -54,12 +152,16 @@ namespace BlueWaterProject
|
||||
var enemyViewData = DataManager.Inst.GetEnemyViewDictionaryFromKey(EnemyStat.ViewIdx);
|
||||
|
||||
InitViewModel(enemyViewData);
|
||||
SetBehaviorTree(UnitManager.Inst.EnemyBehaviorTree);
|
||||
|
||||
SetCurrentHp(EnemyStat.MaxHp);
|
||||
SetMoveSpeed(EnemyStat.MoveSpd);
|
||||
|
||||
|
||||
childNum = enemyUnit.transform.GetSiblingIndex();
|
||||
if (EnemyStat.AttackerType == EAttackerType.DEFENSE)
|
||||
{
|
||||
defensePos = transform.position;
|
||||
SetDefensePos(transform.position);
|
||||
enemyUnit.SetDefensePos(defensePos, childNum);
|
||||
}
|
||||
}
|
||||
|
||||
@ -74,7 +176,222 @@ namespace BlueWaterProject
|
||||
SetActiveViewModel(flagContainer, enemyView.Flag);
|
||||
}
|
||||
|
||||
protected override void SetCurrentHp(float value) => EnemyStat.CurrentHp = value;
|
||||
public override void FindTarget()
|
||||
{
|
||||
switch (EnemyStat.AttackerType)
|
||||
{
|
||||
case EAttackerType.NONE:
|
||||
print("EnemyStat.AttackerType == NONE Error");
|
||||
break;
|
||||
case EAttackerType.OFFENSE:
|
||||
FindTargetInOffense();
|
||||
break;
|
||||
case EAttackerType.DEFENSE:
|
||||
FindTargetInDefense();
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
|
||||
public override bool CanAttack()
|
||||
{
|
||||
if (!targetTransform) return false;
|
||||
|
||||
var attackInRange = Vector3.Distance(transform.position, targetTransform.position) <= EnemyStat.AtkRange;
|
||||
return attackInRange;
|
||||
}
|
||||
|
||||
public override void Attack()
|
||||
{
|
||||
isAttackCoroutine = true;
|
||||
StartCoroutine(nameof(AttackAnimation));
|
||||
}
|
||||
|
||||
protected abstract IEnumerator AttackAnimation();
|
||||
|
||||
private void FindTargetInOffense()
|
||||
{
|
||||
if (!attackingIslandInfo)
|
||||
{
|
||||
print("attackingIslandInfo == null error");
|
||||
return;
|
||||
}
|
||||
|
||||
switch (EnemyStat.OffenseType)
|
||||
{
|
||||
case EOffenseType.NONE:
|
||||
print("AiStat.OffenseType == NONE Error");
|
||||
break;
|
||||
case EOffenseType.NORMAL:
|
||||
if (attackingIslandInfo.EnemyList.Count > 0)
|
||||
{
|
||||
FindNearestTargetInList(attackingIslandInfo.EnemyList);
|
||||
}
|
||||
else if (attackingIslandInfo.HouseList.Count > 0)
|
||||
{
|
||||
FindNearestTargetInList(attackingIslandInfo.HouseList);
|
||||
}
|
||||
break;
|
||||
case EOffenseType.ONLY_HOUSE:
|
||||
if (attackingIslandInfo.HouseList.Count > 0)
|
||||
{
|
||||
FindNearestTargetInList(attackingIslandInfo.HouseList);
|
||||
}
|
||||
else if (attackingIslandInfo.EnemyList.Count > 0)
|
||||
{
|
||||
FindNearestTargetInList(attackingIslandInfo.EnemyList);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void FindNearestTargetInList(List<Transform> targetList)
|
||||
{
|
||||
if (targetList.Count <= 0) return;
|
||||
|
||||
var nearestTarget = targetList.OrderBy(t => t ?
|
||||
Vector3.Distance(transform.position, t.position) : float.MaxValue).FirstOrDefault();
|
||||
|
||||
if (nearestTarget == null) return;
|
||||
|
||||
SetTargetTransform(nearestTarget);
|
||||
}
|
||||
|
||||
private void FindTargetInDefense()
|
||||
{
|
||||
switch (EnemyStat.DefenseType)
|
||||
{
|
||||
case EDefenseType.NONE:
|
||||
print("EnemyStat.DefenseType == NONE Error");
|
||||
break;
|
||||
case EDefenseType.STRIKER:
|
||||
FindNearestTargetInRange(transform.position, EnemyStat.ViewRange);
|
||||
break;
|
||||
case EDefenseType.MIDFIELDER:
|
||||
FindNearestTargetInRange(transform.position, EnemyStat.ViewRange);
|
||||
break;
|
||||
case EDefenseType.DEFENDER:
|
||||
FindNearestTargetInRange(defensePos, EnemyStat.DefenseRange);
|
||||
break;
|
||||
case EDefenseType.KEEPER:
|
||||
FindNearestTargetInRange(transform.position, EnemyStat.ViewRange);
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void FindNearestTargetInRange(Vector3 centerPos, float range)
|
||||
{
|
||||
Array.Clear(colliderWithinRange, 0, TARGET_MAX_SIZE);
|
||||
|
||||
var maxColliderCount = Physics.OverlapSphereNonAlloc(centerPos, range, colliderWithinRange,
|
||||
targetLayer, QueryTriggerInteraction.Collide);
|
||||
|
||||
if (maxColliderCount <= 0)
|
||||
{
|
||||
SetTargetTransform(null);
|
||||
return;
|
||||
}
|
||||
|
||||
var nearestDistance = Mathf.Infinity;
|
||||
Transform nearestTargetTransform = null;
|
||||
|
||||
for (var i = 0; i < maxColliderCount; i++)
|
||||
{
|
||||
var distanceToTarget = Vector3.Distance(transform.position, colliderWithinRange[i].transform.position);
|
||||
|
||||
if (distanceToTarget >= nearestDistance) continue;
|
||||
|
||||
nearestDistance = distanceToTarget;
|
||||
nearestTargetTransform = colliderWithinRange[i].transform;
|
||||
}
|
||||
|
||||
SetTargetTransform(nearestTargetTransform);
|
||||
}
|
||||
|
||||
public void MoveTargetInDefense(Vector3 targetPos)
|
||||
{
|
||||
switch (EnemyStat.DefenseType)
|
||||
{
|
||||
case EDefenseType.NONE:
|
||||
print("EnemyStat.DefenseType == NONE error");
|
||||
break;
|
||||
case EDefenseType.STRIKER:
|
||||
case EDefenseType.MIDFIELDER:
|
||||
break;
|
||||
case EDefenseType.DEFENDER:
|
||||
if (Vector3.Distance(targetPos, defensePos) > EnemyStat.DefenseRange) return;
|
||||
break;
|
||||
case EDefenseType.KEEPER:
|
||||
return;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
|
||||
if (Vector3.Distance(combatAgent.destination, targetPos) < 0.1f) return;
|
||||
|
||||
combatAgent.SetDestination(targetPos);
|
||||
}
|
||||
|
||||
protected override void SetCurrentHp(float value)
|
||||
{
|
||||
EnemyStat.CurrentHp = value;
|
||||
|
||||
var btCurrentHp = behaviorTree.GetVariable("CurrentHp");
|
||||
btCurrentHp?.SetValue(value);
|
||||
}
|
||||
|
||||
protected override void RemoveAiListElement()
|
||||
{
|
||||
if (enemyUnit.enemyUnitStat.EnemyAiList.Contains(this))
|
||||
{
|
||||
enemyUnit.enemyUnitStat.EnemyAiList.Remove(this);
|
||||
}
|
||||
|
||||
childNum = enemyUnit.transform.GetSiblingIndex();
|
||||
SetDefensePos(enemyUnit.GetDefensePos(childNum));
|
||||
}
|
||||
|
||||
private void BeAttackedMovement(Vector3 attackPos)
|
||||
{
|
||||
switch (EnemyStat.DefenseType)
|
||||
{
|
||||
case EDefenseType.NONE:
|
||||
print("EnemyStat.DefenseType == NONE Error");
|
||||
break;
|
||||
case EDefenseType.STRIKER:
|
||||
case EDefenseType.MIDFIELDER:
|
||||
break;
|
||||
case EDefenseType.DEFENDER:
|
||||
if (Vector3.Distance(defensePos, attackPos) > EnemyStat.DefenseRange) return;
|
||||
break;
|
||||
case EDefenseType.KEEPER:
|
||||
return;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
|
||||
foreach (var item in enemyUnit.enemyUnitStat.EnemyAiList)
|
||||
{
|
||||
if (item.GetTargetTransform()) continue;
|
||||
|
||||
item.MoveTarget(attackPos);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetDefensePos(Vector3 value)
|
||||
{
|
||||
defensePos = value;
|
||||
|
||||
var btDefensePos = behaviorTree.GetVariable("DefensePos");
|
||||
btDefensePos?.SetValue(value);
|
||||
}
|
||||
|
||||
public bool GetIsAttackCoroutine() => isAttackCoroutine;
|
||||
public void SetAttackerType(EAttackerType type) => EnemyStat.AttackerType = type;
|
||||
public void SetOffenseType(EOffenseType type) => EnemyStat.OffenseType = type;
|
||||
public void SetDefenseType(EDefenseType type) => EnemyStat.DefenseType = type;
|
||||
|
@ -1,4 +1,7 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Pool;
|
||||
|
||||
@ -16,14 +19,47 @@ namespace BlueWaterProject
|
||||
[Tooltip("화살 발사 후 오브젝트 저장될 위치")]
|
||||
[SerializeField] private Transform arrowsPoolLocation;
|
||||
|
||||
[SerializeField] private LayerMask archerLayer;
|
||||
[SerializeField] private LayerMask arrowLayer;
|
||||
|
||||
private IEnumerator shootArrowCoroutine;
|
||||
|
||||
private IObjectPool<Arrow> arrowPool;
|
||||
|
||||
[SerializeField] private Vector3 rayOffset = new(0f, 2f, 0);
|
||||
[SerializeField] private Vector3 rayOffset = new(0f, 3.5f, 0);
|
||||
|
||||
#endregion
|
||||
|
||||
#region Unity built-in methods
|
||||
|
||||
protected override void OnDrawGizmosSelected()
|
||||
{
|
||||
if (!isDrawGizmosInFieldOfView) return;
|
||||
|
||||
if (EnemyStat.AttackerType == EAttackerType.OFFENSE)
|
||||
{
|
||||
if (!targetTransform) return;
|
||||
|
||||
Gizmos.color = Color.red;
|
||||
Gizmos.DrawLine(transform.position + rayOffset, targetTransform.position + rayOffset);
|
||||
}
|
||||
else if (EnemyStat.AttackerType == EAttackerType.DEFENSE)
|
||||
{
|
||||
if (EnemyStat.DefenseType == EDefenseType.DEFENDER)
|
||||
{
|
||||
Gizmos.color = Color.red;
|
||||
Gizmos.DrawWireSphere(defensePos, EnemyStat.DefenseRange);
|
||||
}
|
||||
|
||||
Gizmos.color = Color.blue;
|
||||
Gizmos.DrawWireSphere(transform.position, EnemyStat.ViewRange);
|
||||
|
||||
if (!targetTransform) return;
|
||||
|
||||
Gizmos.color = Color.red;
|
||||
Gizmos.DrawLine(transform.position + rayOffset, targetTransform.position + rayOffset);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Custom methods
|
||||
@ -69,7 +105,7 @@ namespace BlueWaterProject
|
||||
{
|
||||
base.SetLayer();
|
||||
|
||||
archerLayer = LayerMask.GetMask("Ground") | LayerMask.GetMask("Water") |
|
||||
arrowLayer = LayerMask.GetMask("Ground") | LayerMask.GetMask("Water") |
|
||||
LayerMask.GetMask("Player") | LayerMask.GetMask("Pirate") |
|
||||
LayerMask.GetMask("Props");
|
||||
}
|
||||
@ -81,6 +117,98 @@ namespace BlueWaterProject
|
||||
SetAnimatorController("Archer");
|
||||
}
|
||||
|
||||
protected override void FindNearestTargetInList(List<Transform> targetList)
|
||||
{
|
||||
if (targetList.Count <= 0) return;
|
||||
|
||||
var myPos = transform.position;
|
||||
var nearestTarget = targetList.OrderBy(t => t && IsRaycastHitTarget(myPos, t) ?
|
||||
Vector3.Distance(myPos, t.position) :
|
||||
float.MaxValue).FirstOrDefault();
|
||||
|
||||
if (nearestTarget == null) return;
|
||||
|
||||
SetTargetTransform(nearestTarget);
|
||||
}
|
||||
|
||||
protected override void FindNearestTargetInRange(Vector3 centerPos, float range)
|
||||
{
|
||||
Array.Clear(colliderWithinRange, 0, TARGET_MAX_SIZE);
|
||||
|
||||
var maxColliderCount = Physics.OverlapSphereNonAlloc(centerPos, range, colliderWithinRange,
|
||||
targetLayer, QueryTriggerInteraction.Collide);
|
||||
|
||||
if (maxColliderCount <= 0)
|
||||
{
|
||||
SetTargetTransform(null);
|
||||
return;
|
||||
}
|
||||
|
||||
var nearestDistance = Mathf.Infinity;
|
||||
Transform nearestTargetTransform = null;
|
||||
|
||||
var myPos = transform.position;
|
||||
for (var i = 0; i < maxColliderCount; i++)
|
||||
{
|
||||
var distanceToTarget = Vector3.Distance(myPos, colliderWithinRange[i].transform.position);
|
||||
|
||||
if (!IsRaycastHitTarget(myPos, colliderWithinRange[i].transform) || distanceToTarget >= nearestDistance) continue;
|
||||
|
||||
nearestDistance = distanceToTarget;
|
||||
nearestTargetTransform = colliderWithinRange[i].transform;
|
||||
}
|
||||
|
||||
SetTargetTransform(nearestTargetTransform);
|
||||
}
|
||||
|
||||
private bool IsRaycastHitTarget(Vector3 myPos, Transform target)
|
||||
{
|
||||
var direction = ((target.position + rayOffset) - (myPos + rayOffset)).normalized;
|
||||
var raycastHitTarget = Physics.Raycast(myPos + rayOffset, direction, out var hit, EnemyStat.AtkRange, arrowLayer, QueryTriggerInteraction.Collide);
|
||||
|
||||
return raycastHitTarget && target == hit.transform;
|
||||
}
|
||||
|
||||
protected override IEnumerator AttackAnimation()
|
||||
{
|
||||
combatAnimator.SetTrigger(AttackHash);
|
||||
|
||||
while (isAttacking)
|
||||
{
|
||||
yield return null;
|
||||
}
|
||||
|
||||
yield return new WaitForSeconds(EnemyStat.AtkCooldown);
|
||||
isAttackCoroutine = false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Archer attack 애니메이션에 event 부착용 함수
|
||||
/// </summary>
|
||||
public void OnShootArrow()
|
||||
{
|
||||
if (!targetTransform) return;
|
||||
|
||||
var arrow = arrowPool.Get();
|
||||
var isOffense = EnemyStat.AttackerType == EAttackerType.OFFENSE;
|
||||
|
||||
arrow.SetShootingArrow(leftWeaponContainer.position, transform.position,
|
||||
targetTransform.position + rayOffset, EAiType.ENEMY, EnemyStat.Atk, EnemyStat.ShieldPenetrationRate, EnemyStat.Inaccuracy, isOffense);
|
||||
arrow.ShootArrowCoroutine();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Archer attack 애니메이션에 event 부착용 함수
|
||||
/// </summary>
|
||||
public void OnStoppedMove(int boolValue)
|
||||
{
|
||||
if (!combatAgent.enabled) return;
|
||||
|
||||
combatAgent.isStopped = boolValue == 1;
|
||||
}
|
||||
|
||||
private void OnAttacking(int boolValue) => isAttacking = boolValue == 1;
|
||||
|
||||
#endregion
|
||||
|
||||
#region ObjectPool Function
|
||||
|
@ -1,3 +1,4 @@
|
||||
using System.Collections;
|
||||
using Unity.VisualScripting;
|
||||
using UnityEngine;
|
||||
|
||||
@ -45,6 +46,24 @@ namespace BlueWaterProject
|
||||
closeWeapon.SetAttackerAiType(EAiType.ENEMY);
|
||||
closeWeapon.SetBoxCollider();
|
||||
}
|
||||
|
||||
protected override IEnumerator AttackAnimation()
|
||||
{
|
||||
closeWeapon.SetIsAttacked(false);
|
||||
closeWeapon.SetWeaponStat(EnemyStat.Atk, EnemyStat.ShieldPenetrationRate, EnemyStat.AttackerType == EAttackerType.OFFENSE);
|
||||
combatAnimator.SetTrigger(AttackHash);
|
||||
|
||||
while (isAttacking)
|
||||
{
|
||||
yield return null;
|
||||
}
|
||||
|
||||
yield return new WaitForSeconds(EnemyStat.AtkCooldown);
|
||||
isAttackCoroutine = false;
|
||||
}
|
||||
|
||||
private void SetCloseWeaponCanAttack(int boolValue) => closeWeapon.SetCanAttack(boolValue == 1);
|
||||
private void OnAttacking(int boolValue) => isAttacking = boolValue == 1;
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
using System.Collections;
|
||||
using Unity.VisualScripting;
|
||||
using UnityEngine;
|
||||
|
||||
@ -45,6 +46,24 @@ namespace BlueWaterProject
|
||||
closeWeapon.SetAttackerAiType(EAiType.ENEMY);
|
||||
closeWeapon.SetBoxCollider();
|
||||
}
|
||||
|
||||
protected override IEnumerator AttackAnimation()
|
||||
{
|
||||
closeWeapon.SetIsAttacked(false);
|
||||
closeWeapon.SetWeaponStat(EnemyStat.Atk, EnemyStat.ShieldPenetrationRate, EnemyStat.AttackerType == EAttackerType.OFFENSE);
|
||||
combatAnimator.SetTrigger(AttackHash);
|
||||
|
||||
while (isAttacking)
|
||||
{
|
||||
yield return null;
|
||||
}
|
||||
|
||||
yield return new WaitForSeconds(EnemyStat.AtkCooldown);
|
||||
isAttackCoroutine = false;
|
||||
}
|
||||
|
||||
private void SetCloseWeaponCanAttack(int boolValue) => closeWeapon.SetCanAttack(boolValue == 1);
|
||||
private void OnAttacking(int boolValue) => isAttacking = boolValue == 1;
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
using System.Collections;
|
||||
using Unity.VisualScripting;
|
||||
using UnityEngine;
|
||||
|
||||
@ -45,6 +46,24 @@ namespace BlueWaterProject
|
||||
closeWeapon.SetAttackerAiType(EAiType.ENEMY);
|
||||
closeWeapon.SetBoxCollider();
|
||||
}
|
||||
|
||||
protected override IEnumerator AttackAnimation()
|
||||
{
|
||||
closeWeapon.SetIsAttacked(false);
|
||||
closeWeapon.SetWeaponStat(EnemyStat.Atk, EnemyStat.ShieldPenetrationRate, EnemyStat.AttackerType == EAttackerType.OFFENSE);
|
||||
combatAnimator.SetTrigger(AttackHash);
|
||||
|
||||
while (isAttacking)
|
||||
{
|
||||
yield return null;
|
||||
}
|
||||
|
||||
yield return new WaitForSeconds(EnemyStat.AtkCooldown);
|
||||
isAttackCoroutine = false;
|
||||
}
|
||||
|
||||
private void SetCloseWeaponCanAttack(int boolValue) => closeWeapon.SetCanAttack(boolValue == 1);
|
||||
private void OnAttacking(int boolValue) => isAttacking = boolValue == 1;
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
using System.Collections;
|
||||
using Unity.VisualScripting;
|
||||
using UnityEngine;
|
||||
|
||||
@ -45,6 +46,24 @@ namespace BlueWaterProject
|
||||
closeWeapon.SetAttackerAiType(EAiType.ENEMY);
|
||||
closeWeapon.SetBoxCollider();
|
||||
}
|
||||
|
||||
protected override IEnumerator AttackAnimation()
|
||||
{
|
||||
closeWeapon.SetIsAttacked(false);
|
||||
closeWeapon.SetWeaponStat(EnemyStat.Atk, EnemyStat.ShieldPenetrationRate, EnemyStat.AttackerType == EAttackerType.OFFENSE);
|
||||
combatAnimator.SetTrigger(AttackHash);
|
||||
|
||||
while (isAttacking)
|
||||
{
|
||||
yield return null;
|
||||
}
|
||||
|
||||
yield return new WaitForSeconds(EnemyStat.AtkCooldown);
|
||||
isAttackCoroutine = false;
|
||||
}
|
||||
|
||||
private void SetCloseWeaponCanAttack(int boolValue) => closeWeapon.SetCanAttack(boolValue == 1);
|
||||
private void OnAttacking(int boolValue) => isAttacking = boolValue == 1;
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
@ -1,12 +1,15 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Sirenix.OdinInspector;
|
||||
using UnityEngine;
|
||||
using Random = UnityEngine.Random;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
{
|
||||
public class PirateAi : CombatAi
|
||||
public abstract class PirateAi : CombatAi, IDamageable
|
||||
{
|
||||
#region Properties and variables
|
||||
|
||||
@ -22,19 +25,49 @@ namespace BlueWaterProject
|
||||
|
||||
[Tooltip("캐릭터가 선택되었을 때 색상")]
|
||||
[SerializeField] protected Color selectedSkinColor = Color.red;
|
||||
|
||||
[DisableIf("@true")]
|
||||
[SerializeField] private IslandInfo islandInfo;
|
||||
|
||||
[field: SerializeField] public PirateStat PirateStat { get; set; }
|
||||
|
||||
private PirateUnit pirateUnit;
|
||||
private PirateUnit mouseEnterPirateUnit;
|
||||
private UnitSelection unitSelection;
|
||||
|
||||
[SerializeField] protected bool isAttackCoroutine;
|
||||
[SerializeField] private bool isCommanded;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Unit Built-in methods
|
||||
|
||||
|
||||
protected virtual void OnDrawGizmosSelected()
|
||||
{
|
||||
if (!isDrawGizmosInFieldOfView) return;
|
||||
|
||||
if (PirateStat.AttackerType == EAttackerType.OFFENSE)
|
||||
{
|
||||
if (!targetTransform) return;
|
||||
|
||||
Gizmos.color = Color.red;
|
||||
Gizmos.DrawLine(transform.position, targetTransform.position);
|
||||
}
|
||||
else if (PirateStat.AttackerType == EAttackerType.DEFENSE)
|
||||
{
|
||||
if (PirateStat.DefenseType == EDefenseType.DEFENDER)
|
||||
{
|
||||
Gizmos.color = Color.red;
|
||||
Gizmos.DrawWireSphere(defensePos, PirateStat.DefenseRange);
|
||||
}
|
||||
|
||||
Gizmos.color = Color.blue;
|
||||
Gizmos.DrawWireSphere(transform.position, PirateStat.ViewRange);
|
||||
|
||||
if (!targetTransform) return;
|
||||
|
||||
Gizmos.color = Color.red;
|
||||
Gizmos.DrawLine(transform.position, targetTransform.position);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnMouseEnter()
|
||||
{
|
||||
if (!unitSelection || !unitSelection.IsSelectable) return;
|
||||
@ -69,12 +102,68 @@ namespace BlueWaterProject
|
||||
|
||||
#endregion
|
||||
|
||||
#region IDamageable interface
|
||||
|
||||
public void TakeDamage(float attackerPower, float attackerShieldPenetrationRate, Vector3? attackPos = null)
|
||||
{
|
||||
if (attackPos != null && combatAgent.enabled && PirateStat.AttackerType == EAttackerType.DEFENSE && !targetTransform)
|
||||
{
|
||||
// BeAttackedMovement((Vector3)attackPos);
|
||||
}
|
||||
|
||||
// 회피 성공 체크
|
||||
if (Random.Range(0, 100) < PirateStat.AvoidanceRate)
|
||||
{
|
||||
// TODO : 회피 처리
|
||||
return;
|
||||
}
|
||||
|
||||
var finalDamage = 0f;
|
||||
|
||||
if (PirateStat.UsingShield)
|
||||
{
|
||||
var penetrationChance = attackerShieldPenetrationRate -
|
||||
(attackerShieldPenetrationRate * PirateStat.PenetrationResistivity * 0.01f);
|
||||
|
||||
// 방패를 관통했다면,
|
||||
if (Random.Range(0, 100) < penetrationChance)
|
||||
{
|
||||
finalDamage = attackerPower - PirateStat.Def;
|
||||
finalDamage = Mathf.Max(finalDamage, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
finalDamage = 0f;
|
||||
}
|
||||
}
|
||||
|
||||
finalDamage = attackerPower - PirateStat.Def;
|
||||
finalDamage = Mathf.Max(finalDamage, 0);
|
||||
|
||||
// 방패 막기 체크
|
||||
if (finalDamage == 0f)
|
||||
{
|
||||
combatAnimator.SetTrigger(ShieldHash);
|
||||
return;
|
||||
}
|
||||
var changeHp = Mathf.Max(PirateStat.CurrentHp - finalDamage, 0);
|
||||
SetCurrentHp(changeHp);
|
||||
|
||||
// 죽었는지 체크
|
||||
if (changeHp == 0f) return;
|
||||
|
||||
combatAnimator.SetTrigger(DamageHash);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Custom methods
|
||||
|
||||
protected override void InitComponent()
|
||||
{
|
||||
base.InitComponent();
|
||||
|
||||
pirateUnit = Utils.GetComponentAndAssert<PirateUnit>(transform.parent);
|
||||
unitSelection = Utils.GetComponentAndAssert<UnitSelection>(GameObject.Find("UnitManager").transform);
|
||||
}
|
||||
|
||||
@ -98,6 +187,8 @@ namespace BlueWaterProject
|
||||
|
||||
InitViewModel(pirateViewData);
|
||||
FindMaterial();
|
||||
SetBehaviorTree(UnitManager.Inst.PirateBehaviorTree);
|
||||
|
||||
SetCurrentHp(PirateStat.MaxHp);
|
||||
SetMoveSpeed(PirateStat.MoveSpd);
|
||||
|
||||
@ -105,6 +196,7 @@ namespace BlueWaterProject
|
||||
{
|
||||
defensePos = transform.position;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void InitViewModel(PirateView pirateView)
|
||||
@ -138,9 +230,164 @@ namespace BlueWaterProject
|
||||
}
|
||||
}
|
||||
|
||||
public void CommandMove(Vector3 movePos)
|
||||
public void CommandMoveTarget(Vector3 movePos)
|
||||
{
|
||||
StartCoroutine(CommandMoveCoroutine(movePos));
|
||||
}
|
||||
|
||||
private IEnumerator CommandMoveCoroutine(Vector3 movePos)
|
||||
{
|
||||
while (isAttacking)
|
||||
{
|
||||
yield return null;
|
||||
}
|
||||
|
||||
combatAgent.SetDestination(movePos);
|
||||
SetIsCommanded(true);
|
||||
|
||||
while (combatAgent.pathPending || combatAgent.remainingDistance > combatAgent.stoppingDistance)
|
||||
{
|
||||
yield return null;
|
||||
}
|
||||
|
||||
SetIsCommanded(false);
|
||||
}
|
||||
|
||||
public override void FindTarget()
|
||||
{
|
||||
switch (PirateStat.AttackerType)
|
||||
{
|
||||
case EAttackerType.NONE:
|
||||
print("PirateStat.AttackerType == NONE Error");
|
||||
break;
|
||||
case EAttackerType.OFFENSE:
|
||||
FindTargetInOffense();
|
||||
break;
|
||||
case EAttackerType.DEFENSE:
|
||||
FindTargetInDefense();
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
|
||||
public override bool CanAttack()
|
||||
{
|
||||
if (!targetTransform) return false;
|
||||
|
||||
var attackInRange = Vector3.Distance(transform.position, targetTransform.position) <= PirateStat.AtkRange;
|
||||
return attackInRange;
|
||||
}
|
||||
|
||||
public override void Attack()
|
||||
{
|
||||
isAttackCoroutine = true;
|
||||
StartCoroutine(nameof(AttackAnimation));
|
||||
}
|
||||
|
||||
protected abstract IEnumerator AttackAnimation();
|
||||
|
||||
private void FindTargetInOffense()
|
||||
{
|
||||
if (!attackingIslandInfo)
|
||||
{
|
||||
print("attackingIslandInfo == null error");
|
||||
return;
|
||||
}
|
||||
|
||||
switch (PirateStat.OffenseType)
|
||||
{
|
||||
case EOffenseType.NONE:
|
||||
print("AiStat.OffenseType == NONE Error");
|
||||
break;
|
||||
case EOffenseType.NORMAL:
|
||||
if (attackingIslandInfo.EnemyList.Count > 0)
|
||||
{
|
||||
FindNearestTargetInList(attackingIslandInfo.EnemyList);
|
||||
}
|
||||
else if (attackingIslandInfo.HouseList.Count > 0)
|
||||
{
|
||||
FindNearestTargetInList(attackingIslandInfo.HouseList);
|
||||
}
|
||||
break;
|
||||
case EOffenseType.ONLY_HOUSE:
|
||||
if (attackingIslandInfo.HouseList.Count > 0)
|
||||
{
|
||||
FindNearestTargetInList(attackingIslandInfo.HouseList);
|
||||
}
|
||||
else if (attackingIslandInfo.EnemyList.Count > 0)
|
||||
{
|
||||
FindNearestTargetInList(attackingIslandInfo.EnemyList);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void FindNearestTargetInList(List<Transform> targetList)
|
||||
{
|
||||
if (targetList.Count <= 0) return;
|
||||
|
||||
var nearestTarget = targetList.OrderBy(t => t ?
|
||||
Vector3.Distance(transform.position, t.position) : float.MaxValue).FirstOrDefault();
|
||||
|
||||
if (nearestTarget == null) return;
|
||||
|
||||
SetTargetTransform(nearestTarget);
|
||||
}
|
||||
|
||||
private void FindTargetInDefense()
|
||||
{
|
||||
switch (PirateStat.DefenseType)
|
||||
{
|
||||
case EDefenseType.NONE:
|
||||
print("EnemyStat.DefenseType == NONE Error");
|
||||
break;
|
||||
case EDefenseType.STRIKER:
|
||||
FindNearestTargetInRange(transform.position, PirateStat.ViewRange);
|
||||
break;
|
||||
case EDefenseType.MIDFIELDER:
|
||||
FindNearestTargetInRange(transform.position, PirateStat.ViewRange);
|
||||
break;
|
||||
case EDefenseType.DEFENDER:
|
||||
FindNearestTargetInRange(defensePos, PirateStat.DefenseRange);
|
||||
break;
|
||||
case EDefenseType.KEEPER:
|
||||
FindNearestTargetInRange(transform.position, PirateStat.ViewRange);
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void FindNearestTargetInRange(Vector3 centerPos, float range)
|
||||
{
|
||||
Array.Clear(colliderWithinRange, 0, TARGET_MAX_SIZE);
|
||||
|
||||
var maxColliderCount = Physics.OverlapSphereNonAlloc(centerPos, range, colliderWithinRange,
|
||||
targetLayer, QueryTriggerInteraction.Collide);
|
||||
|
||||
if (maxColliderCount <= 0)
|
||||
{
|
||||
SetTargetTransform(null);
|
||||
return;
|
||||
}
|
||||
|
||||
var nearestDistance = Mathf.Infinity;
|
||||
Transform nearestTargetTransform = null;
|
||||
|
||||
for (var i = 0; i < maxColliderCount; i++)
|
||||
{
|
||||
var distanceToTarget = Vector3.Distance(transform.position, colliderWithinRange[i].transform.position);
|
||||
|
||||
if (distanceToTarget >= nearestDistance) continue;
|
||||
|
||||
nearestDistance = distanceToTarget;
|
||||
nearestTargetTransform = colliderWithinRange[i].transform;
|
||||
}
|
||||
|
||||
SetTargetTransform(nearestTargetTransform);
|
||||
}
|
||||
|
||||
private void SetOutlineColor(Color color)
|
||||
@ -150,8 +397,33 @@ namespace BlueWaterProject
|
||||
skin.SetColor(OutlineColorHash, color);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetIsCommanded(bool value)
|
||||
{
|
||||
isCommanded = value;
|
||||
|
||||
var btIsCommanded = behaviorTree.GetVariable("IsCommanded");
|
||||
btIsCommanded?.SetValue(value);
|
||||
}
|
||||
|
||||
protected override void SetCurrentHp(float value) => PirateStat.CurrentHp = value;
|
||||
protected override void SetCurrentHp(float value)
|
||||
{
|
||||
PirateStat.CurrentHp = value;
|
||||
|
||||
var btCurrentHp = behaviorTree.GetVariable("CurrentHp");
|
||||
btCurrentHp?.SetValue(value);
|
||||
}
|
||||
|
||||
protected override void RemoveAiListElement()
|
||||
{
|
||||
if (pirateUnit.pirateUnitStat.PirateAiList.Contains(this))
|
||||
{
|
||||
pirateUnit.pirateUnitStat.PirateAiList.Remove(this);
|
||||
}
|
||||
}
|
||||
|
||||
public bool GetIsAttackCoroutine() => isAttackCoroutine;
|
||||
public bool GetIsCommanded() => isCommanded;
|
||||
public void SetAttackerType(EAttackerType type) => PirateStat.AttackerType = type;
|
||||
public void SetOffenseType(EOffenseType type) => PirateStat.OffenseType = type;
|
||||
public void SetDefenseType(EDefenseType type) => PirateStat.DefenseType = type;
|
||||
|
@ -1,6 +1,10 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Pool;
|
||||
using UnityEngine.Serialization;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace BlueWaterProject
|
||||
@ -16,14 +20,47 @@ namespace BlueWaterProject
|
||||
[Tooltip("화살 발사 후 오브젝트 저장될 위치")]
|
||||
[SerializeField] private Transform arrowsPoolLocation;
|
||||
|
||||
[SerializeField] private LayerMask archerLayer;
|
||||
[SerializeField] private LayerMask arrowLayer;
|
||||
|
||||
private IEnumerator shootArrowCoroutine;
|
||||
|
||||
private IObjectPool<Arrow> arrowPool;
|
||||
|
||||
[SerializeField] private Vector3 rayOffset = new(0f, 2f, 0);
|
||||
[SerializeField] private Vector3 rayOffset = new(0f, 3.5f, 0);
|
||||
|
||||
#endregion
|
||||
|
||||
#region Unity built-in methods
|
||||
|
||||
protected override void OnDrawGizmosSelected()
|
||||
{
|
||||
if (!isDrawGizmosInFieldOfView) return;
|
||||
|
||||
if (PirateStat.AttackerType == EAttackerType.OFFENSE)
|
||||
{
|
||||
if (!targetTransform) return;
|
||||
|
||||
Gizmos.color = Color.red;
|
||||
Gizmos.DrawLine(transform.position + rayOffset, targetTransform.position + rayOffset);
|
||||
}
|
||||
else if (PirateStat.AttackerType == EAttackerType.DEFENSE)
|
||||
{
|
||||
if (PirateStat.DefenseType == EDefenseType.DEFENDER)
|
||||
{
|
||||
Gizmos.color = Color.red;
|
||||
Gizmos.DrawWireSphere(defensePos, PirateStat.DefenseRange);
|
||||
}
|
||||
|
||||
Gizmos.color = Color.blue;
|
||||
Gizmos.DrawWireSphere(transform.position, PirateStat.ViewRange);
|
||||
|
||||
if (!targetTransform) return;
|
||||
|
||||
Gizmos.color = Color.red;
|
||||
Gizmos.DrawLine(transform.position + rayOffset, targetTransform.position + rayOffset);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Custom methods
|
||||
@ -69,7 +106,7 @@ namespace BlueWaterProject
|
||||
{
|
||||
base.SetLayer();
|
||||
|
||||
archerLayer = LayerMask.GetMask("Ground") | LayerMask.GetMask("Water") |
|
||||
arrowLayer = LayerMask.GetMask("Ground") | LayerMask.GetMask("Water") |
|
||||
LayerMask.GetMask("Enemy") | LayerMask.GetMask("Props");
|
||||
}
|
||||
|
||||
@ -80,6 +117,96 @@ namespace BlueWaterProject
|
||||
SetAnimatorController("Archer");
|
||||
}
|
||||
|
||||
protected override void FindNearestTargetInList(List<Transform> targetList)
|
||||
{
|
||||
if (targetList.Count <= 0) return;
|
||||
|
||||
var myPos = transform.position;
|
||||
var nearestTarget = targetList.OrderBy(t => t && IsRaycastHitTarget(myPos, t)
|
||||
? Vector3.Distance(myPos, t.position) : float.MaxValue).FirstOrDefault();
|
||||
|
||||
if (nearestTarget == null) return;
|
||||
|
||||
SetTargetTransform(nearestTarget);
|
||||
}
|
||||
|
||||
protected override void FindNearestTargetInRange(Vector3 centerPos, float range)
|
||||
{
|
||||
Array.Clear(colliderWithinRange, 0, TARGET_MAX_SIZE);
|
||||
|
||||
var maxColliderCount = Physics.OverlapSphereNonAlloc(centerPos, range, colliderWithinRange,
|
||||
targetLayer, QueryTriggerInteraction.Collide);
|
||||
|
||||
if (maxColliderCount <= 0)
|
||||
{
|
||||
SetTargetTransform(null);
|
||||
return;
|
||||
}
|
||||
|
||||
var nearestDistance = Mathf.Infinity;
|
||||
Transform nearestTargetTransform = null;
|
||||
|
||||
for (var i = 0; i < maxColliderCount; i++)
|
||||
{
|
||||
var distanceToTarget = Vector3.Distance(transform.position, colliderWithinRange[i].transform.position);
|
||||
|
||||
if (!IsRaycastHitTarget(transform.position, colliderWithinRange[i].transform) || distanceToTarget >= nearestDistance) continue;
|
||||
|
||||
nearestDistance = distanceToTarget;
|
||||
nearestTargetTransform = colliderWithinRange[i].transform;
|
||||
}
|
||||
|
||||
SetTargetTransform(nearestTargetTransform);
|
||||
}
|
||||
|
||||
private bool IsRaycastHitTarget(Vector3 myPos, Transform target)
|
||||
{
|
||||
var direction = ((target.position + rayOffset) - (myPos + rayOffset)).normalized;
|
||||
var raycastHitTarget = Physics.Raycast(myPos + rayOffset, direction, out var hit, PirateStat.AtkRange, arrowLayer, QueryTriggerInteraction.Collide);
|
||||
|
||||
return raycastHitTarget && target == hit.transform;
|
||||
}
|
||||
|
||||
protected override IEnumerator AttackAnimation()
|
||||
{
|
||||
combatAnimator.SetTrigger(AttackHash);
|
||||
|
||||
while (isAttacking)
|
||||
{
|
||||
yield return null;
|
||||
}
|
||||
|
||||
yield return new WaitForSeconds(PirateStat.AtkCooldown);
|
||||
isAttackCoroutine = false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Archer attack 애니메이션에 event 부착용 함수
|
||||
/// </summary>
|
||||
public void OnShootArrow()
|
||||
{
|
||||
if (!targetTransform) return;
|
||||
|
||||
var arrow = arrowPool.Get();
|
||||
var isOffense = PirateStat.AttackerType == EAttackerType.OFFENSE;
|
||||
|
||||
arrow.SetShootingArrow(leftWeaponContainer.position, transform.position,
|
||||
targetTransform.position + rayOffset, EAiType.PIRATE, PirateStat.Atk, PirateStat.ShieldPenetrationRate, PirateStat.Inaccuracy, isOffense);
|
||||
arrow.ShootArrowCoroutine();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Archer attack 애니메이션에 event 부착용 함수
|
||||
/// </summary>
|
||||
public void OnStoppedMove(int boolValue)
|
||||
{
|
||||
if (!combatAgent.enabled) return;
|
||||
|
||||
combatAgent.isStopped = boolValue == 1;
|
||||
}
|
||||
|
||||
private void OnAttacking(int boolValue) => isAttacking = boolValue == 1;
|
||||
|
||||
#endregion
|
||||
|
||||
#region ObjectPool Function
|
||||
|
@ -1,3 +1,4 @@
|
||||
using System.Collections;
|
||||
using Unity.VisualScripting;
|
||||
using UnityEngine;
|
||||
|
||||
@ -6,8 +7,14 @@ namespace BlueWaterProject
|
||||
{
|
||||
public class PirateAxeman : PirateAi
|
||||
{
|
||||
#region Properties and variables
|
||||
|
||||
private CloseWeapon closeWeapon;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Custom methods
|
||||
|
||||
protected override void InitStart()
|
||||
{
|
||||
base.InitStart();
|
||||
@ -28,5 +35,25 @@ namespace BlueWaterProject
|
||||
closeWeapon.SetAttackerAiType(EAiType.PIRATE);
|
||||
closeWeapon.SetBoxCollider();
|
||||
}
|
||||
|
||||
protected override IEnumerator AttackAnimation()
|
||||
{
|
||||
closeWeapon.SetIsAttacked(false);
|
||||
closeWeapon.SetWeaponStat(PirateStat.Atk, PirateStat.ShieldPenetrationRate, PirateStat.AttackerType == EAttackerType.OFFENSE);
|
||||
combatAnimator.SetTrigger(AttackHash);
|
||||
|
||||
while (isAttacking)
|
||||
{
|
||||
yield return null;
|
||||
}
|
||||
|
||||
yield return new WaitForSeconds(PirateStat.AtkCooldown);
|
||||
isAttackCoroutine = false;
|
||||
}
|
||||
|
||||
private void SetCloseWeaponCanAttack(int boolValue) => closeWeapon.SetCanAttack(boolValue == 1);
|
||||
private void OnAttacking(int boolValue) => isAttacking = boolValue == 1;
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
using System.Collections;
|
||||
using Unity.VisualScripting;
|
||||
using UnityEngine;
|
||||
|
||||
@ -6,8 +7,14 @@ namespace BlueWaterProject
|
||||
{
|
||||
public class PirateSpearman : PirateAi
|
||||
{
|
||||
#region Properties and variables
|
||||
|
||||
private CloseWeapon closeWeapon;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Custom methods
|
||||
|
||||
protected override void InitStart()
|
||||
{
|
||||
base.InitStart();
|
||||
@ -28,5 +35,25 @@ namespace BlueWaterProject
|
||||
closeWeapon.SetAttackerAiType(EAiType.PIRATE);
|
||||
closeWeapon.SetBoxCollider();
|
||||
}
|
||||
|
||||
protected override IEnumerator AttackAnimation()
|
||||
{
|
||||
closeWeapon.SetIsAttacked(false);
|
||||
closeWeapon.SetWeaponStat(PirateStat.Atk, PirateStat.ShieldPenetrationRate, PirateStat.AttackerType == EAttackerType.OFFENSE);
|
||||
combatAnimator.SetTrigger(AttackHash);
|
||||
|
||||
while (isAttacking)
|
||||
{
|
||||
yield return null;
|
||||
}
|
||||
|
||||
yield return new WaitForSeconds(PirateStat.AtkCooldown);
|
||||
isAttackCoroutine = false;
|
||||
}
|
||||
|
||||
private void SetCloseWeaponCanAttack(int boolValue) => closeWeapon.SetCanAttack(boolValue == 1);
|
||||
private void OnAttacking(int boolValue) => isAttacking = boolValue == 1;
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
using System.Collections;
|
||||
using Unity.VisualScripting;
|
||||
using UnityEngine;
|
||||
|
||||
@ -6,8 +7,14 @@ namespace BlueWaterProject
|
||||
{
|
||||
public class PirateSwordKnight : PirateAi
|
||||
{
|
||||
#region Properties and variables
|
||||
|
||||
private CloseWeapon closeWeapon;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Custom methods
|
||||
|
||||
protected override void InitStart()
|
||||
{
|
||||
base.InitStart();
|
||||
@ -28,5 +35,25 @@ namespace BlueWaterProject
|
||||
closeWeapon.SetAttackerAiType(EAiType.PIRATE);
|
||||
closeWeapon.SetBoxCollider();
|
||||
}
|
||||
|
||||
protected override IEnumerator AttackAnimation()
|
||||
{
|
||||
closeWeapon.SetIsAttacked(false);
|
||||
closeWeapon.SetWeaponStat(PirateStat.Atk, PirateStat.ShieldPenetrationRate, PirateStat.AttackerType == EAttackerType.OFFENSE);
|
||||
combatAnimator.SetTrigger(AttackHash);
|
||||
|
||||
while (isAttacking)
|
||||
{
|
||||
yield return null;
|
||||
}
|
||||
|
||||
yield return new WaitForSeconds(PirateStat.AtkCooldown);
|
||||
isAttackCoroutine = false;
|
||||
}
|
||||
|
||||
private void SetCloseWeaponCanAttack(int boolValue) => closeWeapon.SetCanAttack(boolValue == 1);
|
||||
private void OnAttacking(int boolValue) => isAttacking = boolValue == 1;
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
using System.Collections;
|
||||
using Unity.VisualScripting;
|
||||
using UnityEngine;
|
||||
|
||||
@ -6,8 +7,14 @@ namespace BlueWaterProject
|
||||
{
|
||||
public class PirateSwordman : PirateAi
|
||||
{
|
||||
#region Properties and variables
|
||||
|
||||
private CloseWeapon closeWeapon;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Custom methods
|
||||
|
||||
protected override void InitStart()
|
||||
{
|
||||
base.InitStart();
|
||||
@ -28,5 +35,25 @@ namespace BlueWaterProject
|
||||
closeWeapon.SetAttackerAiType(EAiType.PIRATE);
|
||||
closeWeapon.SetBoxCollider();
|
||||
}
|
||||
|
||||
protected override IEnumerator AttackAnimation()
|
||||
{
|
||||
closeWeapon.SetIsAttacked(false);
|
||||
closeWeapon.SetWeaponStat(PirateStat.Atk, PirateStat.ShieldPenetrationRate, PirateStat.AttackerType == EAttackerType.OFFENSE);
|
||||
combatAnimator.SetTrigger(AttackHash);
|
||||
|
||||
while (isAttacking)
|
||||
{
|
||||
yield return null;
|
||||
}
|
||||
|
||||
yield return new WaitForSeconds(PirateStat.AtkCooldown);
|
||||
isAttackCoroutine = false;
|
||||
}
|
||||
|
||||
private void SetCloseWeaponCanAttack(int boolValue) => closeWeapon.SetCanAttack(boolValue == 1);
|
||||
private void OnAttacking(int boolValue) => isAttacking = boolValue == 1;
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using Sirenix.OdinInspector;
|
||||
using UnityEngine;
|
||||
|
||||
@ -11,6 +12,7 @@ namespace BlueWaterProject
|
||||
[PropertyOrder(-10)]
|
||||
public EnemyUnitStat enemyUnitStat;
|
||||
|
||||
private Vector3[] defensePos;
|
||||
private bool isClickedTypeAllButton;
|
||||
|
||||
#endregion
|
||||
@ -19,7 +21,7 @@ namespace BlueWaterProject
|
||||
|
||||
private void OnDrawGizmosSelected()
|
||||
{
|
||||
if (!Application.isPlaying || enemyUnitStat == null || enemyUnitStat.SailorCount <= 0) return;
|
||||
if (Application.isPlaying || enemyUnitStat == null || enemyUnitStat.SailorCount <= 0) return;
|
||||
|
||||
foreach (var item in enemyUnitStat.EnemyAiList)
|
||||
{
|
||||
@ -30,6 +32,11 @@ namespace BlueWaterProject
|
||||
}
|
||||
}
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
defensePos = new Vector3[enemyUnitStat.EnemyAiList.Count];
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Custom function
|
||||
@ -58,7 +65,7 @@ namespace BlueWaterProject
|
||||
|
||||
private bool CanAssignUnit()
|
||||
{
|
||||
return UnitManager.Inst.CanAssignUnit(this, transform.position);
|
||||
return !Application.isPlaying && UnitManager.Inst.CanAssignUnit(this, transform.position);
|
||||
}
|
||||
|
||||
[PropertyOrder(-7)]
|
||||
@ -75,10 +82,20 @@ namespace BlueWaterProject
|
||||
};
|
||||
isClickedTypeAllButton = false;
|
||||
}
|
||||
|
||||
|
||||
public void ResetDefensePos()
|
||||
{
|
||||
for (var i = 0; i < enemyUnitStat.EnemyAiList.Count; i++)
|
||||
{
|
||||
enemyUnitStat.EnemyAiList[i].SetDefensePos(defensePos[i]);
|
||||
}
|
||||
}
|
||||
|
||||
private Color GetCreateUnitButtonColor() => enemyUnitStat.EnemyAiList.Count > 0 ? Color.white : Color.green;
|
||||
private Color GetTypeAllButtonColor() => isClickedTypeAllButton ? Color.white : Color.green;
|
||||
private void OnTypeChanged() => isClickedTypeAllButton = false;
|
||||
public Vector3 GetDefensePos(int index) => defensePos[index];
|
||||
public void SetDefensePos(Vector3 pos, int index) => defensePos[index] = pos;
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
@ -50,7 +50,7 @@ namespace BlueWaterProject
|
||||
var xOffset = (j - (gridSize - 1) / 2.0f) * UnitManager.Inst.UnitSpacing;
|
||||
var movePos = targetPos + new Vector3(xOffset, 0, zOffset);
|
||||
|
||||
pirateUnitStat.PirateAiList[currentPos].CommandMove(movePos);
|
||||
pirateUnitStat.PirateAiList[currentPos].CommandMoveTarget(movePos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using BehaviorDesigner.Runtime;
|
||||
using Sirenix.OdinInspector;
|
||||
using UnityEditor.Animations;
|
||||
using UnityEngine;
|
||||
@ -19,6 +20,12 @@ namespace BlueWaterProject
|
||||
|
||||
[Tooltip("화살 프리팹")]
|
||||
[field: SerializeField] public GameObject ArrowPrefab { get; private set; }
|
||||
|
||||
[Tooltip("Enemy 비헤이비어 트리")]
|
||||
[field: SerializeField] public ExternalBehaviorTree EnemyBehaviorTree { get; private set; }
|
||||
|
||||
[Tooltip("Pirate 비헤이비어 트리")]
|
||||
[field: SerializeField] public ExternalBehaviorTree PirateBehaviorTree { get; private set; }
|
||||
|
||||
[Tooltip("바닥 레이어")]
|
||||
[field: SerializeField] public LayerMask GroundLayer { get; private set; }
|
||||
@ -65,22 +72,24 @@ namespace BlueWaterProject
|
||||
/// 프리팹 초기화 함수
|
||||
/// </summary>
|
||||
[GUIColor(0, 1, 0)]
|
||||
[ShowIf("@PiratePrefab == null || BaseHumanPrefab == null || ArrowPrefab == null ||" +
|
||||
[ShowIf("@PiratePrefab == null || BaseHumanPrefab == null || ArrowPrefab == null || EnemyBehaviorTree == null || PirateBehaviorTree == null ||" +
|
||||
"AIAnimatorControllerList == null || AIAnimatorControllerList.Count != ANIMATOR_CONTROLLER_PREFAB_CAPACITY")]
|
||||
[Button("프리팹 초기화")]
|
||||
private void InitCharacterPrefabList()
|
||||
{
|
||||
PiratePrefab = Utils.LoadPrefabFromFolder("Assets/05.Prefabs/Character/Unit", "PirateUnit");
|
||||
BaseHumanPrefab = Utils.LoadPrefabFromFolder("Assets/05.Prefabs/Character", "BaseHuman");
|
||||
ArrowPrefab = Utils.LoadPrefabFromFolder("Assets/05.Prefabs", "Arrow_01");
|
||||
PiratePrefab = Utils.LoadFromFolder<GameObject>("Assets/05.Prefabs/Character/Unit", "PirateUnit", ".prefab");
|
||||
BaseHumanPrefab = Utils.LoadFromFolder<GameObject>("Assets/05.Prefabs/Character", "BaseHuman", ".prefab");
|
||||
ArrowPrefab = Utils.LoadFromFolder<GameObject>("Assets/05.Prefabs", "Arrow_01", ".prefab");
|
||||
EnemyBehaviorTree = Utils.LoadFromFolder<ExternalBehaviorTree>("Assets/09.BehaviorTree/Enemy", "BaseEnemyAi", ".asset");
|
||||
PirateBehaviorTree = Utils.LoadFromFolder<ExternalBehaviorTree>("Assets/09.BehaviorTree/Pirate", "BasePirateAi", ".asset");
|
||||
AIAnimatorControllerList = new List<AnimatorController>(ANIMATOR_CONTROLLER_PREFAB_CAPACITY)
|
||||
{
|
||||
Utils.LoadAnimatorControllerFromFolder("Assets/07.Animation", "Archer"),
|
||||
Utils.LoadAnimatorControllerFromFolder("Assets/07.Animation", "Axeman"),
|
||||
Utils.LoadAnimatorControllerFromFolder("Assets/07.Animation", "SpearKnight"),
|
||||
Utils.LoadAnimatorControllerFromFolder("Assets/07.Animation", "Spearman"),
|
||||
Utils.LoadAnimatorControllerFromFolder("Assets/07.Animation", "SwordKnight"),
|
||||
Utils.LoadAnimatorControllerFromFolder("Assets/07.Animation", "Swordman")
|
||||
Utils.LoadFromFolder<AnimatorController>("Assets/07.Animation", "Archer", ".controller"),
|
||||
Utils.LoadFromFolder<AnimatorController>("Assets/07.Animation", "Axeman", ".controller"),
|
||||
Utils.LoadFromFolder<AnimatorController>("Assets/07.Animation", "SpearKnight", ".controller"),
|
||||
Utils.LoadFromFolder<AnimatorController>("Assets/07.Animation", "Spearman", ".controller"),
|
||||
Utils.LoadFromFolder<AnimatorController>("Assets/07.Animation", "SwordKnight", ".controller"),
|
||||
Utils.LoadFromFolder<AnimatorController>("Assets/07.Animation", "Swordman", ".controller")
|
||||
};
|
||||
}
|
||||
#endif
|
||||
@ -424,7 +433,7 @@ namespace BlueWaterProject
|
||||
{
|
||||
if (isOffense)
|
||||
{
|
||||
unit.SetIslandInfo(hitIslandInfo);
|
||||
unit.SetAttackingIslandInfo(hitIslandInfo);
|
||||
}
|
||||
unit.gameObject.SetActive(true);
|
||||
}
|
||||
|
@ -23,7 +23,7 @@ MonoBehaviour:
|
||||
<CurrentHp>k__BackingField: 0
|
||||
<Atk>k__BackingField: 50
|
||||
<Def>k__BackingField: 0
|
||||
<MoveSpd>k__BackingField: 5
|
||||
<MoveSpd>k__BackingField: 7
|
||||
<AtkCooldown>k__BackingField: 3
|
||||
<ViewRange>k__BackingField: 40
|
||||
<AtkRange>k__BackingField: 40
|
||||
@ -44,7 +44,7 @@ MonoBehaviour:
|
||||
<CurrentHp>k__BackingField: 0
|
||||
<Atk>k__BackingField: 40
|
||||
<Def>k__BackingField: 10
|
||||
<MoveSpd>k__BackingField: 4.5
|
||||
<MoveSpd>k__BackingField: 6.5
|
||||
<AtkCooldown>k__BackingField: 2
|
||||
<ViewRange>k__BackingField: 10
|
||||
<AtkRange>k__BackingField: 3.5
|
||||
@ -65,11 +65,11 @@ MonoBehaviour:
|
||||
<CurrentHp>k__BackingField: 0
|
||||
<Atk>k__BackingField: 50
|
||||
<Def>k__BackingField: 5
|
||||
<MoveSpd>k__BackingField: 5.5
|
||||
<MoveSpd>k__BackingField: 7.5
|
||||
<AtkCooldown>k__BackingField: 2
|
||||
<ViewRange>k__BackingField: 15
|
||||
<AtkRange>k__BackingField: 3.5
|
||||
<DefenseRange>k__BackingField: 0
|
||||
<DefenseRange>k__BackingField: 15
|
||||
<ShieldPenetrationRate>k__BackingField: 75
|
||||
<AvoidanceRate>k__BackingField: 20
|
||||
<UsingShield>k__BackingField: 0
|
||||
@ -86,11 +86,11 @@ MonoBehaviour:
|
||||
<CurrentHp>k__BackingField: 0
|
||||
<Atk>k__BackingField: 30
|
||||
<Def>k__BackingField: 10
|
||||
<MoveSpd>k__BackingField: 5
|
||||
<MoveSpd>k__BackingField: 7
|
||||
<AtkCooldown>k__BackingField: 1.5
|
||||
<ViewRange>k__BackingField: 10
|
||||
<AtkRange>k__BackingField: 3
|
||||
<DefenseRange>k__BackingField: 0
|
||||
<DefenseRange>k__BackingField: 10
|
||||
<ShieldPenetrationRate>k__BackingField: 50
|
||||
<AvoidanceRate>k__BackingField: 10
|
||||
<UsingShield>k__BackingField: 1
|
||||
@ -107,11 +107,11 @@ MonoBehaviour:
|
||||
<CurrentHp>k__BackingField: 0
|
||||
<Atk>k__BackingField: 35
|
||||
<Def>k__BackingField: 5
|
||||
<MoveSpd>k__BackingField: 6
|
||||
<MoveSpd>k__BackingField: 8
|
||||
<AtkCooldown>k__BackingField: 1.5
|
||||
<ViewRange>k__BackingField: 15
|
||||
<AtkRange>k__BackingField: 3
|
||||
<DefenseRange>k__BackingField: 0
|
||||
<DefenseRange>k__BackingField: 15
|
||||
<ShieldPenetrationRate>k__BackingField: 50
|
||||
<AvoidanceRate>k__BackingField: 30
|
||||
<UsingShield>k__BackingField: 0
|
||||
@ -128,7 +128,7 @@ MonoBehaviour:
|
||||
<CurrentHp>k__BackingField: 0
|
||||
<Atk>k__BackingField: 50
|
||||
<Def>k__BackingField: 0
|
||||
<MoveSpd>k__BackingField: 5
|
||||
<MoveSpd>k__BackingField: 7
|
||||
<AtkCooldown>k__BackingField: 3
|
||||
<ViewRange>k__BackingField: 40
|
||||
<AtkRange>k__BackingField: 40
|
||||
@ -149,7 +149,7 @@ MonoBehaviour:
|
||||
<CurrentHp>k__BackingField: 0
|
||||
<Atk>k__BackingField: 40
|
||||
<Def>k__BackingField: 10
|
||||
<MoveSpd>k__BackingField: 4.5
|
||||
<MoveSpd>k__BackingField: 6.5
|
||||
<AtkCooldown>k__BackingField: 2
|
||||
<ViewRange>k__BackingField: 10
|
||||
<AtkRange>k__BackingField: 3.5
|
||||
@ -170,11 +170,11 @@ MonoBehaviour:
|
||||
<CurrentHp>k__BackingField: 0
|
||||
<Atk>k__BackingField: 50
|
||||
<Def>k__BackingField: 5
|
||||
<MoveSpd>k__BackingField: 5.5
|
||||
<MoveSpd>k__BackingField: 7.5
|
||||
<AtkCooldown>k__BackingField: 2
|
||||
<ViewRange>k__BackingField: 15
|
||||
<AtkRange>k__BackingField: 3.5
|
||||
<DefenseRange>k__BackingField: 0
|
||||
<DefenseRange>k__BackingField: 15
|
||||
<ShieldPenetrationRate>k__BackingField: 75
|
||||
<AvoidanceRate>k__BackingField: 20
|
||||
<UsingShield>k__BackingField: 0
|
||||
@ -191,11 +191,11 @@ MonoBehaviour:
|
||||
<CurrentHp>k__BackingField: 0
|
||||
<Atk>k__BackingField: 30
|
||||
<Def>k__BackingField: 10
|
||||
<MoveSpd>k__BackingField: 5
|
||||
<MoveSpd>k__BackingField: 7
|
||||
<AtkCooldown>k__BackingField: 1.5
|
||||
<ViewRange>k__BackingField: 10
|
||||
<AtkRange>k__BackingField: 3
|
||||
<DefenseRange>k__BackingField: 0
|
||||
<DefenseRange>k__BackingField: 10
|
||||
<ShieldPenetrationRate>k__BackingField: 50
|
||||
<AvoidanceRate>k__BackingField: 10
|
||||
<UsingShield>k__BackingField: 1
|
||||
@ -212,11 +212,11 @@ MonoBehaviour:
|
||||
<CurrentHp>k__BackingField: 0
|
||||
<Atk>k__BackingField: 35
|
||||
<Def>k__BackingField: 5
|
||||
<MoveSpd>k__BackingField: 6
|
||||
<MoveSpd>k__BackingField: 8
|
||||
<AtkCooldown>k__BackingField: 1.5
|
||||
<ViewRange>k__BackingField: 15
|
||||
<AtkRange>k__BackingField: 3
|
||||
<DefenseRange>k__BackingField: 0
|
||||
<DefenseRange>k__BackingField: 15
|
||||
<ShieldPenetrationRate>k__BackingField: 50
|
||||
<AvoidanceRate>k__BackingField: 30
|
||||
<UsingShield>k__BackingField: 0
|
||||
|
@ -23,7 +23,7 @@ MonoBehaviour:
|
||||
<CurrentHp>k__BackingField: 0
|
||||
<Atk>k__BackingField: 50
|
||||
<Def>k__BackingField: 0
|
||||
<MoveSpd>k__BackingField: 5
|
||||
<MoveSpd>k__BackingField: 7
|
||||
<AtkCooldown>k__BackingField: 3
|
||||
<ViewRange>k__BackingField: 40
|
||||
<AtkRange>k__BackingField: 40
|
||||
@ -44,13 +44,13 @@ MonoBehaviour:
|
||||
<CurrentHp>k__BackingField: 0
|
||||
<Atk>k__BackingField: 50
|
||||
<Def>k__BackingField: 0
|
||||
<MoveSpd>k__BackingField: 5
|
||||
<MoveSpd>k__BackingField: 7
|
||||
<AtkCooldown>k__BackingField: 2.5
|
||||
<ViewRange>k__BackingField: 15
|
||||
<AtkRange>k__BackingField: 3.5
|
||||
<DefenseRange>k__BackingField: 0
|
||||
<ShieldPenetrationRate>k__BackingField: 0
|
||||
<AvoidanceRate>k__BackingField: 100
|
||||
<DefenseRange>k__BackingField: 15
|
||||
<ShieldPenetrationRate>k__BackingField: 100
|
||||
<AvoidanceRate>k__BackingField: 0
|
||||
<UsingShield>k__BackingField: 0
|
||||
<PenetrationResistivity>k__BackingField: 0
|
||||
<UsingBow>k__BackingField: 0
|
||||
@ -65,11 +65,11 @@ MonoBehaviour:
|
||||
<CurrentHp>k__BackingField: 0
|
||||
<Atk>k__BackingField: 50
|
||||
<Def>k__BackingField: 5
|
||||
<MoveSpd>k__BackingField: 5.5
|
||||
<MoveSpd>k__BackingField: 7.5
|
||||
<AtkCooldown>k__BackingField: 2
|
||||
<ViewRange>k__BackingField: 15
|
||||
<AtkRange>k__BackingField: 3.5
|
||||
<DefenseRange>k__BackingField: 0
|
||||
<DefenseRange>k__BackingField: 15
|
||||
<ShieldPenetrationRate>k__BackingField: 75
|
||||
<AvoidanceRate>k__BackingField: 20
|
||||
<UsingShield>k__BackingField: 0
|
||||
@ -86,11 +86,11 @@ MonoBehaviour:
|
||||
<CurrentHp>k__BackingField: 0
|
||||
<Atk>k__BackingField: 30
|
||||
<Def>k__BackingField: 10
|
||||
<MoveSpd>k__BackingField: 5
|
||||
<MoveSpd>k__BackingField: 7
|
||||
<AtkCooldown>k__BackingField: 1.5
|
||||
<ViewRange>k__BackingField: 10
|
||||
<AtkRange>k__BackingField: 3
|
||||
<DefenseRange>k__BackingField: 0
|
||||
<DefenseRange>k__BackingField: 10
|
||||
<ShieldPenetrationRate>k__BackingField: 50
|
||||
<AvoidanceRate>k__BackingField: 10
|
||||
<UsingShield>k__BackingField: 1
|
||||
@ -107,11 +107,11 @@ MonoBehaviour:
|
||||
<CurrentHp>k__BackingField: 0
|
||||
<Atk>k__BackingField: 35
|
||||
<Def>k__BackingField: 5
|
||||
<MoveSpd>k__BackingField: 6
|
||||
<MoveSpd>k__BackingField: 8
|
||||
<AtkCooldown>k__BackingField: 1.5
|
||||
<ViewRange>k__BackingField: 15
|
||||
<AtkRange>k__BackingField: 3
|
||||
<DefenseRange>k__BackingField: 0
|
||||
<DefenseRange>k__BackingField: 15
|
||||
<ShieldPenetrationRate>k__BackingField: 50
|
||||
<AvoidanceRate>k__BackingField: 30
|
||||
<UsingShield>k__BackingField: 0
|
||||
@ -128,7 +128,7 @@ MonoBehaviour:
|
||||
<CurrentHp>k__BackingField: 0
|
||||
<Atk>k__BackingField: 50
|
||||
<Def>k__BackingField: 0
|
||||
<MoveSpd>k__BackingField: 5
|
||||
<MoveSpd>k__BackingField: 7
|
||||
<AtkCooldown>k__BackingField: 3
|
||||
<ViewRange>k__BackingField: 40
|
||||
<AtkRange>k__BackingField: 40
|
||||
@ -149,13 +149,13 @@ MonoBehaviour:
|
||||
<CurrentHp>k__BackingField: 0
|
||||
<Atk>k__BackingField: 40
|
||||
<Def>k__BackingField: 10
|
||||
<MoveSpd>k__BackingField: 4.5
|
||||
<MoveSpd>k__BackingField: 6.5
|
||||
<AtkCooldown>k__BackingField: 2
|
||||
<ViewRange>k__BackingField: 10
|
||||
<AtkRange>k__BackingField: 3.5
|
||||
<DefenseRange>k__BackingField: 10
|
||||
<ShieldPenetrationRate>k__BackingField: 75
|
||||
<AvoidanceRate>k__BackingField: 10
|
||||
<ShieldPenetrationRate>k__BackingField: 100
|
||||
<AvoidanceRate>k__BackingField: 0
|
||||
<UsingShield>k__BackingField: 0
|
||||
<PenetrationResistivity>k__BackingField: 0
|
||||
<UsingBow>k__BackingField: 0
|
||||
@ -170,11 +170,11 @@ MonoBehaviour:
|
||||
<CurrentHp>k__BackingField: 0
|
||||
<Atk>k__BackingField: 50
|
||||
<Def>k__BackingField: 5
|
||||
<MoveSpd>k__BackingField: 5.5
|
||||
<MoveSpd>k__BackingField: 7.5
|
||||
<AtkCooldown>k__BackingField: 2
|
||||
<ViewRange>k__BackingField: 15
|
||||
<AtkRange>k__BackingField: 3.5
|
||||
<DefenseRange>k__BackingField: 0
|
||||
<DefenseRange>k__BackingField: 15
|
||||
<ShieldPenetrationRate>k__BackingField: 75
|
||||
<AvoidanceRate>k__BackingField: 20
|
||||
<UsingShield>k__BackingField: 0
|
||||
@ -191,11 +191,11 @@ MonoBehaviour:
|
||||
<CurrentHp>k__BackingField: 0
|
||||
<Atk>k__BackingField: 30
|
||||
<Def>k__BackingField: 10
|
||||
<MoveSpd>k__BackingField: 5
|
||||
<MoveSpd>k__BackingField: 7
|
||||
<AtkCooldown>k__BackingField: 1.5
|
||||
<ViewRange>k__BackingField: 10
|
||||
<AtkRange>k__BackingField: 3
|
||||
<DefenseRange>k__BackingField: 0
|
||||
<DefenseRange>k__BackingField: 10
|
||||
<ShieldPenetrationRate>k__BackingField: 50
|
||||
<AvoidanceRate>k__BackingField: 10
|
||||
<UsingShield>k__BackingField: 1
|
||||
@ -212,11 +212,11 @@ MonoBehaviour:
|
||||
<CurrentHp>k__BackingField: 0
|
||||
<Atk>k__BackingField: 35
|
||||
<Def>k__BackingField: 5
|
||||
<MoveSpd>k__BackingField: 6
|
||||
<MoveSpd>k__BackingField: 8
|
||||
<AtkCooldown>k__BackingField: 1.5
|
||||
<ViewRange>k__BackingField: 15
|
||||
<AtkRange>k__BackingField: 3
|
||||
<DefenseRange>k__BackingField: 0
|
||||
<DefenseRange>k__BackingField: 15
|
||||
<ShieldPenetrationRate>k__BackingField: 50
|
||||
<AvoidanceRate>k__BackingField: 30
|
||||
<UsingShield>k__BackingField: 0
|
||||
|
@ -92,8 +92,8 @@ namespace BlueWaterProject
|
||||
{
|
||||
if (!unit.gameObject.activeSelf) continue;
|
||||
|
||||
//var aiController = enemy.GetComponent<AiController>();
|
||||
//aiController.SetIslandInfo(this);
|
||||
var combatAi = enemy.GetComponent<CombatAi>();
|
||||
combatAi.SetDefendingIslandInfo(this);
|
||||
EnemyList.Add(enemy);
|
||||
}
|
||||
}
|
||||
@ -123,8 +123,8 @@ namespace BlueWaterProject
|
||||
TargetAllList.Remove(element);
|
||||
}
|
||||
|
||||
CleanupList(list);
|
||||
CleanupList(TargetAllList);
|
||||
//CleanupList(list);
|
||||
//CleanupList(TargetAllList);
|
||||
}
|
||||
|
||||
private void CleanupList(List<Transform> list)
|
||||
|
@ -6,6 +6,7 @@ using UnityEngine;
|
||||
using UnityEngine.AI;
|
||||
using UnityEngine.Assertions;
|
||||
using Debug = UnityEngine.Debug;
|
||||
using Object = UnityEngine.Object;
|
||||
using Random = UnityEngine.Random;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
@ -140,18 +141,11 @@ namespace BlueWaterProject
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
public static GameObject LoadPrefabFromFolder(string folderPath, string prefabName)
|
||||
public static T LoadFromFolder<T>(string folderPath, string name, string extension) where T : Object
|
||||
{
|
||||
var fullPath = System.IO.Path.Combine(folderPath, prefabName + ".prefab");
|
||||
var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(fullPath);
|
||||
return prefab;
|
||||
}
|
||||
|
||||
public static AnimatorController LoadAnimatorControllerFromFolder(string folderPath, string name)
|
||||
{
|
||||
var fullPath = System.IO.Path.Combine(folderPath, name + ".controller");
|
||||
var prefab = AssetDatabase.LoadAssetAtPath<AnimatorController>(fullPath);
|
||||
return prefab;
|
||||
var fullPath = System.IO.Path.Combine(folderPath, name + extension);
|
||||
var t = AssetDatabase.LoadAssetAtPath<T>(fullPath);
|
||||
return t;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -21,13 +21,14 @@ namespace BlueWaterProject
|
||||
private bool isOffense;
|
||||
private float g = Mathf.Abs(Physics.gravity.y);
|
||||
private float inaccuracy;
|
||||
private float atk;
|
||||
private float shieldPenetrationRate;
|
||||
private Vector3? attackerPos;
|
||||
private Vector3 targetPos;
|
||||
private EAiType attackerAiType;
|
||||
|
||||
public Coroutine shootCoroutine;
|
||||
private Transform attackerTransform;
|
||||
private EnemyStat attackerStat;
|
||||
private Rigidbody arrowRigidbody;
|
||||
private IObjectPool<Arrow> managedArrowPool;
|
||||
|
||||
@ -60,10 +61,22 @@ namespace BlueWaterProject
|
||||
}
|
||||
else if (other.gameObject.layer == LayerMask.NameToLayer("Props"))
|
||||
{
|
||||
if (!isOffense) return;
|
||||
|
||||
isAttacked = true;
|
||||
DestroyObject();
|
||||
if (isOffense)
|
||||
{
|
||||
if (other.gameObject.CompareTag("House"))
|
||||
{
|
||||
var iDamageable = other.GetComponentInParent<IDamageable>();
|
||||
|
||||
iDamageable.TakeDamage(atk, shieldPenetrationRate);
|
||||
isAttacked = true;
|
||||
DestroyObject();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
isAttacked = true;
|
||||
DestroyObject();
|
||||
}
|
||||
}
|
||||
else if (other.gameObject.layer == LayerMask.NameToLayer("HitBox"))
|
||||
{
|
||||
@ -92,7 +105,7 @@ namespace BlueWaterProject
|
||||
|
||||
if (attackerPos != null)
|
||||
{
|
||||
iDamageable.TakeDamage(attackerStat.Atk, attackerStat.ShieldPenetrationRate, (Vector3)attackerPos);
|
||||
iDamageable.TakeDamage(atk, shieldPenetrationRate, (Vector3)attackerPos);
|
||||
}
|
||||
isAttacked = true;
|
||||
DestroyObject();
|
||||
@ -164,7 +177,8 @@ namespace BlueWaterProject
|
||||
/// <summary>
|
||||
/// 화살이 발사 되기 직전에 필요한 데이터들을 입력받는 함수
|
||||
/// </summary>
|
||||
public void SetShootingArrow(Vector3 shootLocationPos, Vector3? attackPos, Vector3 targetPosition, EnemyStat attackerAiStat, EAiType aiType, float inaccuracyValue, bool isOffense)
|
||||
public void SetShootingArrow(Vector3 shootLocationPos, Vector3? attackPos, Vector3 targetPosition, EAiType aiType,
|
||||
float atkStat, float shieldPenetrationRateStat, float inaccuracyStat, bool isOffense)
|
||||
{
|
||||
isAttacked = false;
|
||||
transform.position = shootLocationPos;
|
||||
@ -173,9 +187,10 @@ namespace BlueWaterProject
|
||||
attackerPos = (Vector3)attackPos;
|
||||
}
|
||||
targetPos = targetPosition;
|
||||
attackerStat = attackerAiStat;
|
||||
attackerAiType = aiType;
|
||||
inaccuracy = inaccuracyValue;
|
||||
atk = atkStat;
|
||||
shieldPenetrationRate = shieldPenetrationRateStat;
|
||||
inaccuracy = inaccuracyStat;
|
||||
this.isOffense = isOffense;
|
||||
}
|
||||
|
||||
|
@ -9,9 +9,11 @@ namespace BlueWaterProject
|
||||
#region Property and variable
|
||||
|
||||
private bool isAttacked;
|
||||
private bool isOffense;
|
||||
|
||||
private EAiType attackerAiType;
|
||||
private EnemyStat attackerStat;
|
||||
private float atk;
|
||||
private float shieldPenetrationRate;
|
||||
private bool isInit;
|
||||
private bool canAttack;
|
||||
|
||||
@ -49,10 +51,22 @@ namespace BlueWaterProject
|
||||
|
||||
var iDamageable = other.GetComponentInParent<IDamageable>();
|
||||
|
||||
iDamageable.TakeDamage(attackerStat.Atk, attackerStat.ShieldPenetrationRate);
|
||||
iDamageable.TakeDamage(atk, shieldPenetrationRate);
|
||||
|
||||
isAttacked = true;
|
||||
}
|
||||
else if (other.gameObject.layer == LayerMask.NameToLayer("Props"))
|
||||
{
|
||||
if (!isOffense) return;
|
||||
|
||||
if (other.gameObject.CompareTag("House"))
|
||||
{
|
||||
var iDamageable = other.GetComponentInParent<IDamageable>();
|
||||
|
||||
iDamageable.TakeDamage(atk, shieldPenetrationRate);
|
||||
isAttacked = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
@ -74,9 +88,15 @@ namespace BlueWaterProject
|
||||
isInit = true;
|
||||
}
|
||||
|
||||
public void SetWeaponStat(float atkStat, float shieldPenetrationRateStat, bool isOffense)
|
||||
{
|
||||
atk = atkStat;
|
||||
shieldPenetrationRate = shieldPenetrationRateStat;
|
||||
this.isOffense = isOffense;
|
||||
}
|
||||
|
||||
public void SetIsAttacked(bool value) => isAttacked = value;
|
||||
public void SetAttackerAiType(EAiType value) => attackerAiType = value;
|
||||
public void SetAttackerStat(EnemyStat value) => attackerStat = value;
|
||||
public void SetCanAttack(bool value) => canAttack = value;
|
||||
|
||||
#endregion
|
||||
|
@ -147,4 +147,4 @@ MonoBehaviour:
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
autoDestroyTime: 5
|
||||
arrowSpeed: 20
|
||||
arrowSpeed: 30
|
||||
|
@ -8899,14 +8899,14 @@ NavMeshAgent:
|
||||
m_GameObject: {fileID: 155132}
|
||||
m_Enabled: 1
|
||||
m_AgentTypeID: 0
|
||||
m_Radius: 0.5
|
||||
m_Radius: 0.3
|
||||
m_Speed: 3
|
||||
m_Acceleration: 20
|
||||
avoidancePriority: 50
|
||||
m_AngularSpeed: 180
|
||||
m_StoppingDistance: 3
|
||||
m_AutoTraverseOffMeshLink: 1
|
||||
m_AutoBraking: 1
|
||||
m_AutoBraking: 0
|
||||
m_AutoRepath: 1
|
||||
m_Height: 1.6
|
||||
m_BaseOffset: 0
|
||||
|
@ -36177,13 +36177,6 @@ AnimationClip:
|
||||
m_HasGenericRootTransform: 0
|
||||
m_HasMotionFloatCurves: 0
|
||||
m_Events:
|
||||
- time: 0
|
||||
functionName: OnStoppedMove
|
||||
data:
|
||||
objectReferenceParameter: {fileID: 0}
|
||||
floatParameter: 0
|
||||
intParameter: 1
|
||||
messageOptions: 0
|
||||
- time: 0
|
||||
functionName: OnAttacking
|
||||
data:
|
||||
@ -36198,13 +36191,6 @@ AnimationClip:
|
||||
floatParameter: 0
|
||||
intParameter: 0
|
||||
messageOptions: 0
|
||||
- time: 1.5
|
||||
functionName: OnStoppedMove
|
||||
data:
|
||||
objectReferenceParameter: {fileID: 0}
|
||||
floatParameter: 0
|
||||
intParameter: 0
|
||||
messageOptions: 0
|
||||
- time: 1.5
|
||||
functionName: OnAttacking
|
||||
data:
|
||||
|
@ -37527,13 +37527,6 @@ AnimationClip:
|
||||
m_HasGenericRootTransform: 0
|
||||
m_HasMotionFloatCurves: 0
|
||||
m_Events:
|
||||
- time: 0
|
||||
functionName: OnStoppedMove
|
||||
data:
|
||||
objectReferenceParameter: {fileID: 0}
|
||||
floatParameter: 0
|
||||
intParameter: 1
|
||||
messageOptions: 0
|
||||
- time: 0
|
||||
functionName: OnAttacking
|
||||
data:
|
||||
@ -37548,13 +37541,6 @@ AnimationClip:
|
||||
floatParameter: 0
|
||||
intParameter: 0
|
||||
messageOptions: 0
|
||||
- time: 1.5
|
||||
functionName: OnStoppedMove
|
||||
data:
|
||||
objectReferenceParameter: {fileID: 0}
|
||||
floatParameter: 0
|
||||
intParameter: 0
|
||||
messageOptions: 0
|
||||
- time: 1.5
|
||||
functionName: OnAttacking
|
||||
data:
|
||||
|
8
BlueWater/Assets/09.BehaviorTree/Enemy.meta
Normal file
8
BlueWater/Assets/09.BehaviorTree/Enemy.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b7b7d5fff2fc8b0489c464a23e8dcdc9
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -10,7 +10,7 @@ MonoBehaviour:
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: b23f08d2ae4cba14087c1ed36193d82b, type: 3}
|
||||
m_Name: BaseCharacter
|
||||
m_Name: BaseEnemyAi
|
||||
m_EditorClassIdentifier:
|
||||
mBehaviorSource:
|
||||
behaviorName: BaseCharacter
|
||||
@ -20,12 +20,14 @@ MonoBehaviour:
|
||||
parentIndex:
|
||||
startIndex:
|
||||
variableStartIndex:
|
||||
JSONSerialization: '{"EntryTask":{"Type":"BehaviorDesigner.Runtime.Tasks.EntryTask","NodeData":{"Offset":"(337,90)"},"ID":0,"Name":"Entry","Instant":true},"RootTask":{"Type":"BehaviorDesigner.Runtime.Tasks.Repeater","NodeData":{"Offset":"(4.152649,113.838943)"},"ID":1,"Name":"Repeater","Instant":true,"SharedIntcount":{"Type":"BehaviorDesigner.Runtime.SharedInt","Name":null,"Int32mValue":0},"SharedBoolrepeatForever":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":true},"SharedBoolendOnFailure":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":false},"Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Selector","NodeData":{"Offset":"(-2.63156128,120)"},"ID":2,"Name":"Selector","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(-214.714264,143)"},"ID":3,"Name":"Offense
|
||||
JSONSerialization: '{"EntryTask":{"Type":"BehaviorDesigner.Runtime.Tasks.EntryTask","NodeData":{"Offset":"(347,100)"},"ID":0,"Name":"Entry","Instant":true},"RootTask":{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(-4,151)"},"ID":1,"Name":"Init
|
||||
Sequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BlueWaterProject.InitBaseEnemy","NodeData":{"Offset":"(-185.5,146)"},"ID":2,"Name":"Init
|
||||
Base Enemy","Instant":true,"SharedAttackerTypeattackerType":{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":"AttackerType","IsShared":true,"EAttackerTypemValue":"NONE"}},{"Type":"BehaviorDesigner.Runtime.Tasks.Selector","NodeData":{"Offset":"(200,150)"},"ID":3,"Name":"Selector","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(-214.714264,143)"},"ID":4,"Name":"Offense
|
||||
Sequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Unity.SharedVariables.CompareSharedAttackerType","NodeData":{"Offset":"(-129,123)","Comment":"AttackerType
|
||||
== OFFENSE"},"ID":4,"Name":"Compare Shared Attacker Type","Instant":true,"SharedAttackerTypevariable":{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":"AttackerType","IsShared":true,"EAttackerTypemValue":"NONE"},"SharedAttackerTypecompareTo":{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":null,"EAttackerTypemValue":"OFFENSE"}},{"Type":"BehaviorDesigner.Runtime.Tasks.BehaviorTreeReference","NodeData":{"Offset":"(110,120)"},"ID":5,"Name":"Offense
|
||||
Behavior","Instant":true,"ExternalBehavior[]externalBehaviors":[0],"SharedNamedVariable[]variables":[],"Booleancollapsed":false}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(274.264343,138.636353)"},"ID":6,"Name":"Defense
|
||||
== OFFENSE"},"ID":5,"Name":"Compare Shared Attacker Type","Instant":true,"SharedAttackerTypevariable":{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":"AttackerType","IsShared":true,"EAttackerTypemValue":"NONE"},"SharedAttackerTypecompareTo":{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":null,"EAttackerTypemValue":"OFFENSE"}},{"Type":"BehaviorDesigner.Runtime.Tasks.BehaviorTreeReference","NodeData":{"Offset":"(110,120)"},"ID":6,"Name":"Offense
|
||||
Behavior","Instant":true,"ExternalBehavior[]externalBehaviors":[0],"SharedNamedVariable[]variables":[],"Booleancollapsed":false}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(274.264343,138.636353)"},"ID":7,"Name":"Defense
|
||||
Sequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Unity.SharedVariables.CompareSharedAttackerType","NodeData":{"Offset":"(-130,119.999969)","Comment":"AttackerType
|
||||
== DEFENSE"},"ID":7,"Name":"Compare Shared Attacker Type","Instant":true,"SharedAttackerTypevariable":{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":"AttackerType","IsShared":true,"EAttackerTypemValue":"NONE"},"SharedAttackerTypecompareTo":{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":null,"EAttackerTypemValue":"DEFENSE"}},{"Type":"BehaviorDesigner.Runtime.Tasks.BehaviorTreeReference","NodeData":{"Offset":"(110,119.999969)"},"ID":8,"Name":"Defense
|
||||
== DEFENSE"},"ID":8,"Name":"Compare Shared Attacker Type","Instant":true,"SharedAttackerTypevariable":{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":"AttackerType","IsShared":true,"EAttackerTypemValue":"NONE"},"SharedAttackerTypecompareTo":{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":null,"EAttackerTypemValue":"DEFENSE"}},{"Type":"BehaviorDesigner.Runtime.Tasks.BehaviorTreeReference","NodeData":{"Offset":"(110,119.999969)"},"ID":9,"Name":"Defense
|
||||
Behavior","Instant":true,"ExternalBehavior[]externalBehaviors":[1],"SharedNamedVariable[]variables":[],"Booleancollapsed":false}]}]}]},"Variables":[{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":"AttackerType","IsShared":true,"EAttackerTypemValue":"NONE"}]}'
|
||||
fieldSerializationData:
|
||||
typeName: []
|
||||
@ -33,7 +35,7 @@ MonoBehaviour:
|
||||
startIndex:
|
||||
dataPosition:
|
||||
unityObjects:
|
||||
- {fileID: 11400000, guid: 0fa0abbe34de7db4f87d218d194dcc5d, type: 2}
|
||||
- {fileID: 11400000, guid: f034bc00819bc174d84ba6ef56cb0273, type: 2}
|
||||
- {fileID: 11400000, guid: 6ac3257696f4b30469f3e3e0576b146b, type: 2}
|
||||
byteData:
|
||||
byteDataArray:
|
58
BlueWater/Assets/09.BehaviorTree/Enemy/DefenseEnemyAi.asset
Normal file
58
BlueWater/Assets/09.BehaviorTree/Enemy/DefenseEnemyAi.asset
Normal file
@ -0,0 +1,58 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: b23f08d2ae4cba14087c1ed36193d82b, type: 3}
|
||||
m_Name: DefenseEnemyAi
|
||||
m_EditorClassIdentifier:
|
||||
mBehaviorSource:
|
||||
behaviorName: DefenseBehavior
|
||||
behaviorDescription:
|
||||
mTaskData:
|
||||
types: []
|
||||
parentIndex:
|
||||
startIndex:
|
||||
variableStartIndex:
|
||||
JSONSerialization: '{"EntryTask":{"Type":"BehaviorDesigner.Runtime.Tasks.EntryTask","NodeData":{"Offset":"(697.6564,155.842773)"},"ID":0,"Name":"Entry","Instant":true},"RootTask":{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(1.89181328,136.4865)"},"ID":1,"Name":"Init
|
||||
Sequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BlueWaterProject.InitDefenseEnemy","NodeData":{"Offset":"(-219.830383,154.349365)"},"ID":2,"Name":"Init
|
||||
Defense Enemy","Instant":true,"SharedGameObjectmyObj":{"Type":"BehaviorDesigner.Runtime.SharedGameObject","Name":"MyObj","IsShared":true}},{"Type":"BehaviorDesigner.Runtime.Tasks.Repeater","NodeData":{"Offset":"(199.999969,150)"},"ID":3,"Name":"Repeater","Instant":true,"SharedIntcount":{"Type":"BehaviorDesigner.Runtime.SharedInt","Name":null,"Int32mValue":0},"SharedBoolrepeatForever":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":true},"SharedBoolendOnFailure":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":false},"Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Selector","NodeData":{"Offset":"(-3.44348145,154.9137)"},"ID":4,"Name":"Die
|
||||
Selector","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(-257.499176,148.989136)"},"ID":5,"Name":"Die
|
||||
Sequence","Instant":true,"AbortTypeabortType":"LowerPriority","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Unity.SharedVariables.CompareSharedFloat","NodeData":{"Offset":"(-237.261353,151.369934)"},"ID":6,"Name":"Compare
|
||||
Shared Float","Instant":true,"SharedFloatvariable":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":"CurrentHp","IsShared":true,"SinglemValue":0},"SharedFloatcompareTo":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":0}},{"Type":"BlueWaterProject.DieOfCombat","NodeData":{"Offset":"(-77.26136,151.369934)"},"ID":7,"Name":"Die
|
||||
Of Combat","Instant":true},{"Type":"BehaviorDesigner.Runtime.Tasks.Wait","NodeData":{"Offset":"(57.2359619,148.672363)"},"ID":8,"Name":"Wait","Instant":true,"SharedFloatwaitTime":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":3},"SharedBoolrandomWait":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":false},"SharedFloatrandomWaitMin":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":1},"SharedFloatrandomWaitMax":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":1}},{"Type":"BehaviorDesigner.Runtime.Tasks.Unity.UnityGameObject.Destroy","NodeData":{"Offset":"(197.235962,148.672363)"},"ID":9,"Name":"Destroy","Instant":true,"SharedGameObjecttargetGameObject":{"Type":"BehaviorDesigner.Runtime.SharedGameObject","Name":"MyObj","IsShared":true},"Singletime":0}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(259.285675,150)"},"ID":10,"Name":"Find
|
||||
Target Sequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BlueWaterProject.FindTargetOfEnemy","NodeData":{"Offset":"(-132.406738,148.091431)"},"ID":11,"Name":"Find
|
||||
Target Of Enemy","Instant":true},{"Type":"BehaviorDesigner.Runtime.Tasks.Selector","NodeData":{"Offset":"(140.2998,153.643066)"},"ID":12,"Name":"Selector","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(-633.8519,153.138184)"},"ID":13,"Name":"Comeback
|
||||
DefensePos Sequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Unity.SharedVariables.CompareSharedTransform","NodeData":{"Offset":"(-327.5169,146.846512)","Comment":"TargetTransform
|
||||
== null"},"ID":14,"Name":"Compare Shared Transform","Instant":true,"SharedTransformvariable":{"Type":"BehaviorDesigner.Runtime.SharedTransform","Name":"TargetTransform","IsShared":true},"SharedTransformcompareTo":{"Type":"BehaviorDesigner.Runtime.SharedTransform","Name":null}},{"Type":"BlueWaterProject.CanComebackDefensePosOfEnemy","NodeData":{"Offset":"(-107.697006,150)"},"ID":15,"Name":"Can
|
||||
Comeback Defense Pos Of Enemy","Instant":true},{"Type":"BlueWaterProject.IncreaseSharedInt","NodeData":{"Offset":"(105.676559,147.274521)"},"ID":16,"Name":"Increase
|
||||
Shared Int","Instant":true,"SharedInttargetInt":{"Type":"BehaviorDesigner.Runtime.SharedInt","Name":"FailCount","IsShared":true,"Int32mValue":0}},{"Type":"BehaviorDesigner.Runtime.Tasks.Selector","NodeData":{"Offset":"(245.33844,154.789917)"},"ID":17,"Name":"Selector","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(-87.7636948,149.236938)"},"ID":18,"Name":"Sequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Unity.SharedVariables.CompareSharedInt","NodeData":{"Offset":"(-265.106171,150)"},"ID":19,"Name":"Compare
|
||||
Shared Int","Instant":true,"SharedIntvariable":{"Type":"BehaviorDesigner.Runtime.SharedInt","Name":"FailCount","IsShared":true,"Int32mValue":0},"SharedIntcompareTo":{"Type":"BehaviorDesigner.Runtime.SharedInt","Name":null,"Int32mValue":6}},{"Type":"BehaviorDesigner.Runtime.Tasks.Unity.UnityNavMeshAgent.SetIsStopped","NodeData":{"Offset":"(-119.574951,148.297974)"},"ID":20,"Name":"Set
|
||||
Is Stopped","Instant":true,"SharedGameObjecttargetGameObject":{"Type":"BehaviorDesigner.Runtime.SharedGameObject","Name":"MyObj","IsShared":true},"SharedBoolisStopped":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":false}},{"Type":"BehaviorDesigner.Runtime.Tasks.Unity.UnityNavMeshAgent.SetDestination","NodeData":{"Offset":"(2.55319023,150)"},"ID":21,"Name":"Set
|
||||
Destination","Instant":true,"SharedGameObjecttargetGameObject":{"Type":"BehaviorDesigner.Runtime.SharedGameObject","Name":"MyObj","IsShared":true},"SharedVector3destination":{"Type":"BehaviorDesigner.Runtime.SharedVector3","Name":"DefensePos","IsShared":true,"Vector3mValue":"(0,0,0)"}},{"Type":"BehaviorDesigner.Runtime.Tasks.Unity.SharedVariables.SetSharedInt","NodeData":{"Offset":"(122.553185,150)"},"ID":22,"Name":"Set
|
||||
Shared Int","Instant":true,"SharedInttargetValue":{"Type":"BehaviorDesigner.Runtime.SharedInt","Name":null,"Int32mValue":0},"SharedInttargetVariable":{"Type":"BehaviorDesigner.Runtime.SharedInt","Name":"FailCount","IsShared":true,"Int32mValue":0}},{"Type":"BehaviorDesigner.Runtime.Tasks.Wait","NodeData":{"Offset":"(242.553162,150)"},"ID":23,"Name":"Wait","Instant":true,"SharedFloatwaitTime":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":0.5},"SharedBoolrandomWait":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":false},"SharedFloatrandomWaitMin":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":1},"SharedFloatrandomWaitMax":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":1}}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Wait","NodeData":{"Offset":"(104.242462,150)"},"ID":24,"Name":"Wait","Instant":true,"SharedFloatwaitTime":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":0.5},"SharedBoolrandomWait":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":false},"SharedFloatrandomWaitMin":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":1},"SharedFloatrandomWaitMax":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":1}}]}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Selector","NodeData":{"Offset":"(368.432861,147.142334)"},"ID":25,"Name":"Can
|
||||
Attack Selector","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(-230,150)"},"ID":26,"Name":"Move
|
||||
Sequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Inverter","NodeData":{"Offset":"(-211.24556,149.7959)"},"ID":27,"Name":"Inverter","Instant":true,"Children":[{"Type":"BlueWaterProject.CanAttackOfEnemy","NodeData":{"Offset":"(0,150)"},"ID":28,"Name":"Can
|
||||
Attack Of Enemy","Instant":true}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Unity.UnityNavMeshAgent.SetIsStopped","NodeData":{"Offset":"(-84.35962,147.179443)"},"ID":29,"Name":"Set
|
||||
Is Stopped","Instant":true,"SharedGameObjecttargetGameObject":{"Type":"BehaviorDesigner.Runtime.SharedGameObject","Name":"MyObj","IsShared":true},"SharedBoolisStopped":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":false}},{"Type":"BlueWaterProject.MoveTargetOfEnemy","NodeData":{"Offset":"(77.3227158,145.83252)"},"ID":30,"Name":"Move
|
||||
Target Of Enemy","Instant":true},{"Type":"BehaviorDesigner.Runtime.Tasks.Wait","NodeData":{"Offset":"(226.923065,150)"},"ID":31,"Name":"Wait","Instant":true,"SharedFloatwaitTime":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":0.5},"SharedBoolrandomWait":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":false},"SharedFloatrandomWaitMin":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":1},"SharedFloatrandomWaitMax":{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":null,"SinglemValue":1}},{"Type":"BehaviorDesigner.Runtime.Tasks.Unity.SharedVariables.SetSharedInt","NodeData":{"Offset":"(356.6842,147.223755)"},"ID":32,"Name":"Set
|
||||
Shared Int","Instant":true,"SharedInttargetValue":{"Type":"BehaviorDesigner.Runtime.SharedInt","Name":null,"Int32mValue":0},"SharedInttargetVariable":{"Type":"BehaviorDesigner.Runtime.SharedInt","Name":"FailCount","IsShared":true,"Int32mValue":0}}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(426.8182,150)"},"ID":33,"Name":"Attack
|
||||
Sequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Unity.UnityNavMeshAgent.SetIsStopped","NodeData":{"Offset":"(-141.443,148.954468)"},"ID":34,"Name":"Set
|
||||
Is Stopped","Instant":true,"SharedGameObjecttargetGameObject":{"Type":"BehaviorDesigner.Runtime.SharedGameObject","Name":"MyObj","IsShared":true},"SharedBoolisStopped":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":true}},{"Type":"BlueWaterProject.AttackOfEnemy","NodeData":{"Offset":"(-3.29175377,147.723267)"},"ID":35,"Name":"Attack
|
||||
Of Enemy","Instant":true},{"Type":"BehaviorDesigner.Runtime.Tasks.Unity.SharedVariables.SetSharedInt","NodeData":{"Offset":"(153.181641,148.636353)"},"ID":36,"Name":"Set
|
||||
Shared Int","Instant":true,"SharedInttargetValue":{"Type":"BehaviorDesigner.Runtime.SharedInt","Name":null,"Int32mValue":0},"SharedInttargetVariable":{"Type":"BehaviorDesigner.Runtime.SharedInt","Name":"FailCount","IsShared":true,"Int32mValue":0}}]}]}]}]}]}]}]},"Variables":[{"Type":"BehaviorDesigner.Runtime.SharedGameObject","Name":"MyObj","IsShared":true},{"Type":"BehaviorDesigner.Runtime.SharedTransform","Name":"TargetTransform","IsShared":true},{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":"CurrentHp","IsShared":true,"SinglemValue":0},{"Type":"BehaviorDesigner.Runtime.SharedVector3","Name":"DefensePos","IsShared":true,"Vector3mValue":"(0,0,0)"},{"Type":"BehaviorDesigner.Runtime.SharedInt","Name":"FailCount","IsShared":true,"Int32mValue":0}]}'
|
||||
fieldSerializationData:
|
||||
typeName: []
|
||||
fieldNameHash:
|
||||
startIndex:
|
||||
dataPosition:
|
||||
unityObjects: []
|
||||
byteData:
|
||||
byteDataArray:
|
||||
Version: 1.7.7
|
33
BlueWater/Assets/09.BehaviorTree/Enemy/OffenseEnemyAi.asset
Normal file
33
BlueWater/Assets/09.BehaviorTree/Enemy/OffenseEnemyAi.asset
Normal file
@ -0,0 +1,33 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: b23f08d2ae4cba14087c1ed36193d82b, type: 3}
|
||||
m_Name: OffenseEnemyAi
|
||||
m_EditorClassIdentifier:
|
||||
mBehaviorSource:
|
||||
behaviorName: OffenseBehavior
|
||||
behaviorDescription:
|
||||
mTaskData:
|
||||
types: []
|
||||
parentIndex:
|
||||
startIndex:
|
||||
variableStartIndex:
|
||||
JSONSerialization: '{"EntryTask":{"Type":"BehaviorDesigner.Runtime.Tasks.EntryTask","NodeData":{"Offset":"(299.1951,149.024338)"},"ID":0,"Name":"Entry","Instant":true},"RootTask":{"Type":"BehaviorDesigner.Runtime.Tasks.Log","NodeData":{"Offset":"(-0.8049011,141.881454)"},"ID":1,"Name":"Log","Instant":true,"SharedStringtext":{"Type":"BehaviorDesigner.Runtime.SharedString","Name":null,"StringmValue":"Offense
|
||||
Enemy is not setting"},"SharedBoollogError":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":false},"SharedBoollogTime":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":false}},"Variables":[{"Type":"BehaviorDesigner.Runtime.SharedTransform","Name":"TargetTransform","IsShared":true}]}'
|
||||
fieldSerializationData:
|
||||
typeName: []
|
||||
fieldNameHash:
|
||||
startIndex:
|
||||
dataPosition:
|
||||
unityObjects: []
|
||||
byteData:
|
||||
byteDataArray:
|
||||
Version: 1.7.7
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f034bc00819bc174d84ba6ef56cb0273
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,39 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: b23f08d2ae4cba14087c1ed36193d82b, type: 3}
|
||||
m_Name: OffenseBehavior
|
||||
m_EditorClassIdentifier:
|
||||
mBehaviorSource:
|
||||
behaviorName: OffenseBehavior
|
||||
behaviorDescription:
|
||||
mTaskData:
|
||||
types: []
|
||||
parentIndex:
|
||||
startIndex:
|
||||
variableStartIndex:
|
||||
JSONSerialization: '{"EntryTask":{"Type":"BehaviorDesigner.Runtime.Tasks.EntryTask","NodeData":{"Offset":"(299.1951,149.024338)"},"ID":0,"Name":"Entry","Instant":true},"RootTask":{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(-0.9877186,151.42572)"},"ID":1,"Name":"InitSequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BlueWaterProject.InitVariable","NodeData":{"Offset":"(-169.613129,152.2381)"},"ID":2,"Name":"Init
|
||||
Variable","Instant":true,"SharedAiStataiStat":{"Type":"BehaviorDesigner.Runtime.SharedAiStat","Name":"AiStat","IsShared":true,"AiStatmValue":{"UnitType<UnitType>k__BackingField":"NONE","EAiType<AiType>k__BackingField":"NONE","EAttackerType<AttackerType>k__BackingField":"NONE","EOffenseType<OffenseType>k__BackingField":"NONE","EDefenseType<DefenseType>k__BackingField":"NONE","Single<MaxHp>k__BackingField":0,"Single<CurrentHp>k__BackingField":0,"Single<Atk>k__BackingField":0,"Single<Def>k__BackingField":0,"Single<MoveSpd>k__BackingField":0,"Single<AtkCooldown>k__BackingField":0,"Single<ViewRange>k__BackingField":0,"Single<AtkRange>k__BackingField":0,"Single<DefenseRange>k__BackingField":0,"Int32<ShieldPenetrationRate>k__BackingField":0,"Int32<AvoidanceRate>k__BackingField":0,"Boolean<UsingShield>k__BackingField":false,"Int32<PenetrationResistivity>k__BackingField":0,"Boolean<UsingBow>k__BackingField":false,"Single<Inaccuracy>k__BackingField":0}},"SharedNavMeshAgentagent":{"Type":"BehaviorDesigner.Runtime.SharedNavMeshAgent","Name":"NavMeshAgent","IsShared":true},"SharedIslandInfoislandInfo":{"Type":"BehaviorDesigner.Runtime.SharedIslandInfo","Name":"IslandInfo","IsShared":true},"SharedBoolisCommanded":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":false},"SharedVector3defensePos":{"Type":"BehaviorDesigner.Runtime.SharedVector3","Name":null,"Vector3mValue":"(0,0,0)"}},{"Type":"BehaviorDesigner.Runtime.Tasks.Repeater","NodeData":{"Offset":"(200,154.615387)"},"ID":3,"Name":"Repeater","Instant":true,"SharedIntcount":{"Type":"BehaviorDesigner.Runtime.SharedInt","Name":null,"Int32mValue":0},"SharedBoolrepeatForever":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":true},"SharedBoolendOnFailure":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":false},"Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Parallel","NodeData":{"Offset":"(-2.326233,150.280518)"},"ID":4,"Name":"Parallel","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(-357.122,145.887024)"},"ID":5,"Name":"Find
|
||||
Target Sequence","Instant":true,"AbortTypeabortType":"Self","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Unity.SharedVariables.CompareSharedBool","NodeData":{"Offset":"(-104.611588,152.187439)"},"ID":6,"Name":"Compare
|
||||
Shared Bool","Instant":true,"SharedBoolvariable":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":"IsCommanded","IsShared":true,"BooleanmValue":false},"SharedBoolcompareTo":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":false}},{"Type":"BlueWaterProject.FindTarget","NodeData":{"Offset":"(95.29413,153.529358)"},"ID":7,"Name":"Find
|
||||
Target","Instant":true,"SharedAiStataiStat":{"Type":"BehaviorDesigner.Runtime.SharedAiStat","Name":"AiStat","IsShared":true,"AiStatmValue":{"UnitType<UnitType>k__BackingField":"NONE","EAiType<AiType>k__BackingField":"NONE","EAttackerType<AttackerType>k__BackingField":"NONE","EOffenseType<OffenseType>k__BackingField":"NONE","EDefenseType<DefenseType>k__BackingField":"NONE","Single<MaxHp>k__BackingField":0,"Single<CurrentHp>k__BackingField":0,"Single<Atk>k__BackingField":0,"Single<Def>k__BackingField":0,"Single<MoveSpd>k__BackingField":0,"Single<AtkCooldown>k__BackingField":0,"Single<ViewRange>k__BackingField":0,"Single<AtkRange>k__BackingField":0,"Single<DefenseRange>k__BackingField":0,"Int32<ShieldPenetrationRate>k__BackingField":0,"Int32<AvoidanceRate>k__BackingField":0,"Boolean<UsingShield>k__BackingField":false,"Int32<PenetrationResistivity>k__BackingField":0,"Boolean<UsingBow>k__BackingField":false,"Single<Inaccuracy>k__BackingField":0}},"SharedNavMeshAgentnavMeshAgent":{"Type":"BehaviorDesigner.Runtime.SharedNavMeshAgent","Name":"NavMeshAgent","IsShared":true},"SharedTransformtargetTransform":{"Type":"BehaviorDesigner.Runtime.SharedTransform","Name":"TargetTransform","IsShared":true},"SharedIslandInfoislandInfo":{"Type":"BehaviorDesigner.Runtime.SharedIslandInfo","Name":"IslandInfo","IsShared":true},"SharedVector3defensePos":{"Type":"BehaviorDesigner.Runtime.SharedVector3","Name":null,"Vector3mValue":"(0,0,0)"}}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Selector","NodeData":{"Offset":"(368.5714,150)"},"ID":8,"Name":"Behavior
|
||||
Selector","Instant":true,"AbortTypeabortType":"LowerPriority","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(-201.764771,150)"},"ID":9,"Name":"Attack
|
||||
Sequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BlueWaterProject.CanAttackInOffense","NodeData":{"Offset":"(-151.611847,128.141663)"},"ID":10,"Name":"Can
|
||||
Attack In Offense","Instant":true,"SharedAiStataiStat":{"Type":"BehaviorDesigner.Runtime.SharedAiStat","Name":"AiStat","IsShared":true,"AiStatmValue":{"UnitType<UnitType>k__BackingField":"NONE","EAiType<AiType>k__BackingField":"NONE","EAttackerType<AttackerType>k__BackingField":"NONE","EOffenseType<OffenseType>k__BackingField":"NONE","EDefenseType<DefenseType>k__BackingField":"NONE","Single<MaxHp>k__BackingField":0,"Single<CurrentHp>k__BackingField":0,"Single<Atk>k__BackingField":0,"Single<Def>k__BackingField":0,"Single<MoveSpd>k__BackingField":0,"Single<AtkCooldown>k__BackingField":0,"Single<ViewRange>k__BackingField":0,"Single<AtkRange>k__BackingField":0,"Single<DefenseRange>k__BackingField":0,"Int32<ShieldPenetrationRate>k__BackingField":0,"Int32<AvoidanceRate>k__BackingField":0,"Boolean<UsingShield>k__BackingField":false,"Int32<PenetrationResistivity>k__BackingField":0,"Boolean<UsingBow>k__BackingField":false,"Single<Inaccuracy>k__BackingField":0}},"SharedIslandInfoislandInfo":{"Type":"BehaviorDesigner.Runtime.SharedIslandInfo","Name":"IslandInfo","IsShared":true},"SharedTransformtargetTransform":{"Type":"BehaviorDesigner.Runtime.SharedTransform","Name":"TargetTransform","IsShared":true}},{"Type":"BlueWaterProject.Attack","NodeData":{"Offset":"(127.615311,129.8023)"},"ID":11,"Name":"Attack","Instant":true}]}]}]}]}]},"Variables":[{"Type":"BehaviorDesigner.Runtime.SharedAiStat","Name":"AiStat","IsShared":true,"AiStatmValue":{"UnitType<UnitType>k__BackingField":"NONE","EAiType<AiType>k__BackingField":"NONE","EAttackerType<AttackerType>k__BackingField":"NONE","EOffenseType<OffenseType>k__BackingField":"NONE","EDefenseType<DefenseType>k__BackingField":"NONE","Single<MaxHp>k__BackingField":0,"Single<CurrentHp>k__BackingField":0,"Single<Atk>k__BackingField":0,"Single<Def>k__BackingField":0,"Single<MoveSpd>k__BackingField":0,"Single<AtkCooldown>k__BackingField":0,"Single<ViewRange>k__BackingField":0,"Single<AtkRange>k__BackingField":0,"Single<DefenseRange>k__BackingField":0,"Int32<ShieldPenetrationRate>k__BackingField":0,"Int32<AvoidanceRate>k__BackingField":0,"Boolean<UsingShield>k__BackingField":false,"Int32<PenetrationResistivity>k__BackingField":0,"Boolean<UsingBow>k__BackingField":false,"Single<Inaccuracy>k__BackingField":0}},{"Type":"BehaviorDesigner.Runtime.SharedNavMeshAgent","Name":"NavMeshAgent","IsShared":true},{"Type":"BehaviorDesigner.Runtime.SharedIslandInfo","Name":"IslandInfo","IsShared":true},{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":"IsCommanded","IsShared":true,"BooleanmValue":false},{"Type":"BehaviorDesigner.Runtime.SharedTransform","Name":"TargetTransform","IsShared":true}]}'
|
||||
fieldSerializationData:
|
||||
typeName: []
|
||||
fieldNameHash:
|
||||
startIndex:
|
||||
dataPosition:
|
||||
unityObjects: []
|
||||
byteData:
|
||||
byteDataArray:
|
||||
Version: 1.7.7
|
8
BlueWater/Assets/09.BehaviorTree/Pirate.meta
Normal file
8
BlueWater/Assets/09.BehaviorTree/Pirate.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9de35b73358f0034086a64fab3beeb89
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
43
BlueWater/Assets/09.BehaviorTree/Pirate/BasePirateAi.asset
Normal file
43
BlueWater/Assets/09.BehaviorTree/Pirate/BasePirateAi.asset
Normal file
@ -0,0 +1,43 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: b23f08d2ae4cba14087c1ed36193d82b, type: 3}
|
||||
m_Name: BasePirateAi
|
||||
m_EditorClassIdentifier:
|
||||
mBehaviorSource:
|
||||
behaviorName: BaseCharacter
|
||||
behaviorDescription:
|
||||
mTaskData:
|
||||
types: []
|
||||
parentIndex:
|
||||
startIndex:
|
||||
variableStartIndex:
|
||||
JSONSerialization: '{"EntryTask":{"Type":"BehaviorDesigner.Runtime.Tasks.EntryTask","NodeData":{"Offset":"(347,100)"},"ID":0,"Name":"Entry","Instant":true},"RootTask":{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(-4,151)"},"ID":1,"Name":"Init
|
||||
Sequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BlueWaterProject.InitBasePirate","NodeData":{"Offset":"(-157.479568,151.2857)"},"ID":2,"Name":"Init
|
||||
Base Pirate","Instant":true,"SharedAttackerTypeattackerType":{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":"AttackerType","IsShared":true,"EAttackerTypemValue":"NONE"}},{"Type":"BehaviorDesigner.Runtime.Tasks.Selector","NodeData":{"Offset":"(200,150)"},"ID":3,"Name":"AttackerType
|
||||
Selector","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(-214.714264,143)"},"ID":4,"Name":"Offense
|
||||
Sequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Unity.SharedVariables.CompareSharedAttackerType","NodeData":{"Offset":"(-129,123)","Comment":"AttackerType
|
||||
== OFFENSE"},"ID":5,"Name":"Compare Shared Attacker Type","Instant":true,"SharedAttackerTypevariable":{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":"AttackerType","IsShared":true,"EAttackerTypemValue":"NONE"},"SharedAttackerTypecompareTo":{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":null,"EAttackerTypemValue":"OFFENSE"}},{"Type":"BehaviorDesigner.Runtime.Tasks.BehaviorTreeReference","NodeData":{"Offset":"(110,120)"},"ID":6,"Name":"Offense
|
||||
Behavior","Instant":true,"ExternalBehavior[]externalBehaviors":[0],"SharedNamedVariable[]variables":[],"Booleancollapsed":false}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(274.264343,138.636353)"},"ID":7,"Name":"Defense
|
||||
Sequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Unity.SharedVariables.CompareSharedAttackerType","NodeData":{"Offset":"(-130,119.999969)","Comment":"AttackerType
|
||||
== DEFENSE"},"ID":8,"Name":"Compare Shared Attacker Type","Instant":true,"SharedAttackerTypevariable":{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":"AttackerType","IsShared":true,"EAttackerTypemValue":"NONE"},"SharedAttackerTypecompareTo":{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":null,"EAttackerTypemValue":"DEFENSE"}},{"Type":"BehaviorDesigner.Runtime.Tasks.BehaviorTreeReference","NodeData":{"Offset":"(110,119.999969)"},"ID":9,"Name":"Defense
|
||||
Behavior","Instant":true,"ExternalBehavior[]externalBehaviors":[1],"SharedNamedVariable[]variables":[],"Booleancollapsed":false}]}]}]},"Variables":[{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":"AttackerType","IsShared":true,"EAttackerTypemValue":"NONE"}]}'
|
||||
fieldSerializationData:
|
||||
typeName: []
|
||||
fieldNameHash:
|
||||
startIndex:
|
||||
dataPosition:
|
||||
unityObjects:
|
||||
- {fileID: 11400000, guid: 0fa0abbe34de7db4f87d218d194dcc5d, type: 2}
|
||||
- {fileID: 11400000, guid: 3a005c4fc43b3a6488ed5827e875a1fd, type: 2}
|
||||
byteData:
|
||||
byteDataArray:
|
||||
Version: 1.7.7
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c9fc08e77444b4b45986c8df17e6d6ca
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user