OldBlueWater/BlueWater/Assets/02.Scripts/Ui/UiManager.cs

178 lines
6.1 KiB
C#
Raw Normal View History

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<UiManager>
{
[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;
2023-09-11 05:15:18 +00:00
[field: SerializeField] public List<RadarTargetUI> 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; // 타겟 (적)
2023-09-19 16:58:52 +00:00
[Title("InteractionUI")]
private Transform defaultInteraction;
private void Init()
{
cardLayoutGroup = transform.Find("CardLayoutGroup");
CardLayoutGroupAnimator = cardLayoutGroup.GetComponent<UIAnimator>();
takeAim = transform.Find("Aim").gameObject;
radar = transform.Find("Radar");
radarTargets = radar.Find("RadarTargets");
RadarNeedle = radar.Find("RadarNeedle").GetComponent<RadarNeedle>();
enemyMarker = transform.Find("EnemyMarker").GetComponent<Image>();
enemyMarker.sprite = DataManager.Inst.enemyMarker;
2023-09-19 16:58:52 +00:00
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);
}
2023-09-20 09:06:45 +00:00
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>();
draggableCard.card = DataManager.Inst.GetCardDictionaryFromKey(DataManager.Inst.CardList[i]);
draggableCard.CardInit();
}
}
public void RadarTargetInit()
{
if (RadarTargetUis.Count == 0)
2023-09-11 05:15:18 +00:00
{
for (var i = 0; i < GameManager.Inst.player.Canons.Count; i++)
{
var obj = Instantiate(DataManager.Inst.radarTargetUi, radarTargets);
var radarTargetUi = obj.GetComponent<RadarTargetUI>();
radarTargetUi.RadarTargetInit(Random.Range(0f, 360f), Random.Range(0.1f, 0.2f));
RadarTargetUis.Add(radarTargetUi);
GameManager.Inst.player.Canons[i].radarTargetUI = radarTargetUi;
}
}
else
{
for (var i = 0; i < RadarTargetUis.Count; i++)
{
RadarTargetUis[i].Reactivate();
}
2023-09-11 05:15:18 +00:00
}
}
public void CheckRadarOverlap()
{
var needleRotationZ = RadarNeedle.transform.eulerAngles.z;
for (var i = 0; i < RadarTargetUis.Count; i++)
{
var radarTargetUI = RadarTargetUis[i];
2023-09-11 05:15:18 +00:00
var canon = GameManager.Inst.player.Canons[i];
var startAngle = radarTargetUI.RotationZ - radarTargetUI.Image.fillAmount * 180f;
var endAngle = radarTargetUI.RotationZ + radarTargetUI.Image.fillAmount * 180f;
2023-09-11 05:15:18 +00:00
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)
{
2023-09-11 05:15:18 +00:00
var correctedNeedleRotation = needleRotation;
return correctedNeedleRotation >= (startAngle - tolerance) && correctedNeedleRotation <= (endAngle + tolerance);
}
public void UpdateEnemyMarker(Transform target)
{
enemyTarget = target;
if (enemyTarget != null && GameManager.Inst.player.IsTargeting)
{
2023-09-18 05:06:11 +00:00
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);
}
2023-09-19 16:58:52 +00:00
public void DefaultInteractionOnOff(bool isOn)
{
defaultInteraction.gameObject.SetActive(isOn);
}
}
}