OldBlueWater/BlueWater/Assets/02.Scripts/Ai/Unit/UnitController.cs

144 lines
4.3 KiB
C#
Raw Normal View History

using System;
using Sirenix.OdinInspector;
using UnityEngine;
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
{
public class UnitController : MonoBehaviour
{
#region Property and variable
[PropertyOrder(-10)]
public Unit unit;
private bool isClickedTypeAllButton;
#endregion
#region Unity built-in function
private void OnDrawGizmosSelected()
{
if (unit == null || unit.SailorCount <= 0) return;
var gridSize = 0;
switch (unit.SailorCount)
{
case 0:
gridSize = 1;
break;
case <= 3:
gridSize = 2;
break;
case <= 8:
gridSize = 3;
break;
case <= 15:
gridSize = 4;
break;
default:
print("유닛의 병사 숫자 설정 에러");
break;
}
for (var i = 0; i < gridSize; i++)
{
for (var j = 0; j < gridSize; j++)
{
var currentPos = i * gridSize + j;
if (currentPos > unit.SailorCount) break;
var xOffset = (i - (gridSize - 1) / 2.0f) * UnitManager.Inst.UnitSpacing;
var zOffset = (j - (gridSize - 1) / 2.0f) * UnitManager.Inst.UnitSpacing;
var spawnPosition = transform.position + new Vector3(xOffset, 0, zOffset);
var ray = new Ray(spawnPosition, 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);
}
}
}
2023-08-29 03:41:24 +00:00
// private void Start()
// {
// SetIslandInfoTest();
// }
#endregion
#region Custom function
[PropertyOrder(-9)]
[HorizontalGroup("Split", 0.5f)]
[GUIColor("GetCreateUnitButtonColor")]
2023-08-30 02:10:16 +00:00
[EnableIf("@DataManager.Inst.GetUnitSoKey(unit.Idx) != null")]
[Button("유닛 생성")]
public void CreateUnit()
{
UnitManager.Inst.CreateUnitInEditor(this);
}
[PropertyOrder(-8)]
[HorizontalGroup("Split", 0.5f)]
[EnableIf("CanAssignUnit")]
[Button("유닛 배치")]
private void SetAssignUnitInEditor()
{
if (UnitManager.Inst.CanAssignUnit(this, transform.position))
{
UnitManager.Inst.AssignUnit(this, transform.position);
}
}
private bool CanAssignUnit()
{
return UnitManager.Inst.CanAssignUnit(this, transform.position);
}
[PropertyOrder(2)]
[Button("테스트 배치")]
public void SetAssignUnit(Vector3 assignPos)
{
if (UnitManager.Inst.CanAssignUnit(this, assignPos))
{
UnitManager.Inst.AssignUnit(this, assignPos);
}
else
{
print("병력이 땅과 맞닿아 있지 않아 배치할 수 없는 위치입니다.");
}
}
[PropertyOrder(-7)]
[GUIColor(1, 0, 0)]
2023-08-23 02:09:21 +00:00
[Button("유닛 초기화")]
private void ResetUnit()
{
var tempUnitIdx = unit.Idx;
UnitManager.Inst.DestroyDeployedUnits(this);
unit = new Unit
{
Idx = tempUnitIdx
};
isClickedTypeAllButton = false;
}
public void MoveCommand(Vector3 targetPos)
{
foreach (var soldier in unit.UnitList)
{
soldier.MoveTarget(targetPos);
}
}
private Color GetCreateUnitButtonColor() => unit.UnitList.Count > 0 ? Color.white : Color.green;
private Color GetTypeAllButtonColor() => isClickedTypeAllButton ? Color.white : Color.green;
private void OnTypeChanged() => isClickedTypeAllButton = false;
#endregion
}
}