This repository has been archived on 2025-04-28. You can view files and clone it, but cannot push or open issues or pull requests.
ARPlusSystem/ARPlusSystem-250418/Assets/ARLocation/Scripts/ARSession/ARFoundationSessionManager.cs

138 lines
4.1 KiB
C#

#if !ARGPS_USE_VUFORIA
using UnityEngine.XR.ARFoundation;
using System;
using ARLocation.Utils;
#endif
#if !ARGPS_USE_VUFORIA
public static class ARSessionStateExtensions
{
public static string ToInfoString(this ARSessionState state)
{
switch (state)
{
case ARSessionState.None:
return "None";
case ARSessionState.Unsupported:
return "Unsupported";
case ARSessionState.CheckingAvailability:
return "CheckingAvailability";
case ARSessionState.NeedsInstall:
return "NeedsInstall";
case ARSessionState.Installing:
return "Installing";
case ARSessionState.Ready:
return "Ready";
case ARSessionState.SessionInitializing:
return "SessionInitializing";
case ARSessionState.SessionTracking:
return "SessionTracking";
default:
return "None";
}
}
}
#endif
namespace ARLocation.Session
{
#if !ARGPS_USE_VUFORIA
public class ARFoundationSessionManager : IARSessionManager
{
private readonly ARSession arSession;
private Action onAfterReset;
private string infoString;
private bool trackingStarted;
private Action trackingStartedCallback;
private Action trackingRestoredCallback;
private Action trackingLostCallback;
private ARSessionState currentStatus;
public bool DebugMode { get; set; }
public ARFoundationSessionManager(ARSession session)
{
arSession = session;
ARSession.stateChanged += ARSessionOnStateChanged;
}
private void ARSessionOnStateChanged(ARSessionStateChangedEventArgs args)
{
infoString = args.state.ToInfoString();
Logger.LogFromMethod("ARFoundationSessionManager", "ARSessionOnStateChanged", infoString, DebugMode);
if (args.state == ARSessionState.SessionTracking)
{
if (!trackingStarted)
{
trackingStarted = true;
Logger.LogFromMethod("ARFoundationSessionManager", "ARSessionOnStateChanged", "Tracking Started!.", DebugMode);
trackingStartedCallback?.Invoke();
}
else if (currentStatus != ARSessionState.SessionTracking)
{
Logger.LogFromMethod("ARFoundationSessionManager", "ARSessionOnStateChanged", "Tracking Restored!", DebugMode);
trackingRestoredCallback?.Invoke();
}
if (onAfterReset != null)
{
Logger.LogFromMethod("ARFoundationSessionManager", "ARSessionOnStateChanged", "Emitting 'OnAfterReset' event.", DebugMode);
onAfterReset.Invoke();
onAfterReset = null;
}
}
else if (currentStatus == ARSessionState.SessionTracking)
{
Logger.LogFromMethod("ARFoundationSessionManager", "ARSessionOnStateChanged", "Tracking Lost!", DebugMode);
trackingLostCallback?.Invoke();
}
currentStatus = args.state;
}
public void Reset(Action callback)
{
arSession.Reset();
onAfterReset += callback;
}
public string GetSessionInfoString()
{
return infoString;
}
public string GetProviderString()
{
return "ARFoundation";
}
public void OnARTrackingStarted(Action callback)
{
if (trackingStarted)
{
callback.Invoke();
return;
}
trackingStartedCallback += callback;
}
public void OnARTrackingRestored(Action callback)
{
trackingRestoredCallback += callback;
}
public void OnARTrackingLost(Action callback)
{
trackingLostCallback += callback;
}
}
#else
public class ARFoundationSessionManager {}
#endif
}