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
// 일반 변수
protected bool isDrawGizmosInFieldOfView = true;
protected LayerMask targetLayer;
protected Vector3 defensePos;
protected IslandInfo attackingIslandInfo;
// 컴포넌트 관련 변수
protected Animator humanAnimator;
protected Animator combatAnimator;
protected NavMeshAgent humanAgent;
protected CapsuleCollider myCollider;
protected CapsuleCollider hitBoxCollider;
@ -44,7 +47,7 @@ namespace BlueWaterProject
protected override void Awake()
{
base.InitComponent();
base.Awake();
FlagLookAtCamera();
SetLayer();
@ -58,14 +61,14 @@ namespace BlueWaterProject
{
base.InitComponent();
humanAnimator = Utils.GetComponentAndAssert<Animator>(transform);
combatAnimator = Utils.GetComponentAndAssert<Animator>(transform);
humanAgent = Utils.GetComponentAndAssert<NavMeshAgent>(transform);
myCollider = Utils.GetComponentAndAssert<CapsuleCollider>(transform);
hitBoxCollider = Utils.GetComponentAndAssert<CapsuleCollider>(transform.Find("HitBox"));
lookAtConstraint = Utils.GetComponentAndAssert<LookAtConstraint>(flagContainer);
}
private void FlagLookAtCamera()
protected void FlagLookAtCamera()
{
if (Camera.main != null)
{
@ -80,7 +83,10 @@ namespace BlueWaterProject
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;
public void SetIslandInfo(IslandInfo info) => attackingIslandInfo = info;
#endregion
}

View File

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

View File

@ -1,10 +1,101 @@
using System.Collections;
using UnityEngine;
using UnityEngine.Pool;
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
{
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
{
#region Properties and variables
private CloseWeapon closeWeapon;
#endregion
#region Custrom methods
#if UNITY_EDITOR
public override void InitStartInEditor()
{
base.InitStartInEditor();
SetCloseWeapon();
}
#endif
protected override void InitStart()
{
base.InitStart();
SetAnimatorController("SpearKnight");
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;
closeWeapon = rightWeaponContainer.GetChild(rightWeaponView).AddComponent<CloseWeapon>();
@ -27,5 +45,7 @@ namespace BlueWaterProject
closeWeapon.SetAttackerAiType(EAiType.ENEMY);
closeWeapon.SetBoxCollider();
}
#endregion
}
}

View File

@ -6,18 +6,36 @@ namespace BlueWaterProject
{
public class EnemySpearman : EnemyAi
{
#region Properties and variables
private CloseWeapon closeWeapon;
#endregion
#region Custrom methods
#if UNITY_EDITOR
public override void InitStartInEditor()
{
base.InitStartInEditor();
SetCloseWeapon();
}
#endif
protected override void InitStart()
{
base.InitStart();
SetAnimatorController("Spearman");
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;
closeWeapon = rightWeaponContainer.GetChild(rightWeaponView).AddComponent<CloseWeapon>();
@ -27,5 +45,7 @@ namespace BlueWaterProject
closeWeapon.SetAttackerAiType(EAiType.ENEMY);
closeWeapon.SetBoxCollider();
}
#endregion
}
}

View File

@ -6,18 +6,36 @@ namespace BlueWaterProject
{
public class EnemySwordKnight : EnemyAi
{
#region Properties and variables
private CloseWeapon closeWeapon;
#endregion
#region Custrom methods
#if UNITY_EDITOR
public override void InitStartInEditor()
{
base.InitStartInEditor();
SetCloseWeapon();
}
#endif
protected override void InitStart()
{
base.InitStart();
SetAnimatorController("SwordKnight");
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;
closeWeapon = rightWeaponContainer.GetChild(rightWeaponView).AddComponent<CloseWeapon>();
@ -27,5 +45,7 @@ namespace BlueWaterProject
closeWeapon.SetAttackerAiType(EAiType.ENEMY);
closeWeapon.SetBoxCollider();
}
#endregion
}
}

View File

@ -6,18 +6,36 @@ namespace BlueWaterProject
{
public class EnemySwordman : EnemyAi
{
#region Properties and variables
private CloseWeapon closeWeapon;
#endregion
#region Custrom methods
#if UNITY_EDITOR
public override void InitStartInEditor()
{
base.InitStartInEditor();
SetCloseWeapon();
}
#endif
protected override void InitStart()
{
base.InitStart();
SetAnimatorController("Swordman");
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;
closeWeapon = rightWeaponContainer.GetChild(rightWeaponView).AddComponent<CloseWeapon>();
@ -27,5 +45,7 @@ namespace BlueWaterProject
closeWeapon.SetAttackerAiType(EAiType.ENEMY);
closeWeapon.SetBoxCollider();
}
#endregion
}
}

View File

@ -26,12 +26,42 @@ namespace BlueWaterProject
[DisableIf("@true")]
[SerializeField] private IslandInfo islandInfo;
protected PirateStat pirateStat;
[field: SerializeField] public PirateStat PirateStat { get; set; }
private PirateUnit mouseEnterPirateUnit;
private UnitSelection unitSelection;
#endregion
#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()
{
InitStart();
@ -41,6 +71,13 @@ namespace BlueWaterProject
#region Custom methods
protected override void InitComponent()
{
base.InitComponent();
unitSelection = Utils.GetComponentAndAssert<UnitSelection>(GameObject.Find("UnitManager").transform);
}
protected override void SetLayer()
{
gameObject.layer = LayerMask.NameToLayer("Pirate");
@ -49,7 +86,7 @@ namespace BlueWaterProject
hitBoxObj.tag = "Pirate";
targetLayer = LayerMask.GetMask("Enemy");
if (pirateStat.AttackerType == EAttackerType.OFFENSE)
if (PirateStat.AttackerType == EAttackerType.OFFENSE)
{
targetLayer |= LayerMask.GetMask("Props");
}
@ -57,14 +94,14 @@ namespace BlueWaterProject
protected virtual void InitStart()
{
var pirateViewData = GetPirateViewData();
var pirateViewData = DataManager.Inst.GetPirateViewDictionaryFromKey(PirateStat.ViewIdx);
InitViewModel(pirateViewData);
FindMaterial();
SetCurrentHp(pirateStat.MaxHp);
SetMoveSpeed(pirateStat.MoveSpd);
SetCurrentHp(PirateStat.MaxHp);
SetMoveSpeed(PirateStat.MoveSpd);
if (pirateStat.AttackerType == EAttackerType.DEFENSE)
if (PirateStat.AttackerType == EAttackerType.DEFENSE)
{
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
}

View File

@ -1,10 +1,100 @@
using System.Collections;
using UnityEngine;
using UnityEngine.Pool;
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
{
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();
SetAnimatorController("Axeman");
SetCloseWeapon();
}
private void SetCloseWeapon()
{
var rightWeaponView = DataManager.Inst.GetPirateViewDictionaryFromKey(pirateStat.ViewIdx).RightWeapon;
var rightWeaponView = DataManager.Inst.GetPirateViewDictionaryFromKey(PirateStat.ViewIdx).RightWeapon;
if (rightWeaponView == -1) return;
closeWeapon = rightWeaponContainer.GetChild(rightWeaponView).AddComponent<CloseWeapon>();

View File

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

View File

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

View File

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

View File

@ -1,6 +1,5 @@
using Sirenix.OdinInspector;
using UnityEngine;
using UnityEngine.Serialization;
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
@ -22,7 +21,7 @@ namespace BlueWaterProject
{
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 ray = new Ray(unitPos + Vector3.up, Vector3.down);
@ -77,7 +76,7 @@ namespace BlueWaterProject
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 void OnTypeChanged() => isClickedTypeAllButton = false;

View File

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

View File

@ -3,36 +3,19 @@ using System.Collections.Generic;
using Sirenix.OdinInspector;
using UnityEditor.Animations;
using UnityEngine;
using UnityEngine.Serialization;
// ReSharper disable once CheckNamespace
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>
{
#region Property and variable
[Tooltip("유닛 프리팹")]
[field: SerializeField] public GameObject UnitPrefab { get; private set; }
[Tooltip("Pirate 프리팹")]
[field: SerializeField] public GameObject PiratePrefab { get; private set; }
[Tooltip("캐릭터 기초 프리팹")]
[field: SerializeField] public GameObject BaseCharacterPrefab { get; private set; }
[field: SerializeField] public GameObject BaseHumanPrefab { get; private set; }
[Tooltip("화살 프리팹")]
[field: SerializeField] public GameObject ArrowPrefab { get; private set; }
@ -41,30 +24,16 @@ namespace BlueWaterProject
[field: SerializeField] public LayerMask GroundLayer { get; private set; }
[Tooltip("바닥과의 최대 허용 거리")]
[field: SerializeField] public float MaxGroundDistance { get; private set; } = 2.5f;
[field: SerializeField] public float MaxGroundDistance { get; private set; } = 4f;
[Tooltip("병력 간의 간격")]
[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: 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 const int MATRICES_CAPACITY = 9;
private const int CHARACTER_PREFAB_CAPACITY = 10;
private const int ANIMATOR_CONTROLLER_PREFAB_CAPACITY = 6;
private const int PIRATE_UNIT_CAPACITY = 50;
@ -75,58 +44,34 @@ namespace BlueWaterProject
protected override void OnAwake()
{
GroundLayer = LayerMask.GetMask("Ground");
InitUnitMatrices();
InitPlayerUnitList();
//InitPlayerUnitList();
}
private void Reset()
{
GroundLayer = LayerMask.GetMask("Ground");
MaxGroundDistance = 2.5f;
MaxGroundDistance = 4f;
UnitSpacing = 2.5f;
characterPrefabList = new List<GameObject>(CHARACTER_PREFAB_CAPACITY);
InitUnitMatrices();
InitCharacterPrefabList();
InitPlayerUnitList();
//InitPlayerUnitList();
}
#endregion
#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
/// <summary>
/// 프리팹 초기화 함수
/// </summary>
[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("프리팹 초기화")]
private void InitCharacterPrefabList()
{
UnitPrefab = Utils.LoadPrefabFromFolder("Assets/05.Prefabs/Character", "Unit");
BaseCharacterPrefab = Utils.LoadPrefabFromFolder("Assets/05.Prefabs/Character", "BaseCharacter");
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");
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", "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
/// <summary>
/// 플레이어가 가진 유닛 리스트 초기화
/// </summary>
[GUIColor(0, 1, 0)]
[Button("플레이어 유닛 가져오기")]
private void InitPlayerUnitList()
{
SetPlayerUnits();
pirateUnitList = new List<PirateUnit>(PIRATE_UNIT_CAPACITY);
foreach (Transform item in pirateUnits)
{
if (!item.gameObject.activeSelf) continue;
pirateUnitList.Add(item.GetComponent<PirateUnit>());
}
}
// /// <summary>
// /// 플레이어가 가진 유닛 리스트 초기화
// /// </summary>
// [GUIColor(0, 1, 0)]
// [Button("플레이어 유닛 가져오기")]
// private void InitPlayerUnitList()
// {
// SetPlayerUnits();
//
// pirateUnitList = new List<PirateUnit>(PIRATE_UNIT_CAPACITY);
//
// foreach (Transform item in pirateUnits)
// {
// if (!item.gameObject.activeSelf) continue;
//
// pirateUnitList.Add(item.GetComponent<PirateUnit>());
// }
// }
private void SetPlayerUnits()
{
@ -229,12 +160,12 @@ namespace BlueWaterProject
{
var card = DataManager.Inst.GetCardDictionaryFromKey(cardIdx);
var unit = DataManager.Inst.GetPirateUnitStatDictionaryFromKey(card.UnitIdx);
var captainStat = DataManager.Inst.GetEnemyStatDictionaryFromKey(unit.CaptainStatIdx);
var sailorStat = DataManager.Inst.GetEnemyStatDictionaryFromKey(unit.SailorStatIdx);
var captainStat = DataManager.Inst.GetPirateStatDictionaryFromKey(unit.CaptainStatIdx);
var sailorStat = DataManager.Inst.GetPirateStatDictionaryFromKey(unit.SailorStatIdx);
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);
DestroyDeployedUnits(newUnitController);
@ -243,7 +174,7 @@ namespace BlueWaterProject
var baseName = pirateStat.UnitType.ToString();
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 unitControllerRotation = unitControllerTransform.rotation;
@ -284,7 +215,7 @@ namespace BlueWaterProject
var xOffset = (j - (gridSize - 1) / 2.0f) * UnitSpacing;
var spawnPosition = unitControllerTransform.position + new Vector3(xOffset, 0, zOffset);
var baseObj = Instantiate(BaseCharacterPrefab, spawnPosition,
var baseObj = Instantiate(BaseHumanPrefab, spawnPosition,
Quaternion.identity, newUnitController.transform);
var newSoldierName = $"{baseName}_{currentPos + 1:00}";
@ -292,12 +223,12 @@ namespace BlueWaterProject
baseObj.name = newSoldierName;
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);
aiController.SetOffenseType(newUnitController.pirateUnitStat.OffenseType);
aiController.SetDefenseType(newUnitController.pirateUnitStat.DefenseType);
newUnitController.pirateUnitStat.UnitList.Add(aiController);
pirateAi.SetAttackerType(attackerType);
pirateAi.SetOffenseType(newUnitController.pirateUnitStat.OffenseType);
pirateAi.SetDefenseType(newUnitController.pirateUnitStat.DefenseType);
newUnitController.pirateUnitStat.PirateAiList.Add(pirateAi);
}
}
newUnitController.transform.rotation *= unitControllerRotation;
@ -321,11 +252,11 @@ namespace BlueWaterProject
DestroyDeployedUnits(enemyUnit);
var enemyStat = DataManager.Inst.GetEnemyStatDictionaryFromKey(enemyUnit.enemyUnitStat.SailorStatIdx);
var enemyStat = DataManager.Inst.GetEnemyStatSoFromKey(enemyUnit.enemyUnitStat.SailorStatIdx);
var baseName = enemyStat.UnitType.ToString();
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 unitControllerRotation = unitControllerTransform.rotation;
@ -366,7 +297,7 @@ namespace BlueWaterProject
var xOffset = (j - (gridSize - 1) / 2.0f) * UnitSpacing;
var spawnPosition = unitControllerTransform.position + new Vector3(xOffset, 0, zOffset);
var baseObj = Instantiate(BaseCharacterPrefab, spawnPosition,
var baseObj = Instantiate(BaseHumanPrefab, spawnPosition,
Quaternion.identity, enemyUnit.transform);
var newSoldierName = $"{baseName}_{currentPos + 1:00}";
@ -374,63 +305,53 @@ namespace BlueWaterProject
baseObj.name = newSoldierName;
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);
aiController.SetOffenseType(enemyUnit.enemyUnitStat.OffenseType);
aiController.SetDefenseType(enemyUnit.enemyUnitStat.DefenseType);
aiController.InitStartInEditor();
enemyUnit.enemyUnitStat.UnitList.Add(aiController);
enemyAi.SetAttackerType(enemyUnit.enemyUnitStat.AttackerType);
enemyAi.SetOffenseType(enemyUnit.enemyUnitStat.OffenseType);
enemyAi.SetDefenseType(enemyUnit.enemyUnitStat.DefenseType);
enemyAi.InitStartInEditor();
enemyUnit.enemyUnitStat.EnemyAiList.Add(enemyAi);
}
}
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;
switch (unitType)
EnemyAi enemyAi = unitType switch
{
case GlobalValue.UnitType.NONE:
break;
case GlobalValue.UnitType.ARCHER_E:
temp = baseObj.AddComponent<Archer>();
break;
case GlobalValue.UnitType.SPEAR_KNIGHT_E:
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);
GlobalValue.UnitType.ARCHER_E => baseObj.AddComponent<EnemyArcher>(),
GlobalValue.UnitType.SPEAR_KNIGHT_E => baseObj.AddComponent<EnemySpearKnight>(),
GlobalValue.UnitType.SPEARMAN_E => baseObj.AddComponent<EnemySpearman>(),
GlobalValue.UnitType.SWORD_KNIGHT_E => baseObj.AddComponent<EnemySwordKnight>(),
GlobalValue.UnitType.SWORDMAN_E => baseObj.AddComponent<EnemySwordman>(),
_ => throw new ArgumentOutOfRangeException(nameof(unitType), unitType, null)
};
if (enemyAi == null) return null;
enemyAi.EnemyStat = new EnemyStat(enemyStat);
return enemyAi;
}
if (temp == null) return null;
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)
};
//temp.AiStat = new AiStat(aiStat);
return temp;
if (pirateAi == null) return null;
pirateAi.PirateStat = new PirateStat(pirateStat);
return pirateAi;
}
/// <summary>
@ -438,13 +359,13 @@ namespace BlueWaterProject
/// </summary>
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;
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);
if (Physics.Raycast(ray, out var hit, MaxGroundDistance, GroundLayer))
{
@ -463,7 +384,7 @@ namespace BlueWaterProject
{
enemyUnit.transform.position = assignPos;
foreach (var unit in enemyUnit.enemyUnitStat.UnitList)
foreach (var unit in enemyUnit.enemyUnitStat.EnemyAiList)
{
var myPos = unit.transform.position;
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);
}
@ -484,7 +405,7 @@ namespace BlueWaterProject
pirateUnit.transform.position = assignPos;
IslandInfo hitIslandInfo = null;
foreach (var unit in pirateUnit.pirateUnitStat.UnitList)
foreach (var unit in pirateUnit.pirateUnitStat.PirateAiList)
{
var myPos = unit.transform.position;
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)
{
@ -529,20 +450,20 @@ namespace BlueWaterProject
}
}
/// <summary>
/// pirateUnitList 내의 속성
/// </summary>
public void RemovePlayerUnitListElement(PirateUnit pirateUnit)
{
if (pirateUnitList.Contains(pirateUnit))
{
pirateUnitList.Remove(pirateUnit);
}
else
{
Debug.Log("제거하려는 속성이 리스트 내에 존재하지 않습니다.");
}
}
// /// <summary>
// /// pirateUnitList 내의 속성
// /// </summary>
// public void RemovePlayerUnitListElement(PirateUnit pirateUnit)
// {
// if (pirateUnitList.Contains(pirateUnit))
// {
// pirateUnitList.Remove(pirateUnit);
// }
// else
// {
// Debug.Log("제거하려는 속성이 리스트 내에 존재하지 않습니다.");
// }
// }
#endregion
}

View File

@ -9,7 +9,8 @@ namespace BlueWaterProject
#region Property and variable
[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 groundLayer;
@ -47,89 +48,89 @@ namespace BlueWaterProject
private void OnLeftClick(InputAction.CallbackContext context)
{
if (!context.performed) return;
if (!context.performed || !IsSelectable) return;
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>();
if (unitController == null) return;
var pirateUnit = hit.collider.transform.parent.GetComponent<PirateUnit>();
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();
}
// 선택된 부대가 이미 선택된 부대일 때,
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();
}
// 다른 부대가 선택될 때,
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
{
// 선택된 부대가 없었을 때,
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();
}
}
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());
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;
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();
}

View File

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

View File

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

View File

@ -53,7 +53,7 @@ namespace BlueWaterProject
InitDictionary();
}
private void InitDictionary()
public void InitDictionary()
{
enemyViewDictionary = CreateDictionaryFromList(EnemyViewDataSo.enemyViewDataList, GlobalValue.ENEMY_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: 8302608207570708049}
m_Layer: 6
m_Name: Unit
m_Name: EnemyUnit
m_TagString: Unit
m_Icon: {fileID: 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: