korchoon
3/30/2020 - 6:33 AM

collisions

public class Sensor : MonoBehaviour
{
    public CapsuleCollider Collider;
    public LayerMask Mask ;

    void OnValidate()
    {
        Asr.IsTrue(Mask.value != 0);
        Asr.IsTrue(Collider);
    }

    [NonSerialized] public int ContactHash;
    [NonSerialized] public float LastContactTime;
    
    public bool HasCollision()
    {
        return Time.time - LastContactTime < Time.fixedDeltaTime * 2f;
    }

    void OnDrawGizmosSelected()
    {
        Gizmos.color = HasCollision() ? Color.red : Color.green;
        Gizmos.DrawSphere(transform.position + transform.forward * ((Collider.height * 1.17f - 2 * Collider.radius) / 2 + Collider.center.z), Collider.radius);
    }

    void OnTriggerStay(Collider other)
    {
        if (!Has(Mask, other.gameObject.layer))
            return;

        LastContactTime = Time.time;
        ContactHash = other.GetInstanceID();
    }

    static bool Has(LayerMask layerMask, int layer)
    {
        return (layerMask.value & (1 << layer)) != 0;
    }
}