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); } } } // private void Start() // { // SetIslandInfoTest(); // } #endregion #region Custom function [PropertyOrder(-9)] [HorizontalGroup("Split", 0.5f)] [GUIColor("GetCreateUnitButtonColor")] [EnableIf("@DataManager.Inst.GetEnemyUnitSoKey(unit.Idx) != null || 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)] [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 } }