rj-action-library/Runtime/Actions/Node3D/OnCollision.cs

100 lines
1.7 KiB
C#

using System.Collections.Generic;
using Godot;
using Rokojori;
namespace Rokojori
{
[Tool]
[GlobalClass, Icon("res://addons/rokojori_action_library/Icons/OnEvent.svg") ]
public partial class OnCollision:Node
{
[Export]
public Area3D area;
[Export]
public Selector selector;
[Export]
public Action onEntered;
[Export]
public Action onInside;
[Export]
public Action onExit;
Dictionary<Node,System.Action> _inside = new Dictionary<Node,System.Action>();
public override void _Ready()
{
if ( area == null )
{
return;
}
area.AreaEntered += TriggerOnEnter;
area.BodyEntered += TriggerOnEnter;
area.AreaExited += TriggerOnExited;
area.BodyExited += TriggerOnExited;
}
void TriggerOnEnter( Node n )
{
if ( ! Selector.IsSelecting( selector, n ) )
{
return;
}
Action.Trigger( onEntered );
if ( onInside == null )
{
return;
}
var tm = Unique<TimeLineManager>.Get();
if ( tm == null )
{
return;
}
var callback = ()=>{ Action.Trigger( onInside ); };
_inside[ n ] = callback;
tm.AddProcessCallback( callback );
}
void TriggerOnExited( Node n )
{
if ( ! Selector.IsSelecting( selector, n ) )
{
return;
}
Action.Trigger( onExit );
if ( ! _inside.ContainsKey( n ) )
{
return;
}
var tm = Unique<TimeLineManager>.Get();
if ( tm == null )
{
return;
}
var callback = _inside[ n ];
tm.RemoveProcessCallback( callback );
_inside.Remove( n );
}
}
}