Ai 상속 구조 변경 중2

This commit is contained in:
NTG_Lenovo 2023-09-13 16:05:21 +09:00
parent 5a56a9039b
commit 12ff50f646
28 changed files with 646175 additions and 646778 deletions

File diff suppressed because it is too large Load Diff

View File

@ -11,11 +11,14 @@ namespace BlueWaterProject
#region Properties and variables #region Properties and variables
// 일반 변수 // 일반 변수
protected bool isDrawGizmosInFieldOfView = true;
protected LayerMask targetLayer; protected LayerMask targetLayer;
protected Vector3 defensePos; protected Vector3 defensePos;
protected IslandInfo attackingIslandInfo;
// 컴포넌트 관련 변수 // 컴포넌트 관련 변수
protected Animator humanAnimator; protected Animator combatAnimator;
protected NavMeshAgent humanAgent; protected NavMeshAgent humanAgent;
protected CapsuleCollider myCollider; protected CapsuleCollider myCollider;
protected CapsuleCollider hitBoxCollider; protected CapsuleCollider hitBoxCollider;
@ -44,7 +47,7 @@ namespace BlueWaterProject
protected override void Awake() protected override void Awake()
{ {
base.InitComponent(); base.Awake();
FlagLookAtCamera(); FlagLookAtCamera();
SetLayer(); SetLayer();
@ -58,14 +61,14 @@ namespace BlueWaterProject
{ {
base.InitComponent(); base.InitComponent();
humanAnimator = Utils.GetComponentAndAssert<Animator>(transform); combatAnimator = Utils.GetComponentAndAssert<Animator>(transform);
humanAgent = Utils.GetComponentAndAssert<NavMeshAgent>(transform); humanAgent = Utils.GetComponentAndAssert<NavMeshAgent>(transform);
myCollider = Utils.GetComponentAndAssert<CapsuleCollider>(transform); myCollider = Utils.GetComponentAndAssert<CapsuleCollider>(transform);
hitBoxCollider = Utils.GetComponentAndAssert<CapsuleCollider>(transform.Find("HitBox")); hitBoxCollider = Utils.GetComponentAndAssert<CapsuleCollider>(transform.Find("HitBox"));
lookAtConstraint = Utils.GetComponentAndAssert<LookAtConstraint>(flagContainer); lookAtConstraint = Utils.GetComponentAndAssert<LookAtConstraint>(flagContainer);
} }
private void FlagLookAtCamera() protected void FlagLookAtCamera()
{ {
if (Camera.main != null) if (Camera.main != null)
{ {
@ -80,7 +83,10 @@ namespace BlueWaterProject
lookAtConstraint.constraintActive = true; lookAtConstraint.constraintActive = true;
} }
protected void SetAnimatorController(string controllerName) => combatAnimator.runtimeAnimatorController =
UnitManager.Inst.AIAnimatorControllerList.Find(obj => obj.name == controllerName);
protected void SetMoveSpeed(float value) => humanAgent.speed = value; protected void SetMoveSpeed(float value) => humanAgent.speed = value;
public void SetIslandInfo(IslandInfo info) => attackingIslandInfo = info;
#endregion #endregion
} }

View File

@ -7,7 +7,7 @@ namespace BlueWaterProject
{ {
#region Properties and variables #region Properties and variables
protected EnemyStat enemyStat; [field: SerializeField] public EnemyStat EnemyStat { get; set; }
#endregion #endregion
@ -30,21 +30,34 @@ namespace BlueWaterProject
hitBoxObj.tag = "Enemy"; hitBoxObj.tag = "Enemy";
targetLayer = LayerMask.GetMask("Player") | LayerMask.GetMask("Pirate"); targetLayer = LayerMask.GetMask("Player") | LayerMask.GetMask("Pirate");
if (enemyStat.AttackerType == EAttackerType.OFFENSE) if (EnemyStat.AttackerType == EAttackerType.OFFENSE)
{ {
targetLayer |= LayerMask.GetMask("Props"); targetLayer |= LayerMask.GetMask("Props");
} }
} }
#if UNITY_EDITOR
public virtual void InitStartInEditor()
{
var enemyViewData = DataManager.Inst.GetEnemyViewSoFromKey(EnemyStat.ViewIdx);
InitComponent();
SetLayer();
InitViewModel(enemyViewData);
SetCurrentHp(EnemyStat.MaxHp);
SetMoveSpeed(EnemyStat.MoveSpd);
}
#endif
protected virtual void InitStart() protected virtual void InitStart()
{ {
var enemyViewData = GetEnemyViewData(); var enemyViewData = DataManager.Inst.GetEnemyViewDictionaryFromKey(EnemyStat.ViewIdx);
InitViewModel(enemyViewData); InitViewModel(enemyViewData);
SetCurrentHp(enemyStat.MaxHp); SetCurrentHp(EnemyStat.MaxHp);
SetMoveSpeed(enemyStat.MoveSpd); SetMoveSpeed(EnemyStat.MoveSpd);
if (enemyStat.AttackerType == EAttackerType.DEFENSE) if (EnemyStat.AttackerType == EAttackerType.DEFENSE)
{ {
defensePos = transform.position; defensePos = transform.position;
} }
@ -61,11 +74,10 @@ namespace BlueWaterProject
SetActiveViewModel(flagContainer, enemyView.Flag); SetActiveViewModel(flagContainer, enemyView.Flag);
} }
protected override void SetCurrentHp(float value) => enemyStat.CurrentHp = value; protected override void SetCurrentHp(float value) => EnemyStat.CurrentHp = value;
public void SetAttackerType(EAttackerType type) => EnemyStat.AttackerType = type;
private EnemyView GetEnemyViewData() => Application.isPlaying ? public void SetOffenseType(EOffenseType type) => EnemyStat.OffenseType = type;
DataManager.Inst.GetEnemyViewDictionaryFromKey(enemyStat.ViewIdx) : public void SetDefenseType(EDefenseType type) => EnemyStat.DefenseType = type;
DataManager.Inst.GetEnemyViewSoFromKey(enemyStat.ViewIdx);
#endregion #endregion
} }

View File

@ -1,10 +1,101 @@
using System.Collections;
using UnityEngine; using UnityEngine;
using UnityEngine.Pool;
// ReSharper disable once CheckNamespace // ReSharper disable once CheckNamespace
namespace BlueWaterProject namespace BlueWaterProject
{ {
public class EnemyArcher : EnemyAi public class EnemyArcher : EnemyAi
{ {
#region Property and variable
[Header("화살 오브젝트 관리")]
[Tooltip("화살 오브젝트 풀링할 최대 갯수")]
[SerializeField] private int arrowMaxSize = 100;
[Tooltip("화살 발사 후 오브젝트 저장될 위치")]
[SerializeField] private Transform arrowsPoolLocation;
[SerializeField] private LayerMask archerLayer;
private IEnumerator shootArrowCoroutine;
private IObjectPool<Arrow> arrowPool;
[SerializeField] private Vector3 rayOffset = new(0f, 2f, 0);
#endregion
#region Custom methods
protected override void InitComponent()
{
base.InitComponent();
var animatorControllerList = UnitManager.Inst.AIAnimatorControllerList;
if (animatorControllerList == null)
{
Debug.LogError("Animator Controller List is null!");
return;
}
var archerController = animatorControllerList.Find(obj => obj.name == "Archer");
if (archerController == null)
{
Debug.LogError("No AnimatorController named 'Archer' was found in the list.");
return;
}
combatAnimator.runtimeAnimatorController = archerController;
arrowsPoolLocation = GameObject.Find("ObjectPoolData/Arrows").transform;
if (!arrowsPoolLocation)
{
var objectPoolData = GameObject.Find("ObjectPoolData").transform;
if (!objectPoolData)
{
objectPoolData = new GameObject("ObjectPoolData").transform;
}
if (!objectPoolData.Find("Arrows"))
{
Instantiate(new GameObject("Arrows"), Vector3.zero, Quaternion.identity, objectPoolData);
}
}
arrowPool = new ObjectPool<Arrow>(CreateArrow, OnGetArrow, OnReleaseArrow, OnDestroyArrow, maxSize:arrowMaxSize);
}
protected override void SetLayer()
{
base.SetLayer();
archerLayer = LayerMask.GetMask("Ground") | LayerMask.GetMask("Water") |
LayerMask.GetMask("Player") | LayerMask.GetMask("Pirate") |
LayerMask.GetMask("Props");
}
protected override void InitStart()
{
base.InitStart();
SetAnimatorController("Archer");
}
#endregion
#region ObjectPool Function
private Arrow CreateArrow()
{
var arrow = Instantiate(UnitManager.Inst.ArrowPrefab, leftWeaponContainer.position, Quaternion.identity, arrowsPoolLocation).GetComponent<Arrow>();
arrow.SetManagedPool(arrowPool);
return arrow;
}
private void OnGetArrow(Arrow arrow) => arrow.gameObject.SetActive(true);
private void OnReleaseArrow(Arrow arrow) => arrow.ReleaseArrowSetting();
private void OnDestroyArrow(Arrow arrow) => Destroy(arrow.gameObject);
#endregion
} }
} }

View File

