#if VISUALSCRIPTING_1_8_OR_NEWER using System; using Unity.VisualScripting; namespace UnityEngine.XR.ARFoundation.VisualScripting { /// /// A switch unit that breaks down an and triggers one of multiple /// control outputs based on the state value. /// [UnitTitle("Session State Switch")] [UnitCategory(Constants.k_ARFoundation_Unit_Category)] [UnitOrder((int)Constants.ARFoundationFeatureOrder.Session)] [TypeIcon(typeof(ARSessionState))] public sealed class SessionStateSwitchUnit : Unit { /// /// Flow input. /// [DoNotSerialize] [PortLabelHidden] public ControlInput flowIn { get; private set; } /// /// input. /// [DoNotSerialize] [PortLabel("AR Session State")] public ValueInput sessionStateIn { get; private set; } /// /// Flow output if AR Session state is . /// [DoNotSerialize] public ControlOutput none { get; private set; } /// /// Flow output if AR Session state is . /// [DoNotSerialize] public ControlOutput unsupported { get; private set; } /// /// Flow output if AR Session state is . /// [DoNotSerialize] public ControlOutput checkingAvailability { get; private set; } /// /// Flow output if AR Session state is . /// [DoNotSerialize] public ControlOutput needsInstall { get; private set; } /// /// Flow output if AR Session state is . /// [DoNotSerialize] public ControlOutput installing { get; private set; } /// /// Flow output if AR Session state is . /// [DoNotSerialize] public ControlOutput ready { get; private set; } /// /// Flow output if AR Session state is . /// [DoNotSerialize] public ControlOutput sessionInitializing { get; private set; } /// /// Flow output if AR Session state is . /// [DoNotSerialize] public ControlOutput sessionTracking { get; private set; } /// /// Unit definition. /// protected override void Definition() { flowIn = ControlInput(nameof(flowIn), ProcessFlow); sessionStateIn = ValueInput(nameof(sessionStateIn)); none = ControlOutput(nameof(none)); unsupported = ControlOutput(nameof(unsupported)); checkingAvailability = ControlOutput(nameof(checkingAvailability)); needsInstall = ControlOutput(nameof(needsInstall)); installing = ControlOutput(nameof(installing)); ready = ControlOutput(nameof(ready)); sessionInitializing = ControlOutput(nameof(sessionInitializing)); sessionTracking = ControlOutput(nameof(sessionTracking)); Requirement(sessionStateIn, flowIn); Succession(flowIn, none); Succession(flowIn, unsupported); Succession(flowIn, checkingAvailability); Succession(flowIn, needsInstall); Succession(flowIn, installing); Succession(flowIn, ready); Succession(flowIn, sessionInitializing); Succession(flowIn, sessionTracking); } ControlOutput ProcessFlow(Flow flow) { if (!(flow.GetValue(sessionStateIn) is ARSessionState sessionState)) throw new ArgumentException($"{nameof(sessionStateIn)} must be of type {nameof(ARSessionState)}."); return sessionState switch { ARSessionState.None => none, ARSessionState.Unsupported => unsupported, ARSessionState.CheckingAvailability => checkingAvailability, ARSessionState.NeedsInstall => needsInstall, ARSessionState.Installing => installing, ARSessionState.Ready => ready, ARSessionState.SessionInitializing => sessionInitializing, ARSessionState.SessionTracking => sessionTracking, _ => throw new ArgumentOutOfRangeException() }; } } } #endif // VISUALSCRIPTING_1_8_OR_NEWER