using System;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
#if UNITY_IOS
using UnityEngine.XR.ARKit;
#endif
///
/// This example shows how to activate the [ARCoachingOverlayView](https://developer.apple.com/documentation/arkit/arcoachingoverlayview)
///
[RequireComponent(typeof(ARSession))]
public class ARKitCoachingOverlay : MonoBehaviour
{
// Duplicate the ARCoachingGoal enum so that we can use it on a serialized field
enum CoachingGoal
{
Tracking,
HorizontalPlane,
VerticalPlane,
AnyPlane
}
[SerializeField]
[Tooltip("The coaching goal associated with the coaching overlay.")]
#if !UNITY_IOS
#pragma warning disable CS0414
#endif
CoachingGoal m_Goal = CoachingGoal.Tracking;
#if !UNITY_IOS
#pragma warning restore CS0414
#endif
#if UNITY_IOS
///
/// The [ARCoachingGoal](https://developer.apple.com/documentation/arkit/arcoachinggoal) associated with the coaching overlay
///
public ARCoachingGoal goal
{
get
{
if (GetComponent().subsystem is ARKitSessionSubsystem sessionSubsystem)
{
return sessionSubsystem.requestedCoachingGoal;
}
else
{
return (ARCoachingGoal)m_Goal;
}
}
set
{
m_Goal = (CoachingGoal)value;
if (supported && GetComponent().subsystem is ARKitSessionSubsystem sessionSubsystem)
{
sessionSubsystem.requestedCoachingGoal = value;
}
}
}
#endif
[SerializeField]
[Tooltip("Whether the coaching overlay activates automatically.")]
bool m_ActivatesAutomatically = true;
///
/// Whether the coaching overlay activates automatically
///
public bool activatesAutomatically
{
get
{
#if UNITY_IOS
if (supported && GetComponent().subsystem is ARKitSessionSubsystem sessionSubsystem)
{
return sessionSubsystem.coachingActivatesAutomatically;
}
#endif
return m_ActivatesAutomatically;
}
set
{
m_ActivatesAutomatically = value;
#if UNITY_IOS
if (supported && GetComponent().subsystem is ARKitSessionSubsystem sessionSubsystem)
{
sessionSubsystem.coachingActivatesAutomatically = value;
}
#endif
}
}
///
/// Whether the [ARCoachingGoal](https://developer.apple.com/documentation/arkit/arcoachinggoal) is supported.
///
public bool supported
{
get
{
#if UNITY_IOS
return ARKitSessionSubsystem.coachingOverlaySupported;
#else
return false;
#endif
}
}
void OnEnable()
{
#if UNITY_IOS
if (supported && GetComponent().subsystem is ARKitSessionSubsystem sessionSubsystem)
{
sessionSubsystem.requestedCoachingGoal = (ARCoachingGoal)m_Goal;
sessionSubsystem.coachingActivatesAutomatically = m_ActivatesAutomatically;
}
else
#endif
{
Debug.LogError("ARCoachingOverlayView is not supported by this device.");
}
}
///
/// Activates the [ARCoachingGoal](https://developer.apple.com/documentation/arkit/arcoachinggoal)
///
/// If true, the coaching overlay is animated, e.g. fades in. If false, the coaching overlay appears instantly, without any transition.
public void ActivateCoaching(bool animated)
{
#if UNITY_IOS
if (supported && GetComponent().subsystem is ARKitSessionSubsystem sessionSubsystem)
{
sessionSubsystem.SetCoachingActive(true, animated ? ARCoachingOverlayTransition.Animated : ARCoachingOverlayTransition.Instant);
}
else
#endif
{
throw new NotSupportedException("ARCoachingOverlay is not supported");
}
}
///
/// Disables the [ARCoachingGoal](https://developer.apple.com/documentation/arkit/arcoachinggoal)
///
/// If true, the coaching overlay is animated, e.g. fades out. If false, the coaching overlay disappears instantly, without any transition.
public void DisableCoaching(bool animated)
{
#if UNITY_IOS
if (supported && GetComponent().subsystem is ARKitSessionSubsystem sessionSubsystem)
{
sessionSubsystem.SetCoachingActive(false, animated ? ARCoachingOverlayTransition.Animated : ARCoachingOverlayTransition.Instant);
}
else
#endif
{
throw new NotSupportedException("ARCoachingOverlay is not supported");
}
}
}