Ai 테스트

This commit is contained in:
NTG 2023-09-18 09:21:55 +09:00
parent fc65abc7b4
commit b342cb3adf
157 changed files with 654087 additions and 650873 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: ed36e1064a49b084bac46d5debdc1de3
guid: 86dead43324d7b44bbe8482319d1490f
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 23800000

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 2fac3aeaa82ea9148ac35f80b65e67dc
guid: 0dbad892c171e0b43b86934a3ac12789
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 23800000

View File

@ -669,7 +669,7 @@ namespace BlueWaterProject
protected virtual IEnumerator AttackAnimation()
{
closeWeapon.SetIsAttacked(false);
closeWeapon.SetAttackerStat(AiStat);
closeWeapon.SetWeaponStat(AiStat.Atk, AiStat.ShieldPenetrationRate, AiStat.AttackerType == EAttackerType.OFFENSE);
aiAnimator.SetTrigger(AttackHash);
while (isAttacking)

View File

@ -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;
}
}
}

View File

@ -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;
// }
// }
// }

View File

@ -1,5 +1,6 @@
fileFormatVersion: 2
guid: a55ee4efaad27d948ba5f03fc6d7bc80
guid: ec88ff1593c266f4bacdac246851500a
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,6 @@
fileFormatVersion: 2
guid: ed9b95dc6ed6d0647ad7f1a8f305385d
guid: 1b2c1ea1e8ca8894eb1c93a20ae6bdcb
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:

View File

@ -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;
}
}
}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 6875a9897212c2f45ac34352aa8b64ef
guid: 248ee1686bf00ad43951a1296978b09d
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@ -1,5 +1,6 @@
fileFormatVersion: 2
guid: 3d7c4217783978e4abe6496ac71eee94
guid: b95f16cdd3b71dc48bd7fc20493b6b35
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:

View File

@ -1,5 +1,6 @@
fileFormatVersion: 2
guid: 4ff1f29eab234cf4490d9bb383892c44
guid: ce7fd23e7154da9409e4c8e9b8709535
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:

View File

@ -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();
}
}
}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: f726c5737f44a1544b57c5f62cec144c
guid: f3c05fd3087c0bb479afcc8212a74cc1
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 0f16bfce0fda1394aa75287d1197deff
guid: 6b7c7916c685bf741ad0c84618c3ef00
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@ -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;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: cac9370c446b93e4e8a596c75db1ba1d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 8228d4b74ab4bcd47a4c2acfbb49441d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 6a1ba3fb8915d4048a7151e5e4bdd8f0
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2ce7d209551b49e4e802d662e4ca90eb
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 272b142d6b035b948b8315474050f48b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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();
// }
// }
// }

View File

@ -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;
// }
// }
// }

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: fb74fe89de7396d4d8d4aa1400b262f9
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 631b6319d10351a4392d0b692de598d7
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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();
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 152eaa40581591946884634c29014ed1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 67078393a27b3414fb475b36e0787001
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 86c2cf9f56d3adf4ebadf9a0e1915e9a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: cfedbfa8c252b5648b9faf49acff2222
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b3be30dac4ab81d47a4313e506fbf7b8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f225dd6308d308d47ac7aa75de28c5da
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 68fbf203f20f0444694fc0cd87678685
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 18e4f63224214fb48af158d76b500c31
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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>();
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7f96e64d7dffad149835e1501b362e91
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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>();
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 84f9fa3fad1de6640a44b43f28baf46f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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>();
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 0ac6714e1a3da5e42b2433907ceace0c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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>();
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ecb029565680f1d4694b164292599545
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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>();
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 775faef187f436241b9bf4fae9115d48
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 94aaede23a4430d42ae8ef55a1b21e9b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,4 +1,4 @@
using System;
using BehaviorDesigner.Runtime;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.Animations;
@ -11,18 +11,23 @@ namespace BlueWaterProject
#region Properties and variables
// 일반 변수
protected bool isDrawGizmosInFieldOfView = true;
protected LayerMask targetLayer;
protected Vector3 defensePos;
[SerializeField] protected bool isDrawGizmosInFieldOfView = true;
[SerializeField] protected bool isAttacking;
[SerializeField] protected LayerMask targetLayer;
[SerializeField] protected Vector3 defensePos;
protected IslandInfo attackingIslandInfo;
[SerializeField] protected Transform targetTransform;
[SerializeField] protected Collider[] colliderWithinRange = new Collider[TARGET_MAX_SIZE];
[SerializeField] protected IslandInfo attackingIslandInfo;
[SerializeField] protected IslandInfo defendingIslandInfo;
// 컴포넌트 관련 변수
protected Animator combatAnimator;
protected NavMeshAgent humanAgent;
protected NavMeshAgent combatAgent;
protected CapsuleCollider myCollider;
protected CapsuleCollider hitBoxCollider;
protected LookAtConstraint lookAtConstraint;
protected BehaviorTree behaviorTree;
// 애니메이션 관련 변수
protected static readonly int SpeedHash = Animator.StringToHash("Speed");
@ -32,14 +37,19 @@ namespace BlueWaterProject
protected static readonly int DeathHash = Animator.StringToHash("Death");
protected static readonly int ShieldHash = Animator.StringToHash("Shield");
protected static readonly int OutlineColorHash = Shader.PropertyToID("_OutlineColor");
protected const int TARGET_MAX_SIZE = 30;
#endregion
#region Abstract methods
protected abstract void SetLayer();
protected abstract void SetCurrentHp(float value);
protected abstract void RemoveAiListElement();
public abstract void FindTarget();
public abstract bool CanAttack();
public abstract void Attack();
#endregion
@ -53,6 +63,15 @@ namespace BlueWaterProject
SetLayer();
}
private void Update()
{
if (combatAnimator.runtimeAnimatorController != null && combatAnimator.isActiveAndEnabled)
{
combatAnimator.SetFloat(SpeedHash, combatAgent.velocity.normalized.magnitude);
}
UpdateLookAtTarget();
}
#endregion
#region Custom methods
@ -62,7 +81,7 @@ namespace BlueWaterProject
base.InitComponent();
combatAnimator = Utils.GetComponentAndAssert<Animator>(transform);
humanAgent = Utils.GetComponentAndAssert<NavMeshAgent>(transform);
combatAgent = Utils.GetComponentAndAssert<NavMeshAgent>(transform);
myCollider = Utils.GetComponentAndAssert<CapsuleCollider>(transform);
hitBoxCollider = Utils.GetComponentAndAssert<CapsuleCollider>(transform.Find("HitBox"));
lookAtConstraint = Utils.GetComponentAndAssert<LookAtConstraint>(flagContainer);
@ -82,11 +101,89 @@ namespace BlueWaterProject
lookAtConstraint.constraintActive = true;
}
protected void SetBehaviorTree(ExternalBehaviorTree externalBehaviorTree)
{
if (!externalBehaviorTree)
{
print("externalBehaviorTree == null error");
}
var bt = gameObject.GetComponent<BehaviorTree>();
if (bt != null)
{
Destroy(bt);
}
behaviorTree = gameObject.AddComponent<BehaviorTree>();
behaviorTree.StartWhenEnabled = false;
behaviorTree.ExternalBehavior = externalBehaviorTree;
behaviorTree.EnableBehavior();
}
public void MoveTarget(Vector3 targetPos)
{
if (Vector3.Distance(combatAgent.destination, targetPos) < 0.1f) return;
combatAgent.SetDestination(targetPos);
}
private void UpdateLookAtTarget()
{
if (CanAttack())
{
combatAgent.updateRotation = false;
var targetPos = targetTransform.position;
targetPos.y = transform.position.y;
transform.LookAt(targetPos);
}
else
{
combatAgent.updateRotation = true;
}
}
public void SetTargetTransform(Transform value)
{
targetTransform = value;
var btTargetTransform = behaviorTree.GetVariable("TargetTransform");
btTargetTransform?.SetValue(value);
}
public void Die()
{
RemoveIslandInfo();
RemoveAiListElement();
StopAllCoroutines();
combatAgent.enabled = false;
myCollider.enabled = false;
hitBoxCollider.enabled = false;
var randomValue = Random.Range(0, 2);
combatAnimator.SetInteger(DeathTypeHash, randomValue);
// TODO : 죽었을 때 처리(죽는 애니메이션 이후 사라지는 효과 등)
combatAnimator.SetTrigger(DeathHash);
}
private void RemoveIslandInfo()
{
if (defendingIslandInfo == null) return;
defendingIslandInfo.RemoveListElement(defendingIslandInfo.EnemyList, transform);
}
protected void SetAnimatorController(string controllerName) => combatAnimator.runtimeAnimatorController =
UnitManager.Inst.AIAnimatorControllerList.Find(obj => obj.name == controllerName);
protected void SetMoveSpeed(float value) => humanAgent.speed = value;
public void SetIslandInfo(IslandInfo info) => attackingIslandInfo = info;
protected void SetMoveSpeed(float value) => combatAgent.speed = value;
public void SetAttackingIslandInfo(IslandInfo info) => attackingIslandInfo = info;
public void SetDefendingIslandInfo(IslandInfo info) => defendingIslandInfo = info;
public Transform GetTargetTransform() => targetTransform;
public Vector3 GetDefensePos() => defensePos;
#endregion
}

View File

@ -1,26 +1,126 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using Random = UnityEngine.Random;
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
{
public class EnemyAi : CombatAi
public abstract class EnemyAi : CombatAi, IDamageable
{
#region Properties and variables
[field: SerializeField] public EnemyStat EnemyStat { get; set; }
protected bool isAttackCoroutine;
private EnemyUnit enemyUnit;
private int childNum;
#endregion
#region Unit Built-in methods
protected virtual void OnDrawGizmosSelected()
{
if (!isDrawGizmosInFieldOfView) return;
if (EnemyStat.AttackerType == EAttackerType.OFFENSE)
{
if (!targetTransform) return;
Gizmos.color = Color.red;
Gizmos.DrawLine(transform.position, targetTransform.position);
}
else if (EnemyStat.AttackerType == EAttackerType.DEFENSE)
{
if (EnemyStat.DefenseType == EDefenseType.DEFENDER)
{
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(defensePos, EnemyStat.DefenseRange);
}
Gizmos.color = Color.blue;
Gizmos.DrawWireSphere(transform.position, EnemyStat.ViewRange);
if (!targetTransform) return;
Gizmos.color = Color.red;
Gizmos.DrawLine(transform.position, targetTransform.position);
}
}
private void Start()
{
InitStart();
}
#endregion
#region IDamageable interface
public void TakeDamage(float attackerPower, float attackerShieldPenetrationRate, Vector3? attackPos = null)
{
if (attackPos != null && combatAgent.enabled && EnemyStat.AttackerType == EAttackerType.DEFENSE && !targetTransform)
{
BeAttackedMovement((Vector3)attackPos);
}
// 회피 성공 체크
if (Random.Range(0, 100) < EnemyStat.AvoidanceRate)
{
// TODO : 회피 처리
return;
}
var finalDamage = 0f;
if (EnemyStat.UsingShield)
{
var penetrationChance = attackerShieldPenetrationRate -
(attackerShieldPenetrationRate * EnemyStat.PenetrationResistivity * 0.01f);
// 방패를 관통했다면,
if (Random.Range(0, 100) < penetrationChance)
{
finalDamage = attackerPower - EnemyStat.Def;
finalDamage = Mathf.Max(finalDamage, 0);
}
else
{
finalDamage = 0f;
}
}
finalDamage = attackerPower - EnemyStat.Def;
finalDamage = Mathf.Max(finalDamage, 0);
// 방패 막기 체크
if (finalDamage == 0f)
{
combatAnimator.SetTrigger(ShieldHash);
return;
}
var changeHp = Mathf.Max(EnemyStat.CurrentHp - finalDamage, 0);
SetCurrentHp(changeHp);
// 죽었는지 체크
if (changeHp == 0f) return;
combatAnimator.SetTrigger(DamageHash);
}
#endregion
#region Custom methods
protected override void InitComponent()
{
base.InitComponent();
enemyUnit = Utils.GetComponentAndAssert<EnemyUnit>(transform.parent);
}
protected override void SetLayer()
{
@ -44,8 +144,6 @@ namespace BlueWaterProject
InitComponent();
SetLayer();
InitViewModel(enemyViewData);
SetCurrentHp(EnemyStat.MaxHp);
SetMoveSpeed(EnemyStat.MoveSpd);
}
#endif
@ -54,12 +152,16 @@ namespace BlueWaterProject
var enemyViewData = DataManager.Inst.GetEnemyViewDictionaryFromKey(EnemyStat.ViewIdx);
InitViewModel(enemyViewData);
SetBehaviorTree(UnitManager.Inst.EnemyBehaviorTree);
SetCurrentHp(EnemyStat.MaxHp);
SetMoveSpeed(EnemyStat.MoveSpd);
childNum = enemyUnit.transform.GetSiblingIndex();
if (EnemyStat.AttackerType == EAttackerType.DEFENSE)
{
defensePos = transform.position;
SetDefensePos(transform.position);
enemyUnit.SetDefensePos(defensePos, childNum);
}
}
@ -74,7 +176,222 @@ namespace BlueWaterProject
SetActiveViewModel(flagContainer, enemyView.Flag);
}
protected override void SetCurrentHp(float value) => EnemyStat.CurrentHp = value;
public override void FindTarget()
{
switch (EnemyStat.AttackerType)
{
case EAttackerType.NONE:
print("EnemyStat.AttackerType == NONE Error");
break;
case EAttackerType.OFFENSE:
FindTargetInOffense();
break;
case EAttackerType.DEFENSE:
FindTargetInDefense();
break;
default:
throw new ArgumentOutOfRangeException();
}
}
public override bool CanAttack()
{
if (!targetTransform) return false;
var attackInRange = Vector3.Distance(transform.position, targetTransform.position) <= EnemyStat.AtkRange;
return attackInRange;
}
public override void Attack()
{
isAttackCoroutine = true;
StartCoroutine(nameof(AttackAnimation));
}
protected abstract IEnumerator AttackAnimation();
private void FindTargetInOffense()
{
if (!attackingIslandInfo)
{
print("attackingIslandInfo == null error");
return;
}
switch (EnemyStat.OffenseType)
{
case EOffenseType.NONE:
print("AiStat.OffenseType == NONE Error");
break;
case EOffenseType.NORMAL:
if (attackingIslandInfo.EnemyList.Count > 0)
{
FindNearestTargetInList(attackingIslandInfo.EnemyList);
}
else if (attackingIslandInfo.HouseList.Count > 0)
{
FindNearestTargetInList(attackingIslandInfo.HouseList);
}
break;
case EOffenseType.ONLY_HOUSE:
if (attackingIslandInfo.HouseList.Count > 0)
{
FindNearestTargetInList(attackingIslandInfo.HouseList);
}
else if (attackingIslandInfo.EnemyList.Count > 0)
{
FindNearestTargetInList(attackingIslandInfo.EnemyList);
}
break;
default:
throw new ArgumentOutOfRangeException();
}
}
protected virtual void FindNearestTargetInList(List<Transform> targetList)
{
if (targetList.Count <= 0) return;
var nearestTarget = targetList.OrderBy(t => t ?
Vector3.Distance(transform.position, t.position) : float.MaxValue).FirstOrDefault();
if (nearestTarget == null) return;
SetTargetTransform(nearestTarget);
}
private void FindTargetInDefense()
{
switch (EnemyStat.DefenseType)
{
case EDefenseType.NONE:
print("EnemyStat.DefenseType == NONE Error");
break;
case EDefenseType.STRIKER:
FindNearestTargetInRange(transform.position, EnemyStat.ViewRange);
break;
case EDefenseType.MIDFIELDER:
FindNearestTargetInRange(transform.position, EnemyStat.ViewRange);
break;
case EDefenseType.DEFENDER:
FindNearestTargetInRange(defensePos, EnemyStat.DefenseRange);
break;
case EDefenseType.KEEPER:
FindNearestTargetInRange(transform.position, EnemyStat.ViewRange);
break;
default:
throw new ArgumentOutOfRangeException();
}
}
protected virtual void FindNearestTargetInRange(Vector3 centerPos, float range)
{
Array.Clear(colliderWithinRange, 0, TARGET_MAX_SIZE);
var maxColliderCount = Physics.OverlapSphereNonAlloc(centerPos, range, colliderWithinRange,
targetLayer, QueryTriggerInteraction.Collide);
if (maxColliderCount <= 0)
{
SetTargetTransform(null);
return;
}
var nearestDistance = Mathf.Infinity;
Transform nearestTargetTransform = null;
for (var i = 0; i < maxColliderCount; i++)
{
var distanceToTarget = Vector3.Distance(transform.position, colliderWithinRange[i].transform.position);
if (distanceToTarget >= nearestDistance) continue;
nearestDistance = distanceToTarget;
nearestTargetTransform = colliderWithinRange[i].transform;
}
SetTargetTransform(nearestTargetTransform);
}
public void MoveTargetInDefense(Vector3 targetPos)
{
switch (EnemyStat.DefenseType)
{
case EDefenseType.NONE:
print("EnemyStat.DefenseType == NONE error");
break;
case EDefenseType.STRIKER:
case EDefenseType.MIDFIELDER:
break;
case EDefenseType.DEFENDER:
if (Vector3.Distance(targetPos, defensePos) > EnemyStat.DefenseRange) return;
break;
case EDefenseType.KEEPER:
return;
default:
throw new ArgumentOutOfRangeException();
}
if (Vector3.Distance(combatAgent.destination, targetPos) < 0.1f) return;
combatAgent.SetDestination(targetPos);
}
protected override void SetCurrentHp(float value)
{
EnemyStat.CurrentHp = value;
var btCurrentHp = behaviorTree.GetVariable("CurrentHp");
btCurrentHp?.SetValue(value);
}
protected override void RemoveAiListElement()
{
if (enemyUnit.enemyUnitStat.EnemyAiList.Contains(this))
{
enemyUnit.enemyUnitStat.EnemyAiList.Remove(this);
}
childNum = enemyUnit.transform.GetSiblingIndex();
SetDefensePos(enemyUnit.GetDefensePos(childNum));
}
private void BeAttackedMovement(Vector3 attackPos)
{
switch (EnemyStat.DefenseType)
{
case EDefenseType.NONE:
print("EnemyStat.DefenseType == NONE Error");
break;
case EDefenseType.STRIKER:
case EDefenseType.MIDFIELDER:
break;
case EDefenseType.DEFENDER:
if (Vector3.Distance(defensePos, attackPos) > EnemyStat.DefenseRange) return;
break;
case EDefenseType.KEEPER:
return;
default:
throw new ArgumentOutOfRangeException();
}
foreach (var item in enemyUnit.enemyUnitStat.EnemyAiList)
{
if (item.GetTargetTransform()) continue;
item.MoveTarget(attackPos);
}
}
public void SetDefensePos(Vector3 value)
{
defensePos = value;
var btDefensePos = behaviorTree.GetVariable("DefensePos");
btDefensePos?.SetValue(value);
}
public bool GetIsAttackCoroutine() => isAttackCoroutine;
public void SetAttackerType(EAttackerType type) => EnemyStat.AttackerType = type;
public void SetOffenseType(EOffenseType type) => EnemyStat.OffenseType = type;
public void SetDefenseType(EDefenseType type) => EnemyStat.DefenseType = type;

View File