@ -6,18 +6,36 @@ namespace BlueWaterProject
{ {
public class EnemySpearKnight : EnemyAi public class EnemySpearKnight : EnemyAi
{ {
#region Properties and variables
private CloseWeapon closeWeapon; private CloseWeapon closeWeapon;
#endregion
#region Custrom methods
#if UNITY_EDITOR
public override void InitStartInEditor()
{
base.InitStartInEditor();
SetCloseWeapon();
}
#endif
protected override void InitStart() protected override void InitStart()
{ {
base.InitStart(); base.InitStart();
SetAnimatorController("SpearKnight");
SetCloseWeapon(); SetCloseWeapon();
} }
private void SetCloseWeapon() private void SetCloseWeapon()
{ {
var rightWeaponView = DataManager.Inst.GetEnemyViewDictionaryFromKey(enemyStat.ViewIdx).RightWeapon; var rightWeaponView = Application.isPlaying ?
DataManager.Inst.GetEnemyViewDictionaryFromKey(EnemyStat.ViewIdx).RightWeapon :
DataManager.Inst.GetEnemyViewSoFromKey(EnemyStat.ViewIdx).RightWeapon;
if (rightWeaponView == -1) return; if (rightWeaponView == -1) return;
closeWeapon = rightWeaponContainer.GetChild(rightWeaponView).AddComponent<CloseWeapon>(); closeWeapon = rightWeaponContainer.GetChild(rightWeaponView).AddComponent<CloseWeapon>();
@ -27,5 +45,7 @@ namespace BlueWaterProject
closeWeapon.SetAttackerAiType(EAiType.ENEMY); closeWeapon.SetAttackerAiType(EAiType.ENEMY);
closeWeapon.SetBoxCollider(); closeWeapon.SetBoxCollider();
} }
#endregion
} }
} }

View File

@ -6,18 +6,36 @@ namespace BlueWaterProject
{ {
public class EnemySpearman : EnemyAi public class EnemySpearman : EnemyAi
{ {
#region Properties and variables
private CloseWeapon closeWeapon; private CloseWeapon closeWeapon;
#endregion
#region Custrom methods
#if UNITY_EDITOR
public override void InitStartInEditor()
{
base.InitStartInEditor();
SetCloseWeapon();
}
#endif
protected override void InitStart() protected override void InitStart()
{ {
base.InitStart(); base.InitStart();
SetAnimatorController("Spearman");
SetCloseWeapon(); SetCloseWeapon();
} }
private void SetCloseWeapon() private void SetCloseWeapon()
{ {
var rightWeaponView = DataManager.Inst.GetEnemyViewDictionaryFromKey(enemyStat.ViewIdx).RightWeapon; var rightWeaponView = Application.isPlaying ?
DataManager.Inst.GetEnemyViewDictionaryFromKey(EnemyStat.ViewIdx).RightWeapon :
DataManager.Inst.GetEnemyViewSoFromKey(EnemyStat.ViewIdx).RightWeapon;
if (rightWeaponView == -1) return; if (rightWeaponView == -1) return;
closeWeapon = rightWeaponContainer.GetChild(rightWeaponView).AddComponent<CloseWeapon>(); closeWeapon = rightWeaponContainer.GetChild(rightWeaponView).AddComponent<CloseWeapon>();
@ -27,5 +45,7 @@ namespace BlueWaterProject
closeWeapon.SetAttackerAiType(EAiType.ENEMY); closeWeapon.SetAttackerAiType(EAiType.ENEMY);
closeWeapon.SetBoxCollider(); closeWeapon.SetBoxCollider();
} }
#endregion
} }
} }

View File

@ -6,18 +6,36 @@ namespace BlueWaterProject
{ {
public class EnemySwordKnight : EnemyAi public class EnemySwordKnight : EnemyAi
{ {
#region Properties and variables
private CloseWeapon closeWeapon; private CloseWeapon closeWeapon;
#endregion
#region Custrom methods
#if UNITY_EDITOR
public override void InitStartInEditor()
{
base.InitStartInEditor();
SetCloseWeapon();
}
#endif
protected override void InitStart() protected override void InitStart()
{ {
base.InitStart(); base.InitStart();
SetAnimatorController("SwordKnight");
SetCloseWeapon(); SetCloseWeapon();
} }
private void SetCloseWeapon() private void SetCloseWeapon()
{ {
var rightWeaponView = DataManager.Inst.GetEnemyViewDictionaryFromKey(enemyStat.ViewIdx).RightWeapon; var rightWeaponView = Application.isPlaying ?
DataManager.Inst.GetEnemyViewDictionaryFromKey(EnemyStat.ViewIdx).RightWeapon :
DataManager.Inst.GetEnemyViewSoFromKey(EnemyStat.ViewIdx).RightWeapon;
if (rightWeaponView == -1) return; if (rightWeaponView == -1) return;
closeWeapon = rightWeaponContainer.GetChild(rightWeaponView).AddComponent<CloseWeapon>(); closeWeapon = rightWeaponContainer.GetChild(rightWeaponView).AddComponent<CloseWeapon>();
@ -27,5 +45,7 @@ namespace BlueWaterProject
closeWeapon.SetAttackerAiType(EAiType.ENEMY); closeWeapon.SetAttackerAiType(EAiType.ENEMY);
closeWeapon.SetBoxCollider(); closeWeapon.SetBoxCollider();
} }
#endregion
} }
} }

View File

@ -6,18 +6,36 @@ namespace BlueWaterProject
{ {
public class EnemySwordman : EnemyAi public class EnemySwordman : EnemyAi
{ {
#region Properties and variables
private CloseWeapon closeWeapon; private CloseWeapon closeWeapon;
#endregion
#region Custrom methods
#if UNITY_EDITOR
public override void InitStartInEditor()
{
base.InitStartInEditor();
SetCloseWeapon();
}
#endif
protected override void InitStart() protected override void InitStart()
{ {
base.InitStart(); base.InitStart();
SetAnimatorController("Swordman");
SetCloseWeapon(); SetCloseWeapon();
} }
private void SetCloseWeapon() private void SetCloseWeapon()
{ {
var rightWeaponView = DataManager.Inst.GetEnemyViewDictionaryFromKey(enemyStat.ViewIdx).RightWeapon; var rightWeaponView = Application.isPlaying ?
DataManager.Inst.GetEnemyViewDictionaryFromKey(EnemyStat.ViewIdx).RightWeapon :
DataManager.Inst.GetEnemyViewSoFromKey(EnemyStat.ViewIdx).RightWeapon;
if (rightWeaponView == -1) return; if (rightWeaponView == -1) return;
closeWeapon = rightWeaponContainer.GetChild(rightWeaponView).AddComponent<CloseWeapon>(); closeWeapon = rightWeaponContainer.GetChild(rightWeaponView).AddComponent<CloseWeapon>();
@ -27,5 +45,7 @@ namespace BlueWaterProject
closeWeapon.SetAttackerAiType(EAiType.ENEMY); closeWeapon.SetAttackerAiType(EAiType.ENEMY);
closeWeapon.SetBoxCollider(); closeWeapon.SetBoxCollider();
} }
#endregion
} }
} }

View File

@ -26,12 +26,42 @@ namespace BlueWaterProject
[DisableIf("@true")] [DisableIf("@true")]
[SerializeField] private IslandInfo islandInfo; [SerializeField] private IslandInfo islandInfo;
protected PirateStat pirateStat; [field: SerializeField] public PirateStat PirateStat { get; set; }
private PirateUnit mouseEnterPirateUnit;
private UnitSelection unitSelection;
#endregion #endregion
#region Unit Built-in methods #region Unit Built-in methods
private void OnMouseEnter()
{
if (!unitSelection || !unitSelection.IsSelectable) return;
mouseEnterPirateUnit = gameObject.GetComponentInParent<PirateUnit>();
if (mouseEnterPirateUnit == unitSelection.SelectedPirateUnit) return;
foreach (var pirateAi in mouseEnterPirateUnit.pirateUnitStat.PirateAiList)
{
pirateAi.MouseEnterHighlight();
}
}
private void OnMouseExit()
{
if (!unitSelection || !unitSelection.IsSelectable ||
!mouseEnterPirateUnit || mouseEnterPirateUnit == unitSelection.SelectedPirateUnit) return;
foreach (var pirateAi in mouseEnterPirateUnit.pirateUnitStat.PirateAiList)
{
pirateAi.ResetHighlight();
}
mouseEnterPirateUnit = null;
}
private void Start() private void Start()
{ {
InitStart(); InitStart();
@ -41,6 +71,13 @@ namespace BlueWaterProject
#region Custom methods #region Custom methods
protected override void InitComponent()
{
base.InitComponent();
unitSelection = Utils.GetComponentAndAssert<UnitSelection>(GameObject.Find("UnitManager").transform);
}
protected override void SetLayer() protected override void SetLayer()
{ {
gameObject.layer = LayerMask.NameToLayer("Pirate"); gameObject.layer = LayerMask.NameToLayer("Pirate");
@ -49,7 +86,7 @@ namespace BlueWaterProject
hitBoxObj.tag = "Pirate"; hitBoxObj.tag = "Pirate";
targetLayer = LayerMask.GetMask("Enemy"); targetLayer = LayerMask.GetMask("Enemy");
if (pirateStat.AttackerType == EAttackerType.OFFENSE) if (PirateStat.AttackerType == EAttackerType.OFFENSE)
{ {
targetLayer |= LayerMask.GetMask("Props"); targetLayer |= LayerMask.GetMask("Props");
} }
@ -57,14 +94,14 @@ namespace BlueWaterProject
protected virtual void InitStart() protected virtual void InitStart()
{ {
var pirateViewData = GetPirateViewData(); var pirateViewData = DataManager.Inst.GetPirateViewDictionaryFromKey(PirateStat.ViewIdx);
InitViewModel(pirateViewData); InitViewModel(pirateViewData);
FindMaterial(); FindMaterial();
SetCurrentHp(pirateStat.MaxHp); SetCurrentHp(PirateStat.MaxHp);
SetMoveSpeed(pirateStat.MoveSpd); SetMoveSpeed(PirateStat.MoveSpd);
if (pirateStat.AttackerType == EAttackerType.DEFENSE) if (PirateStat.AttackerType == EAttackerType.DEFENSE)
{ {
defensePos = transform.position; defensePos = transform.position;
} }
@ -101,11 +138,26 @@ namespace BlueWaterProject
} }
} }
protected override void SetCurrentHp(float value) => pirateStat.CurrentHp = value; public void CommandMove(Vector3 movePos)
{
private PirateView GetPirateViewData() => Application.isPlaying ? }
DataManager.Inst.GetPirateViewDictionaryFromKey(pirateStat.ViewIdx) :
DataManager.Inst.GetPirateViewSoFromKey(pirateStat.ViewIdx); private void SetOutlineColor(Color color)
{
foreach (var skin in skinMaterialList)
{
skin.SetColor(OutlineColorHash, color);
}
}
protected override void SetCurrentHp(float value) => PirateStat.CurrentHp = value;
public void SetAttackerType(EAttackerType type) => PirateStat.AttackerType = type;
public void SetOffenseType(EOffenseType type) => PirateStat.OffenseType = type;
public void SetDefenseType(EDefenseType type) => PirateStat.DefenseType = type;
public void ResetHighlight() => SetOutlineColor(defaultSkinColor);
public void MouseEnterHighlight() => SetOutlineColor(mouseEnterHighlightSkinColor);
public void SelectedHighlight() => SetOutlineColor(selectedSkinColor);
#endregion #endregion
} }

