using System; using System.Runtime.InteropServices; using AOT; namespace UnityEngine.XR.ARKit { /// /// A set of callbacks related to the ARKit session. Implement this class to provide custom handling of certain /// session events. /// /// /// public abstract class ARKitSessionDelegate { /// /// Invoked when the session fails. This base class implementation does nothing. /// /// /// Use this to respond to session failures. For example, the /// implementation tries to restart the session by calling /// [Reset](xref:UnityEngine.XR.ARSubsystems.XRSessionSubsystem.Reset). /// /// See [session:didFailWithError:](https://developer.apple.com/documentation/arkit/arsessionobserver/2887453-session?language=objc) /// for more information. /// /// The which provides an interface to the ARKit session. /// The object describing the failure. This object is only valid /// during this callback. See also . protected virtual void OnSessionDidFailWithError(ARKitSessionSubsystem sessionSubsystem, NSError error) { } /// /// Invoked when a change to the /// [ARConfiguration](https://developer.apple.com/documentation/arkit/arconfiguration?language=objc) /// is requested. /// /// The which provides an interface to the ARKit session. protected virtual void OnConfigurationChanged(ARKitSessionSubsystem sessionSubsystem) { } /// /// Invoked when the /// [coaching overlay view](https://developer.apple.com/documentation/arkit/arcoachingoverlayview?language=objc) /// activates. This base class implementation does nothing. /// /// /// See [coachingOverlayViewWillActivate:](https://developer.apple.com/documentation/arkit/arcoachingoverlayviewdelegate/3152985-coachingoverlayviewwillactivate?language=objc) /// for more information. /// /// The which provides an interface to the ARKit session. /// /// /// /// protected virtual void OnCoachingOverlayViewWillActivate(ARKitSessionSubsystem sessionSubsystem) { } /// /// Invoked when the /// [coaching experience](https://developer.apple.com/documentation/arkit/arcoachingoverlayview?language=objc) /// is completely deactivated. This base class implementation does nothing. /// /// /// See [coachingOverlayViewDidDeactivate:](https://developer.apple.com/documentation/arkit/arcoachingoverlayviewdelegate/3152983-coachingoverlayviewdiddeactivate?language=objc) /// for more information. /// /// The which provides an interface to the ARKit session. /// /// /// /// protected virtual void OnCoachingOverlayViewDidDeactivate(ARKitSessionSubsystem sessionSubsystem) { } internal static Action s_SessionDidFailWithError = SessionDidFailWithError; internal static Action s_CoachingOverlayViewWillActivate = CoachingOverlayViewWillActivate; internal static Action s_CoachingOverlayViewDidDeactivate = CoachingOverlayViewDidDeactivate; internal static Action s_ConfigurationChanged = ConfigurationChanged; [MonoPInvokeCallback(typeof(Action))] static void SessionDidFailWithError(IntPtr subsystemHandle, NSError error) { if (GCHandle.FromIntPtr(subsystemHandle).Target is ARKitSessionSubsystem subsystem) { subsystem.sessionDelegate?.OnSessionDidFailWithError(subsystem, error); } } [MonoPInvokeCallback(typeof(Action))] static void CoachingOverlayViewWillActivate(IntPtr subsystemHandle) { if (GCHandle.FromIntPtr(subsystemHandle).Target is ARKitSessionSubsystem subsystem) { subsystem.sessionDelegate?.OnCoachingOverlayViewWillActivate(subsystem); } } [MonoPInvokeCallback(typeof(Action))] static void CoachingOverlayViewDidDeactivate(IntPtr subsystemHandle) { if (GCHandle.FromIntPtr(subsystemHandle).Target is ARKitSessionSubsystem subsystem) { subsystem.sessionDelegate?.OnCoachingOverlayViewDidDeactivate(subsystem); } } [MonoPInvokeCallback(typeof(Action))] static void ConfigurationChanged(IntPtr subsystemHandle) { if (GCHandle.FromIntPtr(subsystemHandle).Target is ARKitSessionSubsystem subsystem) { subsystem.sessionDelegate?.OnConfigurationChanged(subsystem); } } } }