@ -1,4 +1,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Pool;
@ -16,14 +19,47 @@ namespace BlueWaterProject
[Tooltip("화살 발사 후 오브젝트 저장될 위치")]
[SerializeField] private Transform arrowsPoolLocation;
[SerializeField] private LayerMask archerLayer;
[SerializeField] private LayerMask arrowLayer;
private IEnumerator shootArrowCoroutine;
private IObjectPool<Arrow> arrowPool;
[SerializeField] private Vector3 rayOffset = new(0f, 2f, 0);
[SerializeField] private Vector3 rayOffset = new(0f, 3.5f, 0);
#endregion
#region Unity built-in methods
protected override void OnDrawGizmosSelected()
{
if (!isDrawGizmosInFieldOfView) return;
if (EnemyStat.AttackerType == EAttackerType.OFFENSE)
{
if (!targetTransform) return;
Gizmos.color = Color.red;
Gizmos.DrawLine(transform.position + rayOffset, targetTransform.position + rayOffset);
}
else if (EnemyStat.AttackerType == EAttackerType.DEFENSE)
{
if (EnemyStat.DefenseType == EDefenseType.DEFENDER)
{
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(defensePos, EnemyStat.DefenseRange);
}
Gizmos.color = Color.blue;
Gizmos.DrawWireSphere(transform.position, EnemyStat.ViewRange);
if (!targetTransform) return;
Gizmos.color = Color.red;
Gizmos.DrawLine(transform.position + rayOffset, targetTransform.position + rayOffset);
}
}
#endregion
#region Custom methods
@ -69,7 +105,7 @@ namespace BlueWaterProject
{
base.SetLayer();
archerLayer = LayerMask.GetMask("Ground") | LayerMask.GetMask("Water") |
arrowLayer = LayerMask.GetMask("Ground") | LayerMask.GetMask("Water") |
LayerMask.GetMask("Player") | LayerMask.GetMask("Pirate") |
LayerMask.GetMask("Props");
}
@ -81,6 +117,98 @@ namespace BlueWaterProject
SetAnimatorController("Archer");
}
protected override void FindNearestTargetInList(List<Transform> targetList)
{
if (targetList.Count <= 0) return;
var myPos = transform.position;
var nearestTarget = targetList.OrderBy(t => t && IsRaycastHitTarget(myPos, t) ?
Vector3.Distance(myPos, t.position) :
float.MaxValue).FirstOrDefault();
if (nearestTarget == null) return;
SetTargetTransform(nearestTarget);
}
protected override void FindNearestTargetInRange(Vector3 centerPos, float range)
{
Array.Clear(colliderWithinRange, 0, TARGET_MAX_SIZE);
var maxColliderCount = Physics.OverlapSphereNonAlloc(centerPos, range, colliderWithinRange,
targetLayer, QueryTriggerInteraction.Collide);
if (maxColliderCount <= 0)
{
SetTargetTransform(null);
return;
}
var nearestDistance = Mathf.Infinity;
Transform nearestTargetTransform = null;
var myPos = transform.position;
for (var i = 0; i < maxColliderCount; i++)
{
var distanceToTarget = Vector3.Distance(myPos, colliderWithinRange[i].transform.position);
if (!IsRaycastHitTarget(myPos, colliderWithinRange[i].transform) || distanceToTarget >= nearestDistance) continue;
nearestDistance = distanceToTarget;
nearestTargetTransform = colliderWithinRange[i].transform;
}
SetTargetTransform(nearestTargetTransform);
}
private bool IsRaycastHitTarget(Vector3 myPos, Transform target)
{
var direction = ((target.position + rayOffset) - (myPos + rayOffset)).normalized;
var raycastHitTarget = Physics.Raycast(myPos + rayOffset, direction, out var hit, EnemyStat.AtkRange, arrowLayer, QueryTriggerInteraction.Collide);
return raycastHitTarget && target == hit.transform;
}
protected override IEnumerator AttackAnimation()
{
combatAnimator.SetTrigger(AttackHash);
while (isAttacking)
{
yield return null;
}
yield return new WaitForSeconds(EnemyStat.AtkCooldown);
isAttackCoroutine = false;
}
/// <summary>
/// Archer attack 애니메이션에 event 부착용 함수
/// </summary>
public void OnShootArrow()
{
if (!targetTransform) return;
var arrow = arrowPool.Get();
var isOffense = EnemyStat.AttackerType == EAttackerType.OFFENSE;
arrow.SetShootingArrow(leftWeaponContainer.position, transform.position,
targetTransform.position + rayOffset, EAiType.ENEMY, EnemyStat.Atk, EnemyStat.ShieldPenetrationRate, EnemyStat.Inaccuracy, isOffense);
arrow.ShootArrowCoroutine();
}
/// <summary>
/// Archer attack 애니메이션에 event 부착용 함수
/// </summary>
public void OnStoppedMove(int boolValue)
{
if (!combatAgent.enabled) return;
combatAgent.isStopped = boolValue == 1;
}
private void OnAttacking(int boolValue) => isAttacking = boolValue == 1;
#endregion
#region ObjectPool Function

View File

@ -1,3 +1,4 @@
using System.Collections;
using Unity.VisualScripting;
using UnityEngine;
@ -45,6 +46,24 @@ namespace BlueWaterProject
closeWeapon.SetAttackerAiType(EAiType.ENEMY);
closeWeapon.SetBoxCollider();
}
protected override IEnumerator AttackAnimation()
{
closeWeapon.SetIsAttacked(false);
closeWeapon.SetWeaponStat(EnemyStat.Atk, EnemyStat.ShieldPenetrationRate, EnemyStat.AttackerType == EAttackerType.OFFENSE);
combatAnimator.SetTrigger(AttackHash);
while (isAttacking)
{
yield return null;
}
yield return new WaitForSeconds(EnemyStat.AtkCooldown);
isAttackCoroutine = false;
}
private void SetCloseWeaponCanAttack(int boolValue) => closeWeapon.SetCanAttack(boolValue == 1);
private void OnAttacking(int boolValue) => isAttacking = boolValue == 1;
#endregion
}

View File

@ -1,3 +1,4 @@
using System.Collections;
using Unity.VisualScripting;
using UnityEngine;
@ -45,6 +46,24 @@ namespace BlueWaterProject
closeWeapon.SetAttackerAiType(EAiType.ENEMY);
closeWeapon.SetBoxCollider();
}
protected override IEnumerator AttackAnimation()
{
closeWeapon.SetIsAttacked(false);
closeWeapon.SetWeaponStat(EnemyStat.Atk, EnemyStat.ShieldPenetrationRate, EnemyStat.AttackerType == EAttackerType.OFFENSE);
combatAnimator.SetTrigger(AttackHash);
while (isAttacking)
{
yield return null;
}
yield return new WaitForSeconds(EnemyStat.AtkCooldown);
isAttackCoroutine = false;
}
private void SetCloseWeaponCanAttack(int boolValue) => closeWeapon.SetCanAttack(boolValue == 1);
private void OnAttacking(int boolValue) => isAttacking = boolValue == 1;
#endregion
}

View File

@ -1,3 +1,4 @@
using System.Collections;
using Unity.VisualScripting;
using UnityEngine;
@ -45,6 +46,24 @@ namespace BlueWaterProject
closeWeapon.SetAttackerAiType(EAiType.ENEMY);
closeWeapon.SetBoxCollider();
}
protected override IEnumerator AttackAnimation()
{
closeWeapon.SetIsAttacked(false);
closeWeapon.SetWeaponStat(EnemyStat.Atk, EnemyStat.ShieldPenetrationRate, EnemyStat.AttackerType == EAttackerType.OFFENSE);
combatAnimator.SetTrigger(AttackHash);
while (isAttacking)
{
yield return null;
}
yield return new WaitForSeconds(EnemyStat.AtkCooldown);
isAttackCoroutine = false;
}
private void SetCloseWeaponCanAttack(int boolValue) => closeWeapon.SetCanAttack(boolValue == 1);
private void OnAttacking(int boolValue) => isAttacking = boolValue == 1;
#endregion
}

View File

@ -1,3 +1,4 @@
using System.Collections;
using Unity.VisualScripting;
using UnityEngine;
@ -45,6 +46,24 @@ namespace BlueWaterProject
closeWeapon.SetAttackerAiType(EAiType.ENEMY);
closeWeapon.SetBoxCollider();
}
protected override IEnumerator AttackAnimation()
{
closeWeapon.SetIsAttacked(false);
closeWeapon.SetWeaponStat(EnemyStat.Atk, EnemyStat.ShieldPenetrationRate, EnemyStat.AttackerType == EAttackerType.OFFENSE);
combatAnimator.SetTrigger(AttackHash);
while (isAttacking)
{
yield return null;
}
yield return new WaitForSeconds(EnemyStat.AtkCooldown);
isAttackCoroutine = false;
}
private void SetCloseWeaponCanAttack(int boolValue) => closeWeapon.SetCanAttack(boolValue == 1);
private void OnAttacking(int boolValue) => isAttacking = boolValue == 1;
#endregion
}

View File

