rj-action-library/Runtime/Interactions/Collidable.cs

96 lines
2.0 KiB
C#

using Godot;
using System.Collections;
using System.Collections.Generic;
using Godot.Collections;
namespace Rokojori
{
public enum CollisionPhase
{
Entered,
Inside,
Exit
}
[Tool]
[GlobalClass,Icon("res://addons/rokojori_action_library/Icons/Collidable.svg")]
public partial class Collidable:Node3D
{
[Export]
public CollisionFlag[] collisionTypes;
[Export]
public Action onEntered;
[Export]
public Node3D onEnteredColliderPose;
[Export]
public Action onInside;
[Export]
public Node3D onInsideColliderPose;
[Export]
public Action onExit;
[Export]
public Node3D onExitColliderPose;
public bool IsCollidingWith( Collider collider )
{
if ( ( collisionTypes == null || collisionTypes.Length == 0 ) && collider.collisionType == null )
{
return true;
}
if ( collisionTypes == null )
{
return false;
}
return collisionTypes.IndexOf( collider.collisionType ) != -1;
}
public void Collide( Collider collider, CollisionPhase phase )
{
_Collide( collider, phase );
if ( phase == CollisionPhase.Entered )
{
if ( onEnteredColliderPose != null )
{
onEnteredColliderPose.CopyGlobalPoseFrom( collider.area );
}
Action.Trigger( collider.onEntered );
Action.Trigger( onEntered );
}
else if ( phase == CollisionPhase.Inside )
{
if ( onInsideColliderPose != null )
{
onInsideColliderPose.CopyGlobalPoseFrom( collider.area );
}
Action.Trigger( collider.onInside );
Action.Trigger( onInside );
}
else if ( phase == CollisionPhase.Exit )
{
if ( onExitColliderPose != null )
{
onExitColliderPose.CopyGlobalPoseFrom( collider.area );
}
Action.Trigger( collider.onExit );
Action.Trigger( onExit );
}
}
protected virtual void _Collide( Collider collider, CollisionPhase phase )
{
}
}
}