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
|
fileFormatVersion: 2
|
||||||
guid: ed36e1064a49b084bac46d5debdc1de3
|
guid: 86dead43324d7b44bbe8482319d1490f
|
||||||
NativeFormatImporter:
|
NativeFormatImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
mainObjectFileID: 23800000
|
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
|
fileFormatVersion: 2
|
||||||
guid: 2fac3aeaa82ea9148ac35f80b65e67dc
|
guid: 0dbad892c171e0b43b86934a3ac12789
|
||||||
NativeFormatImporter:
|
NativeFormatImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
mainObjectFileID: 23800000
|
mainObjectFileID: 23800000
|
@ -669,7 +669,7 @@ namespace BlueWaterProject
|
|||||||
protected virtual IEnumerator AttackAnimation()
|
protected virtual IEnumerator AttackAnimation()
|
||||||
{
|
{
|
||||||
closeWeapon.SetIsAttacked(false);
|
closeWeapon.SetIsAttacked(false);
|
||||||
closeWeapon.SetAttackerStat(AiStat);
|
closeWeapon.SetWeaponStat(AiStat.Atk, AiStat.ShieldPenetrationRate, AiStat.AttackerType == EAttackerType.OFFENSE);
|
||||||
aiAnimator.SetTrigger(AttackHash);
|
aiAnimator.SetTrigger(AttackHash);
|
||||||
|
|
||||||
while (isAttacking)
|
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
|
fileFormatVersion: 2
|
||||||
guid: a55ee4efaad27d948ba5f03fc6d7bc80
|
guid: ec88ff1593c266f4bacdac246851500a
|
||||||
|
folderAsset: yes
|
||||||
DefaultImporter:
|
DefaultImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
userData:
|
userData:
|
@ -1,5 +1,6 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: ed9b95dc6ed6d0647ad7f1a8f305385d
|
guid: 1b2c1ea1e8ca8894eb1c93a20ae6bdcb
|
||||||
|
folderAsset: yes
|
||||||
DefaultImporter:
|
DefaultImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
userData:
|
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
|
fileFormatVersion: 2
|
||||||
guid: 6875a9897212c2f45ac34352aa8b64ef
|
guid: 248ee1686bf00ad43951a1296978b09d
|
||||||
MonoImporter:
|
MonoImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
@ -1,5 +1,6 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 3d7c4217783978e4abe6496ac71eee94
|
guid: b95f16cdd3b71dc48bd7fc20493b6b35
|
||||||
|
folderAsset: yes
|
||||||
DefaultImporter:
|
DefaultImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
userData:
|
userData:
|
@ -1,5 +1,6 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 4ff1f29eab234cf4490d9bb383892c44
|
guid: ce7fd23e7154da9409e4c8e9b8709535
|
||||||
|
folderAsset: yes
|
||||||
DefaultImporter:
|
DefaultImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
userData:
|
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
|
fileFormatVersion: 2
|
||||||
guid: f726c5737f44a1544b57c5f62cec144c
|
guid: f3c05fd3087c0bb479afcc8212a74cc1
|
||||||
MonoImporter:
|
MonoImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
serializedVersion: 2
|
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
|
fileFormatVersion: 2
|
||||||
guid: 0f16bfce0fda1394aa75287d1197deff
|
guid: 6b7c7916c685bf741ad0c84618c3ef00
|
||||||
MonoImporter:
|
MonoImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
serializedVersion: 2
|
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;
|
||||||
using UnityEngine.AI;
|
using UnityEngine.AI;
|
||||||
using UnityEngine.Animations;
|
using UnityEngine.Animations;
|
||||||
@ -11,18 +11,23 @@ namespace BlueWaterProject
|
|||||||
#region Properties and variables
|
#region Properties and variables
|
||||||
|
|
||||||
// 일반 변수
|
// 일반 변수
|
||||||
protected bool isDrawGizmosInFieldOfView = true;
|
[SerializeField] protected bool isDrawGizmosInFieldOfView = true;
|
||||||
protected LayerMask targetLayer;
|
[SerializeField] protected bool isAttacking;
|
||||||
protected Vector3 defensePos;
|
[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 Animator combatAnimator;
|
||||||
protected NavMeshAgent humanAgent;
|
protected NavMeshAgent combatAgent;
|
||||||
protected CapsuleCollider myCollider;
|
protected CapsuleCollider myCollider;
|
||||||
protected CapsuleCollider hitBoxCollider;
|
protected CapsuleCollider hitBoxCollider;
|
||||||
protected LookAtConstraint lookAtConstraint;
|
protected LookAtConstraint lookAtConstraint;
|
||||||
|
protected BehaviorTree behaviorTree;
|
||||||
|
|
||||||
// 애니메이션 관련 변수
|
// 애니메이션 관련 변수
|
||||||
protected static readonly int SpeedHash = Animator.StringToHash("Speed");
|
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 DeathHash = Animator.StringToHash("Death");
|
||||||
protected static readonly int ShieldHash = Animator.StringToHash("Shield");
|
protected static readonly int ShieldHash = Animator.StringToHash("Shield");
|
||||||
protected static readonly int OutlineColorHash = Shader.PropertyToID("_OutlineColor");
|
protected static readonly int OutlineColorHash = Shader.PropertyToID("_OutlineColor");
|
||||||
|
|
||||||
|
protected const int TARGET_MAX_SIZE = 30;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Abstract methods
|
#region Abstract methods
|
||||||
|
|
||||||
protected abstract void SetLayer();
|
protected abstract void SetLayer();
|
||||||
|
|
||||||
protected abstract void SetCurrentHp(float value);
|
protected abstract void SetCurrentHp(float value);
|
||||||
|
protected abstract void RemoveAiListElement();
|
||||||
|
public abstract void FindTarget();
|
||||||
|
public abstract bool CanAttack();
|
||||||
|
public abstract void Attack();
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@ -53,6 +63,15 @@ namespace BlueWaterProject
|
|||||||
SetLayer();
|
SetLayer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
if (combatAnimator.runtimeAnimatorController != null && combatAnimator.isActiveAndEnabled)
|
||||||
|
{
|
||||||
|
combatAnimator.SetFloat(SpeedHash, combatAgent.velocity.normalized.magnitude);
|
||||||
|
}
|
||||||
|
UpdateLookAtTarget();
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Custom methods
|
#region Custom methods
|
||||||
@ -62,7 +81,7 @@ namespace BlueWaterProject
|
|||||||
base.InitComponent();
|
base.InitComponent();
|
||||||
|
|
||||||
combatAnimator = Utils.GetComponentAndAssert<Animator>(transform);
|
combatAnimator = Utils.GetComponentAndAssert<Animator>(transform);
|
||||||
humanAgent = Utils.GetComponentAndAssert<NavMeshAgent>(transform);
|
combatAgent = Utils.GetComponentAndAssert<NavMeshAgent>(transform);
|
||||||
myCollider = Utils.GetComponentAndAssert<CapsuleCollider>(transform);
|
myCollider = Utils.GetComponentAndAssert<CapsuleCollider>(transform);
|
||||||
hitBoxCollider = Utils.GetComponentAndAssert<CapsuleCollider>(transform.Find("HitBox"));
|
hitBoxCollider = Utils.GetComponentAndAssert<CapsuleCollider>(transform.Find("HitBox"));
|
||||||
lookAtConstraint = Utils.GetComponentAndAssert<LookAtConstraint>(flagContainer);
|
lookAtConstraint = Utils.GetComponentAndAssert<LookAtConstraint>(flagContainer);
|
||||||
@ -82,11 +101,89 @@ namespace BlueWaterProject
|
|||||||
|
|
||||||
lookAtConstraint.constraintActive = true;
|
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 =
|
protected void SetAnimatorController(string controllerName) => combatAnimator.runtimeAnimatorController =
|
||||||
UnitManager.Inst.AIAnimatorControllerList.Find(obj => obj.name == controllerName);
|
UnitManager.Inst.AIAnimatorControllerList.Find(obj => obj.name == controllerName);
|
||||||
protected void SetMoveSpeed(float value) => humanAgent.speed = value;
|
protected void SetMoveSpeed(float value) => combatAgent.speed = value;
|
||||||
public void SetIslandInfo(IslandInfo info) => attackingIslandInfo = info;
|
public void SetAttackingIslandInfo(IslandInfo info) => attackingIslandInfo = info;
|
||||||
|
public void SetDefendingIslandInfo(IslandInfo info) => defendingIslandInfo = info;
|
||||||
|
public Transform GetTargetTransform() => targetTransform;
|
||||||
|
public Vector3 GetDefensePos() => defensePos;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
@ -1,26 +1,126 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
using Random = UnityEngine.Random;
|
||||||
|
|
||||||
// ReSharper disable once CheckNamespace
|
// ReSharper disable once CheckNamespace
|
||||||
namespace BlueWaterProject
|
namespace BlueWaterProject
|
||||||
{
|
{
|
||||||
public class EnemyAi : CombatAi
|
public abstract class EnemyAi : CombatAi, IDamageable
|
||||||
{
|
{
|
||||||
#region Properties and variables
|
#region Properties and variables
|
||||||
|
|
||||||
[field: SerializeField] public EnemyStat EnemyStat { get; set; }
|
[field: SerializeField] public EnemyStat EnemyStat { get; set; }
|
||||||
|
|
||||||
|
protected bool isAttackCoroutine;
|
||||||
|
private EnemyUnit enemyUnit;
|
||||||
|
private int childNum;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Unit Built-in methods
|
#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()
|
private void Start()
|
||||||
{
|
{
|
||||||
InitStart();
|
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
|
#endregion
|
||||||
|
|
||||||
#region Custom methods
|
#region Custom methods
|
||||||
|
|
||||||
|
protected override void InitComponent()
|
||||||
|
{
|
||||||
|
base.InitComponent();
|
||||||
|
|
||||||
|
enemyUnit = Utils.GetComponentAndAssert<EnemyUnit>(transform.parent);
|
||||||
|
}
|
||||||
|
|
||||||
protected override void SetLayer()
|
protected override void SetLayer()
|
||||||
{
|
{
|
||||||
@ -44,8 +144,6 @@ namespace BlueWaterProject
|
|||||||
InitComponent();
|
InitComponent();
|
||||||
SetLayer();
|
SetLayer();
|
||||||
InitViewModel(enemyViewData);
|
InitViewModel(enemyViewData);
|
||||||
SetCurrentHp(EnemyStat.MaxHp);
|
|
||||||
SetMoveSpeed(EnemyStat.MoveSpd);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -54,12 +152,16 @@ namespace BlueWaterProject
|
|||||||
var enemyViewData = DataManager.Inst.GetEnemyViewDictionaryFromKey(EnemyStat.ViewIdx);
|
var enemyViewData = DataManager.Inst.GetEnemyViewDictionaryFromKey(EnemyStat.ViewIdx);
|
||||||
|
|
||||||
InitViewModel(enemyViewData);
|
InitViewModel(enemyViewData);
|
||||||
|
SetBehaviorTree(UnitManager.Inst.EnemyBehaviorTree);
|
||||||
|
|
||||||
SetCurrentHp(EnemyStat.MaxHp);
|
SetCurrentHp(EnemyStat.MaxHp);
|
||||||
SetMoveSpeed(EnemyStat.MoveSpd);
|
SetMoveSpeed(EnemyStat.MoveSpd);
|
||||||
|
|
||||||
|
childNum = enemyUnit.transform.GetSiblingIndex();
|
||||||
if (EnemyStat.AttackerType == EAttackerType.DEFENSE)
|
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);
|
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 SetAttackerType(EAttackerType type) => EnemyStat.AttackerType = type;
|
||||||
public void SetOffenseType(EOffenseType type) => EnemyStat.OffenseType = type;
|
public void SetOffenseType(EOffenseType type) => EnemyStat.OffenseType = type;
|
||||||
public void SetDefenseType(EDefenseType type) => EnemyStat.DefenseType = type;
|
public void SetDefenseType(EDefenseType type) => EnemyStat.DefenseType = type;
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Pool;
|
using UnityEngine.Pool;
|
||||||
|
|
||||||
@ -16,14 +19,47 @@ namespace BlueWaterProject
|
|||||||
[Tooltip("화살 발사 후 오브젝트 저장될 위치")]
|
[Tooltip("화살 발사 후 오브젝트 저장될 위치")]
|
||||||
[SerializeField] private Transform arrowsPoolLocation;
|
[SerializeField] private Transform arrowsPoolLocation;
|
||||||
|
|
||||||
[SerializeField] private LayerMask archerLayer;
|
[SerializeField] private LayerMask arrowLayer;
|
||||||
|
|
||||||
private IEnumerator shootArrowCoroutine;
|
private IEnumerator shootArrowCoroutine;
|
||||||
|
|
||||||
private IObjectPool<Arrow> arrowPool;
|
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
|
#endregion
|
||||||
|
|
||||||
#region Custom methods
|
#region Custom methods
|
||||||
@ -69,7 +105,7 @@ namespace BlueWaterProject
|
|||||||
{
|
{
|
||||||
base.SetLayer();
|
base.SetLayer();
|
||||||
|
|
||||||
archerLayer = LayerMask.GetMask("Ground") | LayerMask.GetMask("Water") |
|
arrowLayer = LayerMask.GetMask("Ground") | LayerMask.GetMask("Water") |
|
||||||
LayerMask.GetMask("Player") | LayerMask.GetMask("Pirate") |
|
LayerMask.GetMask("Player") | LayerMask.GetMask("Pirate") |
|
||||||
LayerMask.GetMask("Props");
|
LayerMask.GetMask("Props");
|
||||||
}
|
}
|
||||||
@ -81,6 +117,98 @@ namespace BlueWaterProject
|
|||||||
SetAnimatorController("Archer");
|
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
|
#endregion
|
||||||
|
|
||||||
#region ObjectPool Function
|
#region ObjectPool Function
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
using System.Collections;
|
||||||
using Unity.VisualScripting;
|
using Unity.VisualScripting;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
@ -45,6 +46,24 @@ namespace BlueWaterProject
|
|||||||
closeWeapon.SetAttackerAiType(EAiType.ENEMY);
|
closeWeapon.SetAttackerAiType(EAiType.ENEMY);
|
||||||
closeWeapon.SetBoxCollider();
|
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
|
#endregion
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
using System.Collections;
|
||||||
using Unity.VisualScripting;
|
using Unity.VisualScripting;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
@ -45,6 +46,24 @@ namespace BlueWaterProject
|
|||||||
closeWeapon.SetAttackerAiType(EAiType.ENEMY);
|
closeWeapon.SetAttackerAiType(EAiType.ENEMY);
|
||||||
closeWeapon.SetBoxCollider();
|
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
|
#endregion
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
using System.Collections;
|
||||||
using Unity.VisualScripting;
|
using Unity.VisualScripting;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
@ -45,6 +46,24 @@ namespace BlueWaterProject
|
|||||||
closeWeapon.SetAttackerAiType(EAiType.ENEMY);
|
closeWeapon.SetAttackerAiType(EAiType.ENEMY);
|
||||||
closeWeapon.SetBoxCollider();
|
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
|
#endregion
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
using System.Collections;
|
||||||
using Unity.VisualScripting;
|
using Unity.VisualScripting;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
@ -45,6 +46,24 @@ namespace BlueWaterProject
|
|||||||
closeWeapon.SetAttackerAiType(EAiType.ENEMY);
|
closeWeapon.SetAttackerAiType(EAiType.ENEMY);
|
||||||
closeWeapon.SetBoxCollider();
|
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
|
#endregion
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,15 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using Sirenix.OdinInspector;
|
using Sirenix.OdinInspector;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
using Random = UnityEngine.Random;
|
||||||
|
|
||||||
// ReSharper disable once CheckNamespace
|
// ReSharper disable once CheckNamespace
|
||||||
namespace BlueWaterProject
|
namespace BlueWaterProject
|
||||||
{
|
{
|
||||||
public class PirateAi : CombatAi
|
public abstract class PirateAi : CombatAi, IDamageable
|
||||||
{
|
{
|
||||||
#region Properties and variables
|
#region Properties and variables
|
||||||
|
|
||||||
@ -22,19 +25,49 @@ namespace BlueWaterProject
|
|||||||
|
|
||||||
[Tooltip("캐릭터가 선택되었을 때 색상")]
|
[Tooltip("캐릭터가 선택되었을 때 색상")]
|
||||||
[SerializeField] protected Color selectedSkinColor = Color.red;
|
[SerializeField] protected Color selectedSkinColor = Color.red;
|
||||||
|
|
||||||
[DisableIf("@true")]
|
|
||||||
[SerializeField] private IslandInfo islandInfo;
|
|
||||||
|
|
||||||
[field: SerializeField] public PirateStat PirateStat { get; set; }
|
[field: SerializeField] public PirateStat PirateStat { get; set; }
|
||||||
|
|
||||||
|
private PirateUnit pirateUnit;
|
||||||
private PirateUnit mouseEnterPirateUnit;
|
private PirateUnit mouseEnterPirateUnit;
|
||||||
private UnitSelection unitSelection;
|
private UnitSelection unitSelection;
|
||||||
|
|
||||||
|
[SerializeField] protected bool isAttackCoroutine;
|
||||||
|
[SerializeField] private bool isCommanded;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Unit Built-in methods
|
#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()
|
private void OnMouseEnter()
|
||||||
{
|
{
|
||||||
if (!unitSelection || !unitSelection.IsSelectable) return;
|
if (!unitSelection || !unitSelection.IsSelectable) return;
|
||||||
@ -69,12 +102,68 @@ namespace BlueWaterProject
|
|||||||
|
|
||||||
#endregion
|
#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
|
#region Custom methods
|
||||||
|
|
||||||
protected override void InitComponent()
|
protected override void InitComponent()
|
||||||
{
|
{
|
||||||
base.InitComponent();
|
base.InitComponent();
|
||||||
|
|
||||||
|
pirateUnit = Utils.GetComponentAndAssert<PirateUnit>(transform.parent);
|
||||||
unitSelection = Utils.GetComponentAndAssert<UnitSelection>(GameObject.Find("UnitManager").transform);
|
unitSelection = Utils.GetComponentAndAssert<UnitSelection>(GameObject.Find("UnitManager").transform);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -98,6 +187,8 @@ namespace BlueWaterProject
|
|||||||
|
|
||||||
InitViewModel(pirateViewData);
|
InitViewModel(pirateViewData);
|
||||||
FindMaterial();
|
FindMaterial();
|
||||||
|
SetBehaviorTree(UnitManager.Inst.PirateBehaviorTree);
|
||||||
|
|
||||||
SetCurrentHp(PirateStat.MaxHp);
|
SetCurrentHp(PirateStat.MaxHp);
|
||||||
SetMoveSpeed(PirateStat.MoveSpd);
|
SetMoveSpeed(PirateStat.MoveSpd);
|
||||||
|
|
||||||
@ -105,6 +196,7 @@ namespace BlueWaterProject
|
|||||||
{
|
{
|
||||||
defensePos = transform.position;
|
defensePos = transform.position;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitViewModel(PirateView pirateView)
|
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)
|
private void SetOutlineColor(Color color)
|
||||||
@ -150,8 +397,33 @@ namespace BlueWaterProject
|
|||||||
skin.SetColor(OutlineColorHash, color);
|
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 SetAttackerType(EAttackerType type) => PirateStat.AttackerType = type;
|
||||||
public void SetOffenseType(EOffenseType type) => PirateStat.OffenseType = type;
|
public void SetOffenseType(EOffenseType type) => PirateStat.OffenseType = type;
|
||||||
public void SetDefenseType(EDefenseType type) => PirateStat.DefenseType = type;
|
public void SetDefenseType(EDefenseType type) => PirateStat.DefenseType = type;
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Pool;
|
using UnityEngine.Pool;
|
||||||
|
using UnityEngine.Serialization;
|
||||||
|
|
||||||
// ReSharper disable once CheckNamespace
|
// ReSharper disable once CheckNamespace
|
||||||
namespace BlueWaterProject
|
namespace BlueWaterProject
|
||||||
@ -16,14 +20,47 @@ namespace BlueWaterProject
|
|||||||
[Tooltip("화살 발사 후 오브젝트 저장될 위치")]
|
[Tooltip("화살 발사 후 오브젝트 저장될 위치")]
|
||||||
[SerializeField] private Transform arrowsPoolLocation;
|
[SerializeField] private Transform arrowsPoolLocation;
|
||||||
|
|
||||||
[SerializeField] private LayerMask archerLayer;
|
[SerializeField] private LayerMask arrowLayer;
|
||||||
|
|
||||||
private IEnumerator shootArrowCoroutine;
|
private IEnumerator shootArrowCoroutine;
|
||||||
|
|
||||||
private IObjectPool<Arrow> arrowPool;
|
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
|
#endregion
|
||||||
|
|
||||||
#region Custom methods
|
#region Custom methods
|
||||||
@ -69,7 +106,7 @@ namespace BlueWaterProject
|
|||||||
{
|
{
|
||||||
base.SetLayer();
|
base.SetLayer();
|
||||||
|
|
||||||
archerLayer = LayerMask.GetMask("Ground") | LayerMask.GetMask("Water") |
|
arrowLayer = LayerMask.GetMask("Ground") | LayerMask.GetMask("Water") |
|
||||||
LayerMask.GetMask("Enemy") | LayerMask.GetMask("Props");
|
LayerMask.GetMask("Enemy") | LayerMask.GetMask("Props");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,6 +117,96 @@ namespace BlueWaterProject
|
|||||||
SetAnimatorController("Archer");
|
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
|
#endregion
|
||||||
|
|
||||||
#region ObjectPool Function
|
#region ObjectPool Function
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
using System.Collections;
|
||||||
using Unity.VisualScripting;
|
using Unity.VisualScripting;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
@ -6,8 +7,14 @@ namespace BlueWaterProject
|
|||||||
{
|
{
|
||||||
public class PirateAxeman : PirateAi
|
public class PirateAxeman : PirateAi
|
||||||
{
|
{
|
||||||
|
#region Properties and variables
|
||||||
|
|
||||||
private CloseWeapon closeWeapon;
|
private CloseWeapon closeWeapon;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Custom methods
|
||||||
|
|
||||||
protected override void InitStart()
|
protected override void InitStart()
|
||||||
{
|
{
|
||||||
base.InitStart();
|
base.InitStart();
|
||||||
@ -28,5 +35,25 @@ namespace BlueWaterProject
|
|||||||
closeWeapon.SetAttackerAiType(EAiType.PIRATE);
|
closeWeapon.SetAttackerAiType(EAiType.PIRATE);
|
||||||
closeWeapon.SetBoxCollider();
|
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 Unity.VisualScripting;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
@ -6,8 +7,14 @@ namespace BlueWaterProject
|
|||||||
{
|
{
|
||||||
public class PirateSpearman : PirateAi
|
public class PirateSpearman : PirateAi
|
||||||
{
|
{
|
||||||
|
#region Properties and variables
|
||||||
|
|
||||||
private CloseWeapon closeWeapon;
|
private CloseWeapon closeWeapon;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Custom methods
|
||||||
|
|
||||||
protected override void InitStart()
|
protected override void InitStart()
|
||||||
{
|
{
|
||||||
base.InitStart();
|
base.InitStart();
|
||||||
@ -28,5 +35,25 @@ namespace BlueWaterProject
|
|||||||
closeWeapon.SetAttackerAiType(EAiType.PIRATE);
|
closeWeapon.SetAttackerAiType(EAiType.PIRATE);
|
||||||
closeWeapon.SetBoxCollider();
|
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 Unity.VisualScripting;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
@ -6,8 +7,14 @@ namespace BlueWaterProject
|
|||||||
{
|
{
|
||||||
public class PirateSwordKnight : PirateAi
|
public class PirateSwordKnight : PirateAi
|
||||||
{
|
{
|
||||||
|
#region Properties and variables
|
||||||
|
|
||||||
private CloseWeapon closeWeapon;
|
private CloseWeapon closeWeapon;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Custom methods
|
||||||
|
|
||||||
protected override void InitStart()
|
protected override void InitStart()
|
||||||
{
|
{
|
||||||
base.InitStart();
|
base.InitStart();
|
||||||
@ -28,5 +35,25 @@ namespace BlueWaterProject
|
|||||||
closeWeapon.SetAttackerAiType(EAiType.PIRATE);
|
closeWeapon.SetAttackerAiType(EAiType.PIRATE);
|
||||||
closeWeapon.SetBoxCollider();
|
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 Unity.VisualScripting;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
@ -6,8 +7,14 @@ namespace BlueWaterProject
|
|||||||
{
|
{
|
||||||
public class PirateSwordman : PirateAi
|
public class PirateSwordman : PirateAi
|
||||||
{
|
{
|
||||||
|
#region Properties and variables
|
||||||
|
|
||||||
private CloseWeapon closeWeapon;
|
private CloseWeapon closeWeapon;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Custom methods
|
||||||
|
|
||||||
protected override void InitStart()
|
protected override void InitStart()
|
||||||
{
|
{
|
||||||
base.InitStart();
|
base.InitStart();
|
||||||
@ -28,5 +35,25 @@ namespace BlueWaterProject
|
|||||||
closeWeapon.SetAttackerAiType(EAiType.PIRATE);
|
closeWeapon.SetAttackerAiType(EAiType.PIRATE);
|
||||||
closeWeapon.SetBoxCollider();
|
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 Sirenix.OdinInspector;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
@ -11,6 +12,7 @@ namespace BlueWaterProject
|
|||||||
[PropertyOrder(-10)]
|
[PropertyOrder(-10)]
|
||||||
public EnemyUnitStat enemyUnitStat;
|
public EnemyUnitStat enemyUnitStat;
|
||||||
|
|
||||||
|
private Vector3[] defensePos;
|
||||||
private bool isClickedTypeAllButton;
|
private bool isClickedTypeAllButton;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@ -19,7 +21,7 @@ namespace BlueWaterProject
|
|||||||
|
|
||||||
private void OnDrawGizmosSelected()
|
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)
|
foreach (var item in enemyUnitStat.EnemyAiList)
|
||||||
{
|
{
|
||||||
@ -30,6 +32,11 @@ namespace BlueWaterProject
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Awake()
|
||||||
|
{
|
||||||
|
defensePos = new Vector3[enemyUnitStat.EnemyAiList.Count];
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Custom function
|
#region Custom function
|
||||||
@ -58,7 +65,7 @@ namespace BlueWaterProject
|
|||||||
|
|
||||||
private bool CanAssignUnit()
|
private bool CanAssignUnit()
|
||||||
{
|
{
|
||||||
return UnitManager.Inst.CanAssignUnit(this, transform.position);
|
return !Application.isPlaying && UnitManager.Inst.CanAssignUnit(this, transform.position);
|
||||||
}
|
}
|
||||||
|
|
||||||
[PropertyOrder(-7)]
|
[PropertyOrder(-7)]
|
||||||
@ -75,10 +82,20 @@ namespace BlueWaterProject
|
|||||||
};
|
};
|
||||||
isClickedTypeAllButton = false;
|
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 GetCreateUnitButtonColor() => enemyUnitStat.EnemyAiList.Count > 0 ? Color.white : Color.green;
|
||||||
private Color GetTypeAllButtonColor() => isClickedTypeAllButton ? Color.white : Color.green;
|
private Color GetTypeAllButtonColor() => isClickedTypeAllButton ? Color.white : Color.green;
|
||||||
private void OnTypeChanged() => isClickedTypeAllButton = false;
|
private void OnTypeChanged() => isClickedTypeAllButton = false;
|
||||||
|
public Vector3 GetDefensePos(int index) => defensePos[index];
|
||||||
|
public void SetDefensePos(Vector3 pos, int index) => defensePos[index] = pos;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
@ -50,7 +50,7 @@ namespace BlueWaterProject
|
|||||||
var xOffset = (j - (gridSize - 1) / 2.0f) * UnitManager.Inst.UnitSpacing;
|
var xOffset = (j - (gridSize - 1) / 2.0f) * UnitManager.Inst.UnitSpacing;
|
||||||
var movePos = targetPos + new Vector3(xOffset, 0, zOffset);
|
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;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using BehaviorDesigner.Runtime;
|
||||||
using Sirenix.OdinInspector;
|
using Sirenix.OdinInspector;
|
||||||
using UnityEditor.Animations;
|
using UnityEditor.Animations;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
@ -19,6 +20,12 @@ namespace BlueWaterProject
|
|||||||
|
|
||||||
[Tooltip("화살 프리팹")]
|
[Tooltip("화살 프리팹")]
|
||||||
[field: SerializeField] public GameObject ArrowPrefab { get; private set; }
|
[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("바닥 레이어")]
|
[Tooltip("바닥 레이어")]
|
||||||
[field: SerializeField] public LayerMask GroundLayer { get; private set; }
|
[field: SerializeField] public LayerMask GroundLayer { get; private set; }
|
||||||
@ -65,22 +72,24 @@ namespace BlueWaterProject
|
|||||||
/// 프리팹 초기화 함수
|
/// 프리팹 초기화 함수
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[GUIColor(0, 1, 0)]
|
[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")]
|
"AIAnimatorControllerList == null || AIAnimatorControllerList.Count != ANIMATOR_CONTROLLER_PREFAB_CAPACITY")]
|
||||||
[Button("프리팹 초기화")]
|
[Button("프리팹 초기화")]
|
||||||
private void InitCharacterPrefabList()
|
private void InitCharacterPrefabList()
|
||||||
{
|
{
|
||||||
PiratePrefab = Utils.LoadPrefabFromFolder("Assets/05.Prefabs/Character/Unit", "PirateUnit");
|
PiratePrefab = Utils.LoadFromFolder<GameObject>("Assets/05.Prefabs/Character/Unit", "PirateUnit", ".prefab");
|
||||||
BaseHumanPrefab = Utils.LoadPrefabFromFolder("Assets/05.Prefabs/Character", "BaseHuman");
|
BaseHumanPrefab = Utils.LoadFromFolder<GameObject>("Assets/05.Prefabs/Character", "BaseHuman", ".prefab");
|
||||||
ArrowPrefab = Utils.LoadPrefabFromFolder("Assets/05.Prefabs", "Arrow_01");
|
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)
|
AIAnimatorControllerList = new List<AnimatorController>(ANIMATOR_CONTROLLER_PREFAB_CAPACITY)
|
||||||
{
|
{
|
||||||
Utils.LoadAnimatorControllerFromFolder("Assets/07.Animation", "Archer"),
|
Utils.LoadFromFolder<AnimatorController>("Assets/07.Animation", "Archer", ".controller"),
|
||||||
Utils.LoadAnimatorControllerFromFolder("Assets/07.Animation", "Axeman"),
|
Utils.LoadFromFolder<AnimatorController>("Assets/07.Animation", "Axeman", ".controller"),
|
||||||
Utils.LoadAnimatorControllerFromFolder("Assets/07.Animation", "SpearKnight"),
|
Utils.LoadFromFolder<AnimatorController>("Assets/07.Animation", "SpearKnight", ".controller"),
|
||||||
Utils.LoadAnimatorControllerFromFolder("Assets/07.Animation", "Spearman"),
|
Utils.LoadFromFolder<AnimatorController>("Assets/07.Animation", "Spearman", ".controller"),
|
||||||
Utils.LoadAnimatorControllerFromFolder("Assets/07.Animation", "SwordKnight"),
|
Utils.LoadFromFolder<AnimatorController>("Assets/07.Animation", "SwordKnight", ".controller"),
|
||||||
Utils.LoadAnimatorControllerFromFolder("Assets/07.Animation", "Swordman")
|
Utils.LoadFromFolder<AnimatorController>("Assets/07.Animation", "Swordman", ".controller")
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -424,7 +433,7 @@ namespace BlueWaterProject
|
|||||||
{
|
{
|
||||||
if (isOffense)
|
if (isOffense)
|
||||||
{
|
{
|
||||||
unit.SetIslandInfo(hitIslandInfo);
|
unit.SetAttackingIslandInfo(hitIslandInfo);
|
||||||
}
|
}
|
||||||
unit.gameObject.SetActive(true);
|
unit.gameObject.SetActive(true);
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,7 @@ MonoBehaviour:
|
|||||||
<CurrentHp>k__BackingField: 0
|
<CurrentHp>k__BackingField: 0
|
||||||
<Atk>k__BackingField: 50
|
<Atk>k__BackingField: 50
|
||||||
<Def>k__BackingField: 0
|
<Def>k__BackingField: 0
|
||||||
<MoveSpd>k__BackingField: 5
|
<MoveSpd>k__BackingField: 7
|
||||||
<AtkCooldown>k__BackingField: 3
|
<AtkCooldown>k__BackingField: 3
|
||||||
<ViewRange>k__BackingField: 40
|
<ViewRange>k__BackingField: 40
|
||||||
<AtkRange>k__BackingField: 40
|
<AtkRange>k__BackingField: 40
|
||||||
@ -44,7 +44,7 @@ MonoBehaviour:
|
|||||||
<CurrentHp>k__BackingField: 0
|
<CurrentHp>k__BackingField: 0
|
||||||
<Atk>k__BackingField: 40
|
<Atk>k__BackingField: 40
|
||||||
<Def>k__BackingField: 10
|
<Def>k__BackingField: 10
|
||||||
<MoveSpd>k__BackingField: 4.5
|
<MoveSpd>k__BackingField: 6.5
|
||||||
<AtkCooldown>k__BackingField: 2
|
<AtkCooldown>k__BackingField: 2
|
||||||
<ViewRange>k__BackingField: 10
|
<ViewRange>k__BackingField: 10
|
||||||
<AtkRange>k__BackingField: 3.5
|
<AtkRange>k__BackingField: 3.5
|
||||||
@ -65,11 +65,11 @@ MonoBehaviour:
|
|||||||
<CurrentHp>k__BackingField: 0
|
<CurrentHp>k__BackingField: 0
|
||||||
<Atk>k__BackingField: 50
|
<Atk>k__BackingField: 50
|
||||||
<Def>k__BackingField: 5
|
<Def>k__BackingField: 5
|
||||||
<MoveSpd>k__BackingField: 5.5
|
<MoveSpd>k__BackingField: 7.5
|
||||||
<AtkCooldown>k__BackingField: 2
|
<AtkCooldown>k__BackingField: 2
|
||||||
<ViewRange>k__BackingField: 15
|
<ViewRange>k__BackingField: 15
|
||||||
<AtkRange>k__BackingField: 3.5
|
<AtkRange>k__BackingField: 3.5
|
||||||
<DefenseRange>k__BackingField: 0
|
<DefenseRange>k__BackingField: 15
|
||||||
<ShieldPenetrationRate>k__BackingField: 75
|
<ShieldPenetrationRate>k__BackingField: 75
|
||||||
<AvoidanceRate>k__BackingField: 20
|
<AvoidanceRate>k__BackingField: 20
|
||||||
<UsingShield>k__BackingField: 0
|
<UsingShield>k__BackingField: 0
|
||||||
@ -86,11 +86,11 @@ MonoBehaviour:
|
|||||||
<CurrentHp>k__BackingField: 0
|
<CurrentHp>k__BackingField: 0
|
||||||
<Atk>k__BackingField: 30
|
<Atk>k__BackingField: 30
|
||||||
<Def>k__BackingField: 10
|
<Def>k__BackingField: 10
|
||||||
<MoveSpd>k__BackingField: 5
|
<MoveSpd>k__BackingField: 7
|
||||||
<AtkCooldown>k__BackingField: 1.5
|
<AtkCooldown>k__BackingField: 1.5
|
||||||
<ViewRange>k__BackingField: 10
|
<ViewRange>k__BackingField: 10
|
||||||
<AtkRange>k__BackingField: 3
|
<AtkRange>k__BackingField: 3
|
||||||
<DefenseRange>k__BackingField: 0
|
<DefenseRange>k__BackingField: 10
|
||||||
<ShieldPenetrationRate>k__BackingField: 50
|
<ShieldPenetrationRate>k__BackingField: 50
|
||||||
<AvoidanceRate>k__BackingField: 10
|
<AvoidanceRate>k__BackingField: 10
|
||||||
<UsingShield>k__BackingField: 1
|
<UsingShield>k__BackingField: 1
|
||||||
@ -107,11 +107,11 @@ MonoBehaviour:
|
|||||||
<CurrentHp>k__BackingField: 0
|
<CurrentHp>k__BackingField: 0
|
||||||
<Atk>k__BackingField: 35
|
<Atk>k__BackingField: 35
|
||||||
<Def>k__BackingField: 5
|
<Def>k__BackingField: 5
|
||||||
<MoveSpd>k__BackingField: 6
|
<MoveSpd>k__BackingField: 8
|
||||||
<AtkCooldown>k__BackingField: 1.5
|
<AtkCooldown>k__BackingField: 1.5
|
||||||
<ViewRange>k__BackingField: 15
|
<ViewRange>k__BackingField: 15
|
||||||
<AtkRange>k__BackingField: 3
|
<AtkRange>k__BackingField: 3
|
||||||
<DefenseRange>k__BackingField: 0
|
<DefenseRange>k__BackingField: 15
|
||||||
<ShieldPenetrationRate>k__BackingField: 50
|
<ShieldPenetrationRate>k__BackingField: 50
|
||||||
<AvoidanceRate>k__BackingField: 30
|
<AvoidanceRate>k__BackingField: 30
|
||||||
<UsingShield>k__BackingField: 0
|
<UsingShield>k__BackingField: 0
|
||||||
@ -128,7 +128,7 @@ MonoBehaviour:
|
|||||||
<CurrentHp>k__BackingField: 0
|
<CurrentHp>k__BackingField: 0
|
||||||
<Atk>k__BackingField: 50
|
<Atk>k__BackingField: 50
|
||||||
<Def>k__BackingField: 0
|
<Def>k__BackingField: 0
|
||||||
<MoveSpd>k__BackingField: 5
|
<MoveSpd>k__BackingField: 7
|
||||||
<AtkCooldown>k__BackingField: 3
|
<AtkCooldown>k__BackingField: 3
|
||||||
<ViewRange>k__BackingField: 40
|
<ViewRange>k__BackingField: 40
|
||||||
<AtkRange>k__BackingField: 40
|
<AtkRange>k__BackingField: 40
|
||||||
@ -149,7 +149,7 @@ MonoBehaviour:
|
|||||||
<CurrentHp>k__BackingField: 0
|
<CurrentHp>k__BackingField: 0
|
||||||
<Atk>k__BackingField: 40
|
<Atk>k__BackingField: 40
|
||||||
<Def>k__BackingField: 10
|
<Def>k__BackingField: 10
|
||||||
<MoveSpd>k__BackingField: 4.5
|
<MoveSpd>k__BackingField: 6.5
|
||||||
<AtkCooldown>k__BackingField: 2
|
<AtkCooldown>k__BackingField: 2
|
||||||
<ViewRange>k__BackingField: 10
|
<ViewRange>k__BackingField: 10
|
||||||
<AtkRange>k__BackingField: 3.5
|
<AtkRange>k__BackingField: 3.5
|
||||||
@ -170,11 +170,11 @@ MonoBehaviour:
|
|||||||
<CurrentHp>k__BackingField: 0
|
<CurrentHp>k__BackingField: 0
|
||||||
<Atk>k__BackingField: 50
|
<Atk>k__BackingField: 50
|
||||||
<Def>k__BackingField: 5
|
<Def>k__BackingField: 5
|
||||||
<MoveSpd>k__BackingField: 5.5
|
<MoveSpd>k__BackingField: 7.5
|
||||||
<AtkCooldown>k__BackingField: 2
|
<AtkCooldown>k__BackingField: 2
|
||||||
<ViewRange>k__BackingField: 15
|
<ViewRange>k__BackingField: 15
|
||||||
<AtkRange>k__BackingField: 3.5
|
<AtkRange>k__BackingField: 3.5
|
||||||
<DefenseRange>k__BackingField: 0
|
<DefenseRange>k__BackingField: 15
|
||||||
<ShieldPenetrationRate>k__BackingField: 75
|
<ShieldPenetrationRate>k__BackingField: 75
|
||||||
<AvoidanceRate>k__BackingField: 20
|
<AvoidanceRate>k__BackingField: 20
|
||||||
<UsingShield>k__BackingField: 0
|
<UsingShield>k__BackingField: 0
|
||||||
@ -191,11 +191,11 @@ MonoBehaviour:
|
|||||||
<CurrentHp>k__BackingField: 0
|
<CurrentHp>k__BackingField: 0
|
||||||
<Atk>k__BackingField: 30
|
<Atk>k__BackingField: 30
|
||||||
<Def>k__BackingField: 10
|
<Def>k__BackingField: 10
|
||||||
<MoveSpd>k__BackingField: 5
|
<MoveSpd>k__BackingField: 7
|
||||||
<AtkCooldown>k__BackingField: 1.5
|
<AtkCooldown>k__BackingField: 1.5
|
||||||
<ViewRange>k__BackingField: 10
|
<ViewRange>k__BackingField: 10
|
||||||
<AtkRange>k__BackingField: 3
|
<AtkRange>k__BackingField: 3
|
||||||
<DefenseRange>k__BackingField: 0
|
<DefenseRange>k__BackingField: 10
|
||||||
<ShieldPenetrationRate>k__BackingField: 50
|
<ShieldPenetrationRate>k__BackingField: 50
|
||||||
<AvoidanceRate>k__BackingField: 10
|
<AvoidanceRate>k__BackingField: 10
|
||||||
<UsingShield>k__BackingField: 1
|
<UsingShield>k__BackingField: 1
|
||||||
@ -212,11 +212,11 @@ MonoBehaviour:
|
|||||||
<CurrentHp>k__BackingField: 0
|
<CurrentHp>k__BackingField: 0
|
||||||
<Atk>k__BackingField: 35
|
<Atk>k__BackingField: 35
|
||||||
<Def>k__BackingField: 5
|
<Def>k__BackingField: 5
|
||||||
<MoveSpd>k__BackingField: 6
|
<MoveSpd>k__BackingField: 8
|
||||||
<AtkCooldown>k__BackingField: 1.5
|
<AtkCooldown>k__BackingField: 1.5
|
||||||
<ViewRange>k__BackingField: 15
|
<ViewRange>k__BackingField: 15
|
||||||
<AtkRange>k__BackingField: 3
|
<AtkRange>k__BackingField: 3
|
||||||
<DefenseRange>k__BackingField: 0
|
<DefenseRange>k__BackingField: 15
|
||||||
<ShieldPenetrationRate>k__BackingField: 50
|
<ShieldPenetrationRate>k__BackingField: 50
|
||||||
<AvoidanceRate>k__BackingField: 30
|
<AvoidanceRate>k__BackingField: 30
|
||||||
<UsingShield>k__BackingField: 0
|
<UsingShield>k__BackingField: 0
|
||||||
|
@ -23,7 +23,7 @@ MonoBehaviour:
|
|||||||
<CurrentHp>k__BackingField: 0
|
<CurrentHp>k__BackingField: 0
|
||||||
<Atk>k__BackingField: 50
|
<Atk>k__BackingField: 50
|
||||||
<Def>k__BackingField: 0
|
<Def>k__BackingField: 0
|
||||||
<MoveSpd>k__BackingField: 5
|
<MoveSpd>k__BackingField: 7
|
||||||
<AtkCooldown>k__BackingField: 3
|
<AtkCooldown>k__BackingField: 3
|
||||||
<ViewRange>k__BackingField: 40
|
<ViewRange>k__BackingField: 40
|
||||||
<AtkRange>k__BackingField: 40
|
<AtkRange>k__BackingField: 40
|
||||||
@ -44,13 +44,13 @@ MonoBehaviour:
|
|||||||
<CurrentHp>k__BackingField: 0
|
<CurrentHp>k__BackingField: 0
|
||||||
<Atk>k__BackingField: 50
|
<Atk>k__BackingField: 50
|
||||||
<Def>k__BackingField: 0
|
<Def>k__BackingField: 0
|
||||||
<MoveSpd>k__BackingField: 5
|
<MoveSpd>k__BackingField: 7
|
||||||
<AtkCooldown>k__BackingField: 2.5
|
<AtkCooldown>k__BackingField: 2.5
|
||||||
<ViewRange>k__BackingField: 15
|
<ViewRange>k__BackingField: 15
|
||||||
<AtkRange>k__BackingField: 3.5
|
<AtkRange>k__BackingField: 3.5
|
||||||
<DefenseRange>k__BackingField: 0
|
<DefenseRange>k__BackingField: 15
|
||||||
<ShieldPenetrationRate>k__BackingField: 0
|
<ShieldPenetrationRate>k__BackingField: 100
|
||||||
<AvoidanceRate>k__BackingField: 100
|
<AvoidanceRate>k__BackingField: 0
|
||||||
<UsingShield>k__BackingField: 0
|
<UsingShield>k__BackingField: 0
|
||||||
<PenetrationResistivity>k__BackingField: 0
|
<PenetrationResistivity>k__BackingField: 0
|
||||||
<UsingBow>k__BackingField: 0
|
<UsingBow>k__BackingField: 0
|
||||||
@ -65,11 +65,11 @@ MonoBehaviour:
|
|||||||
<CurrentHp>k__BackingField: 0
|
<CurrentHp>k__BackingField: 0
|
||||||
<Atk>k__BackingField: 50
|
<Atk>k__BackingField: 50
|
||||||
<Def>k__BackingField: 5
|
<Def>k__BackingField: 5
|
||||||
<MoveSpd>k__BackingField: 5.5
|
<MoveSpd>k__BackingField: 7.5
|
||||||
<AtkCooldown>k__BackingField: 2
|
<AtkCooldown>k__BackingField: 2
|
||||||
<ViewRange>k__BackingField: 15
|
<ViewRange>k__BackingField: 15
|
||||||
<AtkRange>k__BackingField: 3.5
|
<AtkRange>k__BackingField: 3.5
|
||||||
<DefenseRange>k__BackingField: 0
|
<DefenseRange>k__BackingField: 15
|
||||||
<ShieldPenetrationRate>k__BackingField: 75
|
<ShieldPenetrationRate>k__BackingField: 75
|
||||||
<AvoidanceRate>k__BackingField: 20
|
<AvoidanceRate>k__BackingField: 20
|
||||||
<UsingShield>k__BackingField: 0
|
<UsingShield>k__BackingField: 0
|
||||||
@ -86,11 +86,11 @@ MonoBehaviour:
|
|||||||
<CurrentHp>k__BackingField: 0
|
<CurrentHp>k__BackingField: 0
|
||||||
<Atk>k__BackingField: 30
|
<Atk>k__BackingField: 30
|
||||||
<Def>k__BackingField: 10
|
<Def>k__BackingField: 10
|
||||||
<MoveSpd>k__BackingField: 5
|
<MoveSpd>k__BackingField: 7
|
||||||
<AtkCooldown>k__BackingField: 1.5
|
<AtkCooldown>k__BackingField: 1.5
|
||||||
<ViewRange>k__BackingField: 10
|
<ViewRange>k__BackingField: 10
|
||||||
<AtkRange>k__BackingField: 3
|
<AtkRange>k__BackingField: 3
|
||||||
<DefenseRange>k__BackingField: 0
|
<DefenseRange>k__BackingField: 10
|
||||||
<ShieldPenetrationRate>k__BackingField: 50
|
<ShieldPenetrationRate>k__BackingField: 50
|
||||||
<AvoidanceRate>k__BackingField: 10
|
<AvoidanceRate>k__BackingField: 10
|
||||||
<UsingShield>k__BackingField: 1
|
<UsingShield>k__BackingField: 1
|
||||||
@ -107,11 +107,11 @@ MonoBehaviour:
|
|||||||
<CurrentHp>k__BackingField: 0
|
<CurrentHp>k__BackingField: 0
|
||||||
<Atk>k__BackingField: 35
|
<Atk>k__BackingField: 35
|
||||||
<Def>k__BackingField: 5
|
<Def>k__BackingField: 5
|
||||||
<MoveSpd>k__BackingField: 6
|
<MoveSpd>k__BackingField: 8
|
||||||
<AtkCooldown>k__BackingField: 1.5
|
<AtkCooldown>k__BackingField: 1.5
|
||||||
<ViewRange>k__BackingField: 15
|
<ViewRange>k__BackingField: 15
|
||||||
<AtkRange>k__BackingField: 3
|
<AtkRange>k__BackingField: 3
|
||||||
<DefenseRange>k__BackingField: 0
|
<DefenseRange>k__BackingField: 15
|
||||||
<ShieldPenetrationRate>k__BackingField: 50
|
<ShieldPenetrationRate>k__BackingField: 50
|
||||||
<AvoidanceRate>k__BackingField: 30
|
<AvoidanceRate>k__BackingField: 30
|
||||||
<UsingShield>k__BackingField: 0
|
<UsingShield>k__BackingField: 0
|
||||||
@ -128,7 +128,7 @@ MonoBehaviour:
|
|||||||
<CurrentHp>k__BackingField: 0
|
<CurrentHp>k__BackingField: 0
|
||||||
<Atk>k__BackingField: 50
|
<Atk>k__BackingField: 50
|
||||||
<Def>k__BackingField: 0
|
<Def>k__BackingField: 0
|
||||||
<MoveSpd>k__BackingField: 5
|
<MoveSpd>k__BackingField: 7
|
||||||
<AtkCooldown>k__BackingField: 3
|
<AtkCooldown>k__BackingField: 3
|
||||||
<ViewRange>k__BackingField: 40
|
<ViewRange>k__BackingField: 40
|
||||||
<AtkRange>k__BackingField: 40
|
<AtkRange>k__BackingField: 40
|
||||||
@ -149,13 +149,13 @@ MonoBehaviour:
|
|||||||
<CurrentHp>k__BackingField: 0
|
<CurrentHp>k__BackingField: 0
|
||||||
<Atk>k__BackingField: 40
|
<Atk>k__BackingField: 40
|
||||||
<Def>k__BackingField: 10
|
<Def>k__BackingField: 10
|
||||||
<MoveSpd>k__BackingField: 4.5
|
<MoveSpd>k__BackingField: 6.5
|
||||||
<AtkCooldown>k__BackingField: 2
|
<AtkCooldown>k__BackingField: 2
|
||||||
<ViewRange>k__BackingField: 10
|
<ViewRange>k__BackingField: 10
|
||||||
<AtkRange>k__BackingField: 3.5
|
<AtkRange>k__BackingField: 3.5
|
||||||
<DefenseRange>k__BackingField: 10
|
<DefenseRange>k__BackingField: 10
|
||||||
<ShieldPenetrationRate>k__BackingField: 75
|
<ShieldPenetrationRate>k__BackingField: 100
|
||||||
<AvoidanceRate>k__BackingField: 10
|
<AvoidanceRate>k__BackingField: 0
|
||||||
<UsingShield>k__BackingField: 0
|
<UsingShield>k__BackingField: 0
|
||||||
<PenetrationResistivity>k__BackingField: 0
|
<PenetrationResistivity>k__BackingField: 0
|
||||||
<UsingBow>k__BackingField: 0
|
<UsingBow>k__BackingField: 0
|
||||||
@ -170,11 +170,11 @@ MonoBehaviour:
|
|||||||
<CurrentHp>k__BackingField: 0
|
<CurrentHp>k__BackingField: 0
|
||||||
<Atk>k__BackingField: 50
|
<Atk>k__BackingField: 50
|
||||||
<Def>k__BackingField: 5
|
<Def>k__BackingField: 5
|
||||||
<MoveSpd>k__BackingField: 5.5
|
<MoveSpd>k__BackingField: 7.5
|
||||||
<AtkCooldown>k__BackingField: 2
|
<AtkCooldown>k__BackingField: 2
|
||||||
<ViewRange>k__BackingField: 15
|
<ViewRange>k__BackingField: 15
|
||||||
<AtkRange>k__BackingField: 3.5
|
<AtkRange>k__BackingField: 3.5
|
||||||
<DefenseRange>k__BackingField: 0
|
<DefenseRange>k__BackingField: 15
|
||||||
<ShieldPenetrationRate>k__BackingField: 75
|
<ShieldPenetrationRate>k__BackingField: 75
|
||||||
<AvoidanceRate>k__BackingField: 20
|
<AvoidanceRate>k__BackingField: 20
|
||||||
<UsingShield>k__BackingField: 0
|
<UsingShield>k__BackingField: 0
|
||||||
@ -191,11 +191,11 @@ MonoBehaviour:
|
|||||||
<CurrentHp>k__BackingField: 0
|
<CurrentHp>k__BackingField: 0
|
||||||
<Atk>k__BackingField: 30
|
<Atk>k__BackingField: 30
|
||||||
<Def>k__BackingField: 10
|
<Def>k__BackingField: 10
|
||||||
<MoveSpd>k__BackingField: 5
|
<MoveSpd>k__BackingField: 7
|
||||||
<AtkCooldown>k__BackingField: 1.5
|
<AtkCooldown>k__BackingField: 1.5
|
||||||
<ViewRange>k__BackingField: 10
|
<ViewRange>k__BackingField: 10
|
||||||
<AtkRange>k__BackingField: 3
|
<AtkRange>k__BackingField: 3
|
||||||
<DefenseRange>k__BackingField: 0
|
<DefenseRange>k__BackingField: 10
|
||||||
<ShieldPenetrationRate>k__BackingField: 50
|
<ShieldPenetrationRate>k__BackingField: 50
|
||||||
<AvoidanceRate>k__BackingField: 10
|
<AvoidanceRate>k__BackingField: 10
|
||||||
<UsingShield>k__BackingField: 1
|
<UsingShield>k__BackingField: 1
|
||||||
@ -212,11 +212,11 @@ MonoBehaviour:
|
|||||||
<CurrentHp>k__BackingField: 0
|
<CurrentHp>k__BackingField: 0
|
||||||
<Atk>k__BackingField: 35
|
<Atk>k__BackingField: 35
|
||||||
<Def>k__BackingField: 5
|
<Def>k__BackingField: 5
|
||||||
<MoveSpd>k__BackingField: 6
|
<MoveSpd>k__BackingField: 8
|
||||||
<AtkCooldown>k__BackingField: 1.5
|
<AtkCooldown>k__BackingField: 1.5
|
||||||
<ViewRange>k__BackingField: 15
|
<ViewRange>k__BackingField: 15
|
||||||
<AtkRange>k__BackingField: 3
|
<AtkRange>k__BackingField: 3
|
||||||
<DefenseRange>k__BackingField: 0
|
<DefenseRange>k__BackingField: 15
|
||||||
<ShieldPenetrationRate>k__BackingField: 50
|
<ShieldPenetrationRate>k__BackingField: 50
|
||||||
<AvoidanceRate>k__BackingField: 30
|
<AvoidanceRate>k__BackingField: 30
|
||||||
<UsingShield>k__BackingField: 0
|
<UsingShield>k__BackingField: 0
|
||||||
|
@ -92,8 +92,8 @@ namespace BlueWaterProject
|
|||||||
{
|
{
|
||||||
if (!unit.gameObject.activeSelf) continue;
|
if (!unit.gameObject.activeSelf) continue;
|
||||||
|
|
||||||
//var aiController = enemy.GetComponent<AiController>();
|
var combatAi = enemy.GetComponent<CombatAi>();
|
||||||
//aiController.SetIslandInfo(this);
|
combatAi.SetDefendingIslandInfo(this);
|
||||||
EnemyList.Add(enemy);
|
EnemyList.Add(enemy);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -123,8 +123,8 @@ namespace BlueWaterProject
|
|||||||
TargetAllList.Remove(element);
|
TargetAllList.Remove(element);
|
||||||
}
|
}
|
||||||
|
|
||||||
CleanupList(list);
|
//CleanupList(list);
|
||||||
CleanupList(TargetAllList);
|
//CleanupList(TargetAllList);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CleanupList(List<Transform> list)
|
private void CleanupList(List<Transform> list)
|
||||||
|
@ -6,6 +6,7 @@ using UnityEngine;
|
|||||||
using UnityEngine.AI;
|
using UnityEngine.AI;
|
||||||
using UnityEngine.Assertions;
|
using UnityEngine.Assertions;
|
||||||
using Debug = UnityEngine.Debug;
|
using Debug = UnityEngine.Debug;
|
||||||
|
using Object = UnityEngine.Object;
|
||||||
using Random = UnityEngine.Random;
|
using Random = UnityEngine.Random;
|
||||||
|
|
||||||
// ReSharper disable once CheckNamespace
|
// ReSharper disable once CheckNamespace
|
||||||
@ -140,18 +141,11 @@ namespace BlueWaterProject
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if UNITY_EDITOR
|
#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 fullPath = System.IO.Path.Combine(folderPath, name + extension);
|
||||||
var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(fullPath);
|
var t = AssetDatabase.LoadAssetAtPath<T>(fullPath);
|
||||||
return prefab;
|
return t;
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -21,13 +21,14 @@ namespace BlueWaterProject
|
|||||||
private bool isOffense;
|
private bool isOffense;
|
||||||
private float g = Mathf.Abs(Physics.gravity.y);
|
private float g = Mathf.Abs(Physics.gravity.y);
|
||||||
private float inaccuracy;
|
private float inaccuracy;
|
||||||
|
private float atk;
|
||||||
|
private float shieldPenetrationRate;
|
||||||
private Vector3? attackerPos;
|
private Vector3? attackerPos;
|
||||||
private Vector3 targetPos;
|
private Vector3 targetPos;
|
||||||
private EAiType attackerAiType;
|
private EAiType attackerAiType;
|
||||||
|
|
||||||
public Coroutine shootCoroutine;
|
public Coroutine shootCoroutine;
|
||||||
private Transform attackerTransform;
|
private Transform attackerTransform;
|
||||||
private EnemyStat attackerStat;
|
|
||||||
private Rigidbody arrowRigidbody;
|
private Rigidbody arrowRigidbody;
|
||||||
private IObjectPool<Arrow> managedArrowPool;
|
private IObjectPool<Arrow> managedArrowPool;
|
||||||
|
|
||||||
@ -60,10 +61,22 @@ namespace BlueWaterProject
|
|||||||
}
|
}
|
||||||
else if (other.gameObject.layer == LayerMask.NameToLayer("Props"))
|
else if (other.gameObject.layer == LayerMask.NameToLayer("Props"))
|
||||||
{
|
{
|
||||||
if (!isOffense) return;
|
if (isOffense)
|
||||||
|
{
|
||||||
isAttacked = true;
|
if (other.gameObject.CompareTag("House"))
|
||||||
DestroyObject();
|
{
|
||||||
|
var iDamageable = other.GetComponentInParent<IDamageable>();
|
||||||
|
|
||||||
|
iDamageable.TakeDamage(atk, shieldPenetrationRate);
|
||||||
|
isAttacked = true;
|
||||||
|
DestroyObject();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
isAttacked = true;
|
||||||
|
DestroyObject();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (other.gameObject.layer == LayerMask.NameToLayer("HitBox"))
|
else if (other.gameObject.layer == LayerMask.NameToLayer("HitBox"))
|
||||||
{
|
{
|
||||||
@ -92,7 +105,7 @@ namespace BlueWaterProject
|
|||||||
|
|
||||||
if (attackerPos != null)
|
if (attackerPos != null)
|
||||||
{
|
{
|
||||||
iDamageable.TakeDamage(attackerStat.Atk, attackerStat.ShieldPenetrationRate, (Vector3)attackerPos);
|
iDamageable.TakeDamage(atk, shieldPenetrationRate, (Vector3)attackerPos);
|
||||||
}
|
}
|
||||||
isAttacked = true;
|
isAttacked = true;
|
||||||
DestroyObject();
|
DestroyObject();
|
||||||
@ -164,7 +177,8 @@ namespace BlueWaterProject
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 화살이 발사 되기 직전에 필요한 데이터들을 입력받는 함수
|
/// 화살이 발사 되기 직전에 필요한 데이터들을 입력받는 함수
|
||||||
/// </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;
|
isAttacked = false;
|
||||||
transform.position = shootLocationPos;
|
transform.position = shootLocationPos;
|
||||||
@ -173,9 +187,10 @@ namespace BlueWaterProject
|
|||||||
attackerPos = (Vector3)attackPos;
|
attackerPos = (Vector3)attackPos;
|
||||||
}
|
}
|
||||||
targetPos = targetPosition;
|
targetPos = targetPosition;
|
||||||
attackerStat = attackerAiStat;
|
|
||||||
attackerAiType = aiType;
|
attackerAiType = aiType;
|
||||||
inaccuracy = inaccuracyValue;
|
atk = atkStat;
|
||||||
|
shieldPenetrationRate = shieldPenetrationRateStat;
|
||||||
|
inaccuracy = inaccuracyStat;
|
||||||
this.isOffense = isOffense;
|
this.isOffense = isOffense;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,9 +9,11 @@ namespace BlueWaterProject
|
|||||||
#region Property and variable
|
#region Property and variable
|
||||||
|
|
||||||
private bool isAttacked;
|
private bool isAttacked;
|
||||||
|
private bool isOffense;
|
||||||
|
|
||||||
private EAiType attackerAiType;
|
private EAiType attackerAiType;
|
||||||
private EnemyStat attackerStat;
|
private float atk;
|
||||||
|
private float shieldPenetrationRate;
|
||||||
private bool isInit;
|
private bool isInit;
|
||||||
private bool canAttack;
|
private bool canAttack;
|
||||||
|
|
||||||
@ -49,10 +51,22 @@ namespace BlueWaterProject
|
|||||||
|
|
||||||
var iDamageable = other.GetComponentInParent<IDamageable>();
|
var iDamageable = other.GetComponentInParent<IDamageable>();
|
||||||
|
|
||||||
iDamageable.TakeDamage(attackerStat.Atk, attackerStat.ShieldPenetrationRate);
|
iDamageable.TakeDamage(atk, shieldPenetrationRate);
|
||||||
|
|
||||||
isAttacked = true;
|
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
|
#endregion
|
||||||
@ -74,9 +88,15 @@ namespace BlueWaterProject
|
|||||||
isInit = true;
|
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 SetIsAttacked(bool value) => isAttacked = value;
|
||||||
public void SetAttackerAiType(EAiType value) => attackerAiType = value;
|
public void SetAttackerAiType(EAiType value) => attackerAiType = value;
|
||||||
public void SetAttackerStat(EnemyStat value) => attackerStat = value;
|
|
||||||
public void SetCanAttack(bool value) => canAttack = value;
|
public void SetCanAttack(bool value) => canAttack = value;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
@ -147,4 +147,4 @@ MonoBehaviour:
|
|||||||
m_Name:
|
m_Name:
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
autoDestroyTime: 5
|
autoDestroyTime: 5
|
||||||
arrowSpeed: 20
|
arrowSpeed: 30
|
||||||
|
@ -8899,14 +8899,14 @@ NavMeshAgent:
|
|||||||
m_GameObject: {fileID: 155132}
|
m_GameObject: {fileID: 155132}
|
||||||
m_Enabled: 1
|
m_Enabled: 1
|
||||||
m_AgentTypeID: 0
|
m_AgentTypeID: 0
|
||||||
m_Radius: 0.5
|
m_Radius: 0.3
|
||||||
m_Speed: 3
|
m_Speed: 3
|
||||||
m_Acceleration: 20
|
m_Acceleration: 20
|
||||||
avoidancePriority: 50
|
avoidancePriority: 50
|
||||||
m_AngularSpeed: 180
|
m_AngularSpeed: 180
|
||||||
m_StoppingDistance: 3
|
m_StoppingDistance: 3
|
||||||
m_AutoTraverseOffMeshLink: 1
|
m_AutoTraverseOffMeshLink: 1
|
||||||
m_AutoBraking: 1
|
m_AutoBraking: 0
|
||||||
m_AutoRepath: 1
|
m_AutoRepath: 1
|
||||||
m_Height: 1.6
|
m_Height: 1.6
|
||||||
m_BaseOffset: 0
|
m_BaseOffset: 0
|
||||||
|
@ -36177,13 +36177,6 @@ AnimationClip:
|
|||||||
m_HasGenericRootTransform: 0
|
m_HasGenericRootTransform: 0
|
||||||
m_HasMotionFloatCurves: 0
|
m_HasMotionFloatCurves: 0
|
||||||
m_Events:
|
m_Events:
|
||||||
- time: 0
|
|
||||||
functionName: OnStoppedMove
|
|
||||||
data:
|
|
||||||
objectReferenceParameter: {fileID: 0}
|
|
||||||
floatParameter: 0
|
|
||||||
intParameter: 1
|
|
||||||
messageOptions: 0
|
|
||||||
- time: 0
|
- time: 0
|
||||||
functionName: OnAttacking
|
functionName: OnAttacking
|
||||||
data:
|
data:
|
||||||
@ -36198,13 +36191,6 @@ AnimationClip:
|
|||||||
floatParameter: 0
|
floatParameter: 0
|
||||||
intParameter: 0
|
intParameter: 0
|
||||||
messageOptions: 0
|
messageOptions: 0
|
||||||
- time: 1.5
|
|
||||||
functionName: OnStoppedMove
|
|
||||||
data:
|
|
||||||
objectReferenceParameter: {fileID: 0}
|
|
||||||
floatParameter: 0
|
|
||||||
intParameter: 0
|
|
||||||
messageOptions: 0
|
|
||||||
- time: 1.5
|
- time: 1.5
|
||||||
functionName: OnAttacking
|
functionName: OnAttacking
|
||||||
data:
|
data:
|
||||||
|
@ -37527,13 +37527,6 @@ AnimationClip:
|
|||||||
m_HasGenericRootTransform: 0
|
m_HasGenericRootTransform: 0
|
||||||
m_HasMotionFloatCurves: 0
|
m_HasMotionFloatCurves: 0
|
||||||
m_Events:
|
m_Events:
|
||||||
- time: 0
|
|
||||||
functionName: OnStoppedMove
|
|
||||||
data:
|
|
||||||
objectReferenceParameter: {fileID: 0}
|
|
||||||
floatParameter: 0
|
|
||||||
intParameter: 1
|
|
||||||
messageOptions: 0
|
|
||||||
- time: 0
|
- time: 0
|
||||||
functionName: OnAttacking
|
functionName: OnAttacking
|
||||||
data:
|
data:
|
||||||
@ -37548,13 +37541,6 @@ AnimationClip:
|
|||||||
floatParameter: 0
|
floatParameter: 0
|
||||||
intParameter: 0
|
intParameter: 0
|
||||||
messageOptions: 0
|
messageOptions: 0
|
||||||
- time: 1.5
|
|
||||||
functionName: OnStoppedMove
|
|
||||||
data:
|
|
||||||
objectReferenceParameter: {fileID: 0}
|
|
||||||
floatParameter: 0
|
|
||||||
intParameter: 0
|
|
||||||
messageOptions: 0
|
|
||||||
- time: 1.5
|
- time: 1.5
|
||||||
functionName: OnAttacking
|
functionName: OnAttacking
|
||||||
data:
|
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_Enabled: 1
|
||||||
m_EditorHideFlags: 0
|
m_EditorHideFlags: 0
|
||||||
m_Script: {fileID: 11500000, guid: b23f08d2ae4cba14087c1ed36193d82b, type: 3}
|
m_Script: {fileID: 11500000, guid: b23f08d2ae4cba14087c1ed36193d82b, type: 3}
|
||||||
m_Name: BaseCharacter
|
m_Name: BaseEnemyAi
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
mBehaviorSource:
|
mBehaviorSource:
|
||||||
behaviorName: BaseCharacter
|
behaviorName: BaseCharacter
|
||||||
@ -20,12 +20,14 @@ MonoBehaviour:
|
|||||||
parentIndex:
|
parentIndex:
|
||||||
startIndex:
|
startIndex:
|
||||||
variableStartIndex:
|
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
|
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
|
== 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":6,"Name":"Defense
|
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
|
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"}]}'
|
Behavior","Instant":true,"ExternalBehavior[]externalBehaviors":[1],"SharedNamedVariable[]variables":[],"Booleancollapsed":false}]}]}]},"Variables":[{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":"AttackerType","IsShared":true,"EAttackerTypemValue":"NONE"}]}'
|
||||||
fieldSerializationData:
|
fieldSerializationData:
|
||||||
typeName: []
|
typeName: []
|
||||||
@ -33,7 +35,7 @@ MonoBehaviour:
|
|||||||
startIndex:
|
startIndex:
|
||||||
dataPosition:
|
dataPosition:
|
||||||
unityObjects:
|
unityObjects:
|
||||||
- {fileID: 11400000, guid: 0fa0abbe34de7db4f87d218d194dcc5d, type: 2}
|
- {fileID: 11400000, guid: f034bc00819bc174d84ba6ef56cb0273, type: 2}
|
||||||
- {fileID: 11400000, guid: 6ac3257696f4b30469f3e3e0576b146b, type: 2}
|
- {fileID: 11400000, guid: 6ac3257696f4b30469f3e3e0576b146b, type: 2}
|
||||||
byteData:
|
byteData:
|
||||||
byteDataArray:
|
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