@ -1,12 +1,15 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Sirenix.OdinInspector;
using UnityEngine;
using Random = UnityEngine.Random;
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
{
public class PirateAi : CombatAi
public abstract class PirateAi : CombatAi, IDamageable
{
#region Properties and variables
@ -22,19 +25,49 @@ namespace BlueWaterProject
[Tooltip("캐릭터가 선택되었을 때 색상")]
[SerializeField] protected Color selectedSkinColor = Color.red;
[DisableIf("@true")]
[SerializeField] private IslandInfo islandInfo;
[field: SerializeField] public PirateStat PirateStat { get; set; }
private PirateUnit pirateUnit;
private PirateUnit mouseEnterPirateUnit;
private UnitSelection unitSelection;
[SerializeField] protected bool isAttackCoroutine;
[SerializeField] private bool isCommanded;
#endregion
#region Unit Built-in methods
protected virtual void OnDrawGizmosSelected()
{
if (!isDrawGizmosInFieldOfView) return;
if (PirateStat.AttackerType == EAttackerType.OFFENSE)
{
if (!targetTransform) return;
Gizmos.color = Color.red;
Gizmos.DrawLine(transform.position, targetTransform.position);
}
else if (PirateStat.AttackerType == EAttackerType.DEFENSE)
{
if (PirateStat.DefenseType == EDefenseType.DEFENDER)
{
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(defensePos, PirateStat.DefenseRange);
}
Gizmos.color = Color.blue;
Gizmos.DrawWireSphere(transform.position, PirateStat.ViewRange);
if (!targetTransform) return;
Gizmos.color = Color.red;
Gizmos.DrawLine(transform.position, targetTransform.position);
}
}
private void OnMouseEnter()
{
if (!unitSelection || !unitSelection.IsSelectable) return;
@ -69,12 +102,68 @@ namespace BlueWaterProject
#endregion
#region IDamageable interface
public void TakeDamage(float attackerPower, float attackerShieldPenetrationRate, Vector3? attackPos = null)
{
if (attackPos != null && combatAgent.enabled && PirateStat.AttackerType == EAttackerType.DEFENSE && !targetTransform)
{
// BeAttackedMovement((Vector3)attackPos);
}
// 회피 성공 체크
if (Random.Range(0, 100) < PirateStat.AvoidanceRate)
{
// TODO : 회피 처리
return;
}
var finalDamage = 0f;
if (PirateStat.UsingShield)
{
var penetrationChance = attackerShieldPenetrationRate -
(attackerShieldPenetrationRate * PirateStat.PenetrationResistivity * 0.01f);
// 방패를 관통했다면,
if (Random.Range(0, 100) < penetrationChance)
{
finalDamage = attackerPower - PirateStat.Def;
finalDamage = Mathf.Max(finalDamage, 0);
}
else
{
finalDamage = 0f;
}
}
finalDamage = attackerPower - PirateStat.Def;
finalDamage = Mathf.Max(finalDamage, 0);
// 방패 막기 체크
if (finalDamage == 0f)
{
combatAnimator.SetTrigger(ShieldHash);
return;
}
var changeHp = Mathf.Max(PirateStat.CurrentHp - finalDamage, 0);
SetCurrentHp(changeHp);
// 죽었는지 체크
if (changeHp == 0f) return;
combatAnimator.SetTrigger(DamageHash);
}
#endregion
#region Custom methods
protected override void InitComponent()
{
base.InitComponent();
pirateUnit = Utils.GetComponentAndAssert<PirateUnit>(transform.parent);
unitSelection = Utils.GetComponentAndAssert<UnitSelection>(GameObject.Find("UnitManager").transform);
}
@ -98,6 +187,8 @@ namespace BlueWaterProject
InitViewModel(pirateViewData);
FindMaterial();
SetBehaviorTree(UnitManager.Inst.PirateBehaviorTree);
SetCurrentHp(PirateStat.MaxHp);
SetMoveSpeed(PirateStat.MoveSpd);
@ -105,6 +196,7 @@ namespace BlueWaterProject
{
defensePos = transform.position;
}
}
private void InitViewModel(PirateView pirateView)
@ -138,9 +230,164 @@ namespace BlueWaterProject
}
}
public void CommandMove(Vector3 movePos)
public void CommandMoveTarget(Vector3 movePos)
{
StartCoroutine(CommandMoveCoroutine(movePos));
}
private IEnumerator CommandMoveCoroutine(Vector3 movePos)
{
while (isAttacking)
{
yield return null;
}
combatAgent.SetDestination(movePos);
SetIsCommanded(true);
while (combatAgent.pathPending || combatAgent.remainingDistance > combatAgent.stoppingDistance)
{
yield return null;
}
SetIsCommanded(false);
}
public override void FindTarget()
{
switch (PirateStat.AttackerType)
{
case EAttackerType.NONE:
print("PirateStat.AttackerType == NONE Error");
break;
case EAttackerType.OFFENSE:
FindTargetInOffense();
break;
case EAttackerType.DEFENSE:
FindTargetInDefense();
break;
default:
throw new ArgumentOutOfRangeException();
}
}
public override bool CanAttack()
{
if (!targetTransform) return false;
var attackInRange = Vector3.Distance(transform.position, targetTransform.position) <= PirateStat.AtkRange;
return attackInRange;
}
public override void Attack()
{
isAttackCoroutine = true;
StartCoroutine(nameof(AttackAnimation));
}
protected abstract IEnumerator AttackAnimation();
private void FindTargetInOffense()
{
if (!attackingIslandInfo)
{
print("attackingIslandInfo == null error");
return;
}
switch (PirateStat.OffenseType)
{
case EOffenseType.NONE:
print("AiStat.OffenseType == NONE Error");
break;
case EOffenseType.NORMAL:
if (attackingIslandInfo.EnemyList.Count > 0)
{
FindNearestTargetInList(attackingIslandInfo.EnemyList);
}
else if (attackingIslandInfo.HouseList.Count > 0)
{
FindNearestTargetInList(attackingIslandInfo.HouseList);
}
break;
case EOffenseType.ONLY_HOUSE:
if (attackingIslandInfo.HouseList.Count > 0)
{
FindNearestTargetInList(attackingIslandInfo.HouseList);
}
else if (attackingIslandInfo.EnemyList.Count > 0)
{
FindNearestTargetInList(attackingIslandInfo.EnemyList);
}
break;
default:
throw new ArgumentOutOfRangeException();
}
}
protected virtual void FindNearestTargetInList(List<Transform> targetList)
{
if (targetList.Count <= 0) return;
var nearestTarget = targetList.OrderBy(t => t ?
Vector3.Distance(transform.position, t.position) : float.MaxValue).FirstOrDefault();
if (nearestTarget == null) return;
SetTargetTransform(nearestTarget);
}
private void FindTargetInDefense()
{
switch (PirateStat.DefenseType)
{
case EDefenseType.NONE:
print("EnemyStat.DefenseType == NONE Error");
break;
case EDefenseType.STRIKER:
FindNearestTargetInRange(transform.position, PirateStat.ViewRange);
break;
case EDefenseType.MIDFIELDER:
FindNearestTargetInRange(transform.position, PirateStat.ViewRange);
break;
case EDefenseType.DEFENDER:
FindNearestTargetInRange(defensePos, PirateStat.DefenseRange);
break;
case EDefenseType.KEEPER:
FindNearestTargetInRange(transform.position, PirateStat.ViewRange);
break;
default:
throw new ArgumentOutOfRangeException();
}
}
protected virtual void FindNearestTargetInRange(Vector3 centerPos, float range)
{
Array.Clear(colliderWithinRange, 0, TARGET_MAX_SIZE);
var maxColliderCount = Physics.OverlapSphereNonAlloc(centerPos, range, colliderWithinRange,
targetLayer, QueryTriggerInteraction.Collide);
if (maxColliderCount <= 0)
{
SetTargetTransform(null);
return;
}
var nearestDistance = Mathf.Infinity;
Transform nearestTargetTransform = null;
for (var i = 0; i < maxColliderCount; i++)
{
var distanceToTarget = Vector3.Distance(transform.position, colliderWithinRange[i].transform.position);
if (distanceToTarget >= nearestDistance) continue;
nearestDistance = distanceToTarget;
nearestTargetTransform = colliderWithinRange[i].transform;
}
SetTargetTransform(nearestTargetTransform);
}
private void SetOutlineColor(Color color)
@ -150,8 +397,33 @@ namespace BlueWaterProject
skin.SetColor(OutlineColorHash, color);
}
}
public void SetIsCommanded(bool value)
{
isCommanded = value;
var btIsCommanded = behaviorTree.GetVariable("IsCommanded");
btIsCommanded?.SetValue(value);
}
protected override void SetCurrentHp(float value) => PirateStat.CurrentHp = value;
protected override void SetCurrentHp(float value)
{
PirateStat.CurrentHp = value;
var btCurrentHp = behaviorTree.GetVariable("CurrentHp");
btCurrentHp?.SetValue(value);
}
protected override void RemoveAiListElement()
{
if (pirateUnit.pirateUnitStat.PirateAiList.Contains(this))
{
pirateUnit.pirateUnitStat.PirateAiList.Remove(this);
}
}
public bool GetIsAttackCoroutine() => isAttackCoroutine;
public bool GetIsCommanded() => isCommanded;
public void SetAttackerType(EAttackerType type) => PirateStat.AttackerType = type;
public void SetOffenseType(EOffenseType type) => PirateStat.OffenseType = type;
public void SetDefenseType(EDefenseType type) => PirateStat.DefenseType = type;

View File

