ソースコード
using System;
using Kogane;
using UnityEngine;
public sealed class Example : MonoBehaviour
{
[SerializeField] private Collider2D m_collider2D;
private bool m_isHit;
public event Action<Collider2D> OnEnter;
public event Action<Collider2D> OnExit;
private void OnTriggerStay2D( Collider2D other )
{
var isContains = m_collider2D.bounds.Contains( other.bounds );
SetState( isContains, other );
}
private void OnTriggerExit2D( Collider2D other )
{
SetState( false, other );
}
private void SetState( bool isHit, Collider2D other )
{
if ( m_isHit == isHit ) return;
var callback = isHit ? OnEnter : OnExit;
callback?.Invoke( other );
m_isHit = isHit;
}
}
public static class BoundsExtensionMethods
{
public static bool Contains( this Bounds self, Bounds other )
{
return self.Contains( other.min ) && self.Contains( other.max );
}
}
使用例
using UnityEngine;
public sealed class SampleScene : MonoBehaviour
{
[SerializeField] private Example m_example;
private void Awake()
{
m_example.OnEnter += _ => Debug.Log( "OnEnter" );
m_example.OnExit += _ => Debug.Log( "OnExit" );
}
}