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 ) { } } }