View File

@ -1,10 +1,100 @@
using System.Collections;
using UnityEngine; using UnityEngine;
using UnityEngine.Pool;
// ReSharper disable once CheckNamespace // ReSharper disable once CheckNamespace
namespace BlueWaterProject namespace BlueWaterProject
{ {
public class PirateArcher : PirateAi public class PirateArcher : PirateAi
{ {
#region Property and variable
[Header("화살 오브젝트 관리")]
[Tooltip("화살 오브젝트 풀링할 최대 갯수")]
[SerializeField] private int arrowMaxSize = 100;
[Tooltip("화살 발사 후 오브젝트 저장될 위치")]
[SerializeField] private Transform arrowsPoolLocation;
[SerializeField] private LayerMask archerLayer;
private IEnumerator shootArrowCoroutine;
private IObjectPool<Arrow> arrowPool;
[SerializeField] private Vector3 rayOffset = new(0f, 2f, 0);
#endregion
#region Custom methods
protected override void InitComponent()
{
base.InitComponent();
var animatorControllerList = UnitManager.Inst.AIAnimatorControllerList;
if (animatorControllerList == null)
{
Debug.LogError("Animator Controller List is null!");
return;
}
var archerController = animatorControllerList.Find(obj => obj.name == "Archer");
if (archerController == null)
{
Debug.LogError("No AnimatorController named 'Archer' was found in the list.");
return;
}
combatAnimator.runtimeAnimatorController = archerController;
arrowsPoolLocation = GameObject.Find("ObjectPoolData/Arrows").transform;
if (!arrowsPoolLocation)
{
var objectPoolData = GameObject.Find("ObjectPoolData").transform;
if (!objectPoolData)
{
objectPoolData = new GameObject("ObjectPoolData").transform;
}
if (!objectPoolData.Find("Arrows"))
{
Instantiate(new GameObject("Arrows"), Vector3.zero, Quaternion.identity, objectPoolData);
}
}
arrowPool = new ObjectPool<Arrow>(CreateArrow, OnGetArrow, OnReleaseArrow, OnDestroyArrow, maxSize:arrowMaxSize);
}
protected override void SetLayer()
{
base.SetLayer();
archerLayer = LayerMask.GetMask("Ground") | LayerMask.GetMask("Water") |
LayerMask.GetMask("Enemy") | LayerMask.GetMask("Props");
}
protected override void InitStart()
{
base.InitStart();
SetAnimatorController("Archer");
}
#endregion
#region ObjectPool Function
private Arrow CreateArrow()
{
var arrow = Instantiate(UnitManager.Inst.ArrowPrefab, leftWeaponContainer.position, Quaternion.identity, arrowsPoolLocation).GetComponent<Arrow>();
arrow.SetManagedPool(arrowPool);
return arrow;
}
private void OnGetArrow(Arrow arrow) => arrow.gameObject.SetActive(true);
private void OnReleaseArrow(Arrow arrow) => arrow.ReleaseArrowSetting();
private void OnDestroyArrow(Arrow arrow) => Destroy(arrow.gameObject);
#endregion
} }
} }

View File

