using System; using System.Collections.Generic; using Doozy.Runtime.Reactor.Animators; using Sirenix.OdinInspector; using UnityEngine; using UnityEngine.UI; using Random = UnityEngine.Random; // ReSharper disable once CheckNamespace namespace BlueWaterProject { public class UiManager : Singleton { [Title("Card")] private Transform cardLayoutGroup; public UIAnimator CardLayoutGroupAnimator { get; set; } [Title("TakeAim")] private GameObject takeAim; private Texture2D cursorTexture; private bool isTakeAim; [Title("Radar")] private Transform radar; private Transform radarTargets; [field: SerializeField] public List RadarTargetUis { get; private set; } = new (GlobalValue.MAX_CANON_COUNT); public RadarNeedle RadarNeedle { get; private set; } [Title("Enemy Marker")] private Image enemyMarker; // 적을 표시할 마커 (Image) private Transform enemyTarget; // 타겟 (적) [Title("InteractionUI")] private Transform defaultInteraction; private void Init() { cardLayoutGroup = transform.Find("CardLayoutGroup"); CardLayoutGroupAnimator = cardLayoutGroup.GetComponent(); takeAim = transform.Find("Aim").gameObject; radar = transform.Find("Radar"); radarTargets = radar.Find("RadarTargets"); RadarNeedle = radar.Find("RadarNeedle").GetComponent(); enemyMarker = transform.Find("EnemyMarker").GetComponent(); enemyMarker.sprite = DataManager.Inst.enemyMarker; defaultInteraction = transform.Find("DefaultInteraction"); } protected override void OnAwake() { Init(); } private void Start() { CursorTextureChange(); AssaultCardInit(); //RadarTargetInit(); } public void AddCard() //TODO Test button and function, delete later { Instantiate(DataManager.Inst.assaultCard, cardLayoutGroup); } public void AimOnOff(bool isOn) { takeAim.SetActive(isOn); isTakeAim = isOn; } private void CursorTextureChange() { cursorTexture = DataManager.Inst.cursorTexture; //var hotSpot = new Vector2(cursorTexture.width / 2f, cursorTexture.height / 2f); var hotSpot = Vector2.zero; Cursor.SetCursor(cursorTexture, hotSpot, CursorMode.Auto); } public void AssaultCardInit() { for (int i = 0; i < DataManager.Inst.CardList.Count; i++) { var obj = Instantiate(DataManager.Inst.assaultCard, cardLayoutGroup); var draggableCard = obj.GetComponent(); draggableCard.card = DataManager.Inst.GetCardDictionaryFromKey(DataManager.Inst.CardList[i]); draggableCard.CardInit(); } } public void RadarTargetInit() { if (RadarTargetUis.Count == 0) { for (var i = 0; i < GameManager.Inst.shipPlayer.Canons.Count; i++) { var obj = Instantiate(DataManager.Inst.radarTargetUi, radarTargets); var radarTargetUi = obj.GetComponent(); radarTargetUi.RadarTargetInit(Random.Range(0f, 360f), Random.Range(0.1f, 0.2f)); RadarTargetUis.Add(radarTargetUi); GameManager.Inst.shipPlayer.Canons[i].radarTargetUI = radarTargetUi; } } else { for (var i = 0; i < RadarTargetUis.Count; i++) { RadarTargetUis[i].Reactivate(); } } } public void CheckRadarOverlap() { var needleRotationZ = RadarNeedle.transform.eulerAngles.z; for (var i = 0; i < RadarTargetUis.Count; i++) { var radarTargetUI = RadarTargetUis[i]; var canon = GameManager.Inst.shipPlayer.Canons[i]; var startAngle = radarTargetUI.RotationZ - radarTargetUI.Image.fillAmount * 180f; var endAngle = radarTargetUI.RotationZ + radarTargetUI.Image.fillAmount * 180f; if (!IsOverlap(needleRotationZ, startAngle, endAngle, GlobalValue.RADAR_OVERLAP_TOLERANCE)) continue; if (!radarTargetUI.gameObject.activeSelf) continue; radarTargetUI.gameObject.SetActive(false); canon.Fire(); } } private bool IsOverlap(float needleRotation, float startAngle, float endAngle, float tolerance = 0) { var correctedNeedleRotation = needleRotation; return correctedNeedleRotation >= (startAngle - tolerance) && correctedNeedleRotation <= (endAngle + tolerance); } public void UpdateEnemyMarker(Transform target) { enemyTarget = target; if (enemyTarget != null && GameManager.Inst.shipPlayer.IsTargeting) { Vector3 screenPos = GameManager.Inst.CameraController.MainCam.WorldToScreenPoint(enemyTarget.position); if (screenPos.z > 0) { enemyMarker.gameObject.SetActive(true); enemyMarker.transform.position = new Vector2(screenPos.x, screenPos.y); } else { enemyMarker.gameObject.SetActive(false); } } else { enemyMarker.gameObject.SetActive(false); } } public void RadarUIOnOff(bool isOn) { radar.gameObject.SetActive(isOn); } public void DefaultInteractionOnOff(bool isOn) { defaultInteraction.gameObject.SetActive(isOn); } } }