96 lines
2.0 KiB
C#
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 )
|
||
|
|
{
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|