@ -12,12 +12,13 @@ namespace BlueWaterProject
{ {
base.InitStart(); base.InitStart();
SetAnimatorController("Axeman");
SetCloseWeapon(); SetCloseWeapon();
} }
private void SetCloseWeapon() private void SetCloseWeapon()
{ {
var rightWeaponView = DataManager.Inst.GetPirateViewDictionaryFromKey(pirateStat.ViewIdx).RightWeapon; var rightWeaponView = DataManager.Inst.GetPirateViewDictionaryFromKey(PirateStat.ViewIdx).RightWeapon;
if (rightWeaponView == -1) return; if (rightWeaponView == -1) return;
closeWeapon = rightWeaponContainer.GetChild(rightWeaponView).AddComponent<CloseWeapon>(); closeWeapon = rightWeaponContainer.GetChild(rightWeaponView).AddComponent<CloseWeapon>();

View File

@ -12,12 +12,13 @@ namespace BlueWaterProject
{ {
base.InitStart(); base.InitStart();
SetAnimatorController("Spearman");
SetCloseWeapon(); SetCloseWeapon();
} }
private void SetCloseWeapon() private void SetCloseWeapon()
{ {
var rightWeaponView = DataManager.Inst.GetPirateViewDictionaryFromKey(pirateStat.ViewIdx).RightWeapon; var rightWeaponView = DataManager.Inst.GetPirateViewDictionaryFromKey(PirateStat.ViewIdx).RightWeapon;
if (rightWeaponView == -1) return; if (rightWeaponView == -1) return;
closeWeapon = rightWeaponContainer.GetChild(rightWeaponView).AddComponent<CloseWeapon>(); closeWeapon = rightWeaponContainer.GetChild(rightWeaponView).AddComponent<CloseWeapon>();

View File

@ -12,12 +12,13 @@ namespace BlueWaterProject
{ {
base.InitStart(); base.InitStart();
SetAnimatorController("SwordKnight");
SetCloseWeapon(); SetCloseWeapon();
} }
private void SetCloseWeapon() private void SetCloseWeapon()
{ {
var rightWeaponView = DataManager.Inst.GetPirateViewDictionaryFromKey(pirateStat.ViewIdx).RightWeapon; var rightWeaponView = DataManager.Inst.GetPirateViewDictionaryFromKey(PirateStat.ViewIdx).RightWeapon;
if (rightWeaponView == -1) return; if (rightWeaponView == -1) return;
closeWeapon = rightWeaponContainer.GetChild(rightWeaponView).AddComponent<CloseWeapon>(); closeWeapon = rightWeaponContainer.GetChild(rightWeaponView).AddComponent<CloseWeapon>();

View File

@ -12,12 +12,13 @@ namespace BlueWaterProject
{ {
base.InitStart(); base.InitStart();
SetAnimatorController("Swordman");
SetCloseWeapon(); SetCloseWeapon();
} }
private void SetCloseWeapon() private void SetCloseWeapon()
{ {
var rightWeaponView = DataManager.Inst.GetPirateViewDictionaryFromKey(pirateStat.ViewIdx).RightWeapon; var rightWeaponView = DataManager.Inst.GetPirateViewDictionaryFromKey(PirateStat.ViewIdx).RightWeapon;
if (rightWeaponView == -1) return; if (rightWeaponView == -1) return;
closeWeapon = rightWeaponContainer.GetChild(rightWeaponView).AddComponent<CloseWeapon>(); closeWeapon = rightWeaponContainer.GetChild(rightWeaponView).AddComponent<CloseWeapon>();

View File

@ -1,6 +1,5 @@
using Sirenix.OdinInspector; using Sirenix.OdinInspector;
using UnityEngine; using UnityEngine;
using UnityEngine.Serialization;
// ReSharper disable once CheckNamespace // ReSharper disable once CheckNamespace
namespace BlueWaterProject namespace BlueWaterProject
@ -22,7 +21,7 @@ namespace BlueWaterProject
{ {
if (!Application.isPlaying || enemyUnitStat == null || enemyUnitStat.SailorCount <= 0) return; if (!Application.isPlaying || enemyUnitStat == null || enemyUnitStat.SailorCount <= 0) return;
foreach (var item in enemyUnitStat.UnitList) foreach (var item in enemyUnitStat.EnemyAiList)
{ {
var unitPos = item.transform.position; var unitPos = item.transform.position;
var ray = new Ray(unitPos + Vector3.up, Vector3.down); var ray = new Ray(unitPos + Vector3.up, Vector3.down);
@ -77,7 +76,7 @@ namespace BlueWaterProject
isClickedTypeAllButton = false; isClickedTypeAllButton = false;
} }
private Color GetCreateUnitButtonColor() => enemyUnitStat.UnitList.Count > 0 ? Color.white : Color.green; private Color GetCreateUnitButtonColor() => enemyUnitStat.EnemyAiList.Count > 0 ? Color.white : Color.green;
private Color GetTypeAllButtonColor() => isClickedTypeAllButton ? Color.white : Color.green; private Color GetTypeAllButtonColor() => isClickedTypeAllButton ? Color.white : Color.green;
private void OnTypeChanged() => isClickedTypeAllButton = false; private void OnTypeChanged() => isClickedTypeAllButton = false;

View File

@ -37,7 +37,7 @@ namespace BlueWaterProject
[field: SerializeField] public EDefenseType DefenseType { get; set; } [field: SerializeField] public EDefenseType DefenseType { get; set; }
[field: Tooltip("부대 병력 리스트")] [field: Tooltip("부대 병력 리스트")]
[field: SerializeField] public List<AiController> UnitList { get; set; } [field: SerializeField] public List<EnemyAi> EnemyAiList { get; set; }
#endregion #endregion
@ -53,11 +53,11 @@ namespace BlueWaterProject
AttackerType = EAttackerType.NONE; AttackerType = EAttackerType.NONE;
OffenseType = EOffenseType.NONE; OffenseType = EOffenseType.NONE;
DefenseType = EDefenseType.NONE; DefenseType = EDefenseType.NONE;
UnitList = new List<AiController>(GlobalValue.ONE_UNIT_CAPACITY); EnemyAiList = new List<EnemyAi>(GlobalValue.ONE_UNIT_CAPACITY);
} }
public EnemyUnitStat(string idx, string captainIdx, string sailorIdx, string unitName, public EnemyUnitStat(string idx, string captainIdx, string sailorIdx, string unitName,
int sailorCount, EAttackerType attackerType, EOffenseType offenseType, EDefenseType defenseType, List<AiController> unitList) int sailorCount, EAttackerType attackerType, EOffenseType offenseType, EDefenseType defenseType, List<EnemyAi> enemyAiList)
{ {
Idx = idx; Idx = idx;
CaptainStatIdx = captainIdx; CaptainStatIdx = captainIdx;
@ -66,7 +66,7 @@ namespace BlueWaterProject
SailorCount = sailorCount; SailorCount = sailorCount;
OffenseType = offenseType; OffenseType = offenseType;
DefenseType = defenseType; DefenseType = defenseType;
UnitList = unitList; EnemyAiList = enemyAiList;
if (AttackerType == EAttackerType.NONE) return; if (AttackerType == EAttackerType.NONE) return;
@ -83,7 +83,7 @@ namespace BlueWaterProject
AttackerType = enemyUnitStat.AttackerType; AttackerType = enemyUnitStat.AttackerType;
OffenseType = enemyUnitStat.OffenseType; OffenseType = enemyUnitStat.OffenseType;
DefenseType = enemyUnitStat.DefenseType; DefenseType = enemyUnitStat.DefenseType;
UnitList = enemyUnitStat.UnitList; EnemyAiList = enemyUnitStat.EnemyAiList;
} }
#endregion #endregion

View File

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

View File

@ -37,7 +37,7 @@ namespace BlueWaterProject
[field: SerializeField] public EDefenseType DefenseType { get; set; } [field: SerializeField] public EDefenseType DefenseType { get; set; }
[field: Tooltip("부대 병력 리스트")] [field: Tooltip("부대 병력 리스트")]
[field: SerializeField] public List<AiController> UnitList { get; set; } [field: SerializeField] public List<PirateAi> PirateAiList { get; set; }
#endregion #endregion
@ -53,11 +53,11 @@ namespace BlueWaterProject
AttackerType = EAttackerType.NONE; AttackerType = EAttackerType.NONE;
OffenseType = EOffenseType.NONE; OffenseType = EOffenseType.NONE;
DefenseType = EDefenseType.NONE; DefenseType = EDefenseType.NONE;
UnitList = new List<AiController>(GlobalValue.ONE_UNIT_CAPACITY); PirateAiList = new List<PirateAi>(GlobalValue.ONE_UNIT_CAPACITY);
} }
public PirateUnitStat(string idx, string captainIdx, string sailorIdx, string unitName, public PirateUnitStat(string idx, string captainIdx, string sailorIdx, string unitName,
int sailorCount, EAttackerType attackerType, EOffenseType offenseType, EDefenseType defenseType, List<AiController> unitList) int sailorCount, EAttackerType attackerType, EOffenseType offenseType, EDefenseType defenseType, List<PirateAi> pirateAiList)
{ {
Idx = idx; Idx = idx;
CaptainStatIdx = captainIdx; CaptainStatIdx = captainIdx;
@ -66,7 +66,7 @@ namespace BlueWaterProject
SailorCount = sailorCount; SailorCount = sailorCount;
OffenseType = offenseType; OffenseType = offenseType;
DefenseType = defenseType; DefenseType = defenseType;
UnitList = unitList; PirateAiList = pirateAiList;
if (AttackerType == EAttackerType.NONE) return; if (AttackerType == EAttackerType.NONE) return;
@ -83,7 +83,7 @@ namespace BlueWaterProject
AttackerType = pirateUnitStat.AttackerType; AttackerType = pirateUnitStat.AttackerType;
OffenseType = pirateUnitStat.OffenseType; OffenseType = pirateUnitStat.OffenseType;
DefenseType = pirateUnitStat.DefenseType; DefenseType = pirateUnitStat.DefenseType;
UnitList = pirateUnitStat.UnitList; PirateAiList = pirateUnitStat.PirateAiList;
} }
#endregion #endregion

View File

@ -3,36 +3,19 @@ using System.Collections.Generic;
using Sirenix.OdinInspector; using Sirenix.OdinInspector;
using UnityEditor.Animations; using UnityEditor.Animations;
using UnityEngine; using UnityEngine;
using UnityEngine.Serialization;
// ReSharper disable once CheckNamespace // ReSharper disable once CheckNamespace
namespace BlueWaterProject namespace BlueWaterProject
{ {
[Serializable]
public class UnitMatrix
{
public int units; // 부대 안의 병사 수
public int rows; // 배치될 행의 갯수
public int columns; // 배치될 열의 갯수
//public int centerNum; // 부대의 중심 번호
public UnitMatrix(int units, int rows, int columns)
{
this.units = units;
this.rows = rows;
this.columns = columns;
}
}
public class UnitManager : Singleton<UnitManager> public class UnitManager : Singleton<UnitManager>
{ {
#region Property and variable #region Property and variable
[Tooltip("유닛 프리팹")] [Tooltip("Pirate 프리팹")]
[field: SerializeField] public GameObject UnitPrefab { get; private set; } [field: SerializeField] public GameObject PiratePrefab { get; private set; }
[Tooltip("캐릭터 기초 프리팹")] [Tooltip("캐릭터 기초 프리팹")]
[field: SerializeField] public GameObject BaseCharacterPrefab { get; private set; } [field: SerializeField] public GameObject BaseHumanPrefab { get; private set; }
[Tooltip("화살 프리팹")] [Tooltip("화살 프리팹")]
[field: SerializeField] public GameObject ArrowPrefab { get; private set; } [field: SerializeField] public GameObject ArrowPrefab { get; private set; }
@ -41,30 +24,16 @@ namespace BlueWaterProject
[field: SerializeField] public LayerMask GroundLayer { get; private set; } [field: SerializeField] public LayerMask GroundLayer { get; private set; }
[Tooltip("바닥과의 최대 허용 거리")] [Tooltip("바닥과의 최대 허용 거리")]
[field: SerializeField] public float MaxGroundDistance { get; private set; } = 2.5f; [field: SerializeField] public float MaxGroundDistance { get; private set; } = 4f;
[Tooltip("병력 간의 간격")] [Tooltip("병력 간의 간격")]
[field: SerializeField] public float UnitSpacing { get; private set; } = 2.5f; [field: SerializeField] public float UnitSpacing { get; private set; } = 2.5f;
[Tooltip("부대 배치 행렬")]
[field: SerializeField] public List<UnitMatrix> UnitMatrices { get; private set; } = new(MATRICES_CAPACITY);
[FormerlySerializedAs("soldierPrefabList")]
[Tooltip("병력들의 프리팹 리스트(순서 중요)")]
[SerializeField] private List<GameObject> characterPrefabList = new(CHARACTER_PREFAB_CAPACITY);
[field: Tooltip("병력들의 애니메이터 컨트롤러 리스트")] [field: Tooltip("병력들의 애니메이터 컨트롤러 리스트")]
[field: SerializeField] public List<AnimatorController> AIAnimatorControllerList { get; private set; } = new(GlobalValue.AI_ANIMATOR_CAPACITY); [field: SerializeField] public List<AnimatorController> AIAnimatorControllerList { get; private set; } = new(GlobalValue.AI_ANIMATOR_CAPACITY);
[Tooltip("플레이어가 가지고 있는 부대리스트")]
[SerializeField] private List<PirateUnit> pirateUnitList = new(PIRATE_UNIT_CAPACITY);
public IReadOnlyList<PirateUnit> PirateUnitList => pirateUnitList;
private Transform pirateUnits; private Transform pirateUnits;
private const int MATRICES_CAPACITY = 9;
private const int CHARACTER_PREFAB_CAPACITY = 10;
private const int ANIMATOR_CONTROLLER_PREFAB_CAPACITY = 6; private const int ANIMATOR_CONTROLLER_PREFAB_CAPACITY = 6;
private const int PIRATE_UNIT_CAPACITY = 50; private const int PIRATE_UNIT_CAPACITY = 50;
@ -75,58 +44,34 @@ namespace BlueWaterProject
protected override void OnAwake() protected override void OnAwake()
{ {
GroundLayer = LayerMask.GetMask("Ground"); GroundLayer = LayerMask.GetMask("Ground");
InitUnitMatrices(); //InitPlayerUnitList();
InitPlayerUnitList();
} }
private void Reset() private void Reset()
{ {
GroundLayer = LayerMask.GetMask("Ground"); GroundLayer = LayerMask.GetMask("Ground");
MaxGroundDistance = 2.5f; MaxGroundDistance = 4f;
UnitSpacing = 2.5f; UnitSpacing = 2.5f;
characterPrefabList = new List<GameObject>(CHARACTER_PREFAB_CAPACITY);
InitUnitMatrices();
InitCharacterPrefabList(); InitCharacterPrefabList();
InitPlayerUnitList(); //InitPlayerUnitList();
} }
#endregion #endregion
#region Custom function #region Custom function
/// <summary>
/// 부대 배치 행렬 초기화 함수
/// </summary>
[GUIColor(0, 1, 0)]
[ShowIf("@UnitMatrices.Count != MATRICES_CAPACITY")]
[Button("행렬 초기화")]
private void InitUnitMatrices()
{
UnitMatrices = new List<UnitMatrix>(MATRICES_CAPACITY)
{
new(1, 1, 1),
new(2, 1, 2),
new(3, 1, 3),
new(4, 2, 2),
new(6, 2, 3),
new(8, 2, 4),
new(9, 3, 3),
new(12, 3, 4),
new(16, 4, 4),
};
}
#if UNITY_EDITOR #if UNITY_EDITOR
/// <summary> /// <summary>
/// 프리팹 초기화 함수 /// 프리팹 초기화 함수
/// </summary> /// </summary>
[GUIColor(0, 1, 0)] [GUIColor(0, 1, 0)]
[ShowIf("@BaseCharacterPrefab == null || UnitPrefab == null || ArrowPrefab == null || AIAnimatorControllerList.Count != ANIMATOR_CONTROLLER_PREFAB_CAPACITY")] [ShowIf("@PiratePrefab == null || BaseHumanPrefab == null || ArrowPrefab == null ||" +
"AIAnimatorControllerList == null || AIAnimatorControllerList.Count != ANIMATOR_CONTROLLER_PREFAB_CAPACITY")]
[Button("프리팹 초기화")] [Button("프리팹 초기화")]
private void InitCharacterPrefabList() private void InitCharacterPrefabList()
{ {
UnitPrefab = Utils.LoadPrefabFromFolder("Assets/05.Prefabs/Character", "Unit"); PiratePrefab = Utils.LoadPrefabFromFolder("Assets/05.Prefabs/Character/Unit", "PirateUnit");
BaseCharacterPrefab = Utils.LoadPrefabFromFolder("Assets/05.Prefabs/Character", "BaseCharacter"); BaseHumanPrefab = Utils.LoadPrefabFromFolder("Assets/05.Prefabs/Character", "BaseHuman");
ArrowPrefab = Utils.LoadPrefabFromFolder("Assets/05.Prefabs", "Arrow_01"); ArrowPrefab = Utils.LoadPrefabFromFolder("Assets/05.Prefabs", "Arrow_01");
AIAnimatorControllerList = new List<AnimatorController>(ANIMATOR_CONTROLLER_PREFAB_CAPACITY) AIAnimatorControllerList = new List<AnimatorController>(ANIMATOR_CONTROLLER_PREFAB_CAPACITY)
{ {
@ -137,41 +82,27 @@ namespace BlueWaterProject
Utils.LoadAnimatorControllerFromFolder("Assets/07.Animation", "SwordKnight"), Utils.LoadAnimatorControllerFromFolder("Assets/07.Animation", "SwordKnight"),
Utils.LoadAnimatorControllerFromFolder("Assets/07.Animation", "Swordman") Utils.LoadAnimatorControllerFromFolder("Assets/07.Animation", "Swordman")
}; };
characterPrefabList = new List<GameObject>(CHARACTER_PREFAB_CAPACITY)
{
Utils.LoadPrefabFromFolder("Assets/05.Prefabs/Character/Enemy", "Archer_E"),
Utils.LoadPrefabFromFolder("Assets/05.Prefabs/Character/Enemy", "SpearKnight_E"),
Utils.LoadPrefabFromFolder("Assets/05.Prefabs/Character/Enemy", "Spearman_E"),
Utils.LoadPrefabFromFolder("Assets/05.Prefabs/Character/Enemy", "SwordKnight_E"),
Utils.LoadPrefabFromFolder("Assets/05.Prefabs/Character/Enemy", "Swordman_E"),
Utils.LoadPrefabFromFolder("Assets/05.Prefabs/Character/Pirate", "Archer_P"),
Utils.LoadPrefabFromFolder("Assets/05.Prefabs/Character/Pirate", "Axeman_P"),
Utils.LoadPrefabFromFolder("Assets/05.Prefabs/Character/Pirate", "Spearman_P"),
Utils.LoadPrefabFromFolder("Assets/05.Prefabs/Character/Pirate", "SwordKnight_P"),
Utils.LoadPrefabFromFolder("Assets/05.Prefabs/Character/Pirate", "Swordman_P")
};
} }
#endif #endif
/// <summary> // /// <summary>
/// 플레이어가 가진 유닛 리스트 초기화 // /// 플레이어가 가진 유닛 리스트 초기화
/// </summary> // /// </summary>
[GUIColor(0, 1, 0)] // [GUIColor(0, 1, 0)]
[Button("플레이어 유닛 가져오기")] // [Button("플레이어 유닛 가져오기")]
private void InitPlayerUnitList() // private void InitPlayerUnitList()
{ // {
SetPlayerUnits(); // SetPlayerUnits();
//
pirateUnitList = new List<PirateUnit>(PIRATE_UNIT_CAPACITY); // pirateUnitList = new List<PirateUnit>(PIRATE_UNIT_CAPACITY);
//
foreach (Transform item in pirateUnits) // foreach (Transform item in pirateUnits)
{ // {
if (!item.gameObject.activeSelf) continue; // if (!item.gameObject.activeSelf) continue;
//
pirateUnitList.Add(item.GetComponent<PirateUnit>()); // pirateUnitList.Add(item.GetComponent<PirateUnit>());
} // }
} // }
private void SetPlayerUnits() private void SetPlayerUnits()
{ {
@ -229,12 +160,12 @@ namespace BlueWaterProject
{ {
var card = DataManager.Inst.GetCardDictionaryFromKey(cardIdx); var card = DataManager.Inst.GetCardDictionaryFromKey(cardIdx);
var unit = DataManager.Inst.GetPirateUnitStatDictionaryFromKey(card.UnitIdx); var unit = DataManager.Inst.GetPirateUnitStatDictionaryFromKey(card.UnitIdx);
var captainStat = DataManager.Inst.GetEnemyStatDictionaryFromKey(unit.CaptainStatIdx); var captainStat = DataManager.Inst.GetPirateStatDictionaryFromKey(unit.CaptainStatIdx);
var sailorStat = DataManager.Inst.GetEnemyStatDictionaryFromKey(unit.SailorStatIdx); var sailorStat = DataManager.Inst.GetPirateStatDictionaryFromKey(unit.SailorStatIdx);
SetPlayerUnits(); SetPlayerUnits();
var newUnitController = Instantiate(UnitPrefab, Vector3.zero, Quaternion.identity, pirateUnits).GetComponent<PirateUnit>(); var newUnitController = Instantiate(PiratePrefab, Vector3.zero, Quaternion.identity, pirateUnits).GetComponent<PirateUnit>();
newUnitController.pirateUnitStat = new PirateUnitStat(unit); newUnitController.pirateUnitStat = new PirateUnitStat(unit);
DestroyDeployedUnits(newUnitController); DestroyDeployedUnits(newUnitController);
@ -243,7 +174,7 @@ namespace BlueWaterProject
var baseName = pirateStat.UnitType.ToString(); var baseName = pirateStat.UnitType.ToString();
SetUnitName(newUnitController, newUnitController.pirateUnitStat.UnitName, baseName); SetUnitName(newUnitController, newUnitController.pirateUnitStat.UnitName, baseName);
newUnitController.pirateUnitStat.UnitList = new List<AiController>(newUnitController.pirateUnitStat.SailorCount + 1); newUnitController.pirateUnitStat.PirateAiList = new List<PirateAi>(newUnitController.pirateUnitStat.SailorCount + 1);
var unitControllerTransform = newUnitController.transform; var unitControllerTransform = newUnitController.transform;
var unitControllerRotation = unitControllerTransform.rotation; var unitControllerRotation = unitControllerTransform.rotation;
@ -284,7 +215,7 @@ namespace BlueWaterProject
var xOffset = (j - (gridSize - 1) / 2.0f) * UnitSpacing; var xOffset = (j - (gridSize - 1) / 2.0f) * UnitSpacing;
var spawnPosition = unitControllerTransform.position + new Vector3(xOffset, 0, zOffset); var spawnPosition = unitControllerTransform.position + new Vector3(xOffset, 0, zOffset);
var baseObj = Instantiate(BaseCharacterPrefab, spawnPosition, var baseObj = Instantiate(BaseHumanPrefab, spawnPosition,
Quaternion.identity, newUnitController.transform); Quaternion.identity, newUnitController.transform);
var newSoldierName = $"{baseName}_{currentPos + 1:00}"; var newSoldierName = $"{baseName}_{currentPos + 1:00}";
@ -292,12 +223,12 @@ namespace BlueWaterProject
baseObj.name = newSoldierName; baseObj.name = newSoldierName;
baseObj.gameObject.SetActive(false); baseObj.gameObject.SetActive(false);
var aiController = GetAiController(baseObj, pirateStat.UnitType, currentPos == heroPosition ? captainStat : sailorStat); var pirateAi = GetPirateAi(baseObj, pirateStat.UnitType, currentPos == heroPosition ? captainStat : sailorStat);
aiController.SetAttackerType(attackerType); pirateAi.SetAttackerType(attackerType);
aiController.SetOffenseType(newUnitController.pirateUnitStat.OffenseType); pirateAi.SetOffenseType(newUnitController.pirateUnitStat.OffenseType);
aiController.SetDefenseType(newUnitController.pirateUnitStat.DefenseType); pirateAi.SetDefenseType(newUnitController.pirateUnitStat.DefenseType);
newUnitController.pirateUnitStat.UnitList.Add(aiController); newUnitController.pirateUnitStat.PirateAiList.Add(pirateAi);
} }
} }
newUnitController.transform.rotation *= unitControllerRotation; newUnitController.transform.rotation *= unitControllerRotation;
@ -321,11 +252,11 @@ namespace BlueWaterProject
DestroyDeployedUnits(enemyUnit); DestroyDeployedUnits(enemyUnit);
var enemyStat = DataManager.Inst.GetEnemyStatDictionaryFromKey(enemyUnit.enemyUnitStat.SailorStatIdx); var enemyStat = DataManager.Inst.GetEnemyStatSoFromKey(enemyUnit.enemyUnitStat.SailorStatIdx);
var baseName = enemyStat.UnitType.ToString(); var baseName = enemyStat.UnitType.ToString();
SetUnitName(enemyUnit, enemyUnit.enemyUnitStat.UnitName, baseName); SetUnitName(enemyUnit, enemyUnit.enemyUnitStat.UnitName, baseName);
enemyUnit.enemyUnitStat.UnitList = new List<AiController>(enemyUnit.enemyUnitStat.SailorCount + 1); enemyUnit.enemyUnitStat.EnemyAiList = new List<EnemyAi>(enemyUnit.enemyUnitStat.SailorCount + 1);
var unitControllerTransform = enemyUnit.transform; var unitControllerTransform = enemyUnit.transform;
var unitControllerRotation = unitControllerTransform.rotation; var unitControllerRotation = unitControllerTransform.rotation;
@ -366,7 +297,7 @@ namespace BlueWaterProject
var xOffset = (j - (gridSize - 1) / 2.0f) * UnitSpacing; var xOffset = (j - (gridSize - 1) / 2.0f) * UnitSpacing;
var spawnPosition = unitControllerTransform.position + new Vector3(xOffset, 0, zOffset); var spawnPosition = unitControllerTransform.position + new Vector3(xOffset, 0, zOffset);
var baseObj = Instantiate(BaseCharacterPrefab, spawnPosition, var baseObj = Instantiate(BaseHumanPrefab, spawnPosition,
Quaternion.identity, enemyUnit.transform); Quaternion.identity, enemyUnit.transform);
var newSoldierName = $"{baseName}_{currentPos + 1:00}"; var newSoldierName = $"{baseName}_{currentPos + 1:00}";
@ -374,63 +305,53 @@ namespace BlueWaterProject
baseObj.name = newSoldierName; baseObj.name = newSoldierName;
baseObj.gameObject.SetActive(false); baseObj.gameObject.SetActive(false);
var aiController = GetAiController(baseObj, enemyStat.UnitType, currentPos == heroPosition ? captainStat : sailorStat); var currentStat = currentPos == heroPosition ? captainStat : sailorStat;
var enemyAi = GetEnemyAi(baseObj, enemyStat.UnitType, currentStat);
aiController.SetAttackerType(enemyUnit.enemyUnitStat.AttackerType); enemyAi.SetAttackerType(enemyUnit.enemyUnitStat.AttackerType);
aiController.SetOffenseType(enemyUnit.enemyUnitStat.OffenseType); enemyAi.SetOffenseType(enemyUnit.enemyUnitStat.OffenseType);
aiController.SetDefenseType(enemyUnit.enemyUnitStat.DefenseType); enemyAi.SetDefenseType(enemyUnit.enemyUnitStat.DefenseType);
aiController.InitStartInEditor(); enemyAi.InitStartInEditor();
enemyUnit.enemyUnitStat.UnitList.Add(aiController); enemyUnit.enemyUnitStat.EnemyAiList.Add(enemyAi);
} }
} }
enemyUnit.transform.rotation *= unitControllerRotation; enemyUnit.transform.rotation *= unitControllerRotation;
} }
private AiController GetAiController(GameObject baseObj, GlobalValue.UnitType unitType, EnemyStat aiStat) private EnemyAi GetEnemyAi(GameObject baseObj, GlobalValue.UnitType unitType, EnemyStat enemyStat)
{ {
AiController temp = null; EnemyAi enemyAi = unitType switch
switch (unitType)
{ {
case GlobalValue.UnitType.NONE: GlobalValue.UnitType.ARCHER_E => baseObj.AddComponent<EnemyArcher>(),
break; GlobalValue.UnitType.SPEAR_KNIGHT_E => baseObj.AddComponent<EnemySpearKnight>(),
case GlobalValue.UnitType.ARCHER_E: GlobalValue.UnitType.SPEARMAN_E => baseObj.AddComponent<EnemySpearman>(),
temp = baseObj.AddComponent<Archer>(); GlobalValue.UnitType.SWORD_KNIGHT_E => baseObj.AddComponent<EnemySwordKnight>(),
break; GlobalValue.UnitType.SWORDMAN_E => baseObj.AddComponent<EnemySwordman>(),
case GlobalValue.UnitType.SPEAR_KNIGHT_E: _ => throw new ArgumentOutOfRangeException(nameof(unitType), unitType, null)
temp = baseObj.AddComponent<SpearKnight>(); };
break;
case GlobalValue.UnitType.SPEARMAN_E:
temp = baseObj.AddComponent<Spearman>();
break;
case GlobalValue.UnitType.SWORD_KNIGHT_E:
temp = baseObj.AddComponent<SwordKnight>();
break;
case GlobalValue.UnitType.SWORDMAN_E:
temp = baseObj.AddComponent<Swordman>();
break;
case GlobalValue.UnitType.ARCHER_P:
temp = baseObj.AddComponent<Archer>();
break;
case GlobalValue.UnitType.AXEMAN_P:
temp = baseObj.AddComponent<Axeman>();
break;
case GlobalValue.UnitType.SPEARMAN_P:
temp = baseObj.AddComponent<Spearman>();
break;
case GlobalValue.UnitType.SWORD_KNIGHT_P:
temp = baseObj.AddComponent<SwordKnight>();
break;
case GlobalValue.UnitType.SWORDMAN_P:
temp = baseObj.AddComponent<Swordman>();
break;
default:
throw new ArgumentOutOfRangeException(nameof(unitType), unitType, null);
}
if (temp == null) return null; if (enemyAi == null) return null;
//temp.AiStat = new AiStat(aiStat); enemyAi.EnemyStat = new EnemyStat(enemyStat);
return temp; return enemyAi;
}
private PirateAi GetPirateAi(GameObject baseObj, GlobalValue.UnitType unitType, PirateStat pirateStat)
{
PirateAi pirateAi = unitType switch
{
GlobalValue.UnitType.ARCHER_P => baseObj.AddComponent<PirateArcher>(),
GlobalValue.UnitType.AXEMAN_P => baseObj.AddComponent<PirateAxeman>(),
GlobalValue.UnitType.SPEARMAN_P => baseObj.AddComponent<PirateSpearman>(),
GlobalValue.UnitType.SWORD_KNIGHT_P => baseObj.AddComponent<PirateSwordKnight>(),
GlobalValue.UnitType.SWORDMAN_P => baseObj.AddComponent<PirateSwordman>(),
_ => throw new ArgumentOutOfRangeException(nameof(unitType), unitType, null)
};
if (pirateAi == null) return null;
pirateAi.PirateStat = new PirateStat(pirateStat);
return pirateAi;
} }
/// <summary> /// <summary>
@ -438,13 +359,13 @@ namespace BlueWaterProject
/// </summary> /// </summary>
public bool CanAssignUnit(EnemyUnit enemyUnit, Vector3 assignPos) public bool CanAssignUnit(EnemyUnit enemyUnit, Vector3 assignPos)
{ {
if (enemyUnit.enemyUnitStat.UnitList.Count <= 0) return false; if (enemyUnit.enemyUnitStat.EnemyAiList.Count <= 0) return false;
enemyUnit.transform.position = assignPos; enemyUnit.transform.position = assignPos;
for (var i = 0; i < enemyUnit.enemyUnitStat.SailorCount; i++) for (var i = 0; i < enemyUnit.enemyUnitStat.SailorCount; i++)
{ {
var unitPos = enemyUnit.enemyUnitStat.UnitList[i].transform.position; var unitPos = enemyUnit.enemyUnitStat.EnemyAiList[i].transform.position;
var ray = new Ray(unitPos + Vector3.up, Vector3.down); var ray = new Ray(unitPos + Vector3.up, Vector3.down);
if (Physics.Raycast(ray, out var hit, MaxGroundDistance, GroundLayer)) if (Physics.Raycast(ray, out var hit, MaxGroundDistance, GroundLayer))
{ {
@ -463,7 +384,7 @@ namespace BlueWaterProject
{ {
enemyUnit.transform.position = assignPos; enemyUnit.transform.position = assignPos;
foreach (var unit in enemyUnit.enemyUnitStat.UnitList) foreach (var unit in enemyUnit.enemyUnitStat.EnemyAiList)
{ {
var myPos = unit.transform.position; var myPos = unit.transform.position;
var ray = new Ray(myPos + Vector3.up, Vector3.down); var ray = new Ray(myPos + Vector3.up, Vector3.down);
@ -473,7 +394,7 @@ namespace BlueWaterProject
} }
} }
foreach (var unit in enemyUnit.enemyUnitStat.UnitList) foreach (var unit in enemyUnit.enemyUnitStat.EnemyAiList)
{ {
unit.gameObject.SetActive(true); unit.gameObject.SetActive(true);
} }
@ -484,7 +405,7 @@ namespace BlueWaterProject
pirateUnit.transform.position = assignPos; pirateUnit.transform.position = assignPos;
IslandInfo hitIslandInfo = null; IslandInfo hitIslandInfo = null;
foreach (var unit in pirateUnit.pirateUnitStat.UnitList) foreach (var unit in pirateUnit.pirateUnitStat.PirateAiList)
{ {
var myPos = unit.transform.position; var myPos = unit.transform.position;
var ray = new Ray(myPos + Vector3.up, Vector3.down); var ray = new Ray(myPos + Vector3.up, Vector3.down);
@ -499,7 +420,7 @@ namespace BlueWaterProject
} }
} }
foreach (var unit in pirateUnit.pirateUnitStat.UnitList) foreach (var unit in pirateUnit.pirateUnitStat.PirateAiList)
{ {
if (isOffense) if (isOffense)
{ {
@ -529,20 +450,20 @@ namespace BlueWaterProject
} }
} }
/// <summary> // /// <summary>
/// pirateUnitList 내의 속성 // /// pirateUnitList 내의 속성
/// </summary> // /// </summary>
public void RemovePlayerUnitListElement(PirateUnit pirateUnit) // public void RemovePlayerUnitListElement(PirateUnit pirateUnit)
{ // {
if (pirateUnitList.Contains(pirateUnit)) // if (pirateUnitList.Contains(pirateUnit))
{ // {
pirateUnitList.Remove(pirateUnit); // pirateUnitList.Remove(pirateUnit);
} // }
else // else
{ // {
Debug.Log("제거하려는 속성이 리스트 내에 존재하지 않습니다."); // Debug.Log("제거하려는 속성이 리스트 내에 존재하지 않습니다.");
} // }
} // }
#endregion #endregion
} }

View File

@ -9,7 +9,8 @@ namespace BlueWaterProject
#region Property and variable #region Property and variable
[Tooltip("선택된 부대")] [Tooltip("선택된 부대")]
[field: SerializeField] public PirateUnit SelectedUnitController { get; private set; } [field: SerializeField] public bool IsSelectable { get; private set; } = true;
[field: SerializeField] public PirateUnit SelectedPirateUnit { get; private set; }
[SerializeField] private LayerMask unitLayer; [SerializeField] private LayerMask unitLayer;
[SerializeField] private LayerMask groundLayer; [SerializeField] private LayerMask groundLayer;
@ -47,89 +48,89 @@ namespace BlueWaterProject
private void OnLeftClick(InputAction.CallbackContext context) private void OnLeftClick(InputAction.CallbackContext context)
{ {
if (!context.performed) return; if (!context.performed || !IsSelectable) return;
var ray = mainCamera.ScreenPointToRay(Mouse.current.position.ReadValue()); var ray = mainCamera.ScreenPointToRay(Mouse.current.position.ReadValue());
// 부대를 클릭 했을 때, // 부대를 클릭 했을 때,
if (Physics.Raycast(ray, out var hit, Mathf.Infinity, unitLayer)) if (Physics.Raycast(ray, out var hit, Mathf.Infinity, unitLayer, QueryTriggerInteraction.Collide))
{ {
var unitController = hit.collider.transform.parent.GetComponent<PirateUnit>(); var pirateUnit = hit.collider.transform.parent.GetComponent<PirateUnit>();
if (unitController == null) return; if (pirateUnit == null) return;
// 선택된 부대가 없었을 때, // 선택된 부대가 없었을 때,
if (SelectedUnitController == null) if (SelectedPirateUnit == null)
{ {
foreach (var soldier in unitController.pirateUnitStat.UnitList) foreach (var pirateAi in pirateUnit.pirateUnitStat.PirateAiList)
{ {
soldier.SelectedHighlight(); pirateAi.SelectedHighlight();
} }
SelectedUnitController = unitController; SelectedPirateUnit = pirateUnit;
GameManager.Inst.SlowSpeedMode(); GameManager.Inst.SlowSpeedMode();
} }
// 선택된 부대가 이미 선택된 부대일 때, // 선택된 부대가 이미 선택된 부대일 때,
else if (SelectedUnitController == unitController) else if (SelectedPirateUnit == pirateUnit)
{ {
foreach (var soldier in SelectedUnitController.pirateUnitStat.UnitList) foreach (var pirateAi in SelectedPirateUnit.pirateUnitStat.PirateAiList)
{ {
soldier.ResetHighlight(); pirateAi.ResetHighlight();
} }
SelectedUnitController = null; SelectedPirateUnit = null;
GameManager.Inst.DefaultSpeedMode(); GameManager.Inst.DefaultSpeedMode();
} }
// 다른 부대가 선택될 때, // 다른 부대가 선택될 때,
else else
{ {
foreach (var soldier in unitController.pirateUnitStat.UnitList) foreach (var pirateAi in pirateUnit.pirateUnitStat.PirateAiList)
{ {
soldier.SelectedHighlight(); pirateAi.SelectedHighlight();
} }
foreach (var soldier in SelectedUnitController.pirateUnitStat.UnitList) foreach (var pirateAi in SelectedPirateUnit.pirateUnitStat.PirateAiList)
{ {
soldier.ResetHighlight(); pirateAi.ResetHighlight();
} }
SelectedUnitController = unitController; SelectedPirateUnit = pirateUnit;
} }
} }
// 부대를 클릭하지 않았을 때, // 부대를 클릭하지 않았을 때,
else else
{ {
// 선택된 부대가 없었을 때, // 선택된 부대가 없었을 때,
if (SelectedUnitController == null) return; if (SelectedPirateUnit == null) return;
// 선택된 부대가 있었을 때, // 선택된 부대가 있었을 때,
foreach (var soldier in SelectedUnitController.pirateUnitStat.UnitList) foreach (var pirateAi in SelectedPirateUnit.pirateUnitStat.PirateAiList)
{ {
soldier.ResetHighlight(); pirateAi.ResetHighlight();
} }
SelectedUnitController = null; SelectedPirateUnit = null;
GameManager.Inst.DefaultSpeedMode(); GameManager.Inst.DefaultSpeedMode();
} }
} }
private void OnRightClick(InputAction.CallbackContext context) private void OnRightClick(InputAction.CallbackContext context)
{ {
if (!context.performed || SelectedUnitController == null) return; if (!context.performed || !IsSelectable || SelectedPirateUnit == null) return;
var ray = mainCamera.ScreenPointToRay(Mouse.current.position.ReadValue()); var ray = mainCamera.ScreenPointToRay(Mouse.current.position.ReadValue());
if (Physics.Raycast(ray, out var hit, Mathf.Infinity, groundLayer)) if (Physics.Raycast(ray, out var hit, Mathf.Infinity, groundLayer, QueryTriggerInteraction.Collide))
{ {
var targetPos = hit.point; var targetPos = hit.point;
SelectedUnitController.MoveCommand(targetPos); SelectedPirateUnit.MoveCommand(targetPos);
} }
foreach (var soldier in SelectedUnitController.pirateUnitStat.UnitList) foreach (var pirateAi in SelectedPirateUnit.pirateUnitStat.PirateAiList)
{ {
soldier.ResetHighlight(); pirateAi.ResetHighlight();
} }
SelectedUnitController = null; SelectedPirateUnit = null;
GameManager.Inst.DefaultSpeedMode(); GameManager.Inst.DefaultSpeedMode();
} }

View File

@ -13,7 +13,7 @@ MonoBehaviour:
m_Name: EnemyViewDataSo m_Name: EnemyViewDataSo
m_EditorClassIdentifier: m_EditorClassIdentifier:
enemyViewDataList: enemyViewDataList:
- <Idx>k__BackingField: enemy_view_salior_001 - <Idx>k__BackingField: enemy_view_sailor_001
<Backpack>k__BackingField: 1 <Backpack>k__BackingField: 1
<LeftWeapon>k__BackingField: 2 <LeftWeapon>k__BackingField: 2
<LeftShield>k__BackingField: -1 <LeftShield>k__BackingField: -1
@ -21,7 +21,7 @@ MonoBehaviour:
<RightWeapon>k__BackingField: -1 <RightWeapon>k__BackingField: -1
<Body>k__BackingField: 11 <Body>k__BackingField: 11
<Flag>k__BackingField: -1 <Flag>k__BackingField: -1
- <Idx>k__BackingField: enemy_view_salior_002 - <Idx>k__BackingField: enemy_view_sailor_002
<Backpack>k__BackingField: -1 <Backpack>k__BackingField: -1
<LeftWeapon>k__BackingField: -1 <LeftWeapon>k__BackingField: -1
<LeftShield>k__BackingField: 1 <LeftShield>k__BackingField: 1
@ -29,7 +29,7 @@ MonoBehaviour:
<RightWeapon>k__BackingField: 27 <RightWeapon>k__BackingField: 27
<Body>k__BackingField: 18 <Body>k__BackingField: 18
<Flag>k__BackingField: -1 <Flag>k__BackingField: -1
- <Idx>k__BackingField: enemy_view_salior_003 - <Idx>k__BackingField: enemy_view_sailor_003
<Backpack>k__BackingField: -1 <Backpack>k__BackingField: -1
<LeftWeapon>k__BackingField: -1 <LeftWeapon>k__BackingField: -1
<LeftShield>k__BackingField: -1 <LeftShield>k__BackingField: -1
@ -37,7 +37,7 @@ MonoBehaviour:
<RightWeapon>k__BackingField: 27 <RightWeapon>k__BackingField: 27
<Body>k__BackingField: 17 <Body>k__BackingField: 17
<Flag>k__BackingField: -1 <Flag>k__BackingField: -1
- <Idx>k__BackingField: enemy_view_salior_004 - <Idx>k__BackingField: enemy_view_sailor_004
<Backpack>k__BackingField: -1 <Backpack>k__BackingField: -1
<LeftWeapon>k__BackingField: -1 <LeftWeapon>k__BackingField: -1
<LeftShield>k__BackingField: 9 <LeftShield>k__BackingField: 9
@ -45,7 +45,7 @@ MonoBehaviour:
<RightWeapon>k__BackingField: 6 <RightWeapon>k__BackingField: 6
<Body>k__BackingField: 39 <Body>k__BackingField: 39
<Flag>k__BackingField: -1 <Flag>k__BackingField: -1
- <Idx>k__BackingField: enemy_view_salior_005 - <Idx>k__BackingField: enemy_view_sailor_005
<Backpack>k__BackingField: -1 <Backpack>k__BackingField: -1
<LeftWeapon>k__BackingField: -1 <LeftWeapon>k__BackingField: -1
<LeftShield>k__BackingField: -1 <LeftShield>k__BackingField: -1

View File

@ -13,7 +13,7 @@ MonoBehaviour:
m_Name: PirateViewDataSo m_Name: PirateViewDataSo
m_EditorClassIdentifier: m_EditorClassIdentifier:
pirateViewDataList: pirateViewDataList:
- <Idx>k__BackingField: pirate_view_salior_001 - <Idx>k__BackingField: pirate_view_sailor_001
<Backpack>k__BackingField: 0 <Backpack>k__BackingField: 0
<LeftWeapon>k__BackingField: 1 <LeftWeapon>k__BackingField: 1
<LeftShield>k__BackingField: -1 <LeftShield>k__BackingField: -1
@ -21,7 +21,7 @@ MonoBehaviour:
<RightWeapon>k__BackingField: -1 <RightWeapon>k__BackingField: -1
<Body>k__BackingField: 1 <Body>k__BackingField: 1
<Flag>k__BackingField: -1 <Flag>k__BackingField: -1
- <Idx>k__BackingField: pirate_view_salior_002 - <Idx>k__BackingField: pirate_view_sailor_002
<Backpack>k__BackingField: -1 <Backpack>k__BackingField: -1
<LeftWeapon>k__BackingField: -1 <LeftWeapon>k__BackingField: -1
<LeftShield>k__BackingField: -1 <LeftShield>k__BackingField: -1
@ -29,7 +29,7 @@ MonoBehaviour:
<RightWeapon>k__BackingField: 31 <RightWeapon>k__BackingField: 31
<Body>k__BackingField: 58 <Body>k__BackingField: 58
<Flag>k__BackingField: -1 <Flag>k__BackingField: -1
- <Idx>k__BackingField: pirate_view_salior_003 - <Idx>k__BackingField: pirate_view_sailor_003
<Backpack>k__BackingField: -1 <Backpack>k__BackingField: -1
<LeftWeapon>k__BackingField: -1 <LeftWeapon>k__BackingField: -1
<LeftShield>k__BackingField: -1 <LeftShield>k__BackingField: -1
@ -37,7 +37,7 @@ MonoBehaviour:
<RightWeapon>k__BackingField: 27 <RightWeapon>k__BackingField: 27
<Body>k__BackingField: 60 <Body>k__BackingField: 60
<Flag>k__BackingField: -1 <Flag>k__BackingField: -1
- <Idx>k__BackingField: pirate_view_salior_004 - <Idx>k__BackingField: pirate_view_sailor_004
<Backpack>k__BackingField: -1 <Backpack>k__BackingField: -1
<LeftWeapon>k__BackingField: -1 <LeftWeapon>k__BackingField: -1
<LeftShield>k__BackingField: 2 <LeftShield>k__BackingField: 2
@ -45,7 +45,7 @@ MonoBehaviour:
<RightWeapon>k__BackingField: 24 <RightWeapon>k__BackingField: 24
<Body>k__BackingField: 58 <Body>k__BackingField: 58
<Flag>k__BackingField: -1 <Flag>k__BackingField: -1
- <Idx>k__BackingField: pirate_view_salior_005 - <Idx>k__BackingField: pirate_view_sailor_005
<Backpack>k__BackingField: -1 <Backpack>k__BackingField: -1
<LeftWeapon>k__BackingField: -1 <LeftWeapon>k__BackingField: -1
<LeftShield>k__BackingField: -1 <LeftShield>k__BackingField: -1

View File

@ -53,7 +53,7 @@ namespace BlueWaterProject
InitDictionary(); InitDictionary();
} }
private void InitDictionary() public void InitDictionary()
{ {
enemyViewDictionary = CreateDictionaryFromList(EnemyViewDataSo.enemyViewDataList, GlobalValue.ENEMY_VIEW_DATA_CAPACITY); enemyViewDictionary = CreateDictionaryFromList(EnemyViewDataSo.enemyViewDataList, GlobalValue.ENEMY_VIEW_DATA_CAPACITY);
pirateViewDictionary = CreateDictionaryFromList(PirateViewDataSo.pirateViewDataList,GlobalValue.PIRATE_VIEW_DATA_CAPACITY); pirateViewDictionary = CreateDictionaryFromList(PirateViewDataSo.pirateViewDataList,GlobalValue.PIRATE_VIEW_DATA_CAPACITY);

View File

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

View File

@ -11,7 +11,7 @@ GameObject:
- component: {fileID: 5207057600910007092} - component: {fileID: 5207057600910007092}
- component: {fileID: 8302608207570708049} - component: {fileID: 8302608207570708049}
m_Layer: 6 m_Layer: 6
m_Name: Unit m_Name: EnemyUnit
m_TagString: Unit m_TagString: Unit
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
m_NavMeshLayer: 0 m_NavMeshLayer: 0

View File

@ -0,0 +1,56 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &4895273044672475838
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5207057600910007092}
- component: {fileID: 8153086830725145821}
m_Layer: 6
m_Name: PirateUnit
m_TagString: Unit
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &5207057600910007092
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4895273044672475838}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &8153086830725145821
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4895273044672475838}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ab5bc80b7b2c7ae4a8629d3000d7c0e0, type: 3}
m_Name:
m_EditorClassIdentifier:
pirateUnitStat:
<Idx>k__BackingField:
<CaptainStatIdx>k__BackingField:
<SailorStatIdx>k__BackingField:
<UnitName>k__BackingField:
<SailorCount>k__BackingField: 0
<AttackerType>k__BackingField: -1
<OffenseType>k__BackingField: -1
<DefenseType>k__BackingField: -1
<PirateAiList>k__BackingField: []

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: fb89776af2571544e99d012ee545cdb9
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant: