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;
}
}