@ -1,6 +1,10 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Pool;
using UnityEngine.Serialization;
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
@ -16,14 +20,47 @@ namespace BlueWaterProject
[Tooltip("화살 발사 후 오브젝트 저장될 위치")]
[SerializeField] private Transform arrowsPoolLocation;
[SerializeField] private LayerMask archerLayer;
[SerializeField] private LayerMask arrowLayer;
private IEnumerator shootArrowCoroutine;
private IObjectPool<Arrow> arrowPool;
[SerializeField] private Vector3 rayOffset = new(0f, 2f, 0);
[SerializeField] private Vector3 rayOffset = new(0f, 3.5f, 0);
#endregion
#region Unity built-in methods
protected override void OnDrawGizmosSelected()
{
if (!isDrawGizmosInFieldOfView) return;
if (PirateStat.AttackerType == EAttackerType.OFFENSE)
{
if (!targetTransform) return;
Gizmos.color = Color.red;
Gizmos.DrawLine(transform.position + rayOffset, targetTransform.position + rayOffset);
}
else if (PirateStat.AttackerType == EAttackerType.DEFENSE)
{
if (PirateStat.DefenseType == EDefenseType.DEFENDER)
{
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(defensePos, PirateStat.DefenseRange);
}
Gizmos.color = Color.blue;
Gizmos.DrawWireSphere(transform.position, PirateStat.ViewRange);
if (!targetTransform) return;
Gizmos.color = Color.red;
Gizmos.DrawLine(transform.position + rayOffset, targetTransform.position + rayOffset);
}
}
#endregion
#region Custom methods
@ -69,7 +106,7 @@ namespace BlueWaterProject
{
base.SetLayer();
archerLayer = LayerMask.GetMask("Ground") | LayerMask.GetMask("Water") |
arrowLayer = LayerMask.GetMask("Ground") | LayerMask.GetMask("Water") |
LayerMask.GetMask("Enemy") | LayerMask.GetMask("Props");
}
@ -80,6 +117,96 @@ namespace BlueWaterProject
SetAnimatorController("Archer");
}
protected override void FindNearestTargetInList(List<Transform> targetList)
{
if (targetList.Count <= 0) return;
var myPos = transform.position;
var nearestTarget = targetList.OrderBy(t => t && IsRaycastHitTarget(myPos, t)
? Vector3.Distance(myPos, t.position) : float.MaxValue).FirstOrDefault();
if (nearestTarget == null) return;
SetTargetTransform(nearestTarget);
}
protected override void FindNearestTargetInRange(Vector3 centerPos, float range)
{
Array.Clear(colliderWithinRange, 0, TARGET_MAX_SIZE);
var maxColliderCount = Physics.OverlapSphereNonAlloc(centerPos, range, colliderWithinRange,
targetLayer, QueryTriggerInteraction.Collide);
if (maxColliderCount <= 0)
{
SetTargetTransform(null);
return;
}
var nearestDistance = Mathf.Infinity;
Transform nearestTargetTransform = null;
for (var i = 0; i < maxColliderCount; i++)
{
var distanceToTarget = Vector3.Distance(transform.position, colliderWithinRange[i].transform.position);
if (!IsRaycastHitTarget(transform.position, colliderWithinRange[i].transform) || distanceToTarget >= nearestDistance) continue;
nearestDistance = distanceToTarget;
nearestTargetTransform = colliderWithinRange[i].transform;
}
SetTargetTransform(nearestTargetTransform);
}
private bool IsRaycastHitTarget(Vector3 myPos, Transform target)
{
var direction = ((target.position + rayOffset) - (myPos + rayOffset)).normalized;
var raycastHitTarget = Physics.Raycast(myPos + rayOffset, direction, out var hit, PirateStat.AtkRange, arrowLayer, QueryTriggerInteraction.Collide);
return raycastHitTarget && target == hit.transform;
}
protected override IEnumerator AttackAnimation()
{
combatAnimator.SetTrigger(AttackHash);
while (isAttacking)
{
yield return null;
}
yield return new WaitForSeconds(PirateStat.AtkCooldown);
isAttackCoroutine = false;
}
/// <summary>
/// Archer attack 애니메이션에 event 부착용 함수
/// </summary>
public void OnShootArrow()
{
if (!targetTransform) return;
var arrow = arrowPool.Get();
var isOffense = PirateStat.AttackerType == EAttackerType.OFFENSE;
arrow.SetShootingArrow(leftWeaponContainer.position, transform.position,
targetTransform.position + rayOffset, EAiType.PIRATE, PirateStat.Atk, PirateStat.ShieldPenetrationRate, PirateStat.Inaccuracy, isOffense);
arrow.ShootArrowCoroutine();
}
/// <summary>
/// Archer attack 애니메이션에 event 부착용 함수
/// </summary>
public void OnStoppedMove(int boolValue)
{
if (!combatAgent.enabled) return;
combatAgent.isStopped = boolValue == 1;
}
private void OnAttacking(int boolValue) => isAttacking = boolValue == 1;
#endregion
#region ObjectPool Function

View File

@ -1,3 +1,4 @@
using System.Collections;
using Unity.VisualScripting;
using UnityEngine;
@ -6,8 +7,14 @@ namespace BlueWaterProject
{
public class PirateAxeman : PirateAi
{
#region Properties and variables
private CloseWeapon closeWeapon;
#endregion
#region Custom methods
protected override void InitStart()
{
base.InitStart();
@ -28,5 +35,25 @@ namespace BlueWaterProject
closeWeapon.SetAttackerAiType(EAiType.PIRATE);
closeWeapon.SetBoxCollider();
}
protected override IEnumerator AttackAnimation()
{
closeWeapon.SetIsAttacked(false);
closeWeapon.SetWeaponStat(PirateStat.Atk, PirateStat.ShieldPenetrationRate, PirateStat.AttackerType == EAttackerType.OFFENSE);
combatAnimator.SetTrigger(AttackHash);
while (isAttacking)
{
yield return null;
}
yield return new WaitForSeconds(PirateStat.AtkCooldown);
isAttackCoroutine = false;
}
private void SetCloseWeaponCanAttack(int boolValue) => closeWeapon.SetCanAttack(boolValue == 1);
private void OnAttacking(int boolValue) => isAttacking = boolValue == 1;
#endregion
}
}

View File

@ -1,3 +1,4 @@
using System.Collections;
using Unity.VisualScripting;
using UnityEngine;
@ -6,8 +7,14 @@ namespace BlueWaterProject
{
public class PirateSpearman : PirateAi
{
#region Properties and variables
private CloseWeapon closeWeapon;
#endregion
#region Custom methods
protected override void InitStart()
{
base.InitStart();
@ -28,5 +35,25 @@ namespace BlueWaterProject
closeWeapon.SetAttackerAiType(EAiType.PIRATE);
closeWeapon.SetBoxCollider();
}
protected override IEnumerator AttackAnimation()
{
closeWeapon.SetIsAttacked(false);
closeWeapon.SetWeaponStat(PirateStat.Atk, PirateStat.ShieldPenetrationRate, PirateStat.AttackerType == EAttackerType.OFFENSE);
combatAnimator.SetTrigger(AttackHash);
while (isAttacking)
{
yield return null;
}
yield return new WaitForSeconds(PirateStat.AtkCooldown);
isAttackCoroutine = false;
}
private void SetCloseWeaponCanAttack(int boolValue) => closeWeapon.SetCanAttack(boolValue == 1);
private void OnAttacking(int boolValue) => isAttacking = boolValue == 1;
#endregion
}
}

View File

@ -1,3 +1,4 @@
using System.Collections;
using Unity.VisualScripting;
using UnityEngine;
@ -6,8 +7,14 @@ namespace BlueWaterProject
{
public class PirateSwordKnight : PirateAi
{
#region Properties and variables
private CloseWeapon closeWeapon;
#endregion
#region Custom methods
protected override void InitStart()
{
base.InitStart();
@ -28,5 +35,25 @@ namespace BlueWaterProject
closeWeapon.SetAttackerAiType(EAiType.PIRATE);
closeWeapon.SetBoxCollider();
}
protected override IEnumerator AttackAnimation()
{
closeWeapon.SetIsAttacked(false);
closeWeapon.SetWeaponStat(PirateStat.Atk, PirateStat.ShieldPenetrationRate, PirateStat.AttackerType == EAttackerType.OFFENSE);
combatAnimator.SetTrigger(AttackHash);
while (isAttacking)
{
yield return null;
}
yield return new WaitForSeconds(PirateStat.AtkCooldown);
isAttackCoroutine = false;
}
private void SetCloseWeaponCanAttack(int boolValue) => closeWeapon.SetCanAttack(boolValue == 1);
private void OnAttacking(int boolValue) => isAttacking = boolValue == 1;
#endregion
}
}

View File

@ -1,3 +1,4 @@
using System.Collections;
using Unity.VisualScripting;
using UnityEngine;
@ -6,8 +7,14 @@ namespace BlueWaterProject
{
public class PirateSwordman : PirateAi
{
#region Properties and variables
private CloseWeapon closeWeapon;
#endregion
#region Custom methods
protected override void InitStart()
{
base.InitStart();
@ -28,5 +35,25 @@ namespace BlueWaterProject
closeWeapon.SetAttackerAiType(EAiType.PIRATE);
closeWeapon.SetBoxCollider();
}
protected override IEnumerator AttackAnimation()
{
closeWeapon.SetIsAttacked(false);
closeWeapon.SetWeaponStat(PirateStat.Atk, PirateStat.ShieldPenetrationRate, PirateStat.AttackerType == EAttackerType.OFFENSE);
combatAnimator.SetTrigger(AttackHash);
while (isAttacking)
{
yield return null;
}
yield return new WaitForSeconds(PirateStat.AtkCooldown);
isAttackCoroutine = false;
}
private void SetCloseWeaponCanAttack(int boolValue) => closeWeapon.SetCanAttack(boolValue == 1);
private void OnAttacking(int boolValue) => isAttacking = boolValue == 1;
#endregion
}
}

View File

@ -1,3 +1,4 @@
using System;
using Sirenix.OdinInspector;
using UnityEngine;
@ -11,6 +12,7 @@ namespace BlueWaterProject
[PropertyOrder(-10)]
public EnemyUnitStat enemyUnitStat;
private Vector3[] defensePos;
private bool isClickedTypeAllButton;
#endregion
@ -19,7 +21,7 @@ namespace BlueWaterProject
private void OnDrawGizmosSelected()
{
if (!Application.isPlaying || enemyUnitStat == null || enemyUnitStat.SailorCount <= 0) return;
if (Application.isPlaying || enemyUnitStat == null || enemyUnitStat.SailorCount <= 0) return;
foreach (var item in enemyUnitStat.EnemyAiList)
{
@ -30,6 +32,11 @@ namespace BlueWaterProject
}
}
private void Awake()
{
defensePos = new Vector3[enemyUnitStat.EnemyAiList.Count];
}
#endregion
#region Custom function
@ -58,7 +65,7 @@ namespace BlueWaterProject
private bool CanAssignUnit()
{
return UnitManager.Inst.CanAssignUnit(this, transform.position);
return !Application.isPlaying && UnitManager.Inst.CanAssignUnit(this, transform.position);
}
[PropertyOrder(-7)]
@ -75,10 +82,20 @@ namespace BlueWaterProject
};
isClickedTypeAllButton = false;
}
public void ResetDefensePos()
{
for (var i = 0; i < enemyUnitStat.EnemyAiList.Count; i++)
{
enemyUnitStat.EnemyAiList[i].SetDefensePos(defensePos[i]);
}
}
private Color GetCreateUnitButtonColor() => enemyUnitStat.EnemyAiList.Count > 0 ? Color.white : Color.green;
private Color GetTypeAllButtonColor() => isClickedTypeAllButton ? Color.white : Color.green;
private void OnTypeChanged() => isClickedTypeAllButton = false;
public Vector3 GetDefensePos(int index) => defensePos[index];
public void SetDefensePos(Vector3 pos, int index) => defensePos[index] = pos;
#endregion
}

View File

@ -50,7 +50,7 @@ namespace BlueWaterProject
var xOffset = (j - (gridSize - 1) / 2.0f) * UnitManager.Inst.UnitSpacing;
var movePos = targetPos + new Vector3(xOffset, 0, zOffset);
pirateUnitStat.PirateAiList[currentPos].CommandMove(movePos);
pirateUnitStat.PirateAiList[currentPos].CommandMoveTarget(movePos);
}
}
}

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using BehaviorDesigner.Runtime;
using Sirenix.OdinInspector;
using UnityEditor.Animations;
using UnityEngine;
@ -19,6 +20,12 @@ namespace BlueWaterProject
[Tooltip("화살 프리팹")]
[field: SerializeField] public GameObject ArrowPrefab { get; private set; }
[Tooltip("Enemy 비헤이비어 트리")]
[field: SerializeField] public ExternalBehaviorTree EnemyBehaviorTree { get; private set; }
[Tooltip("Pirate 비헤이비어 트리")]
[field: SerializeField] public ExternalBehaviorTree PirateBehaviorTree { get; private set; }
[Tooltip("바닥 레이어")]
[field: SerializeField] public LayerMask GroundLayer { get; private set; }
@ -65,22 +72,24 @@ namespace BlueWaterProject
/// 프리팹 초기화 함수
/// </summary>
[GUIColor(0, 1, 0)]
[ShowIf("@PiratePrefab == null || BaseHumanPrefab == null || ArrowPrefab == null ||" +
[ShowIf("@PiratePrefab == null || BaseHumanPrefab == null || ArrowPrefab == null || EnemyBehaviorTree == null || PirateBehaviorTree == null ||" +
"AIAnimatorControllerList == null || AIAnimatorControllerList.Count != ANIMATOR_CONTROLLER_PREFAB_CAPACITY")]
[Button("프리팹 초기화")]
private void InitCharacterPrefabList()
{
PiratePrefab = Utils.LoadPrefabFromFolder("Assets/05.Prefabs/Character/Unit", "PirateUnit");
BaseHumanPrefab = Utils.LoadPrefabFromFolder("Assets/05.Prefabs/Character", "BaseHuman");
ArrowPrefab = Utils.LoadPrefabFromFolder("Assets/05.Prefabs", "Arrow_01");
PiratePrefab = Utils.LoadFromFolder<GameObject>("Assets/05.Prefabs/Character/Unit", "PirateUnit", ".prefab");
BaseHumanPrefab = Utils.LoadFromFolder<GameObject>("Assets/05.Prefabs/Character", "BaseHuman", ".prefab");
ArrowPrefab = Utils.LoadFromFolder<GameObject>("Assets/05.Prefabs", "Arrow_01", ".prefab");
EnemyBehaviorTree = Utils.LoadFromFolder<ExternalBehaviorTree>("Assets/09.BehaviorTree/Enemy", "BaseEnemyAi", ".asset");
PirateBehaviorTree = Utils.LoadFromFolder<ExternalBehaviorTree>("Assets/09.BehaviorTree/Pirate", "BasePirateAi", ".asset");
AIAnimatorControllerList = new List<AnimatorController>(ANIMATOR_CONTROLLER_PREFAB_CAPACITY)
{
Utils.LoadAnimatorControllerFromFolder("Assets/07.Animation", "Archer"),
Utils.LoadAnimatorControllerFromFolder("Assets/07.Animation", "Axeman"),
Utils.LoadAnimatorControllerFromFolder("Assets/07.Animation", "SpearKnight"),
Utils.LoadAnimatorControllerFromFolder("Assets/07.Animation", "Spearman"),
Utils.LoadAnimatorControllerFromFolder("Assets/07.Animation", "SwordKnight"),
Utils.LoadAnimatorControllerFromFolder("Assets/07.Animation", "Swordman")
Utils.LoadFromFolder<AnimatorController>("Assets/07.Animation", "Archer", ".controller"),
Utils.LoadFromFolder<AnimatorController>("Assets/07.Animation", "Axeman", ".controller"),
Utils.LoadFromFolder<AnimatorController>("Assets/07.Animation", "SpearKnight", ".controller"),
Utils.LoadFromFolder<AnimatorController>("Assets/07.Animation", "Spearman", ".controller"),
Utils.LoadFromFolder<AnimatorController>("Assets/07.Animation", "SwordKnight", ".controller"),
Utils.LoadFromFolder<AnimatorController>("Assets/07.Animation", "Swordman", ".controller")
};
}
#endif
@ -424,7 +433,7 @@ namespace BlueWaterProject
{
if (isOffense)
{
unit.SetIslandInfo(hitIslandInfo);
unit.SetAttackingIslandInfo(hitIslandInfo);
}
unit.gameObject.SetActive(true);
}

View File

@ -23,7 +23,7 @@ MonoBehaviour:
<CurrentHp>k__BackingField: 0
<Atk>k__BackingField: 50
<Def>k__BackingField: 0
<MoveSpd>k__BackingField: 5
<MoveSpd>k__BackingField: 7
<AtkCooldown>k__BackingField: 3
<ViewRange>k__BackingField: 40
<AtkRange>k__BackingField: 40
@ -44,7 +44,7 @@ MonoBehaviour:
<CurrentHp>k__BackingField: 0
<Atk>k__BackingField: 40
<Def>k__BackingField: 10
<MoveSpd>k__BackingField: 4.5
<MoveSpd>k__BackingField: 6.5
<AtkCooldown>k__BackingField: 2
<ViewRange>k__BackingField: 10
<AtkRange>k__BackingField: 3.5
@ -65,11 +65,11 @@ MonoBehaviour:
<CurrentHp>k__BackingField: 0
<Atk>k__BackingField: 50
<Def>k__BackingField: 5
<MoveSpd>k__BackingField: 5.5
<MoveSpd>k__BackingField: 7.5
<AtkCooldown>k__BackingField: 2
<ViewRange>k__BackingField: 15
<AtkRange>k__BackingField: 3.5
<DefenseRange>k__BackingField: 0
<DefenseRange>k__BackingField: 15
<ShieldPenetrationRate>k__BackingField: 75
<AvoidanceRate>k__BackingField: 20
<UsingShield>k__BackingField: 0
@ -86,11 +86,11 @@ MonoBehaviour:
<CurrentHp>k__BackingField: 0
<Atk>k__BackingField: 30
<Def>k__BackingField: 10
<MoveSpd>k__BackingField: 5
<MoveSpd>k__BackingField: 7
<AtkCooldown>k__BackingField: 1.5
<ViewRange>k__BackingField: 10
<AtkRange>k__BackingField: 3
<DefenseRange>k__BackingField: 0
<DefenseRange>k__BackingField: 10
<ShieldPenetrationRate>k__BackingField: 50
<AvoidanceRate>k__BackingField: 10
<UsingShield>k__BackingField: 1
@ -107,11 +107,11 @@ MonoBehaviour:
<CurrentHp>k__BackingField: 0
<Atk>k__BackingField: 35
<Def>k__BackingField: 5
<MoveSpd>k__BackingField: 6
<MoveSpd>k__BackingField: 8
<AtkCooldown>k__BackingField: 1.5
<ViewRange>k__BackingField: 15
<AtkRange>k__BackingField: 3
<DefenseRange>k__BackingField: 0
<DefenseRange>k__BackingField: 15
<ShieldPenetrationRate>k__BackingField: 50
<AvoidanceRate>k__BackingField: 30
<UsingShield>k__BackingField: 0
@ -128,7 +128,7 @@ MonoBehaviour:
<CurrentHp>k__BackingField: 0
<Atk>k__BackingField: 50
<Def>k__BackingField: 0
<MoveSpd>k__BackingField: 5
<MoveSpd>k__BackingField: 7
<AtkCooldown>k__BackingField: 3
<ViewRange>k__BackingField: 40
<AtkRange>k__BackingField: 40
@ -149,7 +149,7 @@ MonoBehaviour:
<CurrentHp>k__BackingField: 0
<Atk>k__BackingField: 40
<Def>k__BackingField: 10
<MoveSpd>k__BackingField: 4.5
<MoveSpd>k__BackingField: 6.5
<AtkCooldown>k__BackingField: 2
<ViewRange>k__BackingField: 10
<AtkRange>k__BackingField: 3.5
@ -170,11 +170,11 @@ MonoBehaviour:
<CurrentHp>k__BackingField: 0
<Atk>k__BackingField: 50
<Def>k__BackingField: 5
<MoveSpd>k__BackingField: 5.5
<MoveSpd>k__BackingField: 7.5
<AtkCooldown>k__BackingField: 2
<ViewRange>k__BackingField: 15
<AtkRange>k__BackingField: 3.5
<DefenseRange>k__BackingField: 0
<DefenseRange>k__BackingField: 15
<ShieldPenetrationRate>k__BackingField: 75
<AvoidanceRate>k__BackingField: 20
<UsingShield>k__BackingField: 0
@ -191,11 +191,11 @@ MonoBehaviour:
<CurrentHp>k__BackingField: 0
<Atk>k__BackingField: 30
<Def>k__BackingField: 10
<MoveSpd>k__BackingField: 5
<MoveSpd>k__BackingField: 7
<AtkCooldown>k__BackingField: 1.5
<ViewRange>k__BackingField: 10
<AtkRange>k__BackingField: 3
<DefenseRange>k__BackingField: 0
<DefenseRange>k__BackingField: 10
<ShieldPenetrationRate>k__BackingField: 50
<AvoidanceRate>k__BackingField: 10
<UsingShield>k__BackingField: 1
@ -212,11 +212,11 @@ MonoBehaviour:
<CurrentHp>k__BackingField: 0
<Atk>k__BackingField: 35
<Def>k__BackingField: 5
<MoveSpd>k__BackingField: 6
<MoveSpd>k__BackingField: 8
<AtkCooldown>k__BackingField: 1.5
<ViewRange>k__BackingField: 15
<AtkRange>k__BackingField: 3
<DefenseRange>k__BackingField: 0
<DefenseRange>k__BackingField: 15
<ShieldPenetrationRate>k__BackingField: 50
<AvoidanceRate>k__BackingField: 30
<UsingShield>k__BackingField: 0

View File

@ -23,7 +23,7 @@ MonoBehaviour:
<CurrentHp>k__BackingField: 0
<Atk>k__BackingField: 50
<Def>k__BackingField: 0
<MoveSpd>k__BackingField: 5
<MoveSpd>k__BackingField: 7
<AtkCooldown>k__BackingField: 3
<ViewRange>k__BackingField: 40
<AtkRange>k__BackingField: 40
@ -44,13 +44,13 @@ MonoBehaviour:
<CurrentHp>k__BackingField: 0
<Atk>k__BackingField: 50
<Def>k__BackingField: 0
<MoveSpd>k__BackingField: 5
<MoveSpd>k__BackingField: 7
<AtkCooldown>k__BackingField: 2.5
<ViewRange>k__BackingField: 15
<AtkRange>k__BackingField: 3.5
<DefenseRange>k__BackingField: 0
<ShieldPenetrationRate>k__BackingField: 0
<AvoidanceRate>k__BackingField: 100
<DefenseRange>k__BackingField: 15
<ShieldPenetrationRate>k__BackingField: 100
<AvoidanceRate>k__BackingField: 0
<UsingShield>k__BackingField: 0
<PenetrationResistivity>k__BackingField: 0
<UsingBow>k__BackingField: 0
@ -65,11 +65,11 @@ MonoBehaviour:
<CurrentHp>k__BackingField: 0
<Atk>k__BackingField: 50
<Def>k__BackingField: 5
<MoveSpd>k__BackingField: 5.5
<MoveSpd>k__BackingField: 7.5
<AtkCooldown>k__BackingField: 2
<ViewRange>k__BackingField: 15
<AtkRange>k__BackingField: 3.5
<DefenseRange>k__BackingField: 0
<DefenseRange>k__BackingField: 15
<ShieldPenetrationRate>k__BackingField: 75
<AvoidanceRate>k__BackingField: 20
<UsingShield>k__BackingField: 0
@ -86,11 +86,11 @@ MonoBehaviour:
<CurrentHp>k__BackingField: 0
<Atk>k__BackingField: 30
<Def>k__BackingField: 10
<MoveSpd>k__BackingField: 5
<MoveSpd>k__BackingField: 7
<AtkCooldown>k__BackingField: 1.5
<ViewRange>k__BackingField: 10
<AtkRange>k__BackingField: 3
<DefenseRange>k__BackingField: 0
<DefenseRange>k__BackingField: 10
<ShieldPenetrationRate>k__BackingField: 50
<AvoidanceRate>k__BackingField: 10
<UsingShield>k__BackingField: 1
@ -107,11 +107,11 @@ MonoBehaviour:
<CurrentHp>k__BackingField: 0
<Atk>k__BackingField: 35
<Def>k__BackingField: 5
<MoveSpd>k__BackingField: 6
<MoveSpd>k__BackingField: 8
<AtkCooldown>k__BackingField: 1.5
<ViewRange>k__BackingField: 15
<AtkRange>k__BackingField: 3
<DefenseRange>k__BackingField: 0
<DefenseRange>k__BackingField: 15
<ShieldPenetrationRate>k__BackingField: 50
<AvoidanceRate>k__BackingField: 30
<UsingShield>k__BackingField: 0
@ -128,7 +128,7 @@ MonoBehaviour:
<CurrentHp>k__BackingField: 0
<Atk>k__BackingField: 50
<Def>k__BackingField: 0
<MoveSpd>k__BackingField: 5
<MoveSpd>k__BackingField: 7
<AtkCooldown>k__BackingField: 3
<ViewRange>k__BackingField: 40
<AtkRange>k__BackingField: 40
@ -149,13 +149,13 @@ MonoBehaviour:
<CurrentHp>k__BackingField: 0
<Atk>k__BackingField: 40
<Def>k__BackingField: 10
<MoveSpd>k__BackingField: 4.5
<MoveSpd>k__BackingField: 6.5
<AtkCooldown>k__BackingField: 2
<ViewRange>k__BackingField: 10
<AtkRange>k__BackingField: 3.5
<DefenseRange>k__BackingField: 10
<ShieldPenetrationRate>k__BackingField: 75
<AvoidanceRate>k__BackingField: 10
<ShieldPenetrationRate>k__BackingField: 100
<AvoidanceRate>k__BackingField: 0
<UsingShield>k__BackingField: 0
<PenetrationResistivity>k__BackingField: 0
<UsingBow>k__BackingField: 0
@ -170,11 +170,11 @@ MonoBehaviour:
<CurrentHp>k__BackingField: 0
<Atk>k__BackingField: 50
<Def>k__BackingField: 5
<MoveSpd>k__BackingField: 5.5
<MoveSpd>k__BackingField: 7.5
<AtkCooldown>k__BackingField: 2
<ViewRange>k__BackingField: 15
<AtkRange>k__BackingField: 3.5
<DefenseRange>k__BackingField: 0
<DefenseRange>k__BackingField: 15
<ShieldPenetrationRate>k__BackingField: 75
<AvoidanceRate>k__BackingField: 20
<UsingShield>k__BackingField: 0
@ -191,11 +191,11 @@ MonoBehaviour:
<CurrentHp>k__BackingField: 0
<Atk>k__BackingField: 30
<Def>k__BackingField: 10
<MoveSpd>k__BackingField: 5
<MoveSpd>k__BackingField: 7
<AtkCooldown>k__BackingField: 1.5
<ViewRange>k__BackingField: 10
<AtkRange>k__BackingField: 3
<DefenseRange>k__BackingField: 0
<DefenseRange>k__BackingField: 10
<ShieldPenetrationRate>k__BackingField: 50
<AvoidanceRate>k__BackingField: 10
<UsingShield>k__BackingField: 1
@ -212,11 +212,11 @@ MonoBehaviour:
<CurrentHp>k__BackingField: 0
<Atk>k__BackingField: 35
<Def>k__BackingField: 5
<MoveSpd>k__BackingField: 6
<MoveSpd>k__BackingField: 8
<AtkCooldown>k__BackingField: 1.5
<ViewRange>k__BackingField: 15
<AtkRange>k__BackingField: 3
<DefenseRange>k__BackingField: 0
<DefenseRange>k__BackingField: 15
<ShieldPenetrationRate>k__BackingField: 50
<AvoidanceRate>k__BackingField: 30
<UsingShield>k__BackingField: 0

View File

@ -92,8 +92,8 @@ namespace BlueWaterProject
{
if (!unit.gameObject.activeSelf) continue;
//var aiController = enemy.GetComponent<AiController>();
//aiController.SetIslandInfo(this);
var combatAi = enemy.GetComponent<CombatAi>();
combatAi.SetDefendingIslandInfo(this);
EnemyList.Add(enemy);
}
}
@ -123,8 +123,8 @@ namespace BlueWaterProject
TargetAllList.Remove(element);
}
CleanupList(list);
CleanupList(TargetAllList);
//CleanupList(list);
//CleanupList(TargetAllList);
}
private void CleanupList(List<Transform> list)

