Files
VOIDRPG/Assets/90 - Scripts/Generic/AreaOfEffect/AbstractAreaOfEffect.cs
T
2026-07-09 21:33:33 +02:00

40 lines
1.5 KiB
C#

using System;
using Sirenix.OdinInspector;
using UnityEngine;
namespace VOID.Generic.AreaOfEffect
{
[Serializable]
public abstract class AbstractAreaOfEffect
{
[SerializeField] private bool fixedRotation;
[SerializeField] [MinValue(-180), MaxValue(180)] private float offsetRotation;
/// <summary>
/// Calculates final rotation that include AOE offset rotation and/or fixed rotation.
/// </summary>
/// <param name="from">Position on AOE collider</param>
/// <param name="to">Position where AOE collider should look</param>
/// <returns>Quaternion to put into tranform.rotation</returns>
public Quaternion GetRotation(Vector3 from, Vector3 to)
{
// Ignore look angle, we use only offset rotation
if (fixedRotation) return Quaternion.Euler(new Vector3(0, offsetRotation, 0));
// Include offset rotation into look rotation
var directionNormalized = (new Vector2(to.x, to.z) - new Vector2(from.x, from.z)).normalized;
var lookAngleY = Vector2.SignedAngle(Vector2.up, directionNormalized) * -1;
return Quaternion.Euler(new Vector3(0, lookAngleY + offsetRotation, 0));
}
/// <summary>
/// Returns mesh of this area of effect.
/// </summary>
public abstract Mesh GetMesh();
/// <summary>
/// Adds prepared collider to given GameObject.
/// </summary>
public abstract Collider AddCollider(GameObject gameObject);
}
}