2025-09-24 11:24:38 +05:00

93 lines
1.8 KiB
C#

using UnityEngine;
namespace TPSBR.UI
{
public class UIHitDirection : UIBehaviour
{
// PRIVATE MEMBERS
[SerializeField]
private float _visiblityTime = 4f;
[SerializeField]
private float _minAngleDifference = 5f;
private UIHitDirectionItem[] _items;
private int _maxCount;
// PUBLIC METHODS
public void ShowHit(HitData hit)
{
float angle = Vector3.SignedAngle(-hit.Direction, Vector3.forward, Vector3.up);
var item = GetItem(ref angle);
item.Show(_visiblityTime, angle);
}
public void UpdateDirection(Agent agent)
{
var rotation = RectTransform.rotation.eulerAngles;
float angle = Vector3.SignedAngle(agent.transform.forward, Vector3.forward, Vector3.up);
rotation.z = -angle;
RectTransform.rotation = Quaternion.Euler(rotation);
}
// MONOBEHAVIOUR
protected void Awake()
{
_items = GetComponentsInChildren<UIHitDirectionItem>();
_maxCount = _items.Length;
}
// PRIVATE METHODS
private UIHitDirectionItem GetItem(ref float angle)
{
UIHitDirectionItem bestItem = _items[0];
for (int i = 0; i < _maxCount; i++)
{
var item = _items[i];
if (item.IsActive == false)
{
bestItem = item;
continue;
}
if (Mathf.DeltaAngle(angle, item.Angle) < _minAngleDifference)
{
angle = item.Angle;
return item;
}
if (item.ShowCooldown < bestItem.ShowCooldown)
{
bestItem = item;
}
}
return bestItem;
}
//private bool IsCloseAngle(float angleA, float angleB)
//{
// if (Mathf.Abs(angleA - angleB) < _minAngleDifference)
// return true;
// float angleATo180 = GetAngleTo180(angleA);
// float angleBTo180 = GetAngleTo180(angleB);
// return false;
//}
//private float GetAngleTo180(float angle)
//{
// return angle > 0f ? 180f - angle : Mathf.Abs(-180f - angle);
//}
}
}