Files

134 lines
4.6 KiB
C#
Raw Permalink Normal View History

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DemonicsCollider : MonoBehaviour
{
[SerializeField] private bool _showGizmo = default;
[SerializeField] private bool _ignoreCollision = default;
[SerializeField] private Vector2 _offset = default;
[SerializeField] private Vector2 _size = default;
2022-11-03 18:03:23 +02:00
protected List<DemonicsCollider> _demonicsColliders = new List<DemonicsCollider>();
2022-11-11 13:12:13 +02:00
public DemonicsPhysics _physics { get; set; }
public Color GizmoColor { get; set; } = Color.green;
2022-11-03 18:03:23 +02:00
public bool WasColliding { get; set; }
public bool IgnoreCollision { get { return _ignoreCollision; } set { _ignoreCollision = value; } }
2023-07-02 23:17:37 +03:00
public DemonVector2 Size { get { return new DemonVector2((DemonFloat)_size.x, (DemonFloat)_size.y); } set { _size = new Vector2((float)value.x, (float)value.y); } }
public DemonVector2 Offset { get { return new DemonVector2((DemonFloat)_offset.x * (DemonFloat)transform.root.localScale.x, (DemonFloat)_offset.y); } set { _offset = new Vector2((float)value.x, (float)value.y); } }
public DemonVector2 Position
2022-11-03 18:03:23 +02:00
{
get
{
2022-11-06 13:31:42 +02:00
if (_physics != null)
2022-11-03 18:03:23 +02:00
{
2023-07-02 23:17:37 +03:00
return new DemonVector2((_physics.Position.x + Offset.x), (_physics.Position.y + Offset.y));
2022-11-03 18:03:23 +02:00
}
else
{
return Offset;
}
}
2022-11-03 18:03:23 +02:00
private set { }
}
2023-07-02 23:17:37 +03:00
private static bool valueInRange(DemonFloat value, DemonFloat min, DemonFloat max)
{ return (value >= min) && (value <= max); }
2022-12-25 23:51:32 +02:00
public static bool Colliding(ColliderNetwork a, ColliderNetwork b)
{
2023-01-04 17:56:46 +02:00
if (!a.active || !b.active)
{
return false;
}
2022-12-25 23:51:32 +02:00
bool xOverlap = valueInRange(a.position.x - (a.size.x / (float)2), b.position.x - (b.size.x / (float)2), b.position.x + (b.size.x / (float)2)) ||
valueInRange(b.position.x - (b.size.x / (float)2), a.position.x - (a.size.x / (float)2), a.position.x + (a.size.x / (float)2));
bool yOverlap = valueInRange(a.position.y - (a.size.y / (float)2), b.position.y - (b.size.y / (float)2), b.position.y + (b.size.y / (float)2)) ||
valueInRange(b.position.y - (b.size.y / (float)2), a.position.y - (a.size.y / (float)2), a.position.y + (a.size.y / (float)2));
return xOverlap && yOverlap;
}
2022-11-03 18:03:23 +02:00
protected virtual void Start()
{
2022-11-06 13:31:42 +02:00
_physics = transform.root.GetComponent<DemonicsPhysics>();
2022-11-03 18:03:23 +02:00
InitializeCollisionList();
}
protected virtual void InitializeCollisionList()
{
DemonicsCollider[] demonicsCollidersArray = FindObjectsOfType<DemonicsCollider>();
for (int i = 0; i < demonicsCollidersArray.Length; i++)
{
2022-11-03 18:03:23 +02:00
if (!demonicsCollidersArray[i].transform.IsChildOf(transform.root))
{
_demonicsColliders.Add(demonicsCollidersArray[i]);
}
}
_demonicsColliders.Remove(this);
}
void FixedUpdate()
{
2022-11-03 18:03:23 +02:00
bool colliding = false;
for (int i = 0; i < _demonicsColliders.Count; i++)
{
2022-12-25 23:51:32 +02:00
// if (Colliding(this, _demonicsColliders[i]))
// {
// colliding = true;
// if (!_ignoreCollision)
// {
// if (_demonicsColliders[i].transform.root.TryGetComponent(out DemonicsPhysics demonicsPhysics))
// {
// _physics.OnCollision(demonicsPhysics);
// }
// }
// EnterCollision(_demonicsColliders[i]);
// return;
// }
}
2022-11-03 18:03:23 +02:00
if (WasColliding && !colliding)
{
ExitCollision();
}
2022-11-11 17:56:57 +02:00
_physics.OtherPhysics = null;
}
2022-11-03 18:03:23 +02:00
protected virtual void EnterCollision(DemonicsCollider collider)
{
2022-11-12 00:05:27 +02:00
if (!WasColliding)
{
WasColliding = true;
}
2022-11-03 18:03:23 +02:00
}
protected virtual void ExitCollision()
{
WasColliding = false;
}
2022-11-11 13:12:13 +02:00
protected virtual void OnDisable()
2022-11-03 18:03:23 +02:00
{
WasColliding = false;
}
#if UNITY_EDITOR
protected virtual void OnDrawGizmos()
2022-11-03 18:03:23 +02:00
{
if (_showGizmo)
{
Color color = GizmoColor;
color.a = 0.6f;
Gizmos.color = color;
2022-11-03 18:03:23 +02:00
Vector2 pushboxPosition = new Vector2((float)Position.x, (float)Position.y);
Gizmos.matrix = Matrix4x4.TRS(pushboxPosition, transform.rotation, transform.localScale);
2022-11-03 18:03:23 +02:00
Vector2 gizmoPosition = new Vector2((float)Size.x, (float)Size.y);
Gizmos.DrawWireCube(Vector3.zero, gizmoPosition);
Gizmos.DrawWireCube(Vector3.zero, gizmoPosition);
}
2022-11-03 18:03:23 +02:00
}
#endif
}