OldBlueWater/BlueWater/Assets/02.Scripts/Ai/Human/Unit/EnemyUnit.cs
2023-09-18 09:21:55 +09:00

102 lines
3.2 KiB
C#

using System;
using Sirenix.OdinInspector;
using UnityEngine;
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
{
public class EnemyUnit : BaseUnit
{
#region Property and variable
[PropertyOrder(-10)]
public EnemyUnitStat enemyUnitStat;
private Vector3[] defensePos;
private bool isClickedTypeAllButton;
#endregion
#region Unity built-in function
private void OnDrawGizmosSelected()
{
if (Application.isPlaying || enemyUnitStat == null || enemyUnitStat.SailorCount <= 0) return;
foreach (var item in enemyUnitStat.EnemyAiList)
{
var unitPos = item.transform.position;
var ray = new Ray(unitPos + Vector3.up, Vector3.down);
Gizmos.color = Physics.Raycast(ray, UnitManager.Inst.MaxGroundDistance, UnitManager.Inst.GroundLayer) ? Color.blue : Color.red;
Gizmos.DrawRay(ray.origin, ray.direction * UnitManager.Inst.MaxGroundDistance);
}
}
private void Awake()
{
defensePos = new Vector3[enemyUnitStat.EnemyAiList.Count];
}
#endregion
#region Custom function
[PropertyOrder(-9)]
[HorizontalGroup("Split", 0.5f)]
[GUIColor("GetCreateUnitButtonColor")]
[EnableIf("@DataManager.Inst.GetEnemyUnitStatSoFromKey(enemyUnitStat.Idx) != null")]
[Button("유닛 생성")]
public void CreateUnit()
{
UnitManager.Inst.CreateEnemyUnitInEditor(this);
}
[PropertyOrder(-8)]
[HorizontalGroup("Split", 0.5f)]
[EnableIf("CanAssignUnit")]
[Button("유닛 배치")]
public void AssignUnit()
{
if (UnitManager.Inst.CanAssignUnit(this, transform.position))
{
UnitManager.Inst.AssignEnemyUnit(this, transform.position);
}
}
private bool CanAssignUnit()
{
return !Application.isPlaying && UnitManager.Inst.CanAssignUnit(this, transform.position);
}
[PropertyOrder(-7)]
[GUIColor(1, 0, 0)]
[Button("유닛 초기화")]
private void ResetUnit()
{
var tempUnitIdx = enemyUnitStat.Idx;
UnitManager.Inst.DestroyDeployedUnits(this);
enemyUnitStat = new EnemyUnitStat()
{
Idx = tempUnitIdx
};
isClickedTypeAllButton = false;
}
public void ResetDefensePos()
{
for (var i = 0; i < enemyUnitStat.EnemyAiList.Count; i++)
{
enemyUnitStat.EnemyAiList[i].SetDefensePos(defensePos[i]);
}
}
private Color GetCreateUnitButtonColor() => enemyUnitStat.EnemyAiList.Count > 0 ? Color.white : Color.green;
private Color GetTypeAllButtonColor() => isClickedTypeAllButton ? Color.white : Color.green;
private void OnTypeChanged() => isClickedTypeAllButton = false;
public Vector3 GetDefensePos(int index) => defensePos[index];
public void SetDefensePos(Vector3 pos, int index) => defensePos[index] = pos;
#endregion
}
}