View File

@ -6,6 +6,7 @@ using UnityEngine;
using UnityEngine.AI;
using UnityEngine.Assertions;
using Debug = UnityEngine.Debug;
using Object = UnityEngine.Object;
using Random = UnityEngine.Random;
// ReSharper disable once CheckNamespace
@ -140,18 +141,11 @@ namespace BlueWaterProject
}
#if UNITY_EDITOR
public static GameObject LoadPrefabFromFolder(string folderPath, string prefabName)
public static T LoadFromFolder<T>(string folderPath, string name, string extension) where T : Object
{
var fullPath = System.IO.Path.Combine(folderPath, prefabName + ".prefab");
var prefab = AssetDatabase.LoadAssetAtPath<GameObject>(fullPath);
return prefab;
}
public static AnimatorController LoadAnimatorControllerFromFolder(string folderPath, string name)
{
var fullPath = System.IO.Path.Combine(folderPath, name + ".controller");
var prefab = AssetDatabase.LoadAssetAtPath<AnimatorController>(fullPath);
return prefab;
var fullPath = System.IO.Path.Combine(folderPath, name + extension);
var t = AssetDatabase.LoadAssetAtPath<T>(fullPath);
return t;
}
#endif
}

View File

@ -21,13 +21,14 @@ namespace BlueWaterProject
private bool isOffense;
private float g = Mathf.Abs(Physics.gravity.y);
private float inaccuracy;
private float atk;
private float shieldPenetrationRate;
private Vector3? attackerPos;
private Vector3 targetPos;
private EAiType attackerAiType;
public Coroutine shootCoroutine;
private Transform attackerTransform;
private EnemyStat attackerStat;
private Rigidbody arrowRigidbody;
private IObjectPool<Arrow> managedArrowPool;
@ -60,10 +61,22 @@ namespace BlueWaterProject
}
else if (other.gameObject.layer == LayerMask.NameToLayer("Props"))
{
if (!isOffense) return;
isAttacked = true;
DestroyObject();
if (isOffense)
{
if (other.gameObject.CompareTag("House"))
{
var iDamageable = other.GetComponentInParent<IDamageable>();
iDamageable.TakeDamage(atk, shieldPenetrationRate);
isAttacked = true;
DestroyObject();
}
}
else
{
isAttacked = true;
DestroyObject();
}
}
else if (other.gameObject.layer == LayerMask.NameToLayer("HitBox"))
{
@ -92,7 +105,7 @@ namespace BlueWaterProject
if (attackerPos != null)
{
iDamageable.TakeDamage(attackerStat.Atk, attackerStat.ShieldPenetrationRate, (Vector3)attackerPos);
iDamageable.TakeDamage(atk, shieldPenetrationRate, (Vector3)attackerPos);
}
isAttacked = true;
DestroyObject();
@ -164,7 +177,8 @@ namespace BlueWaterProject
/// <summary>
/// 화살이 발사 되기 직전에 필요한 데이터들을 입력받는 함수
/// </summary>
public void SetShootingArrow(Vector3 shootLocationPos, Vector3? attackPos, Vector3 targetPosition, EnemyStat attackerAiStat, EAiType aiType, float inaccuracyValue, bool isOffense)
public void SetShootingArrow(Vector3 shootLocationPos, Vector3? attackPos, Vector3 targetPosition, EAiType aiType,
float atkStat, float shieldPenetrationRateStat, float inaccuracyStat, bool isOffense)
{
isAttacked = false;
transform.position = shootLocationPos;
@ -173,9 +187,10 @@ namespace BlueWaterProject
attackerPos = (Vector3)attackPos;
}
targetPos = targetPosition;
attackerStat = attackerAiStat;
attackerAiType = aiType;
inaccuracy = inaccuracyValue;
atk = atkStat;
shieldPenetrationRate = shieldPenetrationRateStat;
inaccuracy = inaccuracyStat;
this.isOffense = isOffense;
}

View File

@ -9,9 +9,11 @@ namespace BlueWaterProject
#region Property and variable
private bool isAttacked;
private bool isOffense;
private EAiType attackerAiType;
private EnemyStat attackerStat;
private float atk;
private float shieldPenetrationRate;
private bool isInit;
private bool canAttack;
@ -49,10 +51,22 @@ namespace BlueWaterProject
var iDamageable = other.GetComponentInParent<IDamageable>();
iDamageable.TakeDamage(attackerStat.Atk, attackerStat.ShieldPenetrationRate);
iDamageable.TakeDamage(atk, shieldPenetrationRate);
isAttacked = true;
}
else if (other.gameObject.layer == LayerMask.NameToLayer("Props"))
{
if (!isOffense) return;
if (other.gameObject.CompareTag("House"))
{
var iDamageable = other.GetComponentInParent<IDamageable>();
iDamageable.TakeDamage(atk, shieldPenetrationRate);
isAttacked = true;
}
}
}
#endregion
@ -74,9 +88,15 @@ namespace BlueWaterProject
isInit = true;
}
public void SetWeaponStat(float atkStat, float shieldPenetrationRateStat, bool isOffense)
{
atk = atkStat;
shieldPenetrationRate = shieldPenetrationRateStat;
this.isOffense = isOffense;
}
public void SetIsAttacked(bool value) => isAttacked = value;
public void SetAttackerAiType(EAiType value) => attackerAiType = value;
public void SetAttackerStat(EnemyStat value) => attackerStat = value;
public void SetCanAttack(bool value) => canAttack = value;
#endregion

View File

@ -147,4 +147,4 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
autoDestroyTime: 5
arrowSpeed: 20
arrowSpeed: 30

View File

@ -8899,14 +8899,14 @@ NavMeshAgent:
m_GameObject: {fileID: 155132}
m_Enabled: 1
m_AgentTypeID: 0
m_Radius: 0.5
m_Radius: 0.3
m_Speed: 3
m_Acceleration: 20
avoidancePriority: 50
m_AngularSpeed: 180
m_StoppingDistance: 3
m_AutoTraverseOffMeshLink: 1
m_AutoBraking: 1
m_AutoBraking: 0
m_AutoRepath: 1
m_Height: 1.6
m_BaseOffset: 0

View File

@ -36177,13 +36177,6 @@ AnimationClip:
m_HasGenericRootTransform: 0
m_HasMotionFloatCurves: 0
m_Events:
- time: 0
functionName: OnStoppedMove
data:
objectReferenceParameter: {fileID: 0}
floatParameter: 0
intParameter: 1
messageOptions: 0
- time: 0
functionName: OnAttacking
data:
@ -36198,13 +36191,6 @@ AnimationClip:
floatParameter: 0
intParameter: 0
messageOptions: 0
- time: 1.5
functionName: OnStoppedMove
data:
objectReferenceParameter: {fileID: 0}
floatParameter: 0
intParameter: 0
messageOptions: 0
- time: 1.5
functionName: OnAttacking
data:

View File

@ -37527,13 +37527,6 @@ AnimationClip:
m_HasGenericRootTransform: 0
m_HasMotionFloatCurves: 0
m_Events:
- time: 0
functionName: OnStoppedMove
data:
objectReferenceParameter: {fileID: 0}
floatParameter: 0
intParameter: 1
messageOptions: 0
- time: 0
functionName: OnAttacking
data:
@ -37548,13 +37541,6 @@ AnimationClip:
floatParameter: 0
intParameter: 0
messageOptions: 0
- time: 1.5
functionName: OnStoppedMove
data:
objectReferenceParameter: {fileID: 0}
floatParameter: 0
intParameter: 0
messageOptions: 0
- time: 1.5
functionName: OnAttacking
data:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b7b7d5fff2fc8b0489c464a23e8dcdc9
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -10,7 +10,7 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b23f08d2ae4cba14087c1ed36193d82b, type: 3}
m_Name: BaseCharacter
m_Name: BaseEnemyAi
m_EditorClassIdentifier:
mBehaviorSource:
behaviorName: BaseCharacter
@ -20,12 +20,14 @@ MonoBehaviour:
parentIndex:
startIndex:
variableStartIndex:
JSONSerialization: '{"EntryTask":{"Type":"BehaviorDesigner.Runtime.Tasks.EntryTask","NodeData":{"Offset":"(337,90)"},"ID":0,"Name":"Entry","Instant":true},"RootTask":{"Type":"BehaviorDesigner.Runtime.Tasks.Repeater","NodeData":{"Offset":"(4.152649,113.838943)"},"ID":1,"Name":"Repeater","Instant":true,"SharedIntcount":{"Type":"BehaviorDesigner.Runtime.SharedInt","Name":null,"Int32mValue":0},"SharedBoolrepeatForever":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":true},"SharedBoolendOnFailure":{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":null,"BooleanmValue":false},"Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Selector","NodeData":{"Offset":"(-2.63156128,120)"},"ID":2,"Name":"Selector","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(-214.714264,143)"},"ID":3,"Name":"Offense
JSONSerialization: '{"EntryTask":{"Type":"BehaviorDesigner.Runtime.Tasks.EntryTask","NodeData":{"Offset":"(347,100)"},"ID":0,"Name":"Entry","Instant":true},"RootTask":{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(-4,151)"},"ID":1,"Name":"Init
Sequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BlueWaterProject.InitBaseEnemy","NodeData":{"Offset":"(-185.5,146)"},"ID":2,"Name":"Init
Base Enemy","Instant":true,"SharedAttackerTypeattackerType":{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":"AttackerType","IsShared":true,"EAttackerTypemValue":"NONE"}},{"Type":"BehaviorDesigner.Runtime.Tasks.Selector","NodeData":{"Offset":"(200,150)"},"ID":3,"Name":"Selector","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(-214.714264,143)"},"ID":4,"Name":"Offense
Sequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Unity.SharedVariables.CompareSharedAttackerType","NodeData":{"Offset":"(-129,123)","Comment":"AttackerType
== OFFENSE"},"ID":4,"Name":"Compare Shared Attacker Type","Instant":true,"SharedAttackerTypevariable":{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":"AttackerType","IsShared":true,"EAttackerTypemValue":"NONE"},"SharedAttackerTypecompareTo":{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":null,"EAttackerTypemValue":"OFFENSE"}},{"Type":"BehaviorDesigner.Runtime.Tasks.BehaviorTreeReference","NodeData":{"Offset":"(110,120)"},"ID":5,"Name":"Offense
Behavior","Instant":true,"ExternalBehavior[]externalBehaviors":[0],"SharedNamedVariable[]variables":[],"Booleancollapsed":false}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(274.264343,138.636353)"},"ID":6,"Name":"Defense
== OFFENSE"},"ID":5,"Name":"Compare Shared Attacker Type","Instant":true,"SharedAttackerTypevariable":{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":"AttackerType","IsShared":true,"EAttackerTypemValue":"NONE"},"SharedAttackerTypecompareTo":{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":null,"EAttackerTypemValue":"OFFENSE"}},{"Type":"BehaviorDesigner.Runtime.Tasks.BehaviorTreeReference","NodeData":{"Offset":"(110,120)"},"ID":6,"Name":"Offense
Behavior","Instant":true,"ExternalBehavior[]externalBehaviors":[0],"SharedNamedVariable[]variables":[],"Booleancollapsed":false}]},{"Type":"BehaviorDesigner.Runtime.Tasks.Sequence","NodeData":{"Offset":"(274.264343,138.636353)"},"ID":7,"Name":"Defense
Sequence","Instant":true,"AbortTypeabortType":"None","Children":[{"Type":"BehaviorDesigner.Runtime.Tasks.Unity.SharedVariables.CompareSharedAttackerType","NodeData":{"Offset":"(-130,119.999969)","Comment":"AttackerType
== DEFENSE"},"ID":7,"Name":"Compare Shared Attacker Type","Instant":true,"SharedAttackerTypevariable":{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":"AttackerType","IsShared":true,"EAttackerTypemValue":"NONE"},"SharedAttackerTypecompareTo":{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":null,"EAttackerTypemValue":"DEFENSE"}},{"Type":"BehaviorDesigner.Runtime.Tasks.BehaviorTreeReference","NodeData":{"Offset":"(110,119.999969)"},"ID":8,"Name":"Defense
== DEFENSE"},"ID":8,"Name":"Compare Shared Attacker Type","Instant":true,"SharedAttackerTypevariable":{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":"AttackerType","IsShared":true,"EAttackerTypemValue":"NONE"},"SharedAttackerTypecompareTo":{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":null,"EAttackerTypemValue":"DEFENSE"}},{"Type":"BehaviorDesigner.Runtime.Tasks.BehaviorTreeReference","NodeData":{"Offset":"(110,119.999969)"},"ID":9,"Name":"Defense
Behavior","Instant":true,"ExternalBehavior[]externalBehaviors":[1],"SharedNamedVariable[]variables":[],"Booleancollapsed":false}]}]}]},"Variables":[{"Type":"BehaviorDesigner.Runtime.SharedAttackerType","Name":"AttackerType","IsShared":true,"EAttackerTypemValue":"NONE"}]}'
fieldSerializationData:
typeName: []
@ -33,7 +35,7 @@ MonoBehaviour:
startIndex:
dataPosition:
unityObjects:
- {fileID: 11400000, guid: 0fa0abbe34de7db4f87d218d194dcc5d, type: 2}
- {fileID: 11400000, guid: f034bc00819bc174d84ba6ef56cb0273, type: 2}
- {fileID: 11400000, guid: 6ac3257696f4b30469f3e3e0576b146b, type: 2}
byteData:
byteDataArray:

View 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

View 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

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f034bc00819bc174d84ba6ef56cb0273
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 9de35b73358f0034086a64fab3beeb89
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View 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

View File

@ -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