diff --git a/.gitignore b/.gitignore index d13b1ae7..402a80e5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,8 @@ +# AI +.claude +.etabli + +# Build Output Build/ TestBuilds/ scripts/python/__pycache__/ @@ -5,10 +10,19 @@ scripts/python/__pycache__/ **/.idea/* **/Temp/* plug-ins/**/TestPlayers +**/Apple Plug-In Support/ +**/Apple Plug-In Support.meta +**/NativeLibraries~/ + +# VS Code/Xcode **/.vsconfig **/xcuserdata *.vsconfig **/.vscode/* -**/Apple Plug-In Support/ -**/Apple Plug-In Support.meta -**/NativeLibraries~/ + +# IDE-generated solution/project files (regenerated by Unity's IDE integration) +*.sln +*.slnx +*.csproj + + diff --git a/Documentation/Quickstart.md b/Documentation/Quickstart.md index 5e65648b..399f41f4 100644 --- a/Documentation/Quickstart.md +++ b/Documentation/Quickstart.md @@ -19,6 +19,8 @@ The first step is to download or clone the [Apple-Unity Plug-ins repository](htt | Apple.GameController | [Apple.GameController Documentation](../plug-ins/Apple.GameController/Apple.GameController_Unity/Assets/Apple.GameController/Documentation~/Apple.GameController.md) | | Apple.GameKit | [Apple.GameKit Documentation](../plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Documentation~/Apple.GameKit.md) | | Apple.PHASE | [Apple.PHASE Documentation](../plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/Documentation~/Apple.PHASE.md) | +| Apple.SpatialController | [Apple.SpatialController Documentation](../plug-ins/Apple.SpatialController/README.md) | +| Apple.StoreKit | [Apple.StoreKit Documentation](../plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Documentation~/Apple.StoreKit.md) | ## 2. Build After downloading the plug-in(s), you will need to build the native libraries. If you are familiar with Unity plug-ins, these are compiled assets found in a Unity project's `Assets/.../Plugins/{iOS, macOS, tvOS}/` directories. Along with some C# bridging scripts, they enable communication with Apple devices' native technologies. diff --git a/README.md b/README.md index 6fc07745..c7ae6a11 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,5 @@ # Apple Unity Plug-Ins -## 27 Beta - -27 beta is now live! Watch the [WWDC26 video](https://developer.apple.com/videos/play/wwdc2026/378/) for information and check out the `27-beta` branch to test it out. ## Overview The Apple Unity Plug-Ins expose a selection of Apple platform frameworks to Unity developers. @@ -16,17 +13,19 @@ To get started with integration of these plug-ins into your Unity projects, run | :------ | :---------- | | Apple.Core | Provides integrated build post process management and Editor UI.
**Note:** Apple.Core is a dependency of all Apple Unity plug-ins.| | Apple.Accessibility | Provides Apple's accessibility to Unity developers allowing adding supports to Apple's built-in assistive technologies such as VoiceOver.| +| Apple.BackgroundAssets | Exposes Apple’s Background Assets framework to Unity developers, enabling out-of-band delivery of asset packs from Apple or third-party servers. The plug-in also automatically configures generated Xcode projects with a downloader extension and everything else that’s necessary to use Background Assets. | | Apple.CoreHaptics | Brings Apple's Core Haptics framework to Unity developers, enabling for customizable haptic patterns and in-depth playback control on supported devices. This Plug-In also includes UIKit's UIFeedbackGenerator API.| | Apple.GameController | Exposes Apple's GameController framework to Unity developers allowing for rich controller features in macOS, iOS, and tvOS apps. | | Apple.GameKit | Allows Unity developers to easily integrate GameKit features such as leaderboards, achievements, and match making. | | Apple.PHASE | The PHASE plug-in allows Unity developers to take full advantage of Apple's new geometry and material aware spatial audio system. | | Apple.SpatialController | Exposes Apple's AccessoryTracking and GameController frameworks to Unity developers on visionOS allowing for spatial controller features in visionOS apps. Requires visionOS 26.0 | +| Apple.StoreKit | Exposes Apple's StoreKit 2 framework to Unity developers, enabling in-app purchases, subscriptions, and transaction management with modern async/await patterns. | ## Minimum Supported OS Versions | OS | Version | | :- | :------ | | iOS | 15.6 | -| macOS | 11.5 | +| macOS | 12.0 | | tvOS | 15.6 | | visionOS | 1.3 | | watchOS | not supported | diff --git a/build.py b/build.py index b768fa91..d95e4d09 100755 --- a/build.py +++ b/build.py @@ -26,7 +26,7 @@ # Handle command line args argument_parser = argparse.ArgumentParser(description="Builds all native libraries, packages plug-ins, and moves packages to build folder.") -argument_parser.add_argument("-p", "--plugin-list", dest="plugin_list", nargs='*', default=[PluginID.ALL], help=f"Selects the plug-ins to process. Possible values are: {PluginID.ACCESSIBILITY}, {PluginID.CORE}, {PluginID.CORE_HAPTICS}, {PluginID.GAME_CONTROLLER}, {PluginID.SPATIAL_CONTROLLER}, {PluginID.GAME_KIT}, {PluginID.PHASE}, or {PluginID.ALL}. Default is: {PluginID.ALL}") +argument_parser.add_argument("-p", "--plugin-list", dest="plugin_list", nargs='*', default=[PluginID.ALL], help=f"Selects the plug-ins to process. Possible values are: {PluginID.ACCESSIBILITY}, {PluginID.CORE}, {PluginID.CORE_HAPTICS}, {PluginID.GAME_CONTROLLER}, {PluginID.SPATIAL_CONTROLLER}, {PluginID.GAME_KIT}, {PluginID.PHASE}, {PluginID.STORE_KIT}, {PluginID.BACKGROUND_ASSETS}, or {PluginID.ALL}. Default is: {PluginID.ALL}") argument_parser.add_argument("-m", "--platforms", dest="platform_list", nargs='*', default=[PlatformID.ALL], help=f"Selects the desired platforms to target when building native libraries. Possible values are: {PlatformID.IOS}, {PlatformID.IOS_SIMULATOR}, {PlatformID.MACOS}, {PlatformID.TVOS}, {PlatformID.TVOS_SIMULATOR}, {PlatformID.VISIONOS}, {PlatformID.VISIONOS_SIMULATOR}, {PlatformID.SIMULATORS}, {PlatformID.DEVICES} or {PlatformID.ALL}. Default is: {PlatformID.ALL}") argument_parser.add_argument("-b", "--build-action", dest="build_actions", nargs='*', default=[BuildActionID.BUILD, BuildActionID.PACK], help=f"Sets the build actions for the selected plug-ins. Possible values are: {BuildActionID.BUILD}, {BuildActionID.PACK}, {BuildActionID.NONE} or {BuildActionID.ALL}. Defaults are: {BuildActionID.BUILD}, {BuildActionID.PACK}") argument_parser.add_argument("-bc","--build-config", dest="build_config", default=ConfigID.ALL, help=f"Sets the build configuration to compile. Possible values are: {ConfigID.RELEASE}, {ConfigID.DEBUG}, or {ConfigID.ALL} which builds all other configs. Default is: {ConfigID.ALL}") @@ -186,7 +186,7 @@ def Main(): break elif platform_id in CTX.platforms: if platform_id in supported_platforms: - valid_platform_found = True + valid_platform_found = True CTX.platforms[platform_id] = True else: CTX.printer.WarningMessage(f"Valid platform '{platform_id}' selected, but no {platform_id} SDK is installed.\nPlease add the SDK:\n {Printer.Bold('1.')} Open {Printer.Bold('Xcode')}\n {Printer.Bold('2.')} Open {Printer.Bold('Settings')} (Xcode > Settings...) or (⌘ + ,) \n {Printer.Bold('3.')} Go to the {Printer.Bold('Platforms')} tab\n {Printer.Bold('4.')} Install the {platform_id} SDK.") @@ -235,7 +235,9 @@ def Main(): PluginID.GAME_CONTROLLER: False, PluginID.SPATIAL_CONTROLLER: False, PluginID.GAME_KIT: False, - PluginID.PHASE: False + PluginID.PHASE: False, + PluginID.STORE_KIT: False, + PluginID.BACKGROUND_ASSETS: False } valid_plugin_found = False @@ -249,7 +251,7 @@ def Main(): valid_plugin_found = True break else: - utility.WarningMessage(f"Ignoring unknown plug-in '{plugin_id}'. Valid options are {PluginID.ACCESSIBILITY}, {PluginID.CORE}, {PluginID.CORE_HAPTICS}, {PluginID.GAME_CONTROLLER}, {PluginID.SPATIAL_CONTROLLER}, {PluginID.GAME_KIT}, {PluginID.PHASE}, or {PluginID.ALL} (Default)") + CTX.printer.WarningMessage(f"Ignoring unknown plug-in '{plugin_id}'. Valid options are {PluginID.ACCESSIBILITY}, {PluginID.CORE}, {PluginID.CORE_HAPTICS}, {PluginID.GAME_CONTROLLER}, {PluginID.SPATIAL_CONTROLLER}, {PluginID.GAME_KIT}, {PluginID.PHASE}, {PluginID.STORE_KIT}, {PluginID.BACKGROUND_ASSETS}, or {PluginID.ALL} (Default)") # ------------------------------------------------------------------------- @@ -312,18 +314,18 @@ def Main(): CTX.printer.SectionHeading("Configure Build Paths") # Configure build paths for packages - CTX.build_path = pathlib.Path(build_args.output_path) + CTX.build_output_path = pathlib.Path(build_args.output_path) - if CTX.clean_actions[CleanActionID.PACKAGES] and CTX.build_path.exists(): + if CTX.clean_actions[CleanActionID.PACKAGES] and CTX.build_output_path.exists(): CTX.printer.StatusMessage("Cleaning packages.", "\n") - CTX.printer.StatusMessageWithContext("Removing folder at path:", f"{CTX.build_path}") - utility.RemoveFolder(CTX.build_path, prompt= not build_args.force_clean, printer= CTX.printer) + CTX.printer.StatusMessageWithContext("Removing folder at path:", f"{CTX.build_output_path}") + utility.RemoveFolder(CTX.build_output_path, prompt= not build_args.force_clean, printer= CTX.printer) if CTX.build_actions[BuildActionID.BUILD] or CTX.build_actions[BuildActionID.PACK]: - if not CTX.build_path.exists(): + if not CTX.build_output_path.exists(): CTX.printer.Message(f"Build output path not found.", "\n") - CTX.printer.StatusMessageWithContext("Creating: ", f"{CTX.build_path}") - CTX.build_path.mkdir() + CTX.printer.StatusMessageWithContext("Creating: ", f"{CTX.build_output_path}") + CTX.build_output_path.mkdir() # Configure and optionally clean paths for test builds test_build_root_path = pathlib.Path(build_args.test_output_path) diff --git a/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Assets/Apple.Accessibility/AccessibilityNode.cs b/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Assets/Apple.Accessibility/AccessibilityNode.cs index a8c0856b..87b8df63 100644 --- a/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Assets/Apple.Accessibility/AccessibilityNode.cs +++ b/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Assets/Apple.Accessibility/AccessibilityNode.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Reflection; using System.Runtime.InteropServices; +using Apple.Core; using UnityEngine; namespace Apple.Accessibility @@ -388,60 +389,36 @@ private void OnDestroy() UnregisterAXElement(this); } - private static Dictionary axElements = new Dictionary(); + private static Dictionary axElements = new(); static internal void RegisterAXElement(AccessibilityNode obj) { -#if UNITY_6000_4_OR_NEWER - if (axElements.ContainsKey(EntityId.ToULong(obj.gameObject.GetEntityId()))) -#else - if (axElements.ContainsKey((ulong)obj.gameObject.GetInstanceID())) -#endif + if (axElements.ContainsKey(obj.gameObject.GetLongId())) { return; } - -#if UNITY_6000_4_OR_NEWER - axElements.Add(EntityId.ToULong(obj.gameObject.GetEntityId()), obj); - AccessibilityNode parent = obj._accessibilityParent(); - ulong parentId = EntityId.ToULong(EntityId.None); -#else - axElements.Add((ulong)obj.gameObject.GetInstanceID(), obj); + axElements.Add(obj.gameObject.GetLongId(), obj); AccessibilityNode parent = obj._accessibilityParent(); - ulong parentId = 0; -#endif + // Use Unity's lifetime-aware null check, not C#'s: a destroyed-but-not-collected + // parent is non-null to `?.` but null to `parent != null` below, which would leave + // us reporting a live parentId alongside hasParent: false. + ulong parentId = 0; if (parent) { -#if UNITY_6000_4_OR_NEWER - parentId = EntityId.ToULong(parent.gameObject.GetEntityId()); -#else - parentId = (ulong)parent.gameObject.GetInstanceID(); -#endif + parentId = parent.gameObject.GetLongId(); } #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR -#if UNITY_6000_4_OR_NEWER - _UnityAX_RegisterElementWithIdentifier(EntityId.ToULong(obj.gameObject.GetEntityId()), parentId, parent != null); -#else - _UnityAX_RegisterElementWithIdentifier((ulong)obj.gameObject.GetInstanceID(), parentId, parent != null); -#endif + _UnityAX_RegisterElementWithIdentifier(obj.gameObject.GetLongId(), parentId, parent != null); #endif } static internal void UnregisterAXElement(AccessibilityNode obj) { -#if UNITY_6000_4_OR_NEWER - axElements.Remove(EntityId.ToULong(obj.gameObject.GetEntityId())); -#else - axElements.Remove((ulong)obj.gameObject.GetInstanceID()); -#endif + axElements.Remove(obj.gameObject.GetLongId()); #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR -#if UNITY_6000_4_OR_NEWER - _UnityAX_UnregisterElementWithIdentifier(EntityId.ToULong(obj.gameObject.GetEntityId())); -#else - _UnityAX_UnregisterElementWithIdentifier((ulong)obj.gameObject.GetInstanceID()); -#endif + _UnityAX_UnregisterElementWithIdentifier(obj.gameObject.GetLongId()); #endif } @@ -897,7 +874,7 @@ private static void RegisterCallbacks() #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR [DllImport("__Internal")] private static extern void _UnityAX_InitializeAXRuntime(); - [DllImport("__Internal")] private static extern void _UnityAX_RegisterElementWithIdentifier(ulong identifier, ulong parentIdentifier, bool hasParent); + [DllImport("__Internal")] private static extern void _UnityAX_RegisterElementWithIdentifier(ulong identifier, ulong parentIdentifier, [MarshalAs(UnmanagedType.I1)] bool hasParent); [DllImport("__Internal")] private static extern void _UnityAX_UnregisterElementWithIdentifier(ulong identifier); private delegate string AccessibilityFrameDelegate(ulong identifier); diff --git a/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Assets/Apple.Accessibility/AccessibilitySettings.cs b/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Assets/Apple.Accessibility/AccessibilitySettings.cs index fec756b8..93cde1ed 100644 --- a/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Assets/Apple.Accessibility/AccessibilitySettings.cs +++ b/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Assets/Apple.Accessibility/AccessibilitySettings.cs @@ -483,6 +483,28 @@ public static bool IsOnOffSwitchLabelsEnabled } } + + public delegate void IsAudioDescriptionEnabledChangedHandler(); + /// + /// A notification that gets posted when the system's Audio Descriptions setting changes. + /// + public static IsAudioDescriptionEnabledChangedHandler onIsAudioDescriptionEnabledChanged; + + /// + /// A Boolean value that indicates whether the Audio Descriptions setting is in an enabled state. + /// + public static bool IsAudioDescriptionEnabled + { + get + { +#if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR + return _UnityAX_UIAccessibilityIsAudioDescriptionEnabled(); +#else + return false; +#endif + } + } + #region Native Bridge private static bool __registered = false; @@ -512,6 +534,7 @@ private static void RegisterCallbacks() _UnityAX_registerAccessibilityIsShakeToUndoEnabledDidChangeNotification(_UnityAX_UIAccessibilityIsShakeToUndoEnabledDidChangeNotification); _UnityAX_registerAccessibilityShouldDifferentiateWithoutColorDidChangeNotification(_UnityAX_UIAccessibilityShouldDifferentiateWithoutColorDidChangeNotification); _UnityAX_registerAccessibilityIsOnOffSwitchLabelsEnabledDidChangeNotification(_UnityAX_UIAccessibilityIsOnOffSwitchLabelsEnabledDidChangeNotification); + _UnityAX_registerAccessibilityIsAudioDescriptionEnabledDidChangeNotification(_UnityAX_UIAccessibilityIsAudioDescriptionEnabledDidChangeNotification); #endif __registered = true; } @@ -535,6 +558,7 @@ private static void _UnityAX_UIAccessibilityPreferredContentSizeCategoryDidChang #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR private delegate void UIAccessibilityIsVoiceOverRunningDidChangeNotificationDelegate(); + [return: MarshalAs(UnmanagedType.I1)] [DllImport("__Internal")] private static extern bool _UnityAX_UIAccessibilityIsVoiceOverRunning(); [DllImport("__Internal")] private static extern void _UnityAX_registerAccessibilityIsVoiceOverRunningDidChangeNotification(UIAccessibilityIsVoiceOverRunningDidChangeNotificationDelegate actionDelegate); @@ -548,6 +572,7 @@ private static void _UnityAX_UIAccessibilityIsVoiceOverRunningDidChangeNotificat #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR private delegate void UIAccessibilityIsSwitchControlRunningDidChangeNotificationDelegate(); + [return: MarshalAs(UnmanagedType.I1)] [DllImport("__Internal")] private static extern bool _UnityAX_UIAccessibilityIsSwitchControlRunning(); [DllImport("__Internal")] private static extern void _UnityAX_registerAccessibilityIsSwitchControlRunningDidChangeNotification(UIAccessibilityIsSwitchControlRunningDidChangeNotificationDelegate actionDelegate); @@ -561,6 +586,7 @@ private static void _UnityAX_UIAccessibilityIsSwitchControlRunningDidChangeNotif #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR private delegate void UIAccessibilityIsSpeakSelectionEnabledDidChangeNotificationDelegate(); + [return: MarshalAs(UnmanagedType.I1)] [DllImport("__Internal")] private static extern bool _UnityAX_UIAccessibilityIsSpeakSelectionEnabled(); [DllImport("__Internal")] private static extern void _UnityAX_registerAccessibilityIsSpeakSelectionEnabledDidChangeNotification(UIAccessibilityIsSpeakSelectionEnabledDidChangeNotificationDelegate actionDelegate); @@ -574,6 +600,7 @@ private static void _UnityAX_UIAccessibilityIsSpeakSelectionEnabledDidChangeNoti #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR private delegate void UIAccessibilityIsGuidedAccessEnabledDidChangeNotificationDelegate(); + [return: MarshalAs(UnmanagedType.I1)] [DllImport("__Internal")] private static extern bool _UnityAX_UIAccessibilityIsGuidedAccessEnabled(); [DllImport("__Internal")] private static extern void _UnityAX_registerAccessibilityIsGuidedAccessEnabledDidChangeNotification(UIAccessibilityIsGuidedAccessEnabledDidChangeNotificationDelegate actionDelegate); @@ -587,6 +614,7 @@ private static void _UnityAX_UIAccessibilityIsGuidedAccessEnabledDidChangeNotifi #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR private delegate void UIAccessibilityIsMonoAudioEnabledDidChangeNotificationDelegate(); + [return: MarshalAs(UnmanagedType.I1)] [DllImport("__Internal")] private static extern bool _UnityAX_UIAccessibilityIsMonoAudioEnabled(); [DllImport("__Internal")] private static extern void _UnityAX_registerAccessibilityIsMonoAudioEnabledDidChangeNotification(UIAccessibilityIsMonoAudioEnabledDidChangeNotificationDelegate actionDelegate); @@ -600,6 +628,7 @@ private static void _UnityAX_UIAccessibilityIsMonoAudioEnabledDidChangeNotificat #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR private delegate void UIAccessibilityIsClosedCaptioningEnabledDidChangeNotificationDelegate(); + [return: MarshalAs(UnmanagedType.I1)] [DllImport("__Internal")] private static extern bool _UnityAX_UIAccessibilityIsClosedCaptioningEnabled(); [DllImport("__Internal")] private static extern void _UnityAX_registerAccessibilityIsClosedCaptioningEnabledDidChangeNotification(UIAccessibilityIsClosedCaptioningEnabledDidChangeNotificationDelegate actionDelegate); @@ -614,6 +643,7 @@ private static void _UnityAX_UIAccessibilityIsClosedCaptioningEnabledDidChangeNo #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR private delegate void UIAccessibilityIsInvertColorsEnabledDidChangeNotificationDelegate(); + [return: MarshalAs(UnmanagedType.I1)] [DllImport("__Internal")] private static extern bool _UnityAX_UIAccessibilityIsInvertColorsEnabled(); [DllImport("__Internal")] private static extern void _UnityAX_registerAccessibilityIsInvertColorsEnabledDidChangeNotification(UIAccessibilityIsInvertColorsEnabledDidChangeNotificationDelegate actionDelegate); @@ -627,6 +657,7 @@ private static void _UnityAX_UIAccessibilityIsInvertColorsEnabledDidChangeNotifi #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR private delegate void UIAccessibilityIsBoldTextEnabledDidChangeNotificationDelegate(); + [return: MarshalAs(UnmanagedType.I1)] [DllImport("__Internal")] private static extern bool _UnityAX_UIAccessibilityIsBoldTextEnabled(); [DllImport("__Internal")] private static extern void _UnityAX_registerAccessibilityIsBoldTextEnabledDidChangeNotification(UIAccessibilityIsBoldTextEnabledDidChangeNotificationDelegate actionDelegate); @@ -640,6 +671,7 @@ private static void _UnityAX_UIAccessibilityIsBoldTextEnabledDidChangeNotificati #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR private delegate void UIAccessibilityButtonShapesEnabledDidChangeNotificationDelegate(); + [return: MarshalAs(UnmanagedType.I1)] [DllImport("__Internal")] private static extern bool _UnityAX_UIAccessibilityButtonShapesEnabled(); [DllImport("__Internal")] private static extern void _UnityAX_registerAccessibilityButtonShapesEnabledDidChangeNotification(UIAccessibilityButtonShapesEnabledDidChangeNotificationDelegate actionDelegate); @@ -653,6 +685,7 @@ private static void _UnityAX_UIAccessibilityButtonShapesEnabledDidChangeNotifica #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR private delegate void UIAccessibilityIsGrayscaleEnabledDidChangeNotificationDelegate(); + [return: MarshalAs(UnmanagedType.I1)] [DllImport("__Internal")] private static extern bool _UnityAX_UIAccessibilityIsGrayscaleEnabled(); [DllImport("__Internal")] private static extern void _UnityAX_registerAccessibilityIsGrayscaleEnabledDidChangeNotification(UIAccessibilityIsGrayscaleEnabledDidChangeNotificationDelegate actionDelegate); @@ -666,6 +699,7 @@ private static void _UnityAX_UIAccessibilityIsGrayscaleEnabledDidChangeNotificat #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR private delegate void UIAccessibilityIsReduceTransparencyEnabledDidChangeNotificationDelegate(); + [return: MarshalAs(UnmanagedType.I1)] [DllImport("__Internal")] private static extern bool _UnityAX_UIAccessibilityIsReduceTransparencyEnabled(); [DllImport("__Internal")] private static extern void _UnityAX_registerAccessibilityIsReduceTransparencyEnabledDidChangeNotification(UIAccessibilityIsReduceTransparencyEnabledDidChangeNotificationDelegate actionDelegate); @@ -679,6 +713,7 @@ private static void _UnityAX_UIAccessibilityIsReduceTransparencyEnabledDidChange #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR private delegate void UIAccessibilityIsReduceMotionEnabledDidChangeNotificationDelegate(); + [return: MarshalAs(UnmanagedType.I1)] [DllImport("__Internal")] private static extern bool _UnityAX_UIAccessibilityIsReduceMotionEnabled(); [DllImport("__Internal")] private static extern void _UnityAX_registerAccessibilityIsReduceMotionEnabledDidChangeNotification(UIAccessibilityIsReduceMotionEnabledDidChangeNotificationDelegate actionDelegate); @@ -692,6 +727,7 @@ private static void _UnityAX_UIAccessibilityIsReduceMotionEnabledDidChangeNotifi #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR private delegate void UIAccessibilityPrefersCrossFadeTransitionsDidChangeNotificationDelegate(); + [return: MarshalAs(UnmanagedType.I1)] [DllImport("__Internal")] private static extern bool _UnityAX_UIAccessibilityPrefersCrossFadeTransitions(); [DllImport("__Internal")] private static extern void _UnityAX_registerAccessibilityPrefersCrossFadeTransitionsDidChangeNotification(UIAccessibilityPrefersCrossFadeTransitionsDidChangeNotificationDelegate actionDelegate); @@ -705,6 +741,7 @@ private static void _UnityAX_UIAccessibilityPrefersCrossFadeTransitionsDidChange #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR private delegate void UIAccessibilityIsVideoAutoplayEnabledDidChangeNotificationDelegate(); + [return: MarshalAs(UnmanagedType.I1)] [DllImport("__Internal")] private static extern bool _UnityAX_UIAccessibilityIsVideoAutoplayEnabled(); [DllImport("__Internal")] private static extern void _UnityAX_registerAccessibilityIsVideoAutoplayEnabledDidChangeNotification(UIAccessibilityIsVideoAutoplayEnabledDidChangeNotificationDelegate actionDelegate); @@ -718,6 +755,7 @@ private static void _UnityAX_UIAccessibilityIsVideoAutoplayEnabledDidChangeNotif #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR private delegate void UIAccessibilityDarkerSystemColorsEnabledDidChangeNotificationDelegate(); + [return: MarshalAs(UnmanagedType.I1)] [DllImport("__Internal")] private static extern bool _UnityAX_UIAccessibilityDarkerSystemColorsEnabled(); [DllImport("__Internal")] private static extern void _UnityAX_registerAccessibilityDarkerSystemColorsEnabledDidChangeNotification(UIAccessibilityDarkerSystemColorsEnabledDidChangeNotificationDelegate actionDelegate); @@ -731,6 +769,7 @@ private static void _UnityAX_UIAccessibilityDarkerSystemColorsEnabledDidChangeNo #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR private delegate void UIAccessibilityIsSpeakScreenEnabledDidChangeNotificationDelegate(); + [return: MarshalAs(UnmanagedType.I1)] [DllImport("__Internal")] private static extern bool _UnityAX_UIAccessibilityIsSpeakScreenEnabled(); [DllImport("__Internal")] private static extern void _UnityAX_registerAccessibilityIsSpeakScreenEnabledDidChangeNotification(UIAccessibilityIsSpeakScreenEnabledDidChangeNotificationDelegate actionDelegate); @@ -744,6 +783,7 @@ private static void _UnityAX_UIAccessibilityIsSpeakScreenEnabledDidChangeNotific #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR private delegate void UIAccessibilityIsShakeToUndoEnabledDidChangeNotificationDelegate(); + [return: MarshalAs(UnmanagedType.I1)] [DllImport("__Internal")] private static extern bool _UnityAX_UIAccessibilityIsShakeToUndoEnabled(); [DllImport("__Internal")] private static extern void _UnityAX_registerAccessibilityIsShakeToUndoEnabledDidChangeNotification(UIAccessibilityIsShakeToUndoEnabledDidChangeNotificationDelegate actionDelegate); @@ -757,6 +797,7 @@ private static void _UnityAX_UIAccessibilityIsShakeToUndoEnabledDidChangeNotific #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR private delegate void UIAccessibilityShouldDifferentiateWithoutColorDidChangeNotificationDelegate(); + [return: MarshalAs(UnmanagedType.I1)] [DllImport("__Internal")] private static extern bool _UnityAX_UIAccessibilityShouldDifferentiateWithoutColor(); [DllImport("__Internal")] private static extern void _UnityAX_registerAccessibilityShouldDifferentiateWithoutColorDidChangeNotification(UIAccessibilityShouldDifferentiateWithoutColorDidChangeNotificationDelegate actionDelegate); @@ -770,6 +811,7 @@ private static void _UnityAX_UIAccessibilityShouldDifferentiateWithoutColorDidCh #if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR private delegate void UIAccessibilityIsOnOffSwitchLabelsEnabledDidChangeNotificationDelegate(); + [return: MarshalAs(UnmanagedType.I1)] [DllImport("__Internal")] private static extern bool _UnityAX_UIAccessibilityIsOnOffSwitchLabelsEnabled(); [DllImport("__Internal")] private static extern void _UnityAX_registerAccessibilityIsOnOffSwitchLabelsEnabledDidChangeNotification(UIAccessibilityIsOnOffSwitchLabelsEnabledDidChangeNotificationDelegate actionDelegate); @@ -780,6 +822,20 @@ private static void _UnityAX_UIAccessibilityIsOnOffSwitchLabelsEnabledDidChangeN } #endif +#if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR + private delegate void UIAccessibilityIsAudioDescriptionEnabledDidChangeNotificationDelegate(); + + [return: MarshalAs(UnmanagedType.I1)] + [DllImport("__Internal")] private static extern bool _UnityAX_UIAccessibilityIsAudioDescriptionEnabled(); + [DllImport("__Internal")] private static extern void _UnityAX_registerAccessibilityIsAudioDescriptionEnabledDidChangeNotification(UIAccessibilityIsAudioDescriptionEnabledDidChangeNotificationDelegate actionDelegate); + + [AOT.MonoPInvokeCallback(typeof(UIAccessibilityIsAudioDescriptionEnabledDidChangeNotificationDelegate))] + private static void _UnityAX_UIAccessibilityIsAudioDescriptionEnabledDidChangeNotification() + { + onIsAudioDescriptionEnabledChanged?.Invoke(); + } +#endif + #endregion } } diff --git a/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Assets/Apple.Accessibility/CHANGELOG.md b/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Assets/Apple.Accessibility/CHANGELOG.md index 93dbbc56..a2e8e19a 100644 --- a/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Assets/Apple.Accessibility/CHANGELOG.md +++ b/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Assets/Apple.Accessibility/CHANGELOG.md @@ -1,6 +1,23 @@ # CHANGELOG All notable changes to this project will be documented in this file. +## [1.2.0] - 2026-09-16 +### Added +- Audio Descriptions support: the `IsAudioDescriptionEnabled` property and the + `onIsAudioDescriptionEnabledChanged` event. + +### Changed +- Replaced deprecated `Object.GetInstanceID()` calls with Apple.Core's `GetLongId()`, so the plug-in + compiles warning-free on Unity 6 while still building against the Unity 2022.3 floor. +- Updated the native project for Xcode 27 and raised its deployment targets to iOS 15.0 and + tvOS 15.0, matching the minimum OS versions the plug-ins already document as supported. +- Now requires Apple.Core 3.3.0. + +### Fixed +- Added `[MarshalAs(UnmanagedType.I1)]` to `bool` P/Invoke declarations so `bool` results marshal + correctly. +- Fixed plug-in builds when the source root path contains a space character. + ## [1.1.4] - 2025-01-29 - Remove references to some unused packages. diff --git a/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Assets/Apple.Accessibility/Tests/AccessibilityTests/AccessibilityNode_TestSuite.cs b/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Assets/Apple.Accessibility/Tests/AccessibilityTests/AccessibilityNode_TestSuite.cs index 60dfca8f..1feaab15 100644 --- a/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Assets/Apple.Accessibility/Tests/AccessibilityTests/AccessibilityNode_TestSuite.cs +++ b/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Assets/Apple.Accessibility/Tests/AccessibilityTests/AccessibilityNode_TestSuite.cs @@ -1,5 +1,6 @@ using NUnit.Framework; using System.Collections; +using Apple.Core; using UnityEngine; using UnityEngine.TestTools; using UnityEngine.SceneManagement; @@ -58,11 +59,7 @@ public IEnumerator Test_AccessibilityLabel() AccessibilityNode axObject = ButtonAXObject(); UnityEngine.Assertions.Assert.AreEqual(axObject.AccessibilityLabel, "Button"); -#if UNITY_6000_4_OR_NEWER - bool succeeded = AccessibilityTests.RuniOSSideUnitTestWithKeyPathExpectingStringResult(EntityId.ToULong(axObject.gameObject.GetEntityId()), "accessibilityLabel", "Button"); -#else - bool succeeded = AccessibilityTests.RuniOSSideUnitTestWithKeyPathExpectingStringResult((ulong)axObject.gameObject.GetInstanceID(), "accessibilityLabel", "Button"); -#endif + bool succeeded = AccessibilityTests.RuniOSSideUnitTestWithKeyPathExpectingStringResult(axObject.gameObject.GetLongId(), "accessibilityLabel", "Button"); UnityEngine.Assertions.Assert.IsTrue(succeeded); yield return null; @@ -79,11 +76,7 @@ public IEnumerator Test_AccessibilityValue() AccessibilityNode axObject = ButtonAXObject(); UnityEngine.Assertions.Assert.AreEqual(axObject.AccessibilityValue, "ButtonValue"); -#if UNITY_6000_4_OR_NEWER - bool succeeded = AccessibilityTests.RuniOSSideUnitTestWithKeyPathExpectingStringResult(EntityId.ToULong(axObject.gameObject.GetEntityId()), "accessibilityValue", "ButtonValue"); -#else - bool succeeded = AccessibilityTests.RuniOSSideUnitTestWithKeyPathExpectingStringResult((ulong)axObject.gameObject.GetInstanceID(), "accessibilityValue", "ButtonValue"); -#endif + bool succeeded = AccessibilityTests.RuniOSSideUnitTestWithKeyPathExpectingStringResult(axObject.gameObject.GetLongId(), "accessibilityValue", "ButtonValue"); UnityEngine.Assertions.Assert.IsTrue(succeeded); yield return null; @@ -100,11 +93,7 @@ public IEnumerator Test_AccessibilityHint() AccessibilityNode axObject = ButtonAXObject(); UnityEngine.Assertions.Assert.AreEqual(axObject.AccessibilityHint, "ButtonHint"); -#if UNITY_6000_4_OR_NEWER - bool succeeded = AccessibilityTests.RuniOSSideUnitTestWithKeyPathExpectingStringResult(EntityId.ToULong(axObject.gameObject.GetEntityId()), "accessibilityHint", "ButtonHint"); -#else - bool succeeded = AccessibilityTests.RuniOSSideUnitTestWithKeyPathExpectingStringResult((ulong)axObject.gameObject.GetInstanceID(), "accessibilityHint", "ButtonHint"); -#endif + bool succeeded = AccessibilityTests.RuniOSSideUnitTestWithKeyPathExpectingStringResult(axObject.gameObject.GetLongId(), "accessibilityHint", "ButtonHint"); UnityEngine.Assertions.Assert.IsTrue(succeeded); yield return null; @@ -147,11 +136,7 @@ public IEnumerator Test_PerformMagicTap() return true; }; -#if UNITY_6000_4_OR_NEWER - bool tapSucceeded = AccessibilityRuntime._UnityAX_AccessibilityPerformMagicTap(EntityId.ToULong(axObject.gameObject.GetEntityId())); -#else - bool tapSucceeded = AccessibilityRuntime._UnityAX_AccessibilityPerformMagicTap((ulong)axObject.gameObject.GetInstanceID()); -#endif + bool tapSucceeded = AccessibilityRuntime._UnityAX_AccessibilityPerformMagicTap(axObject.gameObject.GetLongId()); expectedMagicTapCount += 1; UnityEngine.Assertions.Assert.AreEqual(magicTapCount, expectedMagicTapCount); UnityEngine.Assertions.Assert.IsTrue(tapSucceeded); @@ -172,11 +157,7 @@ public IEnumerator Test_PerformMagicTap() return false; }; -#if UNITY_6000_4_OR_NEWER - tapSucceeded = AccessibilityRuntime._UnityAX_AccessibilityPerformMagicTap(EntityId.ToULong(axObject.gameObject.GetEntityId())); -#else - tapSucceeded = AccessibilityRuntime._UnityAX_AccessibilityPerformMagicTap((ulong)axObject.gameObject.GetInstanceID()); -#endif + tapSucceeded = AccessibilityRuntime._UnityAX_AccessibilityPerformMagicTap(axObject.gameObject.GetLongId()); expectedMagicTapCount += 1; UnityEngine.Assertions.Assert.AreEqual(magicTapCount, expectedMagicTapCount); UnityEngine.Assertions.Assert.IsFalse(tapSucceeded); @@ -191,11 +172,7 @@ public IEnumerator Test_PerformMagicTap() //Unimplemented tap axObject.onAccessibilityPerformMagicTap = null; -#if UNITY_6000_4_OR_NEWER - tapSucceeded = AccessibilityRuntime._UnityAX_AccessibilityPerformMagicTap(EntityId.ToULong(axObject.gameObject.GetEntityId())); -#else - tapSucceeded = AccessibilityRuntime._UnityAX_AccessibilityPerformMagicTap((ulong)axObject.gameObject.GetInstanceID()); -#endif + tapSucceeded = AccessibilityRuntime._UnityAX_AccessibilityPerformMagicTap(axObject.gameObject.GetLongId()); UnityEngine.Assertions.Assert.AreEqual(magicTapCount, expectedMagicTapCount); UnityEngine.Assertions.Assert.IsFalse(tapSucceeded); #if UNITY_IOS && !UNITY_EDITOR @@ -229,11 +206,7 @@ public IEnumerator Test_PerformEscape() return true; }; -#if UNITY_6000_4_OR_NEWER - bool tapSucceeded = AccessibilityRuntime._UnityAX_AccessibilityPerformEscape(EntityId.ToULong(axObject.gameObject.GetEntityId())); -#else - bool tapSucceeded = AccessibilityRuntime._UnityAX_AccessibilityPerformEscape((ulong)axObject.gameObject.GetInstanceID()); -#endif + bool tapSucceeded = AccessibilityRuntime._UnityAX_AccessibilityPerformEscape(axObject.gameObject.GetLongId()); expectedEscapeCount += 1; UnityEngine.Assertions.Assert.AreEqual(EscapeCount, expectedEscapeCount); UnityEngine.Assertions.Assert.IsTrue(tapSucceeded); @@ -254,11 +227,7 @@ public IEnumerator Test_PerformEscape() return false; }; -#if UNITY_6000_4_OR_NEWER - tapSucceeded = AccessibilityRuntime._UnityAX_AccessibilityPerformEscape(EntityId.ToULong(axObject.gameObject.GetEntityId())); -#else - tapSucceeded = AccessibilityRuntime._UnityAX_AccessibilityPerformEscape((ulong)axObject.gameObject.GetInstanceID()); -#endif + tapSucceeded = AccessibilityRuntime._UnityAX_AccessibilityPerformEscape(axObject.gameObject.GetLongId()); expectedEscapeCount += 1; UnityEngine.Assertions.Assert.AreEqual(EscapeCount, expectedEscapeCount); UnityEngine.Assertions.Assert.IsFalse(tapSucceeded); @@ -273,11 +242,7 @@ public IEnumerator Test_PerformEscape() //Unimplemented tap axObject.onAccessibilityPerformEscape = null; -#if UNITY_6000_4_OR_NEWER - tapSucceeded = AccessibilityRuntime._UnityAX_AccessibilityPerformEscape(EntityId.ToULong(axObject.gameObject.GetEntityId())); -#else - tapSucceeded = AccessibilityRuntime._UnityAX_AccessibilityPerformEscape((ulong)axObject.gameObject.GetInstanceID()); -#endif + tapSucceeded = AccessibilityRuntime._UnityAX_AccessibilityPerformEscape(axObject.gameObject.GetLongId()); UnityEngine.Assertions.Assert.AreEqual(EscapeCount, expectedEscapeCount); UnityEngine.Assertions.Assert.IsFalse(tapSucceeded); #if UNITY_IOS && !UNITY_EDITOR diff --git a/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Assets/Apple.Accessibility/package.json b/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Assets/Apple.Accessibility/package.json index 6e9a80cf..b94c7854 100644 --- a/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Assets/Apple.Accessibility/package.json +++ b/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Assets/Apple.Accessibility/package.json @@ -1,11 +1,11 @@ { "name": "com.apple.unityplugin.accessibility", - "version": "1.1.4", + "version": "1.2.0", "displayName": "Apple.Accessibility", "description": "A Unity-port of Apple's UIAccessibility protocol from UIKit.framework", "unity": "2022.3", "dependencies": { - "com.apple.unityplugin.core": "3.1.8" + "com.apple.unityplugin.core": "3.3.0" }, "keywords": [ "accessibility", @@ -22,7 +22,7 @@ { "displayName": "UIAccessibility Demo", "description": "Demos for UIAccessibility", - "path": "Demos~" + "path": "Demos" } ] } diff --git a/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Packages/manifest.json b/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Packages/manifest.json index 65f1993f..1ecbc883 100644 --- a/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Packages/manifest.json +++ b/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Packages/manifest.json @@ -1,8 +1,11 @@ { "dependencies": { "com.apple.unityplugin.core": "file:../../../Apple.Core/Apple.Core_Unity/Assets/Apple.Core", - "com.unity.test-framework": "1.1.33", - "com.unity.ugui": "1.0.0", + "com.unity.multiplayer.center": "1.0.1", + "com.unity.test-framework": "1.7.0", + "com.unity.ugui": "2.5.0", + "com.unity.modules.accessibility": "1.0.0", + "com.unity.modules.adaptiveperformance": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", "com.unity.modules.animation": "1.0.0", @@ -16,6 +19,7 @@ "com.unity.modules.particlesystem": "1.0.0", "com.unity.modules.physics": "1.0.0", "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.physicscore2d": "1.0.0", "com.unity.modules.screencapture": "1.0.0", "com.unity.modules.terrain": "1.0.0", "com.unity.modules.terrainphysics": "1.0.0", @@ -29,9 +33,9 @@ "com.unity.modules.unitywebrequestaudio": "1.0.0", "com.unity.modules.unitywebrequesttexture": "1.0.0", "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vectorgraphics": "1.0.0", "com.unity.modules.vehicles": "1.0.0", "com.unity.modules.video": "1.0.0", - "com.unity.modules.vr": "1.0.0", "com.unity.modules.wind": "1.0.0", "com.unity.modules.xr": "1.0.0" }, diff --git a/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Packages/packages-lock.json b/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Packages/packages-lock.json index 142b9bab..5c7c45dd 100644 --- a/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Packages/packages-lock.json +++ b/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/Packages/packages-lock.json @@ -7,30 +7,53 @@ "dependencies": {} }, "com.unity.ext.nunit": { - "version": "1.0.6", + "version": "2.1.0", "depth": 1, - "source": "registry", - "dependencies": {}, - "url": "https://packages.unity.com" + "source": "builtin", + "dependencies": {} + }, + "com.unity.multiplayer.center": { + "version": "1.0.1", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.uielements": "1.0.0" + } }, "com.unity.test-framework": { - "version": "1.1.33", + "version": "1.7.0", "depth": 0, - "source": "registry", + "source": "builtin", "dependencies": { - "com.unity.ext.nunit": "1.0.6", + "com.unity.ext.nunit": "2.1.0", "com.unity.modules.imgui": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0" - }, - "url": "https://packages.unity.com" + } }, "com.unity.ugui": { - "version": "1.0.0", + "version": "2.5.0", "depth": 0, "source": "builtin", "dependencies": { "com.unity.modules.ui": "1.0.0", - "com.unity.modules.imgui": "1.0.0" + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.physics": "1.0.0" + } + }, + "com.unity.modules.accessibility": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.adaptiveperformance": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.subsystems": "1.0.0" } }, "com.unity.modules.ai": { @@ -43,7 +66,9 @@ "version": "1.0.0", "depth": 0, "source": "builtin", - "dependencies": {} + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0" + } }, "com.unity.modules.animation": { "version": "1.0.0", @@ -80,6 +105,12 @@ "com.unity.modules.animation": "1.0.0" } }, + "com.unity.modules.hierarchycore": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": {} + }, "com.unity.modules.imageconversion": { "version": "1.0.0", "depth": 0, @@ -111,6 +142,14 @@ "dependencies": {} }, "com.unity.modules.physics2d": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physicscore2d": "1.0.0" + } + }, + "com.unity.modules.physicscore2d": { "version": "1.0.0", "depth": 0, "source": "builtin", @@ -168,7 +207,10 @@ "dependencies": { "com.unity.modules.ui": "1.0.0", "com.unity.modules.imgui": "1.0.0", - "com.unity.modules.jsonserialize": "1.0.0" + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.hierarchycore": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.animation": "1.0.0" } }, "com.unity.modules.umbra": { @@ -232,32 +274,32 @@ "com.unity.modules.imageconversion": "1.0.0" } }, - "com.unity.modules.vehicles": { + "com.unity.modules.vectorgraphics": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.physics": "1.0.0" + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0" } }, - "com.unity.modules.video": { + "com.unity.modules.vehicles": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.audio": "1.0.0", - "com.unity.modules.ui": "1.0.0", - "com.unity.modules.unitywebrequest": "1.0.0" + "com.unity.modules.physics": "1.0.0" } }, - "com.unity.modules.vr": { + "com.unity.modules.video": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.jsonserialize": "1.0.0", - "com.unity.modules.physics": "1.0.0", - "com.unity.modules.xr": "1.0.0" + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" } }, "com.unity.modules.wind": { diff --git a/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/ProjectSettings/MultiplayerManager.asset b/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/ProjectSettings/MultiplayerManager.asset new file mode 100644 index 00000000..2a936644 --- /dev/null +++ b/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/ProjectSettings/MultiplayerManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!655991488 &1 +MultiplayerManager: + m_ObjectHideFlags: 0 + m_EnableMultiplayerRoles: 0 + m_StrippingTypes: {} diff --git a/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/ProjectSettings/PackageManagerSettings.asset b/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/ProjectSettings/PackageManagerSettings.asset index be4a7974..0c2a9056 100644 --- a/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/ProjectSettings/PackageManagerSettings.asset +++ b/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/ProjectSettings/PackageManagerSettings.asset @@ -12,32 +12,33 @@ MonoBehaviour: m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} m_Name: m_EditorClassIdentifier: - m_EnablePreviewPackages: 0 - m_EnablePackageDependencies: 0 + m_EnablePreReleasePackages: 0 m_AdvancedSettingsExpanded: 1 m_ScopedRegistriesSettingsExpanded: 1 + m_SeeAllPackageVersions: 0 + m_DismissPreviewPackagesInUse: 0 oneTimeWarningShown: 0 - m_Registries: - - m_Id: main + oneTimePackageErrorsPopUpShown: 0 + m_MainRegistry: + m_Id: main m_Name: m_Url: https://packages.unity.com m_Scopes: [] m_IsDefault: 1 + m_IsUnityRegistry: 1 m_Capabilities: 7 + m_ConfigSource: 0 + m_Compliance: + m_Status: 0 + m_Violations: [] + m_ScopedRegistries: [] m_UserSelectedRegistryName: m_UserAddingNewScopedRegistry: 0 m_RegistryInfoDraft: - m_ErrorMessage: - m_Original: - m_Id: - m_Name: - m_Url: - m_Scopes: [] - m_IsDefault: 0 - m_Capabilities: 0 m_Modified: 0 - m_Name: - m_Url: - m_Scopes: - - - m_SelectedScopeIndex: 0 + m_ErrorMessage: + m_UserModificationsEntityId: + m_rawData: 568105589213756510 + m_OriginalEntityId: + m_rawData: 568105589213756508 + m_LoadAssets: 0 diff --git a/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/ProjectSettings/PhysicsCoreProjectSettings2D.asset b/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/ProjectSettings/PhysicsCoreProjectSettings2D.asset new file mode 100644 index 00000000..049c7454 --- /dev/null +++ b/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/ProjectSettings/PhysicsCoreProjectSettings2D.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!176606843 &1 +PhysicsCoreProjectSettings2D: + m_ObjectHideFlags: 0 + m_PhysicsCoreSettings: {fileID: 0} diff --git a/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/ProjectSettings/ProjectVersion.txt b/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/ProjectSettings/ProjectVersion.txt index b8523623..c1608124 100644 --- a/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/ProjectSettings/ProjectVersion.txt +++ b/plug-ins/Apple.Accessibility/Apple.Accessibility_Unity/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2022.3.62f2 -m_EditorVersionWithRevision: 2022.3.62f2 (7670c08855a9) +m_EditorVersion: 6000.5.2f1 +m_EditorVersionWithRevision: 6000.5.2f1 (eb73d3b415a1) diff --git a/plug-ins/Apple.Accessibility/Native/Accessibility.xcconfig b/plug-ins/Apple.Accessibility/Native/Accessibility.xcconfig index 49960f44..0e3dbcd5 100644 --- a/plug-ins/Apple.Accessibility/Native/Accessibility.xcconfig +++ b/plug-ins/Apple.Accessibility/Native/Accessibility.xcconfig @@ -25,7 +25,7 @@ NATIVE_LIBRARY_ROOT_FOLDER_NAME=Apple.Accessibility // ------------------ GENERATE_INFOPLIST_FILE = YES -CURRENT_PROJECT_VERSION = 1.1.4 +CURRENT_PROJECT_VERSION = 1.2.0 MARKETING_VERSION = $CURRENT_PROJECT_VERSION VERSIONING_SYSTEM = apple-generic INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2021 - 2024 Apple, Inc. All rights reserved." diff --git a/plug-ins/Apple.Accessibility/Native/Accessibility.xcodeproj/project.pbxproj b/plug-ins/Apple.Accessibility/Native/Accessibility.xcodeproj/project.pbxproj index 80f0b7a0..74010569 100644 --- a/plug-ins/Apple.Accessibility/Native/Accessibility.xcodeproj/project.pbxproj +++ b/plug-ins/Apple.Accessibility/Native/Accessibility.xcodeproj/project.pbxproj @@ -500,7 +500,7 @@ INFOPLIST_KEY_NSHumanReadableCopyright = ""; INFOPLIST_OUTPUT_FORMAT = XML; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.AppleAccessibility-iOS"; PRODUCT_NAME = AppleAccessibility; @@ -525,7 +525,7 @@ INFOPLIST_KEY_NSHumanReadableCopyright = ""; INFOPLIST_OUTPUT_FORMAT = XML; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.AppleAccessibility-iOS"; PRODUCT_NAME = AppleAccessibility; @@ -556,7 +556,7 @@ SDKROOT = appletvos; SKIP_INSTALL = YES; SWIFT_EMIT_LOC_STRINGS = YES; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 15.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -580,7 +580,7 @@ SDKROOT = appletvos; SKIP_INSTALL = YES; SWIFT_EMIT_LOC_STRINGS = YES; - TVOS_DEPLOYMENT_TARGET = 9.0; + TVOS_DEPLOYMENT_TARGET = 15.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; diff --git a/plug-ins/Apple.Accessibility/Native/Accessibility.xcodeproj/xcshareddata/xcschemes/iOS - Debug.xcscheme b/plug-ins/Apple.Accessibility/Native/Accessibility.xcodeproj/xcshareddata/xcschemes/iOS - Debug.xcscheme index 4e90694a..c07a35a3 100644 --- a/plug-ins/Apple.Accessibility/Native/Accessibility.xcodeproj/xcshareddata/xcschemes/iOS - Debug.xcscheme +++ b/plug-ins/Apple.Accessibility/Native/Accessibility.xcodeproj/xcshareddata/xcschemes/iOS - Debug.xcscheme @@ -10,7 +10,7 @@ ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction"> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> #import +#import #import #import #import "AppleAccessibilitySafeOverride.h" @@ -364,6 +365,20 @@ APPLE_ACCESSIBILITY_EXTERN bool _UnityAX_UIAccessibilityIsOnOffSwitchLabelsEnabl } } +static AccessibilityNotificationDelegate __axIsAudioDescriptionEnabledDidChangeNotificationDelegate = NULL; +APPLE_ACCESSIBILITY_EXTERN void _UnityAX_registerAccessibilityIsAudioDescriptionEnabledDidChangeNotification(AccessibilityNotificationDelegate delegate) { __axIsAudioDescriptionEnabledDidChangeNotificationDelegate = delegate; } +APPLE_ACCESSIBILITY_EXTERN bool _UnityAX_UIAccessibilityIsAudioDescriptionEnabled(void) +{ + CFArrayRef characteristics = MAAudibleMediaCopyPreferredCharacteristics(); + if ( characteristics == NULL ) + { + return false; + } + bool enabled = CFArrayContainsValue(characteristics, CFRangeMake(0, CFArrayGetCount(characteristics)), MAMediaCharacteristicDescribesVideoForAccessibility); + CFRelease(characteristics); + return enabled; +} + APPLE_ACCESSIBILITY_HIDDEN @interface _AppleAccessibilityNotificationObserver: NSObject @@ -547,6 +562,14 @@ - (void)_accessibilityStatusChangedCallback:(NSNotification *)notification { return; } } + if ( [notification.name isEqualToString:(__bridge NSString *)kMAAudibleMediaSettingsChangedNotification] ) + { + if ( __axIsAudioDescriptionEnabledDidChangeNotificationDelegate != NULL ) + { + __axIsAudioDescriptionEnabledDidChangeNotificationDelegate(); + } + return; + } } @end @@ -600,6 +623,7 @@ APPLE_ACCESSIBILITY_EXTERN void _UnityAX_InitializeAXRuntime(void) { [center addObserver:_observer selector:@selector(_accessibilityStatusChangedCallback:) name:UIAccessibilityOnOffSwitchLabelsDidChangeNotification object:nil]; } + [center addObserver:_observer selector:@selector(_accessibilityStatusChangedCallback:) name:(__bridge NSString *)kMAAudibleMediaSettingsChangedNotification object:nil]; [AppleAccessibilityRuntime.sharedInstance setUnityAccessibilityFrame:^CGRect(NSNumber *identifier) { if ( __axFrameDelegate == NULL ) diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/.gitignore b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/.gitignore new file mode 100644 index 00000000..2d7733f9 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/.gitignore @@ -0,0 +1,11 @@ +.DS_Store +Library +Logs +obj +Temp +TutorialInfo +TutorialInfo.meta +UserSettings +*.sln +*.slnx +*.csproj diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets.meta new file mode 100644 index 00000000..0ebaca47 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5b9eb7592a57c493cb3b45a0e168d5d2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/CHANGELOG.md b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/CHANGELOG.md new file mode 100644 index 00000000..004777fc --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/CHANGELOG.md @@ -0,0 +1,9 @@ +# CHANGELOG +All notable changes to this project will be documented in this file. + +## [1.0.0] - 2026-06-10 +- Initial release. Exposes Apple's Background Assets framework to Unity developers, enabling + out-of-band delivery of asset packs from the App Store or from a self-hosted server via + `AssetPackManager`, `AssetPack`, and `AssetPackManifest`. +- The build step automatically configures the generated Xcode project with a Background Assets + downloader extension and the accompanying hosting configuration. diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/CHANGELOG.md.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/CHANGELOG.md.meta new file mode 100644 index 00000000..c5847e21 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 100006d47951453e8b003d72f9ed8441 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor.meta new file mode 100644 index 00000000..18b2422b --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b072840ce04094393a3af7f8fb225179 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/Apple.BackgroundAssets.asmdef b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/Apple.BackgroundAssets.asmdef new file mode 100644 index 00000000..ba8969b4 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/Apple.BackgroundAssets.asmdef @@ -0,0 +1,18 @@ +{ + "name": "Apple.BackgroundAssets.Editor", + "references": [ + "Apple.Core", + "Apple.Core.Editor" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/Apple.BackgroundAssets.asmdef.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/Apple.BackgroundAssets.asmdef.meta new file mode 100644 index 00000000..514b1ec2 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/Apple.BackgroundAssets.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4d28b7fa63cf3470a8e25053bf6422fa +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/AppleHostingConfiguration.cs b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/AppleHostingConfiguration.cs new file mode 100644 index 00000000..9bcb1448 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/AppleHostingConfiguration.cs @@ -0,0 +1,16 @@ +using UnityEditor.iOS.Xcode; +using UnityEngine; + +namespace Apple.BackgroundAssets { + + [CreateAssetMenu(menuName = "Apple/Background Assets/Apple Hosting Configuration")] + public class AppleHostingConfiguration: HostingConfiguration { + + public override void OnProcessInfoPlist(PlistDocument infoPlist) { + base.OnProcessInfoPlist(infoPlist); + infoPlist.root.SetBoolean(UsesAppleHostingKey, true); + } + + } + +} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/AppleHostingConfiguration.cs.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/AppleHostingConfiguration.cs.meta new file mode 100644 index 00000000..e936211e --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/AppleHostingConfiguration.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: bdf76f4caa64d4d6390f38f16d1a79c5 \ No newline at end of file diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/BuildStep.cs b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/BuildStep.cs new file mode 100644 index 00000000..207203f6 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/BuildStep.cs @@ -0,0 +1,204 @@ +using Apple.Core; +using System.IO; +using UnityEditor; +using UnityEditor.iOS.Xcode; +using UnityEngine; + +namespace Apple.BackgroundAssets { + + public class BuildStep: AppleBuildStep { + + public override string DisplayName => "Apple.BackgroundAssets"; + + public override BuildTarget[] SupportedTargets => new BuildTarget[] {BuildTarget.iOS, BuildTarget.tvOS, BuildTarget.StandaloneOSX, BuildTarget.VisionOS}; + + [Tooltip("Your app’s downloader extension’s bundle ID. It must have your main app’s bundle ID followed by a “.” character as a prefix.")] + public string DownloaderExtensionBundleId; + + [Tooltip("The ID of the app group that your app and its downloader extension share.")] + public string AppGroupId; + + [Tooltip("An object that provides information about where your asset packs are hosted and how large they are in aggregate.")] + public HostingConfiguration HostingConfiguration; + + const string AppGroupIdKey = "BAAppGroupID"; + + const string AppGroupsKey = "com.apple.security.application-groups"; + + const string AppSandboxKey = "com.apple.security.app-sandbox"; + + public void OnEnable() { + if (Application.identifier != null) { + this.DownloaderExtensionBundleId = Application.identifier + ".downloader"; + this.AppGroupId = "group." + Application.identifier; + } + } + + public override void OnProcessInfoPlist(AppleBuildProfile appleBuildProfile, BuildTarget buildTarget, string generatedProjectPath, PlistDocument infoPlist) { + infoPlist.root.SetString(AppGroupIdKey, this.AppGroupId); + this.HostingConfiguration.OnProcessInfoPlist(infoPlist); + } + + public override void OnProcessEntitlements(AppleBuildProfile appleBuildProfile, BuildTarget buildTarget, string generatedProjectPath, PlistDocument entitlements) { + PlistElementArray appGroups; + if (entitlements.root.values.ContainsKey(AppGroupsKey)) { + appGroups = entitlements.root[AppGroupsKey].AsArray(); + } else { + appGroups = entitlements.root.CreateArray(AppGroupsKey); + } + bool appIsAlreadyInAppGroup = false; + foreach (PlistElement appGroupElement in appGroups.values) { + if (appGroupElement is PlistElementString appGroupStringElement && appGroupStringElement.value == this.AppGroupId) { + appIsAlreadyInAppGroup = true; + break; + } + } + if (!appIsAlreadyInAppGroup) { + appGroups.AddString(this.AppGroupId); + } + } + + public override void OnProcessFrameworks(AppleBuildProfile appleBuildProfile, BuildTarget buildTarget, string generatedProjectPath, PBXProject pbxProject) { + // Background Assets requires that an app include a downloader extension that handles background asset downloads. The following code automatically creates and configures a downloader-extension target in the generated Xcode project. + string mainTargetGuid = + buildTarget == BuildTarget.StandaloneOSX + ? pbxProject.TargetGuidByName(Application.productName) + : pbxProject.GetUnityMainTargetGuid(); + string downloaderTargetGuid = pbxProject.TargetGuidByName("Downloader"); + if (downloaderTargetGuid == null) { + downloaderTargetGuid = pbxProject.AddTarget("Downloader", "appex", "com.apple.product-type.app-extension"); + PlistDocument downloaderInfoPlist = new PlistDocument(); + downloaderInfoPlist.root.SetString("CFBundleDisplayName", "$(PRODUCT_NAME)"); + downloaderInfoPlist.root.SetString("CFBundleExecutable", "$(EXECUTABLE_NAME)"); + downloaderInfoPlist.root.SetString("CFBundleIdentifier", "$(PRODUCT_BUNDLE_IDENTIFIER)"); + downloaderInfoPlist.root.SetString("CFBundleName", "$(PRODUCT_NAME)"); + downloaderInfoPlist.root.SetString("CFBundleVersion", PlayerSettings.iOS.buildNumber); + downloaderInfoPlist.root.SetString("CFBundleShortVersionString", PlayerSettings.bundleVersion); + PlistElementDict downloaderExtensionAttributes = downloaderInfoPlist.root.CreateDict("EXAppExtensionAttributes"); + downloaderExtensionAttributes.SetString("EXExtensionPointIdentifier", "com.apple.background-asset-downloader-extension"); + string fullDownloaderDirectoryPath = Path.Combine(generatedProjectPath, "Downloader"); + if (!Directory.Exists(fullDownloaderDirectoryPath)) { + Directory.CreateDirectory(fullDownloaderDirectoryPath); + } + string fullDownloaderInfoPlistPath = Path.Combine(fullDownloaderDirectoryPath, "Info.plist"); + downloaderInfoPlist.WriteToFile(fullDownloaderInfoPlistPath); + pbxProject.AddBuildProperty(downloaderTargetGuid, "CODE_SIGN_ENTITLEMENTS", "Downloader/Downloader.entitlements"); + pbxProject.AddBuildProperty(downloaderTargetGuid, "CODE_SIGN_STYLE", "Automatic"); + pbxProject.AddBuildProperty(downloaderTargetGuid, "INFOPLIST_FILE", "Downloader/Info.plist"); + pbxProject.AddBuildProperty(downloaderTargetGuid, "PRODUCT_BUNDLE_IDENTIFIER", this.DownloaderExtensionBundleId); + pbxProject.AddBuildProperty(downloaderTargetGuid, "PRODUCT_NAME", "Downloader"); + pbxProject.AddBuildProperty(downloaderTargetGuid, "SWIFT_VERSION", "6.0"); + switch (buildTarget) { + case BuildTarget.iOS: + pbxProject.AddBuildProperty(downloaderTargetGuid, "IPHONEOS_DEPLOYMENT_TARGET", PlayerSettings.iOS.targetOSVersionString); + break; + case BuildTarget.StandaloneOSX: + pbxProject.AddBuildProperty(downloaderTargetGuid, "MACOSX_DEPLOYMENT_TARGET", PlayerSettings.macOS.targetOSVersion); + break; + case BuildTarget.tvOS: + pbxProject.AddBuildProperty(downloaderTargetGuid, "TVOS_DEPLOYMENT_TARGET", PlayerSettings.tvOS.targetOSVersionString); + break; + case BuildTarget.VisionOS: + pbxProject.AddBuildProperty(downloaderTargetGuid, "XROS_DEPLOYMENT_TARGET", PlayerSettings.VisionOS.targetOSVersionString); + break; + } + pbxProject.AddFolderReference(fullDownloaderDirectoryPath, "Downloader"); + pbxProject.AddSourcesBuildPhase(downloaderTargetGuid); + string fullBackgroundDownloadHandlerPath = Path.Combine(fullDownloaderDirectoryPath, "BackgroundDownloadHandler.swift"); + string backgroundDownloadHandlerCode = ""; + if (this.HostingConfiguration is AppleHostingConfiguration) { + backgroundDownloadHandlerCode = @" +import ExtensionFoundation +import StoreKit + +@main +struct BackgroundDownloadHandler: StoreDownloaderExtension { } +"; + } else if (this.HostingConfiguration is SelfHostingConfiguration) { + backgroundDownloadHandlerCode += @" +import BackgroundAssets +import ExtensionFoundation + +@main +struct BackgroundDownloadHandler: ManagedDownloaderExtension { } +"; + } + File.WriteAllText(fullBackgroundDownloadHandlerPath, backgroundDownloadHandlerCode); + string backgroundDownloadHandlerGuid = pbxProject.AddFile(fullBackgroundDownloadHandlerPath, "BackgroundDownloadHandler.swift"); + pbxProject.AddFileToBuild(downloaderTargetGuid, backgroundDownloadHandlerGuid); + string embedExtensionKitExtensionsBuildPhaseGuid = pbxProject.AddCopyFilesBuildPhase(mainTargetGuid, "Embed ExtensionKit Extensions", "$(EXTENSIONS_FOLDER_PATH)", "16"); + string downloaderProductGuid = pbxProject.FindFileGuidByProjectPath("Products/Downloader.appex"); + pbxProject.AddFileToBuildSection(mainTargetGuid, embedExtensionKitExtensionsBuildPhaseGuid, downloaderProductGuid); + AppleNativeLibraryUtility.ProcessWrapperLibrary(this.DisplayName, buildTarget, generatedProjectPath, pbxProject); + AppleNativeLibraryUtility.AddPlatformFrameworkDependency("BackgroundAssets.framework", false, buildTarget, pbxProject); + } else { + string[] downloaderInfoPlistPaths = pbxProject.GetBuildPropertyForAnyConfig(downloaderTargetGuid, "INFOPLIST_FILE").Split(' '); + foreach (string downloaderInfoPlistPath in downloaderInfoPlistPaths) { + string fullDownloaderInfoPlistPath = Path.Combine(generatedProjectPath, downloaderInfoPlistPath); + PlistDocument downloaderInfoPlist = new PlistDocument(); + downloaderInfoPlist.ReadFromFile(fullDownloaderInfoPlistPath); + downloaderInfoPlist.root.SetString("CFBundleVersion", PlayerSettings.iOS.buildNumber); + downloaderInfoPlist.root.SetString("CFBundleShortVersionString", PlayerSettings.bundleVersion); + downloaderInfoPlist.WriteToFile(fullDownloaderInfoPlistPath); + } + pbxProject.SetBuildProperty(downloaderTargetGuid, "PRODUCT_BUNDLE_IDENTIFIER", this.DownloaderExtensionBundleId); + switch (buildTarget) { + case BuildTarget.iOS: + pbxProject.SetBuildProperty(downloaderTargetGuid, "IPHONEOS_DEPLOYMENT_TARGET", PlayerSettings.iOS.targetOSVersionString); + break; + case BuildTarget.StandaloneOSX: + pbxProject.SetBuildProperty(downloaderTargetGuid, "MACOSX_DEPLOYMENT_TARGET", PlayerSettings.macOS.targetOSVersion); + break; + case BuildTarget.tvOS: + pbxProject.SetBuildProperty(downloaderTargetGuid, "TVOS_DEPLOYMENT_TARGET", PlayerSettings.tvOS.targetOSVersionString); + break; + case BuildTarget.VisionOS: + pbxProject.SetBuildProperty(downloaderTargetGuid, "XROS_DEPLOYMENT_TARGET", PlayerSettings.VisionOS.targetOSVersionString); + break; + } + } + string downloaderEntitlementsPath = pbxProject.GetEntitlementFilePathForTarget(downloaderTargetGuid); + string fullDownloaderEntitlementsPath = Path.Combine(generatedProjectPath, downloaderEntitlementsPath); + PlistDocument downloaderEntitlements = new PlistDocument(); + if (File.Exists(fullDownloaderEntitlementsPath)) { + downloaderEntitlements.ReadFromFile(fullDownloaderEntitlementsPath); + } + PlistElementArray downloaderAppGroups; + if (downloaderEntitlements.root.values.ContainsKey(AppGroupsKey)) { + downloaderAppGroups = downloaderEntitlements.root[AppGroupsKey].AsArray(); + } else { + downloaderAppGroups = downloaderEntitlements.root.CreateArray(AppGroupsKey); + } + bool downloaderIsAlreadyInAppGroup = false; + foreach (PlistElement appGroupElement in downloaderAppGroups.values) { + if (appGroupElement is PlistElementString appGroupStringElement && appGroupStringElement.value == this.AppGroupId) { + downloaderIsAlreadyInAppGroup = true; + break; + } + } + if (!downloaderIsAlreadyInAppGroup) { + downloaderAppGroups.AddString(this.AppGroupId); + } + if (!downloaderEntitlements.root.values.ContainsKey(AppSandboxKey)) { + downloaderEntitlements.root.SetBoolean(AppSandboxKey, true); + } + downloaderEntitlements.WriteToFile(fullDownloaderEntitlementsPath); + + // This is a hack to work around the fact that Unity’s property-list API doesn’t support integer values that are greater than the maximum 32-bit signed integer. + string[] mainInfoPlistPaths = pbxProject.GetBuildPropertyForAnyConfig(mainTargetGuid, "INFOPLIST_FILE").Split(' '); + foreach (string mainInfoPlistPath in mainInfoPlistPaths) { + string fullMainInfoPlistPath = Path.Combine(generatedProjectPath, mainInfoPlistPath); + if (!File.Exists(fullMainInfoPlistPath)) { + continue; + } + string mainInfoPlistString = File.ReadAllText(fullMainInfoPlistPath); + foreach ((string Old, string New) replacement in this.HostingConfiguration.InfoPlistReplacements) { + mainInfoPlistString = mainInfoPlistString.Replace(replacement.Old, replacement.New); + } + File.WriteAllText(fullMainInfoPlistPath, mainInfoPlistString); + } + } + + } + +} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/BuildStep.cs.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/BuildStep.cs.meta new file mode 100644 index 00000000..9a2437a7 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/BuildStep.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5e40d2626eebc4a30b8e9a5f93cd94c4 \ No newline at end of file diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/HostingConfiguration.cs b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/HostingConfiguration.cs new file mode 100644 index 00000000..dc7f7453 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/HostingConfiguration.cs @@ -0,0 +1,20 @@ +using UnityEditor.iOS.Xcode; +using UnityEngine; + +namespace Apple.BackgroundAssets { + + public abstract class HostingConfiguration: ScriptableObject { + + internal virtual (string Old, string New)[] InfoPlistReplacements => new (string, string)[0]; + + const string HasManagedAssetPacksKey = "BAHasManagedAssetPacks"; + + protected const string UsesAppleHostingKey = "BAUsesAppleHosting"; + + public virtual void OnProcessInfoPlist(PlistDocument infoPlist) { + infoPlist.root.SetBoolean(HasManagedAssetPacksKey, true); + } + + } + +} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/HostingConfiguration.cs.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/HostingConfiguration.cs.meta new file mode 100644 index 00000000..654a03ca --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/HostingConfiguration.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ad98f708d6c25467ebbe44d95c9462b4 \ No newline at end of file diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/SelfHostingConfiguration.cs b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/SelfHostingConfiguration.cs new file mode 100644 index 00000000..dc18952a --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/SelfHostingConfiguration.cs @@ -0,0 +1,84 @@ +using System.Collections.Generic; +using System.Linq; +using UnityEditor.iOS.Xcode; +using UnityEngine; + +namespace Apple.BackgroundAssets { + + [CreateAssetMenu(menuName = "Apple/Background Assets/Self Hosting Configuration")] + public class SelfHostingConfiguration: HostingConfiguration { + + [Tooltip("The URL of your app’s manifest of asset packs that are available to download from your server.")] + public string ManifestUrl; + + [Tooltip("The domains, including wildcards, from which your app can download asset packs.")] + public List DownloadDomainAllowList; + + [Tooltip("The combined, maximum download size in bytes of asset packs with prefetch download policies that your app can download.")] + public ulong DownloadAllowance; + + [Tooltip("The combined, maximum download size in bytes of asset packs with essential download policies that your app can download.")] + public ulong EssentialDownloadAllowance; + + [Tooltip("The combined, maximum installation size in bytes of asset packs with prefetch download policies that your app can download.")] + public ulong MaxInstallSize; + + [Tooltip("The combined, maximum installation size in bytes of asset packs with essential download policies that your app can download.")] + public ulong EssentialMaxInstallSize; + + internal override (string Old, string New)[] InfoPlistReplacements => this.InfoPlistSentinelReplacements.Select(pair => ($"{pair.Sentinel}", $"{pair.Real}")).ToArray(); + + internal List<(int Sentinel, ulong Real)> InfoPlistSentinelReplacements = new List<(int, ulong)>(); + + const string ManifestUrlKey = "BAManifestURL"; + + const string InitialDownloadRestrictionsKey = "BAInitialDownloadRestrictions"; + + const string DownloadDomainAllowListKey = "BADownloadDomainAllowList"; + + const string DownloadAllowanceKey = "BADownloadAllowance"; + + const string EssentialDownloadAllowanceKey = "BAEssentialDownloadAllowance"; + + const string MaxInstallSizeKey = "BAMaxInstallSize"; + + const string EssentialMaxInstallSizeKey = "BAEssentialMaxInstallSize"; + + public override void OnProcessInfoPlist(PlistDocument infoPlist) { + base.OnProcessInfoPlist(infoPlist); + infoPlist.root.SetBoolean(UsesAppleHostingKey, false); + infoPlist.root.SetString(ManifestUrlKey, this.ManifestUrl); + PlistElementDict initialDownloadRestrictions = infoPlist.root.CreateDict(InitialDownloadRestrictionsKey); + PlistElementArray downloadDomainAllowList = initialDownloadRestrictions.CreateArray(DownloadDomainAllowListKey); + foreach (string downloadDomain in this.DownloadDomainAllowList) { + bool downloadDomainIsAlreadyInAllowList = false; + foreach (PlistElement downloadDomainElement in downloadDomainAllowList.values) { + if (downloadDomainElement is PlistElementString downloadDomainStringElement && downloadDomainStringElement.value == downloadDomain) { + downloadDomainIsAlreadyInAllowList = true; + break; + } + } + if (!downloadDomainIsAlreadyInAllowList) { + downloadDomainAllowList.AddString(downloadDomain); + } + } + int downloadAllowanceSentinel, essentialDownloadAllowanceSentinel, maxInstallSizeSentinel, essentialMaxInstallSizeSentinel; + do { + downloadAllowanceSentinel = Random.Range(1_000_000_000, int.MaxValue); + essentialDownloadAllowanceSentinel = Random.Range(1_000_000_000, int.MaxValue); + maxInstallSizeSentinel = Random.Range(1_000_000_000, int.MaxValue); + essentialMaxInstallSizeSentinel = Random.Range(1_000_000_000, int.MaxValue); + } while ((new HashSet(new int[] { downloadAllowanceSentinel, essentialDownloadAllowanceSentinel, maxInstallSizeSentinel, essentialMaxInstallSizeSentinel })).Count < 4); + initialDownloadRestrictions.SetInteger(DownloadAllowanceKey, downloadAllowanceSentinel); + initialDownloadRestrictions.SetInteger(EssentialDownloadAllowanceKey, essentialDownloadAllowanceSentinel); + infoPlist.root.SetInteger(MaxInstallSizeKey, maxInstallSizeSentinel); + infoPlist.root.SetInteger(EssentialMaxInstallSizeKey, essentialMaxInstallSizeSentinel); + this.InfoPlistSentinelReplacements.Add((downloadAllowanceSentinel, this.DownloadAllowance)); + this.InfoPlistSentinelReplacements.Add((essentialDownloadAllowanceSentinel, this.EssentialDownloadAllowance)); + this.InfoPlistSentinelReplacements.Add((maxInstallSizeSentinel, this.MaxInstallSize)); + this.InfoPlistSentinelReplacements.Add((essentialMaxInstallSizeSentinel, this.EssentialMaxInstallSize)); + } + + } + +} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/SelfHostingConfiguration.cs.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/SelfHostingConfiguration.cs.meta new file mode 100644 index 00000000..7787a9ab --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Editor/SelfHostingConfiguration.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 9b2a9759bc3cb4c8ab4819d23b005d66 \ No newline at end of file diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime.meta new file mode 100644 index 00000000..9b287d94 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6b767cbd186c74780989866a8f26199a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Apple.BackgroundAssets.asmdef b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Apple.BackgroundAssets.asmdef new file mode 100644 index 00000000..8cd3edfd --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Apple.BackgroundAssets.asmdef @@ -0,0 +1,22 @@ +{ + "name": "Apple.BackgroundAssets", + "rootNamespace": "", + "references": [ + "Apple.Core" + ], + "includePlatforms": [ + "Editor", + "iOS", + "macOSStandalone", + "tvOS", + "VisionOS" + ], + "excludePlatforms": [], + "allowUnsafeCode": true, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Apple.BackgroundAssets.asmdef.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Apple.BackgroundAssets.asmdef.meta new file mode 100644 index 00000000..1cda8fde --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Apple.BackgroundAssets.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5a89ffc3c409247ab8a4ff4240bdad8d +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/AssetPack.cs b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/AssetPack.cs new file mode 100644 index 00000000..1c313ba3 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/AssetPack.cs @@ -0,0 +1,147 @@ +using System; +using System.Runtime.InteropServices; + +namespace Apple.BackgroundAssets { + + /// An archive of assets that the system downloads together. + public class AssetPack { + + /// The status of an asset pack. + public class Status { + + [StructLayout(LayoutKind.Explicit)] + internal struct baw_assetpack_status_res { + + [FieldOffset(0)] + internal byte success; + + [FieldOffset(0)] + internal Error.baw_err failure; + + } + + byte RawValue; + + internal Status() { + this.RawValue = 0; + } + + internal Status(byte rawValue) { + this.RawValue = rawValue; + } + + /// Returns whether this status object indicates that the asset pack is available to download. + /// Whether the asset pack is available to download. + public bool IsDownloadAvailable() { + return (this.RawValue & 0b0000001) > 0; + } + + /// Returns whether this status object indicates that an update to the asset pack is available to download. + /// Whether an update is available to download. + public bool IsUpdateAvailable() { + return (this.RawValue & 0b0000010) > 0; + } + + /// Returns whether this status object indicates that the downloaded asset pack is up to date. + /// Whether the asset pack is up to date. + public bool IsUpToDate() { + return (this.RawValue & 0b0000100) > 0; + } + + /// + /// Returns whether this status object indicates that the downloaded asset pack is out of date. + /// + /// A return value of true doesn’t necessarily imply that an update to the asset pack can be downloaded over the current network connection. Call IsUpdateAvailable() to determine whether an update can currently be downloaded. + /// + /// Whether the asset pack is out of date. + public bool IsOutOfDate() { + return (this.RawValue & 0b0001000) > 0; + } + + /// + /// Returns whether this status object indicates that the asset pack is no longer available to download. + /// + /// Obsolete asset packs can’t be updated, and they also can’t be redownloaded once removed. + /// + /// Whether the asset pack is obsolete. + public bool IsObsolete() { + return (this.RawValue & 0b0010000) > 0; + } + + /// Returns whether this status object indicates that the system is currently downloading the asset pack. + /// Whether the asset pack is being downloaded. + public bool IsDownloading() { + return (this.RawValue & 0b0100000) > 0; + } + + /// Returns whether this status object indicates that the system finished downloading the asset pack. + /// Whether the asset pack is downloaded. + public bool IsDownloaded() { + return (this.RawValue & 0b1000000) > 0; + } + + } + + [StructLayout(LayoutKind.Sequential)] + internal struct baw_assetpack { + + IntPtr impl; + + } + + [DllImport(InteropUtility.DllName)] + static extern void baw_assetpack_deinit(baw_assetpack assetpack); + + [DllImport(InteropUtility.DllName)] + static extern string baw_assetpack_id(baw_assetpack assetpack); + + [DllImport(InteropUtility.DllName)] + static extern ulong baw_assetpack_downloadsize(baw_assetpack assetpack); + + [DllImport(InteropUtility.DllName)] + static extern ushort baw_assetpack_version(baw_assetpack assetpack); + + [DllImport(InteropUtility.DllName)] + static extern Language.baw_lang baw_assetpack_lang(baw_assetpack assetpack); + + internal baw_assetpack CAssetPack; + + internal AssetPack(baw_assetpack cAssetPack) { + this.CAssetPack = cAssetPack; + } + + ~AssetPack() { + baw_assetpack_deinit(this.CAssetPack); + } + + /// Returns a unique ID for this asset pack. + /// The ID. + public string GetId() { + return baw_assetpack_id(this.CAssetPack); + } + + /// + /// Returns the size of the download file containing this asset pack in bytes. + /// + /// This is different than the installation size, which could be larger. + /// + /// The download size. + public long GetDownloadSize() { + return (long) baw_assetpack_downloadsize(this.CAssetPack); + } + + /// Returns this asset pack’s version number. + /// The version number. + public ushort GetVersion() { + return baw_assetpack_version(this.CAssetPack); + } + + /// Returns the language for which this asset pack is localized. + /// The language. + public Language GetLanguage() { + return new Language(baw_assetpack_lang(this.CAssetPack)); + } + + } + +} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/AssetPack.cs.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/AssetPack.cs.meta new file mode 100644 index 00000000..1c55d18f --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/AssetPack.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 07af9e94b8d9a4f879035bb7916fa062 \ No newline at end of file diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/AssetPackManager.cs b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/AssetPackManager.cs new file mode 100644 index 00000000..4482f2dc --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/AssetPackManager.cs @@ -0,0 +1,1064 @@ +using AOT; +using Microsoft.Win32.SafeHandles; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Threading; +using System.Threading.Tasks; + +namespace Apple.BackgroundAssets { + + /// + /// A class that manages asset packs. + /// + /// The first time that your code refers to the manager, Background Assets considers that your app is opting into automatic system management of your asset packs. + /// + public static class AssetPackManager { + + #nullable enable + + enum baw_assetpackmanager_downloadstatusupdate_kind { + baw_assetpackmanager_downloadstatusupdate_kind_began, + baw_assetpackmanager_downloadstatusupdate_kind_paused, + baw_assetpackmanager_downloadstatusupdate_kind_downloading, + baw_assetpackmanager_downloadstatusupdate_kind_finished, + baw_assetpackmanager_downloadstatusupdate_kind_failed + } + + [StructLayout(LayoutKind.Sequential)] + struct baw_assetpackmanager_downloadstatusupdate { + + [StructLayout(LayoutKind.Explicit)] + internal struct __Unnamed_union_payload { + + [FieldOffset(0)] + internal double progress; + + [FieldOffset(0)] + internal Error.baw_err err; + + } + + internal baw_assetpackmanager_downloadstatusupdate_kind kind; + + internal AssetPack.baw_assetpack assetpack; + + internal __Unnamed_union_payload payload; + + } + + [StructLayout(LayoutKind.Explicit)] + struct baw_assetpackmanager_assetpack_update_res { + + [StructLayout(LayoutKind.Sequential)] + internal struct __Unnamed_struct_success { + + internal long updatingc; + + internal unsafe IntPtr* updatingv; + + internal long removedc; + + internal unsafe IntPtr* removedv; + + } + + [FieldOffset(0)] + internal __Unnamed_struct_success success; + + [FieldOffset(0)] + internal Error.baw_err failure; + + } + + /// The status of an asset-pack download. + public abstract class DownloadStatusUpdate { + + /// A status update that indicates that the download began or resumed after being paused. + public class Began : DownloadStatusUpdate { + + internal Began(AssetPack assetPack) : base(assetPack) { } + + public override string ToString() { + return $"{this.AssetPack.GetId()}: Began"; + } + + } + + /// A status update that indicates that the download paused. + public class Paused : DownloadStatusUpdate { + + internal Paused(AssetPack assetPack) : base(assetPack) { } + + public override string ToString() { + return $"{this.AssetPack.GetId()}: Paused"; + } + + } + + /// A status update that indicates that the download is in progress. + public class Downloading : DownloadStatusUpdate { + + /// The download progress, represented as a portion between 0 and 1 (inclusive). + public readonly double Progress; + + internal Downloading(AssetPack assetPack, double progress) : base(assetPack) { + this.Progress = progress; + } + + public override string ToString() { + return $"{this.AssetPack.GetId()}: Downloading ({this.Progress})"; + } + + } + + /// A status update that indicates that the download completed and that the asset pack is available locally. + public class Finished : DownloadStatusUpdate { + + internal override bool IsTerminal { + get { + return true; + } + } + + internal Finished(AssetPack assetPack) : base(assetPack) { } + + public override string ToString() { + return $"{this.AssetPack.GetId()}: Finished"; + } + + } + + /// A status update that indicates that the download failed. + public class Failed : DownloadStatusUpdate { + + /// An error that indicates why the download failed. + public readonly Error Error; + + internal override bool IsTerminal { + get { + return true; + } + } + + internal Failed(AssetPack assetPack, Error error) : base(assetPack) { + this.Error = error; + } + + public override string ToString() { + return $"{this.AssetPack.GetId()}: Failed ({this.Error})"; + } + + } + + /// The asset pack to which this status update pertains. + public readonly AssetPack AssetPack; + + internal virtual bool IsTerminal { + get { + return false; + } + } + + DownloadStatusUpdate(AssetPack assetPack) { + this.AssetPack = assetPack; + } + + } + + [StructLayout(LayoutKind.Sequential)] + struct DownloadStatusUpdatesContext { + + [MarshalAs(UnmanagedType.IUnknown)] + object LockObject; + + [MarshalAs(UnmanagedType.IUnknown)] + object? StatusUpdate; + + [MarshalAs(UnmanagedType.IUnknown)] + object Semaphore; + + [MarshalAs(UnmanagedType.IUnknown)] + object? AssetPackId; + + internal DownloadStatusUpdatesContext(string? assetPackId) { + this.LockObject = new object(); + this.StatusUpdate = null; + this.Semaphore = new SemaphoreSlim(0); + this.AssetPackId = assetPackId; + } + + internal object GetLockObject() { + return this.LockObject; + } + + internal DownloadStatusUpdate? GetStatusUpdate() { + return (DownloadStatusUpdate?) this.StatusUpdate; + } + + internal void SetStatusUpdate(DownloadStatusUpdate statusUpdate) { + this.StatusUpdate = statusUpdate; + } + + internal SemaphoreSlim GetSemaphore() { + return (SemaphoreSlim) this.Semaphore; + } + + internal void ResetSemaphore() { + this.Semaphore = new SemaphoreSlim(0); + } + + internal string? GetAssetPackId() { + return (string?) this.AssetPackId; + } + + } + + [StructLayout(LayoutKind.Sequential)] + struct ManifestContext { + + [MarshalAs(UnmanagedType.IUnknown)] + object Result; + + [MarshalAs(UnmanagedType.IUnknown)] + object Semaphore; + + internal static ManifestContext Create() { + return new ManifestContext { + Semaphore = new SemaphoreSlim(0) + }; + } + + internal Result GetResult() { + return (Result) this.Result; + } + + internal void SetResult(Result result) { + this.Result = result; + } + + internal SemaphoreSlim GetSemaphore() { + return (SemaphoreSlim) this.Semaphore; + } + + } + + [StructLayout(LayoutKind.Sequential)] + struct AssetPackStatusContext { + + [MarshalAs(UnmanagedType.IUnknown)] + object Result; + + [MarshalAs(UnmanagedType.IUnknown)] + object Semaphore; + + internal static AssetPackStatusContext Create() { + return new AssetPackStatusContext { + Semaphore = new SemaphoreSlim(0) + }; + } + + internal Result GetResult() { + return (Result) this.Result; + } + + internal void SetResult(Result result) { + this.Result = result; + } + + internal SemaphoreSlim GetSemaphore() { + return (SemaphoreSlim) this.Semaphore; + } + + } + + [StructLayout(LayoutKind.Sequential)] + struct LocalAssetPackStatusContext { + + [MarshalAs(UnmanagedType.IUnknown)] + object Status; + + [MarshalAs(UnmanagedType.IUnknown)] + object Semaphore; + + internal static LocalAssetPackStatusContext Create() { + return new LocalAssetPackStatusContext { + Semaphore = new SemaphoreSlim(0) + }; + } + + internal AssetPack.Status GetStatus() { + return (AssetPack.Status) this.Status; + } + + internal void SetStatus(AssetPack.Status status) { + this.Status = status; + } + + internal SemaphoreSlim GetSemaphore() { + return (SemaphoreSlim) this.Semaphore; + } + + } + + [StructLayout(LayoutKind.Sequential)] + struct EnsureLocalAvailabilityContext { + + [MarshalAs(UnmanagedType.IUnknown)] + object? Error; + + [MarshalAs(UnmanagedType.IUnknown)] + object Semaphore; + + internal static EnsureLocalAvailabilityContext Create() { + return new EnsureLocalAvailabilityContext { + Error = null, + Semaphore = new SemaphoreSlim(0) + }; + } + + internal Error? GetError() { + return (Error?) this.Error; + } + + internal void SetError(Error error) { + this.Error = error; + } + + internal SemaphoreSlim GetSemaphore() { + return (SemaphoreSlim) this.Semaphore; + } + + } + + [StructLayout(LayoutKind.Sequential)] + struct CheckForUpdatesContext { + + [MarshalAs(UnmanagedType.IUnknown)] + object Result; + + [MarshalAs(UnmanagedType.IUnknown)] + object Semaphore; + + internal static CheckForUpdatesContext Create() { + return new CheckForUpdatesContext { + Semaphore = new SemaphoreSlim(0) + }; + } + + internal Result<(string[], string[]), Error> GetResult() { + return (Result<(string[], string[]), Error>) this.Result; + } + + internal void SetResult(Result<(string[], string[]), Error> result) { + this.Result = result; + } + + internal SemaphoreSlim GetSemaphore() { + return (SemaphoreSlim) this.Semaphore; + } + + } + + [StructLayout(LayoutKind.Sequential)] + struct RemoveAssetPackContext { + + [MarshalAs(UnmanagedType.IUnknown)] + object? Error; + + [MarshalAs(UnmanagedType.IUnknown)] + object Semaphore; + + internal static RemoveAssetPackContext Create() { + return new RemoveAssetPackContext { + Error = null, + Semaphore = new SemaphoreSlim(0) + }; + } + + internal Error? GetError() { + return (Error?) this.Error; + } + + internal void SetError(Error error) { + this.Error = error; + } + + internal SemaphoreSlim GetSemaphore() { + return (SemaphoreSlim) this.Semaphore; + } + + } + + [StructLayout(LayoutKind.Sequential)] + struct LocallyAvailableLanguagesContext { + + [MarshalAs(UnmanagedType.IUnknown)] + object Languages; + + [MarshalAs(UnmanagedType.IUnknown)] + object Semaphore; + + internal static LocallyAvailableLanguagesContext Create() { + return new LocallyAvailableLanguagesContext { + Semaphore = new SemaphoreSlim(0) + }; + } + + internal Language[] GetLanguages() { + return (Language[]) this.Languages; + } + + internal void SetLanguages(Language[] languages) { + this.Languages = languages; + } + + internal SemaphoreSlim GetSemaphore() { + return (SemaphoreSlim) this.Semaphore; + } + + } + + [StructLayout(LayoutKind.Sequential)] + struct ReconcilePreferredLanguagesContext { + + [MarshalAs(UnmanagedType.IUnknown)] + object? Error; + + [MarshalAs(UnmanagedType.IUnknown)] + object Semaphore; + + internal static ReconcilePreferredLanguagesContext Create() { + return new ReconcilePreferredLanguagesContext { + Error = null, + Semaphore = new SemaphoreSlim(0) + }; + } + + internal Error? GetError() { + return (Error?) this.Error; + } + + internal void SetError(Error error) { + this.Error = error; + } + + internal SemaphoreSlim GetSemaphore() { + return (SemaphoreSlim) this.Semaphore; + } + + } + + [DllImport(InteropUtility.DllName)] + static extern void baw_assetpackmanager_downloadstatusupdates(string? id, IntPtr ctx, FDownloadStatusUpdates cb); + + [DllImport(InteropUtility.DllName)] + static extern void baw_assetpackmanager_manifest(IntPtr ctx, FManifest cb); + + [DllImport(InteropUtility.DllName)] + static extern void baw_assetpackmanager_assetpack_status(AssetPack.baw_assetpack assetpack, IntPtr ctx, FAssetPackStatus cb); + + [DllImport(InteropUtility.DllName)] + static extern void baw_assetpackmanager_assetpack_status_local(string id, IntPtr ctx, FAssetPackStatusLocal cb); + + [DllImport(InteropUtility.DllName)] + [return: MarshalAs(UnmanagedType.I1)] + static extern bool baw_assetpackmanager_assetpack_local(string id); + + [DllImport(InteropUtility.DllName)] + static extern void baw_assetpackmanager_assetpack_local_ensure(AssetPack.baw_assetpack assetpack, IntPtr ctx, FAssetPackLocalEnsure cb); + + [DllImport(InteropUtility.DllName)] + static extern void baw_assetpackmanager_assetpack_local_ensure_update(AssetPack.baw_assetpack assetpack, bool update, IntPtr ctx, FAssetPackLocalEnsure cb); + + [DllImport(InteropUtility.DllName)] + static extern void baw_assetpackmanager_assetpack_local_ensure_updatev(int assetpackc, AssetPack.baw_assetpack[] assetpackv, bool update, IntPtr ctx, FAssetPackLocalEnsure cb); + + [DllImport(InteropUtility.DllName)] + static extern void baw_assetpackmanager_assetpack_update(IntPtr ctx, FAssetPackUpdate cb); + + [DllImport(InteropUtility.DllName)] + static extern void baw_assetpackmanager_assetpack_remove(string id, IntPtr ctx, FAssetPackRemove cb); + + [DllImport(InteropUtility.DllName)] + static extern Language.baw_lang baw_assetpackmanager_lang_resolved(); + + [DllImport(InteropUtility.DllName)] + static extern void baw_assetpackmanager_lang_resolved_set(Language.baw_lang lang); + + [DllImport(InteropUtility.DllName)] + static extern void baw_assetpackmanager_lang_local(IntPtr ctx, FLangLocal cb); + + [DllImport(InteropUtility.DllName)] + static extern void baw_assetpackmanager_lang_reconcile(IntPtr ctx, FLangReconcile cb); + + [DllImport(InteropUtility.DllName)] + static extern int baw_assetpackmanager_open(string path, string? id, out Error.baw_err err); + + [DllImport(InteropUtility.DllName)] + static extern int baw_assetpackmanager_open_lang(string path, Language.baw_lang lang, out Error.baw_err err); + + [DllImport(InteropUtility.DllName)] + static extern IntPtr baw_assetpackmanager_url(string path, out Error.baw_err err); + + [DllImport(InteropUtility.DllName)] + static extern IntPtr baw_assetpackmanager_url_lang(string path, Language.baw_lang lang, out Error.baw_err err); + + [DllImport(InteropUtility.DllName)] + static extern void baw_assetpackmanager_url_deinit(IntPtr url); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + delegate void FDownloadStatusUpdates(baw_assetpackmanager_downloadstatusupdate downloadstatusupdate, IntPtr ctx); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + delegate void FManifest(AssetPackManifest.baw_assetpackmanifest_res res, Result.baw_res_kind res_kind, IntPtr ctx); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + delegate void FAssetPackStatus(AssetPack.Status.baw_assetpack_status_res res, Result.baw_res_kind res_kind, IntPtr ctx); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + delegate void FAssetPackStatusLocal(byte status, IntPtr ctx); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + delegate void FAssetPackLocalEnsure(Error.baw_err err, Result.baw_res_kind res_kind, IntPtr ctx); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + delegate void FAssetPackUpdate(baw_assetpackmanager_assetpack_update_res res, Result.baw_res_kind res_kind, IntPtr ctx); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + delegate void FAssetPackRemove(Error.baw_err err, Result.baw_res_kind res_kind, IntPtr ctx); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + unsafe delegate void FLangLocal(long langc, Language.baw_lang* langv, IntPtr ctx); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + delegate void FLangReconcile(Error.baw_err err, Result.baw_res_kind res_kind, IntPtr ctx); + + /// Returns an asynchronous sequence of download-status updates for all asset packs. + /// An asynchronous sequence of download-status updates. + public static async IAsyncEnumerable DownloadStatusUpdatesAsync() { + DownloadStatusUpdatesContext context = new DownloadStatusUpdatesContext(null); + int contextSize = Marshal.SizeOf(context); + IntPtr contextPointer = Marshal.AllocHGlobal(contextSize); + Marshal.StructureToPtr(context, contextPointer, false); + baw_assetpackmanager_downloadstatusupdates(null, contextPointer, DownloadStatusUpdatesCallback); + while (true) { + await context.GetSemaphore().WaitAsync(); + lock (context.GetLockObject()) { + context = Marshal.PtrToStructure(contextPointer); + if (context.GetStatusUpdate() is DownloadStatusUpdate statusUpdate) { + yield return statusUpdate; + } + context.ResetSemaphore(); + Marshal.StructureToPtr(context, contextPointer, true); + } + } + } + + /// + /// Returns an asynchronous sequence of download-status updates for the asset pack with the specified ID. + /// + /// The sequence finishes after yielding an instance of DownloadStatusUpdate.Finished or DownloadStatusUpdate.Failed. + /// + /// The asset pack’s ID. + /// An asynchronous sequence of download-status updates. + public static async IAsyncEnumerable DownloadStatusUpdatesAsync(string assetPackId) { + DownloadStatusUpdatesContext context = new DownloadStatusUpdatesContext(assetPackId); + int contextSize = Marshal.SizeOf(context); + IntPtr contextPointer = Marshal.AllocHGlobal(contextSize); + Marshal.StructureToPtr(context, contextPointer, false); + baw_assetpackmanager_downloadstatusupdates(assetPackId, contextPointer, DownloadStatusUpdatesCallback); + while (true) { + await context.GetSemaphore().WaitAsync(); + bool shouldBreak = false; + lock (context.GetLockObject()) { + context = Marshal.PtrToStructure(contextPointer); + if (context.GetStatusUpdate() is DownloadStatusUpdate statusUpdate) { + yield return statusUpdate; + if (statusUpdate.IsTerminal) { + shouldBreak = true; + } + } + context.ResetSemaphore(); + Marshal.StructureToPtr(context, contextPointer, true); + } + if (shouldBreak) { + break; + } + } + } + + [MonoPInvokeCallback(typeof(FDownloadStatusUpdates))] + static void DownloadStatusUpdatesCallback(baw_assetpackmanager_downloadstatusupdate cStatusUpdate, IntPtr contextPointer) { + DownloadStatusUpdatesContext context = Marshal.PtrToStructure(contextPointer); + AssetPack assetPack = new AssetPack(cStatusUpdate.assetpack); + if (context.GetAssetPackId() is string assetPackId) { + if (assetPack.GetId() != assetPackId) { + return; // Filter out status updates for other asset packs + } + } + lock (context.GetLockObject()) { + switch (cStatusUpdate.kind) { + case baw_assetpackmanager_downloadstatusupdate_kind.baw_assetpackmanager_downloadstatusupdate_kind_began: + context.SetStatusUpdate(new DownloadStatusUpdate.Began(assetPack)); + break; + case baw_assetpackmanager_downloadstatusupdate_kind.baw_assetpackmanager_downloadstatusupdate_kind_paused: + context.SetStatusUpdate(new DownloadStatusUpdate.Paused(assetPack)); + break; + case baw_assetpackmanager_downloadstatusupdate_kind.baw_assetpackmanager_downloadstatusupdate_kind_downloading: + context.SetStatusUpdate(new DownloadStatusUpdate.Downloading(assetPack, cStatusUpdate.payload.progress)); + break; + case baw_assetpackmanager_downloadstatusupdate_kind.baw_assetpackmanager_downloadstatusupdate_kind_finished: + context.SetStatusUpdate(new DownloadStatusUpdate.Finished(assetPack)); + break; + case baw_assetpackmanager_downloadstatusupdate_kind.baw_assetpackmanager_downloadstatusupdate_kind_failed: + context.SetStatusUpdate(new DownloadStatusUpdate.Failed(assetPack, new Error(cStatusUpdate.payload.err))); + break; + } + Marshal.StructureToPtr(context, contextPointer, true); + context.GetSemaphore().Release(); + } + } + + /// Returns the manifest of asset packs that are available to download. + /// A task that yields the manifest. + public static async Task GetManifestAsync() { + ManifestContext context = ManifestContext.Create(); + int contextSize = Marshal.SizeOf(); + IntPtr contextPointer = Marshal.AllocHGlobal(contextSize); + Marshal.StructureToPtr(context, contextPointer, false); + baw_assetpackmanager_manifest(contextPointer, ManifestCallback); + await context.GetSemaphore().WaitAsync(); + context = Marshal.PtrToStructure(contextPointer); + Marshal.FreeHGlobal(contextPointer); + return context.GetResult().Get(); + } + + [MonoPInvokeCallback(typeof(FManifest))] + static void ManifestCallback(AssetPackManifest.baw_assetpackmanifest_res cResult, Result.baw_res_kind cResultKind, IntPtr contextPointer) { + ManifestContext context = Marshal.PtrToStructure(contextPointer); + switch (cResultKind) { + case Result.baw_res_kind.baw_res_kind_success: + context.SetResult(new Result(new AssetPackManifest(cResult.success))); + break; + case Result.baw_res_kind.baw_res_kind_failure: + context.SetResult(new Result(new Error(cResult.failure))); + break; + } + Marshal.StructureToPtr(context, contextPointer, true); + context.GetSemaphore().Release(); + } + + /// + /// Checks the current status relative to a particular asset pack. + /// + /// This method checks whether any version of the specified asset pack is currently downloaded. If one is, then it determines the version relationship between the downloaded asset pack and the specified asset pack. If they have different version numbers, then the returned status object will contain “out of date”. The returned status object will contain “update available” only if the relevant asset pack on the server hasn’t been further updated since the initialization of the provided AssetPack object. + /// + /// For example, consider the following sequence of events, assuming that version 1 of the relevant asset pack is already available locally: + /// 1. Your app calls GetAssetPack(string) on the AssetPackManifest object that GetManifestAsync() returns to obtain an AssetPack object. + /// 2. The asset pack is updated to version 2 on the server. + /// 3. Your app calls this method, passing the AssetPack object from step 1. + /// In this case, the returned status object will indicate that the downloaded asset pack is up to date. Generally, you shouldn’t need to handle this type of situation explicitly because the system automatically polls for updates periodically in the background. + /// + /// This method doesn’t automatically trigger any downloads, updates, or removals. + /// + /// The asset pack. + /// A task that yields the status object. + public static async Task GetAssetPackStatusAsync(AssetPack assetPack) { + AssetPackStatusContext context = AssetPackStatusContext.Create(); + int contextSize = Marshal.SizeOf(context); + IntPtr contextPointer = Marshal.AllocHGlobal(contextSize); + Marshal.StructureToPtr(context, contextPointer, false); + baw_assetpackmanager_assetpack_status(assetPack.CAssetPack, contextPointer, AssetPackStatusCallback); + await context.GetSemaphore().WaitAsync(); + context = Marshal.PtrToStructure(contextPointer); + Marshal.FreeHGlobal(contextPointer); + return context.GetResult().Get(); + } + + [MonoPInvokeCallback(typeof(FAssetPackStatus))] + static void AssetPackStatusCallback(AssetPack.Status.baw_assetpack_status_res cResult, Result.baw_res_kind cResultKind, IntPtr contextPointer) { + AssetPackStatusContext context = Marshal.PtrToStructure(contextPointer); + switch (cResultKind) { + case Result.baw_res_kind.baw_res_kind_success: + context.SetResult(new Result(new AssetPack.Status(cResult.success))); + break; + case Result.baw_res_kind.baw_res_kind_failure: + context.SetResult(new Result(new Error(cResult.failure))); + break; + } + Marshal.StructureToPtr(context, contextPointer, true); + context.GetSemaphore().Release(); + } + + /// + /// Checks an asset pack’s local status. + /// + /// This method checks only status values that are determinable offline. It doesn’t induce any network traffic or automatically trigger any downloads, updates, or removals. The following status values are determinable offline: + /// - “Out of date” (in some situations) + /// - “Obsolete” (in some situations) + /// - “Downloaded” + /// + /// Because this method doesn’t communicate with the server, it can’t determine whether a particular asset pack exists in the first place. Instead, it returns an empty status object when provided a nonexistent asset-pack ID, which is indistinguishable from the situation in which the asset pack does indeed exist but hasn’t yet been downloaded. Use GetAssetPackStatusAsync(AssetPack) to get a full view of an asset pack’s status. + /// + /// The asset pack’s ID. + /// + /// A task that yields the status object. + /// + public static async Task GetLocalAssetPackStatusAsync(string id) { + LocalAssetPackStatusContext context = LocalAssetPackStatusContext.Create(); + int contextSize = Marshal.SizeOf(context); + IntPtr contextPointer = Marshal.AllocHGlobal(contextSize); + Marshal.StructureToPtr(context, contextPointer, false); + baw_assetpackmanager_assetpack_status_local(id, contextPointer, LocalAssetPackStatusCallback); + await context.GetSemaphore().WaitAsync(); + context = Marshal.PtrToStructure(contextPointer); + Marshal.FreeHGlobal(contextPointer); + return context.GetStatus(); + } + + [MonoPInvokeCallback(typeof(FAssetPackStatusLocal))] + static void LocalAssetPackStatusCallback(byte cStatus, IntPtr contextPointer) { + LocalAssetPackStatusContext context = Marshal.PtrToStructure(contextPointer); + context.SetStatus(new AssetPack.Status(cStatus)); + Marshal.StructureToPtr(context, contextPointer, true); + context.GetSemaphore().Release(); + } + + /// Checks whether an asset pack is available locally. + /// The asset pack’s ID. + /// Whether the asset pack is available locally. + public static bool AssetPackIsAvailableLocally(string id) { + return baw_assetpackmanager_assetpack_local(id); + } + + /// + /// Ensures that the specified asset pack be available locally. + /// + /// This method checks whether the asset pack is currently downloaded, ignoring available updates. If it isn’t, then the system schedules it to be downloaded and waits for the download to finish. It’s guaranteed that the requested asset pack will be available locally once this method returns without throwing. If the method throws, then the asset pack is not guaranteed to be available locally. You can optionally monitor download progress by awaiting status updates from DownloadStatusUpdatesAsync() or DownloadStatusUpdatesAsync(string) in a separate task. + /// + /// The asset pack the local availability of which to ensure. + /// A task that yields when the asset pack is available locally + public static async Task EnsureLocalAvailabilityOfAssetPackAsync(AssetPack assetPack) { + EnsureLocalAvailabilityContext context = EnsureLocalAvailabilityContext.Create(); + int contextSize = Marshal.SizeOf(context); + IntPtr contextPointer = Marshal.AllocHGlobal(contextSize); + Marshal.StructureToPtr(context, contextPointer, false); + baw_assetpackmanager_assetpack_local_ensure(assetPack.CAssetPack, contextPointer, EnsureLocalAvailabilityCallback); + await context.GetSemaphore().WaitAsync(); + context = Marshal.PtrToStructure(contextPointer); + Marshal.FreeHGlobal(contextPointer); + if (context.GetError() is Error error) { + throw error; + } + } + + /// + /// Ensures that the specified asset pack be available locally. + /// + /// This method checks whether the asset pack is currently downloaded. If it isn’t, then the system schedules it to be downloaded and waits for the download to finish. It’s guaranteed that the requested asset pack will be available locally once this method returns without throwing. If the method throws, then the asset pack is not guaranteed to be available locally. You can optionally monitor download progress by awaiting status updates from DownloadStatusUpdatesAsync() or DownloadStatusUpdatesAsync(string) in a separate task. + /// + /// The asset pack the local availability of which to ensure. + /// Whether to require that the latest version be available locally. When true is passed to this parameter, the method will wait for the update (if there indeed is one available) to be downloaded before returning. When false is passed, the method won’t check for updates and won’t attempt to download any. + /// A task that yields when the asset pack is available locally. + public static async Task EnsureLocalAvailabilityOfAssetPackAsync(AssetPack assetPack, bool shouldUpdate) { + EnsureLocalAvailabilityContext context = EnsureLocalAvailabilityContext.Create(); + int contextSize = Marshal.SizeOf(context); + IntPtr contextPointer = Marshal.AllocHGlobal(contextSize); + Marshal.StructureToPtr(context, contextPointer, false); + baw_assetpackmanager_assetpack_local_ensure_update(assetPack.CAssetPack, shouldUpdate, contextPointer, EnsureLocalAvailabilityCallback); + await context.GetSemaphore().WaitAsync(); + context = Marshal.PtrToStructure(contextPointer); + Marshal.FreeHGlobal(contextPointer); + if (context.GetError() is Error error) { + throw error; + } + } + + /// + /// Ensures that the specified asset packs be available locally. + /// + /// This method checks whether the asset packs are currently downloaded. If any aren’t, then the system schedules them to be downloaded and waits for all of the downloads to finish. It’s guaranteed that the requested asset packs will be available locally once this method returns without throwing. If the method throws, then the asset packs are not all guaranteed to be available locally, though some might be; inspect the thrown error for more details. You can optionally monitor download progress by awaiting status updates from DownloadStatusUpdatesAsync() or DownloadStatusUpdatesAsync(string) in a separate task. + /// + /// The asset packs the local availability of which to ensure. + /// + /// A task that yields when the asset packs are available locally. + public static async void EnsureLocalAvailabilityOfAssetPacksAsync(AssetPack[] assetPacks, bool shouldUpdate) { + EnsureLocalAvailabilityContext context = EnsureLocalAvailabilityContext.Create(); + int contextSize = Marshal.SizeOf(context); + IntPtr contextPointer = Marshal.AllocHGlobal(contextSize); + Marshal.StructureToPtr(context, contextPointer, false); + AssetPack.baw_assetpack[] cAssetPacks = assetPacks.Select(assetPack => assetPack.CAssetPack).ToArray(); + baw_assetpackmanager_assetpack_local_ensure_updatev(cAssetPacks.Count(), cAssetPacks, shouldUpdate, contextPointer, EnsureLocalAvailabilityCallback); + await context.GetSemaphore().WaitAsync(); + context = Marshal.PtrToStructure(contextPointer); + Marshal.FreeHGlobal(contextPointer); + if (context.GetError() is Error error) { + throw error; + } + } + + [MonoPInvokeCallback(typeof(FAssetPackLocalEnsure))] + static void EnsureLocalAvailabilityCallback(Error.baw_err cError, Result.baw_res_kind cResultKind, IntPtr contextPointer) { + EnsureLocalAvailabilityContext context = Marshal.PtrToStructure(contextPointer); + switch (cResultKind) { + case Result.baw_res_kind.baw_res_kind_success: + break; + case Result.baw_res_kind.baw_res_kind_failure: + context.SetError(new Error(cError)); + break; + } + Marshal.StructureToPtr(context, contextPointer, true); + context.GetSemaphore().Release(); + } + + /// + /// Gets the latest asset-pack information from the server, updates outdated asset packs, and removes obsolete asset packs. + /// + /// This method waits for any downloads that it schedules to be registered with the download manager, but it doesn’t wait for those downloads to begin or to finish. If you want to monitor download progress, then you should await status updates from DownloadStatusUpdatesAsync() or DownloadStatusUpdatesAsync(string). + /// + /// A task the yields a 2-tuple with the set of IDs of asset packs that are being updated and the set of IDs of asset packs that were removed as a result of the check for updates. Neither updates nor removals that weren’t triggered by the check for updates are taken into account. + public static async Task<(string[] UpdatingIds, string[] RemovedIds)> CheckForUpdatesAsync() { + CheckForUpdatesContext context = CheckForUpdatesContext.Create(); + int contextSize = Marshal.SizeOf(context); + IntPtr contextPointer = Marshal.AllocHGlobal(contextSize); + Marshal.StructureToPtr(context, contextPointer, false); + baw_assetpackmanager_assetpack_update(contextPointer, CheckForUpdatesCallback); + await context.GetSemaphore().WaitAsync(); + context = Marshal.PtrToStructure(contextPointer); + Marshal.FreeHGlobal(contextPointer); + return context.GetResult().Get(); + } + + [MonoPInvokeCallback(typeof(FAssetPackUpdate))] + static void CheckForUpdatesCallback(baw_assetpackmanager_assetpack_update_res cResult, Result.baw_res_kind cResultKind, IntPtr contextPointer) { + CheckForUpdatesContext context = Marshal.PtrToStructure(contextPointer); + switch (cResultKind) { + case Result.baw_res_kind.baw_res_kind_success: + unsafe { + string[] updatingIds = new string[cResult.success.updatingc]; + for (long index = 0; index < cResult.success.updatingc; ++index) { + updatingIds[index] = Marshal.PtrToStringUTF8(cResult.success.updatingv[index]); + } + string[] removedIds = new string[cResult.success.removedc]; + for (long index = 0; index < cResult.success.removedc; ++index) { + removedIds[index] = Marshal.PtrToStringUTF8(cResult.success.removedv[index]); + } + context.SetResult(new Result<(string[], string[]), Error>((updatingIds, removedIds))); + } + break; + case Result.baw_res_kind.baw_res_kind_failure: + context.SetResult(new Result<(string[], string[]), Error>(new Error(cResult.failure))); + break; + } + Marshal.StructureToPtr(context, contextPointer, true); + context.GetSemaphore().Release(); + } + + /// Removes the specified asset pack from the device. + /// The asset pack’s ID. + /// A task the yields when the asset pack is removed. + public static async Task RemoveAssetPackAsync(string id) { + RemoveAssetPackContext context = RemoveAssetPackContext.Create(); + int contextSize = Marshal.SizeOf(context); + IntPtr contextPointer = Marshal.AllocHGlobal(contextSize); + Marshal.StructureToPtr(context, contextPointer, false); + baw_assetpackmanager_assetpack_remove(id, contextPointer, RemoveAssetPackCallback); + await context.GetSemaphore().WaitAsync(); + context = Marshal.PtrToStructure(contextPointer); + Marshal.FreeHGlobal(contextPointer); + if (context.GetError() is Error error) { + throw error; + } + } + + [MonoPInvokeCallback(typeof(FAssetPackRemove))] + static void RemoveAssetPackCallback(Error.baw_err cError, Result.baw_res_kind cResultKind, IntPtr contextPointer) { + RemoveAssetPackContext context = Marshal.PtrToStructure(contextPointer); + switch (cResultKind) { + case Result.baw_res_kind.baw_res_kind_success: + break; + case Result.baw_res_kind.baw_res_kind_failure: + context.SetError(new Error(cError)); + break; + } + Marshal.StructureToPtr(context, contextPointer, true); + context.GetSemaphore().Release(); + } + + /// + /// The language asset packs that are localized for which the system automatically makes available locally. + /// + /// The user’s preferred languages inform the choice of resolved language, respecting any language that your app sets manually. The returned value may be null if no localized asset packs are available. If the user recently changed their preferred language, then the returned value could be temporarily out of sync with the set of asset packs that are available locally. + /// + /// The resolved language. + public static Language GetResolvedLanguage() { + return new Language(baw_assetpackmanager_lang_resolved()); + } + + /// + /// Sets the language asset packs that are localized for which the system automatically makes available locally. + /// + /// The user’s preferred languages inform the choice of resolved language, respecting any language that your app sets manually. You can pass null to this method to revert to the user’s system-wide language preference. Setting the language doesn’t immediately download or remove any asset packs; call ReconcilePreferredLanguages() to reconcile the set of downloaded asset packs with the new configuration. + /// + /// The language to set. + public static void SetResolvedLanguage(Language? language) { + baw_assetpackmanager_lang_resolved_set(language?.CLanguage ?? new Language.baw_lang()); + } + + /// Returns the languages asset packs that are localized for which are available locally. + /// A task that yields the locally available languages. + public static async Task GetLocallyAvailableLanguagesAsync() { + LocallyAvailableLanguagesContext context = LocallyAvailableLanguagesContext.Create(); + int contextSize = Marshal.SizeOf(context); + IntPtr contextPointer = Marshal.AllocHGlobal(contextSize); + Marshal.StructureToPtr(context, contextPointer, false); + unsafe { + baw_assetpackmanager_lang_local(contextPointer, LocallyAvailableLanguagesCallback); + } + await context.GetSemaphore().WaitAsync(); + context = Marshal.PtrToStructure(contextPointer); + Marshal.FreeHGlobal(contextPointer); + return context.GetLanguages(); + } + + [MonoPInvokeCallback(typeof(FLangLocal))] + unsafe static void LocallyAvailableLanguagesCallback(long count, Language.baw_lang* cLanguages, IntPtr contextPointer) { + LocallyAvailableLanguagesContext context = Marshal.PtrToStructure(contextPointer); + Language[] languages = new Language[count]; + for (long index = 0; index < count; ++index) { + languages[index] = new Language(cLanguages[index]); + } + context.SetLanguages(languages); + Marshal.StructureToPtr(context, contextPointer, true); + context.GetSemaphore().Release(); + } + + /// + /// Reconciles the set of locally available asset packs with the user’s preferred languages. + /// + /// This method downloads any missing localized asset packs, waits for those downloads to finish, and removes any unneeded ones. If you’ve overridden the preferred languages, then this method will respect that. It won’t remove any localized asset packs that you’ve downloaded manually. + /// + /// A task that yields when the reconciliation operation finishes. + public static async Task ReconcilePreferredLanguages() { + ReconcilePreferredLanguagesContext context = ReconcilePreferredLanguagesContext.Create(); + int contextSize = Marshal.SizeOf(context); + IntPtr contextPointer = Marshal.AllocHGlobal(contextSize); + Marshal.StructureToPtr(context, contextPointer, false); + baw_assetpackmanager_lang_reconcile(contextPointer, ReconcilePreferredLanguagesCallback); + await context.GetSemaphore().WaitAsync(); + context = Marshal.PtrToStructure(contextPointer); + Marshal.FreeHGlobal(contextPointer); + if (context.GetError() is Error error) { + throw error; + } + } + + static void ReconcilePreferredLanguagesCallback(Error.baw_err cError, Result.baw_res_kind cResultKind, IntPtr contextPointer) { + ReconcilePreferredLanguagesContext context = Marshal.PtrToStructure(contextPointer); + switch (cResultKind) { + case Result.baw_res_kind.baw_res_kind_success: + break; + case Result.baw_res_kind.baw_res_kind_failure: + context.SetError(new Error(cError)); + break; + } + Marshal.StructureToPtr(context, contextPointer, true); + context.GetSemaphore().Release(); + } + + /// + /// Opens and returns a file handle for an asset file at the specified relative path. + /// + /// All asset packs share the same namespace, so you can treat the overall collection of downloaded asset packs as if it were a single root directory that contains all of your subdirectories and asset files, regardless of the specific asset pack in which any particular file resides. If there’s a path collision across multiple asset packs, then it’s undefined from which asset pack the file will be read unless you explicitly limit the search to a particular asset pack by passing a non-null ID to the assetPackId parameter. + /// + /// The relative path. + /// The ID of the asset pack in which to search for the file. If you pass null, then all downloaded asset packs are searched. + /// A handle for the opened file. + public static SafeFileHandle OpenFile(string path, string? assetPackId) { + Error.baw_err cError; + int fileDescriptor = baw_assetpackmanager_open(path, assetPackId, out cError); + if (fileDescriptor < 0) { + throw new Error(cError); + } + return new SafeFileHandle((IntPtr) fileDescriptor, true); + } + + /// + /// Opens and returns a file handle for a localized asset file at the specified relative path. + /// + /// All asset packs share the same namespace, so you can treat the overall collection of downloaded asset packs as if it were a single root directory that contains all of your subdirectories and asset files, regardless of the specific asset pack in which any particular file resides. This method searches in only the downloaded asset packs that are localized in the specified language. If there’s a file-path collision across multiple such asset packs, then it’s undefined from which asset pack the file will be read. + /// + /// This method is most useful if you intentionally induce a file-path collision across multiple differently localized asset packs. For example, you may include an English-localized version of Videos/Introduction.m4v in an en asset pack, a Hebrew-localized version of Videos/Introduction.m4v in a he asset pack, and an American Spanish–localized version of Videos/Introduction.m4v in an es-US asset pack. If you offer split-language functionality to users, then you may want to download two or more of those asset packs on the same device. In that scenario, the specific choice of file that OpenFile(string, string?) opens would be undefined unless you determine the appropriate asset pack’s ID and pass it to that method’s assetPackId parameter. With this method, merely passing a Language object to the language parameter is sufficient to resolve the ambiguity without requiring that you determine the asset pack’s ID. OpenFile(string, string?) is more suitable in most other situations. + /// + /// Language matching considers implicit script and region tags per Unicode’s Common Locale Data Repository. For example, en is equivalent to en-US and en-Latn-US but not en-CA. + /// + /// The relative path. + /// The language in asset packs that are localized for which to search. + /// A handle for the opened file. + public static SafeFileHandle OpenLocalizedFile(string path, Language language) { + Error.baw_err cError; + int fileDescriptor = baw_assetpackmanager_open_lang(path, language.CLanguage, out cError); + if (fileDescriptor < 0) { + throw new Error(cError); + } + return new SafeFileHandle((IntPtr) fileDescriptor, true); + } + + /// + /// Returns a URI for the specified relative path. + /// + /// Don’t persist the returned URI beyond the lifetime of the current process. + /// + /// This method will return a well formed URI even if no item exists at the specified relative path in any asset pack, in which case any attempts to get its contents—whether it’s a file or a directory—will fail. + /// + /// All asset packs share the same namespace, so you can treat the overall collection of downloaded asset packs as if it were a single root directory that contains all of your subdirectories and asset files, regardless of the specific asset pack in which any particular file resides. Unlike OpenFile(string, string?), this method supports retrieving entire directories—including packages—in which case it merges the corresponding slices of the shared logical directory from all downloaded asset packs that contain such slices. If there’s a path collision across multiple asset packs, then it’s undefined from which asset pack an individual file will be resolved. + /// + /// This method is less efficient than is OpenFile(string, string?); use that method instead if you can do so. In particular, this method shouldn’t be used to get the URI to the root of the shared asset-pack namespace. Don’t use this method to block the main thread. + /// + /// The relative path. + /// The URI to the item. + public static Uri GetUriForFile(string path) { + Error.baw_err cError; + IntPtr cUrl = baw_assetpackmanager_url(path, out cError); + if (cUrl == null) { + throw new Error(cError); + } + string urlString = Marshal.PtrToStringUTF8(cUrl); + baw_assetpackmanager_url_deinit(cUrl); + return new Uri(urlString); + } + + /// + /// Returns a URI for the specified relative path. + /// + /// Don’t persist the returned URI beyond the lifetime of the current process. + /// + /// This method will return a well formed URI even if no item exists at the specified relative path in any relevant asset pack, in which case any attempts to get its contents—whether it’s a file or a directory—will fail. + /// + /// All asset packs share the same namespace, so you can treat the overall collection of downloaded asset packs as if it were a single root directory that contains all of your subdirectories and asset files, regardless of the specific asset pack in which any particular file resides. Unlike OpenLocalizedFile(string, Language), this method supports retrieving entire directories—including packages—in which case it merges the corresponding slices of the shared logical directory from all downloaded asset packs that are localized in the specified language and that contain such slices. If there’s a path collision across multiple such asset packs, then it’s undefined from which asset pack an individual file will be resolved. + /// + /// This method is less efficient than is OpenFile(string, Language); use that method instead if you can do so. In particular, this method shouldn’t be used to get the URI to the root of the shared asset-pack namespace. Don’t use this method to block the main thread. + /// + /// This method is most useful if you intentionally induce a file-path collision across multiple differently localized asset packs. For example, you may include an English-localized version of Videos/Introduction.m4v in an en asset pack, a Hebrew-localized version of Videos/Introduction.m4v in a he asset pack, and an American Spanish–localized version of Videos/Introduction.m4v in an es-US asset pack. If you offer split-language functionality to users, then you may want to download two or more of those asset packs on the same device. In that scenario, the specific choice of item the URI to which GetUriForFile(string) returns would be undefined. With this method, merely passing a Language object to the language parameter is sufficient to resolve the ambiguity. GetUriForFile(string) is more suitable in most other situations. + /// + /// Language matching considers implicit script and region tags per Unicode’s Common Locale Data Repository. For example, en is equivalent to en-US and en-Latn-US but not en-CA. + /// + /// The relative path. + /// The language in asset packs that are localized for which to search. + /// The URIF to the item. + public static Uri GetUriForLocalizedFile(string path, Language language) { + Error.baw_err cError; + IntPtr cUrl = baw_assetpackmanager_url_lang(path, language.CLanguage, out cError); + if (cUrl == null) { + throw new Error(cError); + } + string urlString = Marshal.PtrToStringUTF8(cUrl); + baw_assetpackmanager_url_deinit(cUrl); + return new Uri(urlString); + } + + } + +} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/AssetPackManager.cs.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/AssetPackManager.cs.meta new file mode 100644 index 00000000..67cb520f --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/AssetPackManager.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 44907a329ebfa4d0881357add467775d \ No newline at end of file diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/AssetPackManifest.cs b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/AssetPackManifest.cs new file mode 100644 index 00000000..175efb20 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/AssetPackManifest.cs @@ -0,0 +1,190 @@ +using System.Runtime.InteropServices; + +namespace Apple.BackgroundAssets { + + /// A manifest of asset packs that are available to download. + public class AssetPackManifest { + + [StructLayout(LayoutKind.Sequential)] + struct baw_assetpackmanifest_compat { + + long assetpackc; + + unsafe AssetPack.baw_assetpack* assetpackv; + + } + + [StructLayout(LayoutKind.Explicit)] + internal struct baw_assetpackmanifest { + + [FieldOffset(0)] + unsafe void* opaque; + + [FieldOffset(0)] + baw_assetpackmanifest_compat compat; + } + + [StructLayout(LayoutKind.Explicit)] + internal struct baw_assetpackmanifest_res { + + [FieldOffset(0)] + internal baw_assetpackmanifest success; + + [FieldOffset(0)] + internal Error.baw_err failure; + + } + + [DllImport(InteropUtility.DllName)] + static extern void baw_assetpackmanifest_deinit(baw_assetpackmanifest manifest); + + [DllImport(InteropUtility.DllName)] + static extern AssetPack.baw_assetpack baw_assetpackmanifest_assetpack(baw_assetpackmanifest manifest, string id); + + [DllImport(InteropUtility.DllName)] + unsafe static extern AssetPack.baw_assetpack* baw_assetpackmanifest_assetpackv(baw_assetpackmanifest manifest, out long assetpackc); + + [DllImport(InteropUtility.DllName)] + unsafe static extern AssetPack.baw_assetpack* baw_assetpackmanifest_assetpackv_localized(baw_assetpackmanifest manifest, out long assetpackc); + + [DllImport(InteropUtility.DllName)] + unsafe static extern AssetPack.baw_assetpack* baw_assetpackmanifest_assetpackv_localized_lang(baw_assetpackmanifest manifest, Language.baw_lang lang, out long assetpackc); + + [DllImport(InteropUtility.DllName)] + unsafe static extern void baw_assetpackmanifest_assetpackv_deinit(long assetpackc, AssetPack.baw_assetpack* assetpackv); + + [DllImport(InteropUtility.DllName)] + static extern Language.baw_lang baw_assetpackmanifest_lang_primary(baw_assetpackmanifest manifest); + + [DllImport(InteropUtility.DllName)] + static extern Language.baw_lang baw_assetpackmanifest_lang_resolved(baw_assetpackmanifest manifest); + + [DllImport(InteropUtility.DllName)] + unsafe static extern Language.baw_lang* baw_assetpackmanifest_langv(baw_assetpackmanifest manifest, out long langc); + + [DllImport(InteropUtility.DllName)] + unsafe static extern void baw_assetpackmanifest_langv_deinit(long langc, Language.baw_lang* langv); + + internal baw_assetpackmanifest CManifest; + + internal AssetPackManifest(baw_assetpackmanifest cManifest) { + this.CManifest = cManifest; + } + + ~AssetPackManifest() { + baw_assetpackmanifest_deinit(this.CManifest); + } + + /// Returns the asset pack in this manifest with the given ID. + /// The asset pack’s ID. + /// The asset pack. + public AssetPack GetAssetPack(string id) { + return new AssetPack(baw_assetpackmanifest_assetpack(this.CManifest, id)); + } + + /// Returns the asset packs in this manifest that are available to download. + /// The asset packs + public unsafe AssetPack[] GetAllAssetPacks() { + long count; + AssetPack.baw_assetpack* cAssetPacks = baw_assetpackmanifest_assetpackv(this.CManifest, out count); + if (cAssetPacks == null) { + return new AssetPack[0]; + } else { + AssetPack[] assetPacks = new AssetPack[count]; + for (long index = 0; index < count; ++index) { + assetPacks[index] = new AssetPack(cAssetPacks[index]); + } + baw_assetpackmanifest_assetpackv_deinit(count, cAssetPacks); + return assetPacks; + } + } + + /// Returns the subset of asset packs in this manifest that are available to download and that best match the user’s preferred languages. + /// The localized asset packs. + public unsafe AssetPack[] GetLocalizedAssetPacks() { + long count; + AssetPack.baw_assetpack* cAssetPacks = baw_assetpackmanifest_assetpackv_localized(this.CManifest, out count); + if (cAssetPacks == null) { + return new AssetPack[0]; + } else { + AssetPack[] assetPacks = new AssetPack[count]; + for (long index = 0; index < count; ++index) { + assetPacks[index] = new AssetPack(cAssetPacks[index]); + } + baw_assetpackmanifest_assetpackv_deinit(count, cAssetPacks); + return assetPacks; + } + } + + /// + /// Returns the subset of asset packs in this manifest that are available to download and that best match the specified language. + /// + /// Depending on which languages are available, the returned asset packs’ respective languages may not exactly match the specified language. + /// + /// The language. + /// The localized asset packs. + public unsafe AssetPack[] GetLocalizedAssetPacks(Language language) { + long count; + AssetPack.baw_assetpack* cAssetPacks = baw_assetpackmanifest_assetpackv_localized_lang(this.CManifest, language.CLanguage, out count); + if (cAssetPacks == null) { + return new AssetPack[0]; + } else { + AssetPack[] assetPacks = new AssetPack[count]; + for (long index = 0; index < count; ++index) { + assetPacks[index] = new AssetPack(cAssetPacks[index]); + } + baw_assetpackmanifest_assetpackv_deinit(count, cAssetPacks); + return assetPacks; + } + } + + /// + /// Returns the app’s primary language as configured in App Store Connect. + /// + /// If no available localized asset packs match the user’s preferred languages, then the system will fall back on the app’s primary language. + /// + /// The primary language. + public Language GetPrimaryLanguage() { + Language.baw_lang cLanguage = baw_assetpackmanifest_lang_primary(this.CManifest); + if (Language.baw_lang_is_nonnull(cLanguage)) { + return new Language(cLanguage); + } else { + return null; + } + } + + /// + /// Returns the language asset packs in this manifest that are localized for which the system automatically makes available locally. + /// + /// The user’s preferred languages inform the choice of resolved language, respecting any language that your app sets manually. This property may be nil if no localized asset packs are available. If the user recently changed their preferred language or if this manifest is outdated, then this property’s value may be out of sync with the set of asset packs that are available locally. + /// + /// The resolved language. + public Language GetResolvedLanguage() { + Language.baw_lang cLanguage = baw_assetpackmanifest_lang_resolved(this.CManifest); + if (Language.baw_lang_is_nonnull(cLanguage)) { + return new Language(cLanguage); + } else { + return null; + } + } + + /// Returns the languages for which asset packs in this manifest are localized. + /// The available languages. + public unsafe Language[] GetAvailableLanguages() { + long count; + Language.baw_lang* cLanguages = baw_assetpackmanifest_langv(this.CManifest, out count); + if (cLanguages == null) { + return new Language[0]; + } else { + Language[] languages = new Language[count]; + for (long index = 0; index < count; ++index) { + languages[index] = new Language(cLanguages[index]); + } + baw_assetpackmanifest_langv_deinit(count, cLanguages); + return languages; + } + } + + } + +} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/AssetPackManifest.cs.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/AssetPackManifest.cs.meta new file mode 100644 index 00000000..07f2ab99 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/AssetPackManifest.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ad987304854164ddfa1236c8304c91de \ No newline at end of file diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Error.cs b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Error.cs new file mode 100644 index 00000000..e2c0a171 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Error.cs @@ -0,0 +1,37 @@ +using System; +using System.Runtime.InteropServices; + +namespace Apple.BackgroundAssets { + + /// An error that the Background Assets framework throws. + public class Error : Exception { + + [StructLayout(LayoutKind.Sequential)] + internal struct baw_err { + + internal IntPtr description; + + bool _static; + + } + + [DllImport(InteropUtility.DllName)] + static extern void baw_err_deinit(baw_err err); + + baw_err CError; + + internal Error(baw_err cError) { + this.CError = cError; + } + + ~Error() { + baw_err_deinit(this.CError); + } + + public unsafe override string ToString() { + return Marshal.PtrToStringUTF8(this.CError.description); + } + + } + +} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Error.cs.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Error.cs.meta new file mode 100644 index 00000000..0351a3ed --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Error.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4d44f120d7b4d4ac5822665c4910305a \ No newline at end of file diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/InteropUtility.cs b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/InteropUtility.cs new file mode 100644 index 00000000..423dfd76 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/InteropUtility.cs @@ -0,0 +1,17 @@ +using UnityEngine.Scripting; + +[assembly:Preserve] + +namespace Apple.BackgroundAssets { + + internal static class InteropUtility { + +#if (UNITY_IOS || UNITY_TVOS || UNITY_VISIONOS) && !UNITY_EDITOR + public const string DllName = "__Internal"; +#else + public const string DllName = "BackgroundAssetsWrapper"; +#endif + + } + +} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/InteropUtility.cs.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/InteropUtility.cs.meta new file mode 100644 index 00000000..f111b083 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/InteropUtility.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0b8cb455609a74c9683d5bee2b774450 \ No newline at end of file diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Language.cs b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Language.cs new file mode 100644 index 00000000..4b96a970 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Language.cs @@ -0,0 +1,71 @@ +using System; +using System.Runtime.InteropServices; + +namespace Apple.BackgroundAssets { + + /// A language, including its script and region. + public class Language { + + [StructLayout(LayoutKind.Sequential)] + internal struct baw_lang { + + IntPtr impl; + + } + + [DllImport(InteropUtility.DllName)] + static extern baw_lang baw_lang_init(string id); + + [DllImport(InteropUtility.DllName)] + static extern void baw_lang_deinit(baw_lang lang); + + [DllImport(InteropUtility.DllName)] + internal static extern bool baw_lang_is_nonnull(baw_lang lang); + + [DllImport(InteropUtility.DllName)] + static extern string baw_lang_id_min(baw_lang lang); + + [DllImport(InteropUtility.DllName)] + static extern string baw_lang_id_max(baw_lang lang); + + [DllImport(InteropUtility.DllName)] + static extern bool baw_lang_equivalent(baw_lang lang_first, baw_lang lang_second); + + internal baw_lang CLanguage; + + /// Creates a language from a BCP-47 ID. + /// A BCP-47 ID. + public Language(string id) { + this.CLanguage = baw_lang_init(id); + } + + internal Language(baw_lang cLanguage) { + this.CLanguage = cLanguage; + } + + ~Language() { + baw_lang_deinit(this.CLanguage); + } + + /// Returns this language’s minimal BCP-47 ID, excluding subtags that the system can infer implicitly. + /// The minimal ID. + public string GetMinimalId() { + return baw_lang_id_min(this.CLanguage); + } + + /// Returns this language’s maximal BCP-47 ID, including all subtags. + /// The maximal ID. + public string GetMaximalId() { + return baw_lang_id_max(this.CLanguage); + } + + /// Returns whether this language is equivalent to another language, considering implied subtags. + /// Another language. + /// Whether the languages are equivalent. + public bool IsEquivalent(Language other) { + return baw_lang_equivalent(this.CLanguage, other.CLanguage); + } + + } + +} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Language.cs.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Language.cs.meta new file mode 100644 index 00000000..7feb6bc5 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Language.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 87cb5b0205f8a444a95e5eba22efd0d3 \ No newline at end of file diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Result.cs b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Result.cs new file mode 100644 index 00000000..2034d65d --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Result.cs @@ -0,0 +1,43 @@ +using System; + +namespace Apple.BackgroundAssets { + + class Result where TFailure : Exception { + + #nullable enable + + internal enum baw_res_kind { + baw_res_kind_success, + baw_res_kind_failure + } + + readonly TSuccess? Success; + + readonly TFailure? Failure; + + public Result() { + this.Success = default(TSuccess); + this.Failure = default(TFailure); + } + + internal Result(TSuccess success) { + this.Success = success; + this.Failure = default(TFailure); + } + + internal Result(TFailure failure) { + this.Success = default(TSuccess); + this.Failure = failure; + } + + internal TSuccess Get() { + if (this.Success == null) { + throw this.Failure ?? new Exception(); + } else { + return this.Success; + } + } + + } + +} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Result.cs.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Result.cs.meta new file mode 100644 index 00000000..333df0e8 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/Runtime/Result.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ca6cbf6622fbb4c5eb1e899fc96f501d \ No newline at end of file diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/package.json b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/package.json new file mode 100644 index 00000000..aad3d610 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/package.json @@ -0,0 +1,19 @@ +{ + "name": "com.apple.unityplugin.backgroundassets", + "displayName": "Apple.BackgroundAssets", + "description": "Distribute asset packs of additional downloadable content on the App Store or from your own server.", + "version": "1.0.0", + "unity": "2022.3", + "dependencies": { + "com.apple.unityplugin.core": "3.3.0" + }, + "keywords": [ + "apple", + "backgroundassets" + ], + "author": { + "name": "Apple, Inc", + "email": "developer@apple.com", + "url": "https://developer.apple.com" + } +} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/package.json.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/package.json.meta new file mode 100644 index 00000000..2596359e --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Apple.BackgroundAssets/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: da73d76f1931c4c2182577e59fffcf58 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/New Apple Hosting Configuration.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/New Apple Hosting Configuration.asset new file mode 100644 index 00000000..f2ce9977 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/New Apple Hosting Configuration.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bdf76f4caa64d4d6390f38f16d1a79c5, type: 3} + m_Name: New Apple Hosting Configuration + m_EditorClassIdentifier: Assembly-CSharp-Editor::Apple.BackgroundAssets.AppleHostingConfiguration diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/New Apple Hosting Configuration.asset.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/New Apple Hosting Configuration.asset.meta new file mode 100644 index 00000000..b3e1596e --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/New Apple Hosting Configuration.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a0d9f41a882604c4eab712b1cd018810 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/New Self Hosting Configuration.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/New Self Hosting Configuration.asset new file mode 100644 index 00000000..102b537f --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/New Self Hosting Configuration.asset @@ -0,0 +1,21 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9b2a9759bc3cb4c8ab4819d23b005d66, type: 3} + m_Name: New Self Hosting Configuration + m_EditorClassIdentifier: Assembly-CSharp-Editor::Apple.BackgroundAssets.SelfHostingConfiguration + ManifestURL: https://assets.example.com/manifest + DownloadDomainAllowList: + - '*.example.com' + DownloadAllowance: 10000000000 + EssentialDownloadAllowance: 500000000 + MaxInstallSize: 23000000000 + EssentialMaxInstallSize: 560000000 diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/New Self Hosting Configuration.asset.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/New Self Hosting Configuration.asset.meta new file mode 100644 index 00000000..eae2d243 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/New Self Hosting Configuration.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5ece13b9c43574d96b4d51e377949029 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Readme.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Readme.asset new file mode 100644 index 00000000..d64b92ad --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Readme.asset @@ -0,0 +1,37 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fcf7219bab7fe46a1ad266029b2fee19, type: 3} + m_Name: Readme + m_EditorClassIdentifier: + commonStyle: {fileID: 7433441132597879392, guid: d2c670ece470f4c4fa6712b8dc28a9bb, type: 3} + darkStyle: {fileID: 7433441132597879392, guid: 1f902e57f049a7f47986618de93f5ee1, type: 3} + lightStyle: {fileID: 7433441132597879392, guid: 69e7ab73923f93149821ac3a88b84856, type: 3} + icon: {fileID: 2800000, guid: 727a75301c3d24613a3ebcec4a24c2c8, type: 3} + title: URP Empty Template + sections: + - heading: Welcome to the Universal Render Pipeline + text: This template includes the settings and assets you need to start creating with the Universal Render Pipeline. + linkText: + url: + - heading: URP Documentation + text: + linkText: Read more about URP + url: https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@latest + - heading: Forums + text: + linkText: Get answers and support + url: https://forum.unity.com/forums/universal-render-pipeline.383/ + - heading: Report bugs + text: + linkText: Submit a report + url: https://unity3d.com/unity/qa/bug-reporting + loadedLayout: 1 diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Readme.asset.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Readme.asset.meta new file mode 100644 index 00000000..ab3ad453 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Readme.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8105016687592461f977c054a80ce2f2 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Scenes.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Scenes.meta new file mode 100644 index 00000000..e59fb459 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9c53962885c2c4f449125a979d6ad240 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Scenes/SampleScene.unity b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Scenes/SampleScene.unity new file mode 100644 index 00000000..1c63aa8d --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Scenes/SampleScene.unity @@ -0,0 +1,432 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 10 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.18028378, g: 0.22571412, b: 0.30692285, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &330585543 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 330585546} + - component: {fileID: 330585545} + - component: {fileID: 330585544} + - component: {fileID: 330585547} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &330585544 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 330585543} + m_Enabled: 1 +--- !u!20 &330585545 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 330585543} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &330585546 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 330585543} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &330585547 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 330585543} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + m_VolumeTrigger: {fileID: 0} + m_VolumeFrameworkUpdateModeOption: 2 + m_RenderPostProcessing: 1 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_AllowHDROutput: 1 + m_UseScreenCoordOverride: 0 + m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} + m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_Version: 2 + m_TaaSettings: + quality: 3 + frameInfluence: 0.1 + jitterScale: 1 + mipBias: 0 + varianceClampScale: 0.9 + contrastAdaptiveSharpening: 0 +--- !u!1 &410087039 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 410087041} + - component: {fileID: 410087040} + - component: {fileID: 410087042} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &410087040 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 410087039} + m_Enabled: 1 + serializedVersion: 11 + m_Type: 1 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 2 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 5000 + m_UseColorTemperature: 1 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ForceVisible: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &410087041 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 410087039} + serializedVersion: 2 + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!114 &410087042 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 410087039} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Version: 3 + m_UsePipelineSettings: 1 + m_AdditionalLightsShadowResolutionTier: 2 + m_LightLayerMask: 1 + m_RenderingLayers: 1 + m_CustomShadowLayers: 0 + m_ShadowLayerMask: 1 + m_ShadowRenderingLayers: 1 + m_LightCookieSize: {x: 1, y: 1} + m_LightCookieOffset: {x: 0, y: 0} + m_SoftShadowQuality: 1 +--- !u!1 &832575517 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 832575519} + - component: {fileID: 832575518} + m_Layer: 0 + m_Name: Global Volume + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &832575518 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 832575517} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IsGlobal: 1 + priority: 0 + blendDistance: 0 + weight: 1 + sharedProfile: {fileID: 11400000, guid: 10fc4df2da32a41aaa32d77bc913491c, type: 2} +--- !u!4 &832575519 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 832575517} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 330585546} + - {fileID: 410087041} + - {fileID: 832575519} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Scenes/SampleScene.unity.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Scenes/SampleScene.unity.meta new file mode 100644 index 00000000..9531828b --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Scenes/SampleScene.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 99c9720ab356a0642a771bea13969a05 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings.meta new file mode 100644 index 00000000..39b94dd7 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 709f11a7f3c4041caa4ef136ea32d874 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/DefaultVolumeProfile.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/DefaultVolumeProfile.asset new file mode 100644 index 00000000..9e4bbfdd --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/DefaultVolumeProfile.asset @@ -0,0 +1,983 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-9167874883656233139 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5485954d14dfb9a4c8ead8edb0ded5b1, type: 3} + m_Name: LiftGammaGain + m_EditorClassIdentifier: + active: 1 + lift: + m_OverrideState: 1 + m_Value: {x: 1, y: 1, z: 1, w: 0} + gamma: + m_OverrideState: 1 + m_Value: {x: 1, y: 1, z: 1, w: 0} + gain: + m_OverrideState: 1 + m_Value: {x: 1, y: 1, z: 1, w: 0} +--- !u!114 &-8270506406425502121 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 70afe9e12c7a7ed47911bb608a23a8ff, type: 3} + m_Name: SplitToning + m_EditorClassIdentifier: + active: 1 + shadows: + m_OverrideState: 1 + m_Value: {r: 0.5, g: 0.5, b: 0.5, a: 1} + highlights: + m_OverrideState: 1 + m_Value: {r: 0.5, g: 0.5, b: 0.5, a: 1} + balance: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &-8104416584915340131 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 0} + m_Name: CopyPasteTestComponent2 + m_EditorClassIdentifier: Unity.RenderPipelines.Core.Editor.Tests:UnityEditor.Rendering.Tests:VolumeComponentCopyPasteTests/CopyPasteTestComponent2 + active: 1 + p1: + m_OverrideState: 1 + m_Value: 0 + p2: + m_OverrideState: 1 + m_Value: 0 + p21: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &-7750755424749557576 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 60f3b30c03e6ba64d9a27dc9dba8f28d, type: 3} + m_Name: OutlineVolumeComponent + m_EditorClassIdentifier: + active: 1 + Enabled: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &-7743500325797982168 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ccf1aba9553839d41ae37dd52e9ebcce, type: 3} + m_Name: MotionBlur + m_EditorClassIdentifier: + active: 1 + mode: + m_OverrideState: 1 + m_Value: 0 + quality: + m_OverrideState: 1 + m_Value: 0 + intensity: + m_OverrideState: 1 + m_Value: 0 + clamp: + m_OverrideState: 1 + m_Value: 0.05 +--- !u!114 &-7274224791359825572 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0fd9ee276a1023e439cf7a9c393195fa, type: 3} + m_Name: TestAnimationCurveVolumeComponent + m_EditorClassIdentifier: + active: 1 + testParameter: + m_OverrideState: 1 + m_Value: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0.5 + value: 10 + inSlope: 0 + outSlope: 10 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 15 + inSlope: 10 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!114 &-6335409530604852063 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 66f335fb1ffd8684294ad653bf1c7564, type: 3} + m_Name: ColorAdjustments + m_EditorClassIdentifier: + active: 1 + postExposure: + m_OverrideState: 1 + m_Value: 0 + contrast: + m_OverrideState: 1 + m_Value: 0 + colorFilter: + m_OverrideState: 1 + m_Value: {r: 1, g: 1, b: 1, a: 1} + hueShift: + m_OverrideState: 1 + m_Value: 0 + saturation: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &-6288072647309666549 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 29fa0085f50d5e54f8144f766051a691, type: 3} + m_Name: FilmGrain + m_EditorClassIdentifier: + active: 1 + type: + m_OverrideState: 1 + m_Value: 0 + intensity: + m_OverrideState: 1 + m_Value: 0 + response: + m_OverrideState: 1 + m_Value: 0.8 + texture: + m_OverrideState: 1 + m_Value: {fileID: 0} +--- !u!114 &-5520245016509672950 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 97c23e3b12dc18c42a140437e53d3951, type: 3} + m_Name: Tonemapping + m_EditorClassIdentifier: + active: 1 + mode: + m_OverrideState: 1 + m_Value: 0 + neutralHDRRangeReductionMode: + m_OverrideState: 1 + m_Value: 2 + acesPreset: + m_OverrideState: 1 + m_Value: 3 + hueShiftAmount: + m_OverrideState: 1 + m_Value: 0 + detectPaperWhite: + m_OverrideState: 1 + m_Value: 0 + paperWhite: + m_OverrideState: 1 + m_Value: 300 + detectBrightnessLimits: + m_OverrideState: 1 + m_Value: 1 + minNits: + m_OverrideState: 1 + m_Value: 0.005 + maxNits: + m_OverrideState: 1 + m_Value: 1000 +--- !u!114 &-5360449096862653589 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 0} + m_Name: VolumeComponentSupportedEverywhere + m_EditorClassIdentifier: Unity.RenderPipelines.Core.Editor.Tests:UnityEngine.Rendering.Tests:VolumeComponentEditorSupportedOnTests/VolumeComponentSupportedEverywhere + active: 1 +--- !u!114 &-5139089513906902183 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5a00a63fdd6bd2a45ab1f2d869305ffd, type: 3} + m_Name: OasisFogVolumeComponent + m_EditorClassIdentifier: + active: 1 + Density: + m_OverrideState: 1 + m_Value: 0 + StartDistance: + m_OverrideState: 1 + m_Value: 0 + HeightRange: + m_OverrideState: 1 + m_Value: {x: 0, y: 50} + Tint: + m_OverrideState: 1 + m_Value: {r: 1, g: 1, b: 1, a: 1} + SunScatteringIntensity: + m_OverrideState: 1 + m_Value: 2 +--- !u!114 &-4463884970436517307 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fb60a22f311433c4c962b888d1393f88, type: 3} + m_Name: PaniniProjection + m_EditorClassIdentifier: + active: 1 + distance: + m_OverrideState: 1 + m_Value: 0 + cropToFit: + m_OverrideState: 1 + m_Value: 1 +--- !u!114 &-1410297666881709256 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6bd486065ce11414fa40e631affc4900, type: 3} + m_Name: ProbeVolumesOptions + m_EditorClassIdentifier: + active: 1 + normalBias: + m_OverrideState: 1 + m_Value: 0.33 + viewBias: + m_OverrideState: 1 + m_Value: 0 + scaleBiasWithMinProbeDistance: + m_OverrideState: 1 + m_Value: 0 + samplingNoise: + m_OverrideState: 1 + m_Value: 0.1 + animateSamplingNoise: + m_OverrideState: 1 + m_Value: 1 + leakReductionMode: + m_OverrideState: 1 + m_Value: 1 + minValidDotProductValue: + m_OverrideState: 1 + m_Value: 0.1 + occlusionOnlyReflectionNormalization: + m_OverrideState: 1 + m_Value: 1 + intensityMultiplier: + m_OverrideState: 1 + m_Value: 1 + skyOcclusionIntensityMultiplier: + m_OverrideState: 1 + m_Value: 1 + worldOffset: + m_OverrideState: 1 + m_Value: {x: 0, y: 0, z: 0} +--- !u!114 &-1216621516061285780 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0b2db86121404754db890f4c8dfe81b2, type: 3} + m_Name: Bloom + m_EditorClassIdentifier: + active: 1 + skipIterations: + m_OverrideState: 1 + m_Value: 1 + threshold: + m_OverrideState: 1 + m_Value: 0.9 + intensity: + m_OverrideState: 1 + m_Value: 0 + scatter: + m_OverrideState: 1 + m_Value: 0.7 + clamp: + m_OverrideState: 1 + m_Value: 65472 + tint: + m_OverrideState: 1 + m_Value: {r: 1, g: 1, b: 1, a: 1} + highQualityFiltering: + m_OverrideState: 1 + m_Value: 0 + downscale: + m_OverrideState: 1 + m_Value: 0 + maxIterations: + m_OverrideState: 1 + m_Value: 6 + dirtTexture: + m_OverrideState: 1 + m_Value: {fileID: 0} + dimension: 1 + dirtIntensity: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &-1170528603972255243 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 221518ef91623a7438a71fef23660601, type: 3} + m_Name: WhiteBalance + m_EditorClassIdentifier: + active: 1 + temperature: + m_OverrideState: 1 + m_Value: 0 + tint: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &-581120513425526550 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 0} + m_Name: CopyPasteTestComponent3 + m_EditorClassIdentifier: Unity.RenderPipelines.Core.Editor.Tests:UnityEditor.Rendering.Tests:VolumeComponentCopyPasteTests/CopyPasteTestComponent3 + active: 1 + p1: + m_OverrideState: 1 + m_Value: 0 + p2: + m_OverrideState: 1 + m_Value: 0 + p31: + m_OverrideState: 1 + m_Value: {r: 0, g: 0, b: 0, a: 1} +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d7fd9488000d3734a9e00ee676215985, type: 3} + m_Name: DefaultVolumeProfile + m_EditorClassIdentifier: + components: + - {fileID: -9167874883656233139} + - {fileID: 1918650496244738858} + - {fileID: 853819529557874667} + - {fileID: 1052315754049611418} + - {fileID: -1170528603972255243} + - {fileID: -8270506406425502121} + - {fileID: -5520245016509672950} + - {fileID: 7173750748008157695} + - {fileID: 1666464333004379222} + - {fileID: 9001657382290151224} + - {fileID: -6335409530604852063} + - {fileID: -1216621516061285780} + - {fileID: 3959858460715838825} + - {fileID: -7743500325797982168} + - {fileID: 4644742534064026673} + - {fileID: -4463884970436517307} + - {fileID: -6288072647309666549} + - {fileID: 7518938298396184218} + - {fileID: -1410297666881709256} +--- !u!114 &853819529557874667 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 06437c1ff663d574d9447842ba0a72e4, type: 3} + m_Name: ScreenSpaceLensFlare + m_EditorClassIdentifier: + active: 1 + intensity: + m_OverrideState: 1 + m_Value: 0 + tintColor: + m_OverrideState: 1 + m_Value: {r: 1, g: 1, b: 1, a: 1} + bloomMip: + m_OverrideState: 1 + m_Value: 1 + firstFlareIntensity: + m_OverrideState: 1 + m_Value: 1 + secondaryFlareIntensity: + m_OverrideState: 1 + m_Value: 1 + warpedFlareIntensity: + m_OverrideState: 1 + m_Value: 1 + warpedFlareScale: + m_OverrideState: 1 + m_Value: {x: 1, y: 1} + samples: + m_OverrideState: 1 + m_Value: 1 + sampleDimmer: + m_OverrideState: 1 + m_Value: 0.5 + vignetteEffect: + m_OverrideState: 1 + m_Value: 1 + startingPosition: + m_OverrideState: 1 + m_Value: 1.25 + scale: + m_OverrideState: 1 + m_Value: 1.5 + streaksIntensity: + m_OverrideState: 1 + m_Value: 0 + streaksLength: + m_OverrideState: 1 + m_Value: 0.5 + streaksOrientation: + m_OverrideState: 1 + m_Value: 0 + streaksThreshold: + m_OverrideState: 1 + m_Value: 0.25 + resolution: + m_OverrideState: 1 + m_Value: 4 + chromaticAbberationIntensity: + m_OverrideState: 1 + m_Value: 0.5 +--- !u!114 &1052315754049611418 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 558a8e2b6826cf840aae193990ba9f2e, type: 3} + m_Name: ShadowsMidtonesHighlights + m_EditorClassIdentifier: + active: 1 + shadows: + m_OverrideState: 1 + m_Value: {x: 1, y: 1, z: 1, w: 0} + midtones: + m_OverrideState: 1 + m_Value: {x: 1, y: 1, z: 1, w: 0} + highlights: + m_OverrideState: 1 + m_Value: {x: 1, y: 1, z: 1, w: 0} + shadowsStart: + m_OverrideState: 1 + m_Value: 0 + shadowsEnd: + m_OverrideState: 1 + m_Value: 0.3 + highlightsStart: + m_OverrideState: 1 + m_Value: 0.55 + highlightsEnd: + m_OverrideState: 1 + m_Value: 1 +--- !u!114 &1666464333004379222 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3eb4b772797da9440885e8bd939e9560, type: 3} + m_Name: ColorCurves + m_EditorClassIdentifier: + active: 1 + master: + m_OverrideState: 1 + m_Value: + k__BackingField: 2 + m_Loop: 0 + m_ZeroValue: 0 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + red: + m_OverrideState: 1 + m_Value: + k__BackingField: 2 + m_Loop: 0 + m_ZeroValue: 0 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + green: + m_OverrideState: 1 + m_Value: + k__BackingField: 2 + m_Loop: 0 + m_ZeroValue: 0 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + blue: + m_OverrideState: 1 + m_Value: + k__BackingField: 2 + m_Loop: 0 + m_ZeroValue: 0 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 1 + outSlope: 1 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + hueVsHue: + m_OverrideState: 1 + m_Value: + k__BackingField: 0 + m_Loop: 1 + m_ZeroValue: 0.5 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + hueVsSat: + m_OverrideState: 1 + m_Value: + k__BackingField: 0 + m_Loop: 1 + m_ZeroValue: 0.5 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + satVsSat: + m_OverrideState: 1 + m_Value: + k__BackingField: 0 + m_Loop: 0 + m_ZeroValue: 0.5 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + lumVsSat: + m_OverrideState: 1 + m_Value: + k__BackingField: 0 + m_Loop: 0 + m_ZeroValue: 0.5 + m_Range: 1 + m_Curve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 +--- !u!114 &1918650496244738858 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e021b4c809a781e468c2988c016ebbea, type: 3} + m_Name: ColorLookup + m_EditorClassIdentifier: + active: 1 + texture: + m_OverrideState: 1 + m_Value: {fileID: 0} + dimension: 1 + contribution: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &3959858460715838825 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c01700fd266d6914ababb731e09af2eb, type: 3} + m_Name: DepthOfField + m_EditorClassIdentifier: + active: 1 + mode: + m_OverrideState: 1 + m_Value: 0 + gaussianStart: + m_OverrideState: 1 + m_Value: 10 + gaussianEnd: + m_OverrideState: 1 + m_Value: 30 + gaussianMaxRadius: + m_OverrideState: 1 + m_Value: 1 + highQualitySampling: + m_OverrideState: 1 + m_Value: 0 + focusDistance: + m_OverrideState: 1 + m_Value: 10 + aperture: + m_OverrideState: 1 + m_Value: 5.6 + focalLength: + m_OverrideState: 1 + m_Value: 50 + bladeCount: + m_OverrideState: 1 + m_Value: 5 + bladeCurvature: + m_OverrideState: 1 + m_Value: 1 + bladeRotation: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &4251301726029935498 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 74955a4b0b4243bc87231e8b59ed9140, type: 3} + m_Name: TestVolume + m_EditorClassIdentifier: + active: 1 + param: + m_OverrideState: 1 + m_Value: 123 +--- !u!114 &4644742534064026673 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 81180773991d8724ab7f2d216912b564, type: 3} + m_Name: ChromaticAberration + m_EditorClassIdentifier: + active: 1 + intensity: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &6940869943325143175 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 0} + m_Name: VolumeComponentSupportedOnAnySRP + m_EditorClassIdentifier: Unity.RenderPipelines.Core.Editor.Tests:UnityEngine.Rendering.Tests:VolumeComponentEditorSupportedOnTests/VolumeComponentSupportedOnAnySRP + active: 1 +--- !u!114 &7173750748008157695 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 899c54efeace73346a0a16faa3afe726, type: 3} + m_Name: Vignette + m_EditorClassIdentifier: + active: 1 + color: + m_OverrideState: 1 + m_Value: {r: 0, g: 0, b: 0, a: 1} + center: + m_OverrideState: 1 + m_Value: {x: 0.5, y: 0.5} + intensity: + m_OverrideState: 1 + m_Value: 0 + smoothness: + m_OverrideState: 1 + m_Value: 0.2 + rounded: + m_OverrideState: 1 + m_Value: 0 +--- !u!114 &7518938298396184218 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c5e1dc532bcb41949b58bc4f2abfbb7e, type: 3} + m_Name: LensDistortion + m_EditorClassIdentifier: + active: 1 + intensity: + m_OverrideState: 1 + m_Value: 0 + xMultiplier: + m_OverrideState: 1 + m_Value: 1 + yMultiplier: + m_OverrideState: 1 + m_Value: 1 + center: + m_OverrideState: 1 + m_Value: {x: 0.5, y: 0.5} + scale: + m_OverrideState: 1 + m_Value: 1 +--- !u!114 &9001657382290151224 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cdfbdbb87d3286943a057f7791b43141, type: 3} + m_Name: ChannelMixer + m_EditorClassIdentifier: + active: 1 + redOutRedIn: + m_OverrideState: 1 + m_Value: 100 + redOutGreenIn: + m_OverrideState: 1 + m_Value: 0 + redOutBlueIn: + m_OverrideState: 1 + m_Value: 0 + greenOutRedIn: + m_OverrideState: 1 + m_Value: 0 + greenOutGreenIn: + m_OverrideState: 1 + m_Value: 100 + greenOutBlueIn: + m_OverrideState: 1 + m_Value: 0 + blueOutRedIn: + m_OverrideState: 1 + m_Value: 0 + blueOutGreenIn: + m_OverrideState: 1 + m_Value: 0 + blueOutBlueIn: + m_OverrideState: 1 + m_Value: 100 +--- !u!114 &9122958982931076880 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 0} + m_Name: CopyPasteTestComponent1 + m_EditorClassIdentifier: Unity.RenderPipelines.Core.Editor.Tests:UnityEditor.Rendering.Tests:VolumeComponentCopyPasteTests/CopyPasteTestComponent1 + active: 1 + p1: + m_OverrideState: 1 + m_Value: 0 + p2: + m_OverrideState: 1 + m_Value: 0 diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/DefaultVolumeProfile.asset.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/DefaultVolumeProfile.asset.meta new file mode 100644 index 00000000..53b314ad --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/DefaultVolumeProfile.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ab09877e2e707104187f6f83e2f62510 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/Mobile_RPAsset.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/Mobile_RPAsset.asset new file mode 100644 index 00000000..9a2a9bca --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/Mobile_RPAsset.asset @@ -0,0 +1,143 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3} + m_Name: Mobile_RPAsset + m_EditorClassIdentifier: + k_AssetVersion: 13 + k_AssetPreviousVersion: 13 + m_RendererType: 1 + m_RendererData: {fileID: 0} + m_RendererDataList: + - {fileID: 11400000, guid: 65bc7dbf4170f435aa868c779acfb082, type: 2} + m_DefaultRendererIndex: 0 + m_RequireDepthTexture: 0 + m_RequireOpaqueTexture: 0 + m_OpaqueDownsampling: 0 + m_SupportsTerrainHoles: 1 + m_SupportsHDR: 1 + m_HDRColorBufferPrecision: 0 + m_MSAA: 1 + m_RenderScale: 0.8 + m_UpscalingFilter: 0 + m_FsrOverrideSharpness: 0 + m_FsrSharpness: 0.92 + m_EnableLODCrossFade: 1 + m_LODCrossFadeDitheringType: 1 + m_ShEvalMode: 0 + m_LightProbeSystem: 0 + m_ProbeVolumeMemoryBudget: 1024 + m_ProbeVolumeBlendingMemoryBudget: 256 + m_SupportProbeVolumeGPUStreaming: 0 + m_SupportProbeVolumeDiskStreaming: 0 + m_SupportProbeVolumeScenarios: 0 + m_SupportProbeVolumeScenarioBlending: 0 + m_ProbeVolumeSHBands: 1 + m_MainLightRenderingMode: 1 + m_MainLightShadowsSupported: 1 + m_MainLightShadowmapResolution: 1024 + m_AdditionalLightsRenderingMode: 1 + m_AdditionalLightsPerObjectLimit: 4 + m_AdditionalLightShadowsSupported: 0 + m_AdditionalLightsShadowmapResolution: 2048 + m_AdditionalLightsShadowResolutionTierLow: 256 + m_AdditionalLightsShadowResolutionTierMedium: 512 + m_AdditionalLightsShadowResolutionTierHigh: 1024 + m_ReflectionProbeBlending: 1 + m_ReflectionProbeBoxProjection: 1 + m_ReflectionProbeAtlas: 1 + m_ShadowDistance: 50 + m_ShadowCascadeCount: 1 + m_Cascade2Split: 0.25 + m_Cascade3Split: {x: 0.1, y: 0.3} + m_Cascade4Split: {x: 0.067, y: 0.2, z: 0.467} + m_CascadeBorder: 0.2 + m_ShadowDepthBias: 1 + m_ShadowNormalBias: 1 + m_AnyShadowsSupported: 1 + m_SoftShadowsSupported: 0 + m_ConservativeEnclosingSphere: 1 + m_NumIterationsEnclosingSphere: 64 + m_SoftShadowQuality: 2 + m_AdditionalLightsCookieResolution: 1024 + m_AdditionalLightsCookieFormat: 1 + m_UseSRPBatcher: 1 + m_SupportsDynamicBatching: 0 + m_MixedLightingSupported: 1 + m_SupportsLightCookies: 1 + m_SupportsLightLayers: 1 + m_DebugLevel: 0 + m_StoreActionsOptimization: 0 + m_UseAdaptivePerformance: 1 + m_ColorGradingMode: 0 + m_ColorGradingLutSize: 32 + m_AllowPostProcessAlphaOutput: 0 + m_UseFastSRGBLinearConversion: 1 + m_SupportDataDrivenLensFlare: 1 + m_SupportScreenSpaceLensFlare: 1 + m_GPUResidentDrawerMode: 0 + m_SmallMeshScreenPercentage: 0 + m_GPUResidentDrawerEnableOcclusionCullingInCameras: 0 + m_ShadowType: 1 + m_LocalShadowsSupported: 0 + m_LocalShadowsAtlasResolution: 256 + m_MaxPixelLights: 0 + m_ShadowAtlasResolution: 256 + m_VolumeFrameworkUpdateMode: 0 + m_VolumeProfile: {fileID: 11400000, guid: 10fc4df2da32a41aaa32d77bc913491c, type: 2} + apvScenesData: + obsoleteSceneBounds: + m_Keys: [] + m_Values: [] + obsoleteHasProbeVolumes: + m_Keys: [] + m_Values: + m_PrefilteringModeMainLightShadows: 3 + m_PrefilteringModeAdditionalLight: 3 + m_PrefilteringModeAdditionalLightShadows: 0 + m_PrefilterXRKeywords: 1 + m_PrefilteringModeForwardPlus: 0 + m_PrefilteringModeDeferredRendering: 0 + m_PrefilteringModeScreenSpaceOcclusion: 0 + m_PrefilterDebugKeywords: 1 + m_PrefilterWriteRenderingLayers: 1 + m_PrefilterHDROutput: 1 + m_PrefilterAlphaOutput: 1 + m_PrefilterSSAODepthNormals: 1 + m_PrefilterSSAOSourceDepthLow: 1 + m_PrefilterSSAOSourceDepthMedium: 1 + m_PrefilterSSAOSourceDepthHigh: 1 + m_PrefilterSSAOInterleaved: 1 + m_PrefilterSSAOBlueNoise: 1 + m_PrefilterSSAOSampleCountLow: 1 + m_PrefilterSSAOSampleCountMedium: 1 + m_PrefilterSSAOSampleCountHigh: 1 + m_PrefilterDBufferMRT1: 1 + m_PrefilterDBufferMRT2: 1 + m_PrefilterDBufferMRT3: 1 + m_PrefilterSoftShadowsQualityLow: 1 + m_PrefilterSoftShadowsQualityMedium: 1 + m_PrefilterSoftShadowsQualityHigh: 1 + m_PrefilterSoftShadows: 0 + m_PrefilterScreenCoord: 1 + m_PrefilterScreenSpaceIrradiance: 1 + m_PrefilterNativeRenderPass: 1 + m_PrefilterUseLegacyLightmaps: 0 + m_PrefilterBicubicLightmapSampling: 1 + m_PrefilterReflectionProbeRotation: 0 + m_PrefilterReflectionProbeBlending: 0 + m_PrefilterReflectionProbeBoxProjection: 0 + m_PrefilterReflectionProbeAtlas: 1 + m_ShaderVariantLogLevel: 0 + m_ShadowCascades: 0 + m_Textures: + blueNoise64LTex: {fileID: 2800000, guid: e3d24661c1e055f45a7560c033dbb837, type: 3} + bayerMatrixTex: {fileID: 2800000, guid: f9ee4ed84c1d10c49aabb9b210b0fc44, type: 3} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/Mobile_RPAsset.asset.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/Mobile_RPAsset.asset.meta new file mode 100644 index 00000000..3660d151 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/Mobile_RPAsset.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5e6cbd92db86f4b18aec3ed561671858 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/Mobile_Renderer.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/Mobile_Renderer.asset new file mode 100644 index 00000000..ea246b25 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/Mobile_Renderer.asset @@ -0,0 +1,52 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: de640fe3d0db1804a85f9fc8f5cadab6, type: 3} + m_Name: Mobile_Renderer + m_EditorClassIdentifier: + debugShaders: + debugReplacementPS: {fileID: 4800000, guid: cf852408f2e174538bcd9b7fda1c5ae7, + type: 3} + hdrDebugViewPS: {fileID: 4800000, guid: 573620ae32aec764abd4d728906d2587, type: 3} + probeVolumeSamplingDebugComputeShader: {fileID: 7200000, guid: 53626a513ea68ce47b59dc1299fe3959, + type: 3} + probeVolumeResources: + probeVolumeDebugShader: {fileID: 0} + probeVolumeFragmentationDebugShader: {fileID: 0} + probeVolumeOffsetDebugShader: {fileID: 0} + probeVolumeSamplingDebugShader: {fileID: 0} + probeSamplingDebugMesh: {fileID: 0} + probeSamplingDebugTexture: {fileID: 0} + probeVolumeBlendStatesCS: {fileID: 0} + m_RendererFeatures: [] + m_RendererFeatureMap: + m_UseNativeRenderPass: 1 + postProcessData: {fileID: 11400000, guid: 41439944d30ece34e96484bdb6645b55, type: 2} + m_AssetVersion: 2 + m_OpaqueLayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_TransparentLayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_DefaultStencilState: + overrideStencilState: 0 + stencilReference: 0 + stencilCompareFunction: 8 + passOperation: 2 + failOperation: 0 + zFailOperation: 0 + m_ShadowTransparentReceive: 0 + m_RenderingMode: 0 + m_DepthPrimingMode: 0 + m_CopyDepthMode: 0 + m_AccurateGbufferNormals: 0 + m_IntermediateTextureMode: 0 diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/Mobile_Renderer.asset.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/Mobile_Renderer.asset.meta new file mode 100644 index 00000000..a3588b1a --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/Mobile_Renderer.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 65bc7dbf4170f435aa868c779acfb082 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/PC_RPAsset.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/PC_RPAsset.asset new file mode 100644 index 00000000..5a05f065 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/PC_RPAsset.asset @@ -0,0 +1,143 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3} + m_Name: PC_RPAsset + m_EditorClassIdentifier: + k_AssetVersion: 13 + k_AssetPreviousVersion: 13 + m_RendererType: 1 + m_RendererData: {fileID: 0} + m_RendererDataList: + - {fileID: 11400000, guid: f288ae1f4751b564a96ac7587541f7a2, type: 2} + m_DefaultRendererIndex: 0 + m_RequireDepthTexture: 1 + m_RequireOpaqueTexture: 1 + m_OpaqueDownsampling: 1 + m_SupportsTerrainHoles: 1 + m_SupportsHDR: 1 + m_HDRColorBufferPrecision: 0 + m_MSAA: 1 + m_RenderScale: 1 + m_UpscalingFilter: 0 + m_FsrOverrideSharpness: 0 + m_FsrSharpness: 0.92 + m_EnableLODCrossFade: 1 + m_LODCrossFadeDitheringType: 1 + m_ShEvalMode: 0 + m_LightProbeSystem: 0 + m_ProbeVolumeMemoryBudget: 1024 + m_ProbeVolumeBlendingMemoryBudget: 256 + m_SupportProbeVolumeGPUStreaming: 0 + m_SupportProbeVolumeDiskStreaming: 0 + m_SupportProbeVolumeScenarios: 0 + m_SupportProbeVolumeScenarioBlending: 0 + m_ProbeVolumeSHBands: 1 + m_MainLightRenderingMode: 1 + m_MainLightShadowsSupported: 1 + m_MainLightShadowmapResolution: 2048 + m_AdditionalLightsRenderingMode: 1 + m_AdditionalLightsPerObjectLimit: 4 + m_AdditionalLightShadowsSupported: 1 + m_AdditionalLightsShadowmapResolution: 2048 + m_AdditionalLightsShadowResolutionTierLow: 256 + m_AdditionalLightsShadowResolutionTierMedium: 512 + m_AdditionalLightsShadowResolutionTierHigh: 1024 + m_ReflectionProbeBlending: 1 + m_ReflectionProbeBoxProjection: 1 + m_ReflectionProbeAtlas: 1 + m_ShadowDistance: 50 + m_ShadowCascadeCount: 4 + m_Cascade2Split: 0.25 + m_Cascade3Split: {x: 0.1, y: 0.3} + m_Cascade4Split: {x: 0.12299999, y: 0.2926, z: 0.53599995} + m_CascadeBorder: 0.107758604 + m_ShadowDepthBias: 0.1 + m_ShadowNormalBias: 0.5 + m_AnyShadowsSupported: 1 + m_SoftShadowsSupported: 1 + m_ConservativeEnclosingSphere: 1 + m_NumIterationsEnclosingSphere: 64 + m_SoftShadowQuality: 3 + m_AdditionalLightsCookieResolution: 2048 + m_AdditionalLightsCookieFormat: 3 + m_UseSRPBatcher: 1 + m_SupportsDynamicBatching: 0 + m_MixedLightingSupported: 1 + m_SupportsLightCookies: 1 + m_SupportsLightLayers: 1 + m_DebugLevel: 0 + m_StoreActionsOptimization: 0 + m_UseAdaptivePerformance: 1 + m_ColorGradingMode: 0 + m_ColorGradingLutSize: 32 + m_AllowPostProcessAlphaOutput: 0 + m_UseFastSRGBLinearConversion: 0 + m_SupportDataDrivenLensFlare: 1 + m_SupportScreenSpaceLensFlare: 1 + m_GPUResidentDrawerMode: 1 + m_SmallMeshScreenPercentage: 0 + m_GPUResidentDrawerEnableOcclusionCullingInCameras: 0 + m_ShadowType: 1 + m_LocalShadowsSupported: 0 + m_LocalShadowsAtlasResolution: 256 + m_MaxPixelLights: 0 + m_ShadowAtlasResolution: 256 + m_VolumeFrameworkUpdateMode: 0 + m_VolumeProfile: {fileID: 11400000, guid: 10fc4df2da32a41aaa32d77bc913491c, type: 2} + apvScenesData: + obsoleteSceneBounds: + m_Keys: [] + m_Values: [] + obsoleteHasProbeVolumes: + m_Keys: [] + m_Values: + m_PrefilteringModeMainLightShadows: 3 + m_PrefilteringModeAdditionalLight: 0 + m_PrefilteringModeAdditionalLightShadows: 2 + m_PrefilterXRKeywords: 1 + m_PrefilteringModeForwardPlus: 2 + m_PrefilteringModeDeferredRendering: 0 + m_PrefilteringModeScreenSpaceOcclusion: 2 + m_PrefilterDebugKeywords: 1 + m_PrefilterWriteRenderingLayers: 1 + m_PrefilterHDROutput: 1 + m_PrefilterAlphaOutput: 1 + m_PrefilterSSAODepthNormals: 0 + m_PrefilterSSAOSourceDepthLow: 1 + m_PrefilterSSAOSourceDepthMedium: 1 + m_PrefilterSSAOSourceDepthHigh: 1 + m_PrefilterSSAOInterleaved: 1 + m_PrefilterSSAOBlueNoise: 0 + m_PrefilterSSAOSampleCountLow: 1 + m_PrefilterSSAOSampleCountMedium: 0 + m_PrefilterSSAOSampleCountHigh: 1 + m_PrefilterDBufferMRT1: 1 + m_PrefilterDBufferMRT2: 1 + m_PrefilterDBufferMRT3: 1 + m_PrefilterSoftShadowsQualityLow: 1 + m_PrefilterSoftShadowsQualityMedium: 1 + m_PrefilterSoftShadowsQualityHigh: 1 + m_PrefilterSoftShadows: 0 + m_PrefilterScreenCoord: 1 + m_PrefilterScreenSpaceIrradiance: 1 + m_PrefilterNativeRenderPass: 1 + m_PrefilterUseLegacyLightmaps: 1 + m_PrefilterBicubicLightmapSampling: 1 + m_PrefilterReflectionProbeRotation: 0 + m_PrefilterReflectionProbeBlending: 0 + m_PrefilterReflectionProbeBoxProjection: 0 + m_PrefilterReflectionProbeAtlas: 0 + m_ShaderVariantLogLevel: 0 + m_ShadowCascades: 0 + m_Textures: + blueNoise64LTex: {fileID: 2800000, guid: e3d24661c1e055f45a7560c033dbb837, type: 3} + bayerMatrixTex: {fileID: 2800000, guid: f9ee4ed84c1d10c49aabb9b210b0fc44, type: 3} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/PC_RPAsset.asset.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/PC_RPAsset.asset.meta new file mode 100644 index 00000000..e286b2fd --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/PC_RPAsset.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4b83569d67af61e458304325a23e5dfd +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/PC_Renderer.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/PC_Renderer.asset new file mode 100644 index 00000000..475b02e5 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/PC_Renderer.asset @@ -0,0 +1,95 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: de640fe3d0db1804a85f9fc8f5cadab6, type: 3} + m_Name: PC_Renderer + m_EditorClassIdentifier: + debugShaders: + debugReplacementPS: {fileID: 4800000, guid: cf852408f2e174538bcd9b7fda1c5ae7, + type: 3} + hdrDebugViewPS: {fileID: 4800000, guid: 573620ae32aec764abd4d728906d2587, type: 3} + probeVolumeSamplingDebugComputeShader: {fileID: 7200000, guid: 53626a513ea68ce47b59dc1299fe3959, + type: 3} + probeVolumeResources: + probeVolumeDebugShader: {fileID: 4800000, guid: e5c6678ed2aaa91408dd3df699057aae, + type: 3} + probeVolumeFragmentationDebugShader: {fileID: 4800000, guid: 03cfc4915c15d504a9ed85ecc404e607, + type: 3} + probeVolumeOffsetDebugShader: {fileID: 4800000, guid: 53a11f4ebaebf4049b3638ef78dc9664, + type: 3} + probeVolumeSamplingDebugShader: {fileID: 4800000, guid: 8f96cd657dc40064aa21efcc7e50a2e7, + type: 3} + probeSamplingDebugMesh: {fileID: -3555484719484374845, guid: 57d7c4c16e2765b47a4d2069b311bffe, + type: 3} + probeSamplingDebugTexture: {fileID: 2800000, guid: 24ec0e140fb444a44ab96ee80844e18e, + type: 3} + probeVolumeBlendStatesCS: {fileID: 7200000, guid: b9a23f869c4fd45f19c5ada54dd82176, + type: 3} + m_RendererFeatures: + - {fileID: 7833122117494664109} + m_RendererFeatureMap: ad6b866f10d7b46c + m_UseNativeRenderPass: 1 + postProcessData: {fileID: 11400000, guid: 41439944d30ece34e96484bdb6645b55, type: 2} + m_AssetVersion: 2 + m_OpaqueLayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_TransparentLayerMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_DefaultStencilState: + overrideStencilState: 0 + stencilReference: 1 + stencilCompareFunction: 3 + passOperation: 2 + failOperation: 0 + zFailOperation: 0 + m_ShadowTransparentReceive: 1 + m_RenderingMode: 2 + m_DepthPrimingMode: 0 + m_CopyDepthMode: 0 + m_AccurateGbufferNormals: 0 + m_IntermediateTextureMode: 0 +--- !u!114 &7833122117494664109 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f62c9c65cf3354c93be831c8bc075510, type: 3} + m_Name: ScreenSpaceAmbientOcclusion + m_EditorClassIdentifier: + m_Active: 1 + m_Settings: + AOMethod: 0 + Downsample: 0 + AfterOpaque: 0 + Source: 1 + NormalSamples: 1 + Intensity: 0.4 + DirectLightingStrength: 0.25 + Radius: 0.3 + Samples: 1 + BlurQuality: 0 + Falloff: 100 + SampleCount: -1 + m_BlueNoise256Textures: + - {fileID: 2800000, guid: 36f118343fc974119bee3d09e2111500, type: 3} + - {fileID: 2800000, guid: 4b7b083e6b6734e8bb2838b0b50a0bc8, type: 3} + - {fileID: 2800000, guid: c06cc21c692f94f5fb5206247191eeee, type: 3} + - {fileID: 2800000, guid: cb76dd40fa7654f9587f6a344f125c9a, type: 3} + - {fileID: 2800000, guid: e32226222ff144b24bf3a5a451de54bc, type: 3} + - {fileID: 2800000, guid: 3302065f671a8450b82c9ddf07426f3a, type: 3} + - {fileID: 2800000, guid: 56a77a3e8d64f47b6afe9e3c95cb57d5, type: 3} + m_Shader: {fileID: 4800000, guid: 0849e84e3d62649e8882e9d6f056a017, type: 3} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/PC_Renderer.asset.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/PC_Renderer.asset.meta new file mode 100644 index 00000000..ddae6a5f --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/PC_Renderer.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f288ae1f4751b564a96ac7587541f7a2 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/SampleSceneProfile.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/SampleSceneProfile.asset new file mode 100644 index 00000000..c1b0f631 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/SampleSceneProfile.asset @@ -0,0 +1,159 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-7893295128165547882 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0b2db86121404754db890f4c8dfe81b2, type: 3} + m_Name: Bloom + m_EditorClassIdentifier: + active: 1 + skipIterations: + m_OverrideState: 1 + m_Value: 0 + threshold: + m_OverrideState: 1 + m_Value: 1 + intensity: + m_OverrideState: 1 + m_Value: 0.25 + scatter: + m_OverrideState: 1 + m_Value: 0.5 + clamp: + m_OverrideState: 0 + m_Value: 65472 + tint: + m_OverrideState: 0 + m_Value: {r: 1, g: 1, b: 1, a: 1} + highQualityFiltering: + m_OverrideState: 1 + m_Value: 1 + downscale: + m_OverrideState: 0 + m_Value: 0 + maxIterations: + m_OverrideState: 0 + m_Value: 6 + dirtTexture: + m_OverrideState: 0 + m_Value: {fileID: 0} + dimension: 1 + dirtIntensity: + m_OverrideState: 0 + m_Value: 0 +--- !u!114 &-3357603926938260329 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 899c54efeace73346a0a16faa3afe726, type: 3} + m_Name: Vignette + m_EditorClassIdentifier: + active: 1 + color: + m_OverrideState: 0 + m_Value: {r: 0, g: 0, b: 0, a: 1} + center: + m_OverrideState: 0 + m_Value: {x: 0.5, y: 0.5} + intensity: + m_OverrideState: 1 + m_Value: 0.2 + smoothness: + m_OverrideState: 0 + m_Value: 0.2 + rounded: + m_OverrideState: 0 + m_Value: 0 +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d7fd9488000d3734a9e00ee676215985, type: 3} + m_Name: SampleSceneProfile + m_EditorClassIdentifier: + components: + - {fileID: 849379129802519247} + - {fileID: -7893295128165547882} + - {fileID: 7391319092446245454} + - {fileID: -3357603926938260329} +--- !u!114 &849379129802519247 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 97c23e3b12dc18c42a140437e53d3951, type: 3} + m_Name: Tonemapping + m_EditorClassIdentifier: + active: 1 + mode: + m_OverrideState: 1 + m_Value: 1 + neutralHDRRangeReductionMode: + m_OverrideState: 0 + m_Value: 2 + acesPreset: + m_OverrideState: 0 + m_Value: 3 + hueShiftAmount: + m_OverrideState: 0 + m_Value: 0 + detectPaperWhite: + m_OverrideState: 1 + m_Value: 0 + paperWhite: + m_OverrideState: 1 + m_Value: 234 + detectBrightnessLimits: + m_OverrideState: 1 + m_Value: 1 + minNits: + m_OverrideState: 1 + m_Value: 0.005 + maxNits: + m_OverrideState: 1 + m_Value: 647 +--- !u!114 &7391319092446245454 +MonoBehaviour: + m_ObjectHideFlags: 3 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ccf1aba9553839d41ae37dd52e9ebcce, type: 3} + m_Name: MotionBlur + m_EditorClassIdentifier: + active: 0 + mode: + m_OverrideState: 0 + m_Value: 0 + quality: + m_OverrideState: 1 + m_Value: 2 + intensity: + m_OverrideState: 1 + m_Value: 0.6 + clamp: + m_OverrideState: 0 + m_Value: 0.05 diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/SampleSceneProfile.asset.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/SampleSceneProfile.asset.meta new file mode 100644 index 00000000..b82270c5 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/SampleSceneProfile.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 10fc4df2da32a41aaa32d77bc913491c +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset new file mode 100644 index 00000000..f0d6e746 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset @@ -0,0 +1,449 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2ec995e51a6e251468d2a3fd8a686257, type: 3} + m_Name: UniversalRenderPipelineGlobalSettings + m_EditorClassIdentifier: + m_ShaderStrippingSetting: + m_Version: 0 + m_ExportShaderVariants: 1 + m_ShaderVariantLogLevel: 0 + m_StripRuntimeDebugShaders: 1 + m_URPShaderStrippingSetting: + m_Version: 0 + m_StripUnusedPostProcessingVariants: 1 + m_StripUnusedVariants: 1 + m_StripScreenCoordOverrideVariants: 1 + m_ShaderVariantLogLevel: 0 + m_ExportShaderVariants: 1 + m_StripDebugVariants: 1 + m_StripUnusedPostProcessingVariants: 1 + m_StripUnusedVariants: 1 + m_StripScreenCoordOverrideVariants: 1 + supportRuntimeDebugDisplay: 0 + m_Settings: + m_SettingsList: + m_List: + - rid: 6852985685364965376 + - rid: 6852985685364965377 + - rid: 6852985685364965378 + - rid: 6852985685364965379 + - rid: 6852985685364965380 + - rid: 6852985685364965381 + - rid: 6852985685364965382 + - rid: 6852985685364965383 + - rid: 6852985685364965384 + - rid: 6852985685364965385 + - rid: 6852985685364965386 + - rid: 6852985685364965387 + - rid: 6852985685364965388 + - rid: 6852985685364965389 + - rid: 6852985685364965390 + - rid: 6852985685364965391 + - rid: 6852985685364965392 + - rid: 6852985685364965393 + - rid: 6852985685364965394 + - rid: 8712630790384254976 + - rid: 4284062438471237637 + - rid: 5747374308340793344 + - rid: 5747374308340793345 + - rid: 5747374308340793346 + - rid: 5747374308340793347 + - rid: 5747374308340793348 + - rid: 5747374308340793349 + - rid: 8138915168729694208 + - rid: 8138915168729694209 + - rid: 8138915168729694210 + - rid: 8138915168729694211 + - rid: 8138915168729694212 + - rid: 8138915168729694213 + - rid: 8138915168729694214 + - rid: 3467017739646271488 + m_RuntimeSettings: + m_List: [] + m_AssetVersion: 10 + m_ObsoleteDefaultVolumeProfile: {fileID: 0} + m_RenderingLayerNames: + - Light Layer default + - Light Layer 1 + - Light Layer 2 + - Light Layer 3 + - Light Layer 4 + - Light Layer 5 + - Light Layer 6 + - Light Layer 7 + m_ValidRenderingLayers: 0 + lightLayerName0: Light Layer default + lightLayerName1: Light Layer 1 + lightLayerName2: Light Layer 2 + lightLayerName3: Light Layer 3 + lightLayerName4: Light Layer 4 + lightLayerName5: Light Layer 5 + lightLayerName6: Light Layer 6 + lightLayerName7: Light Layer 7 + apvScenesData: + obsoleteSceneBounds: + m_Keys: [] + m_Values: [] + obsoleteHasProbeVolumes: + m_Keys: [] + m_Values: + references: + version: 2 + RefIds: + - rid: 3467017739646271488 + type: {class: WorldRenderPipelineResources, ns: UnityEngine.PathTracing.Core, asm: Unity.PathTracing.Runtime} + data: + _version: 3 + _blitCubemap: {fileID: 7200000, guid: 5a992812cb320d146a66cc600200cce7, type: 3} + _blitGrayScaleCookie: {fileID: 7200000, guid: 557fa399e33bf7647bda5697c5c158df, type: 3} + _setAlphaChannelShader: {fileID: 7200000, guid: 5efaea0e81c66334aa9d062d6573e6fd, type: 3} + _environmentImportanceSamplingBuild: {fileID: 7200000, guid: 5bb2534d2411d344cbc54f880232640f, type: 3} + _skyBoxMesh: {fileID: 4300000, guid: 0529e6c5f6dea8c4a8c2835ed7de57cb, type: 2} + _sixFaceSkyBoxMesh: {fileID: 4300000, guid: a80925ceebd011741b42509226cefc74, type: 2} + _buildLightGridShader: {fileID: 7200000, guid: 16e47c1641bd0104e92b624601457bb0, type: 3} + - rid: 4284062438471237637 + type: {class: URPReflectionProbeSettings, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Universal.Runtime} + data: + version: 1 + useReflectionProbeRotation: 1 + - rid: 5747374308340793344 + type: {class: UniversalRenderPipelineEditorAssets, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_DefaultSettingsVolumeProfile: {fileID: 11400000, guid: eda47df5b85f4f249abf7abd73db2cb2, type: 2} + - rid: 5747374308340793345 + type: {class: PostProcessData/ShaderResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + stopNanPS: {fileID: 4800000, guid: 1121bb4e615ca3c48b214e79e841e823, type: 3} + subpixelMorphologicalAntialiasingPS: {fileID: 4800000, guid: 63eaba0ebfb82cc43bde059b4a8c65f6, type: 3} + gaussianDepthOfFieldPS: {fileID: 4800000, guid: 5e7134d6e63e0bc47a1dd2669cedb379, type: 3} + bokehDepthOfFieldPS: {fileID: 4800000, guid: 2aed67ad60045d54ba3a00c91e2d2631, type: 3} + cameraMotionBlurPS: {fileID: 4800000, guid: 1edcd131364091c46a17cbff0b1de97a, type: 3} + paniniProjectionPS: {fileID: 4800000, guid: a15b78cf8ca26ca4fb2090293153c62c, type: 3} + lutBuilderLdrPS: {fileID: 4800000, guid: 65df88701913c224d95fc554db28381a, type: 3} + lutBuilderHdrPS: {fileID: 4800000, guid: ec9fec698a3456d4fb18cf8bacb7a2bc, type: 3} + bloomPS: {fileID: 4800000, guid: 5f1864addb451f54bae8c86d230f736e, type: 3} + temporalAntialiasingPS: {fileID: 4800000, guid: 9c70c1a35ff15f340b38ea84842358bf, type: 3} + LensFlareDataDrivenPS: {fileID: 4800000, guid: 6cda457ac28612740adb23da5d39ea92, type: 3} + LensFlareScreenSpacePS: {fileID: 4800000, guid: 701880fecb344ea4c9cd0db3407ab287, type: 3} + scalingSetupPS: {fileID: 4800000, guid: e8ee25143a34b8c4388709ea947055d1, type: 3} + easuPS: {fileID: 4800000, guid: 562b7ae4f629f144aa97780546fce7c6, type: 3} + uberPostPS: {fileID: 4800000, guid: e7857e9d0c934dc4f83f270f8447b006, type: 3} + finalPostPassPS: {fileID: 4800000, guid: c49e63ed1bbcb334780a3bd19dfed403, type: 3} + m_ShaderResourcesVersion: 0 + - rid: 5747374308340793346 + type: {class: ScreenSpaceAmbientOcclusionDynamicResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_BlueNoise256Textures: + - {fileID: 2800000, guid: 36f118343fc974119bee3d09e2111500, type: 3} + - {fileID: 2800000, guid: 4b7b083e6b6734e8bb2838b0b50a0bc8, type: 3} + - {fileID: 2800000, guid: c06cc21c692f94f5fb5206247191eeee, type: 3} + - {fileID: 2800000, guid: cb76dd40fa7654f9587f6a344f125c9a, type: 3} + - {fileID: 2800000, guid: e32226222ff144b24bf3a5a451de54bc, type: 3} + - {fileID: 2800000, guid: 3302065f671a8450b82c9ddf07426f3a, type: 3} + - {fileID: 2800000, guid: 56a77a3e8d64f47b6afe9e3c95cb57d5, type: 3} + m_Version: 0 + - rid: 5747374308340793347 + type: {class: ScreenSpaceAmbientOcclusionPersistentResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Shader: {fileID: 4800000, guid: 0849e84e3d62649e8882e9d6f056a017, type: 3} + m_Version: 0 + - rid: 5747374308340793348 + type: {class: UniversalRenderPipelineRuntimeXRResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_xrOcclusionMeshPS: {fileID: 4800000, guid: 4431b1f1f743fbf4eb310a967890cbea, type: 3} + m_xrMirrorViewPS: {fileID: 4800000, guid: d5a307c014552314b9f560906d708772, type: 3} + m_xrMotionVector: {fileID: 4800000, guid: f89aac1e4f84468418fe30e611dff395, type: 3} + - rid: 5747374308340793349 + type: {class: PostProcessData/TextureResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + blueNoise16LTex: + - {fileID: 2800000, guid: 81200413a40918d4d8702e94db29911c, type: 3} + - {fileID: 2800000, guid: d50c5e07c9911a74982bddf7f3075e7b, type: 3} + - {fileID: 2800000, guid: 1134690bf9216164dbc75050e35b7900, type: 3} + - {fileID: 2800000, guid: 7ce2118f74614a94aa8a0cdf2e6062c3, type: 3} + - {fileID: 2800000, guid: 2ca97df9d1801e84a8a8f2c53cb744f0, type: 3} + - {fileID: 2800000, guid: e63eef8f54aa9dc4da9a5ac094b503b5, type: 3} + - {fileID: 2800000, guid: 39451254daebd6d40b52899c1f1c0c1b, type: 3} + - {fileID: 2800000, guid: c94ad916058dff743b0f1c969ddbe660, type: 3} + - {fileID: 2800000, guid: ed5ea7ce59ca8ec4f9f14bf470a30f35, type: 3} + - {fileID: 2800000, guid: 071e954febf155243a6c81e48f452644, type: 3} + - {fileID: 2800000, guid: 96aaab9cc247d0b4c98132159688c1af, type: 3} + - {fileID: 2800000, guid: fc3fa8f108657e14486697c9a84ccfc5, type: 3} + - {fileID: 2800000, guid: bfed3e498947fcb4890b7f40f54d85b9, type: 3} + - {fileID: 2800000, guid: d512512f4af60a442ab3458489412954, type: 3} + - {fileID: 2800000, guid: 47a45908f6db0cb44a0d5e961143afec, type: 3} + - {fileID: 2800000, guid: 4dcc0502f8586f941b5c4a66717205e8, type: 3} + - {fileID: 2800000, guid: 9d92991794bb5864c8085468b97aa067, type: 3} + - {fileID: 2800000, guid: 14381521ff11cb74abe3fe65401c23be, type: 3} + - {fileID: 2800000, guid: d36f0fe53425e08499a2333cf423634c, type: 3} + - {fileID: 2800000, guid: d4044ea2490d63b43aa1765f8efbf8a9, type: 3} + - {fileID: 2800000, guid: c9bd74624d8070f429e3f46d161f9204, type: 3} + - {fileID: 2800000, guid: d5c9b274310e5524ebe32a4e4da3df1f, type: 3} + - {fileID: 2800000, guid: f69770e54f2823f43badf77916acad83, type: 3} + - {fileID: 2800000, guid: 10b6c6d22e73dea46a8ab36b6eebd629, type: 3} + - {fileID: 2800000, guid: a2ec5cbf5a9b64345ad3fab0912ddf7b, type: 3} + - {fileID: 2800000, guid: 1c3c6d69a645b804fa232004b96b7ad3, type: 3} + - {fileID: 2800000, guid: d18a24d7b4ed50f4387993566d9d3ae2, type: 3} + - {fileID: 2800000, guid: c989e1ed85cf7154caa922fec53e6af6, type: 3} + - {fileID: 2800000, guid: ff47e5a0f105eb34883b973e51f4db62, type: 3} + - {fileID: 2800000, guid: fa042edbfc40fbd4bad0ab9d505b1223, type: 3} + - {fileID: 2800000, guid: 896d9004736809c4fb5973b7c12eb8b9, type: 3} + - {fileID: 2800000, guid: 179f794063d2a66478e6e726f84a65bc, type: 3} + filmGrainTex: + - {fileID: 2800000, guid: 654c582f7f8a5a14dbd7d119cbde215d, type: 3} + - {fileID: 2800000, guid: dd77ffd079630404e879388999033049, type: 3} + - {fileID: 2800000, guid: 1097e90e1306e26439701489f391a6c0, type: 3} + - {fileID: 2800000, guid: f0b67500f7fad3b4c9f2b13e8f41ba6e, type: 3} + - {fileID: 2800000, guid: 9930fb4528622b34687b00bbe6883de7, type: 3} + - {fileID: 2800000, guid: bd9e8c758250ef449a4b4bfaad7a2133, type: 3} + - {fileID: 2800000, guid: 510a2f57334933e4a8dbabe4c30204e4, type: 3} + - {fileID: 2800000, guid: b4db8180660810945bf8d55ab44352ad, type: 3} + - {fileID: 2800000, guid: fd2fd78b392986e42a12df2177d3b89c, type: 3} + - {fileID: 2800000, guid: 5cdee82a77d13994f83b8fdabed7c301, type: 3} + smaaAreaTex: {fileID: 2800000, guid: d1f1048909d55cd4fa1126ab998f617e, type: 3} + smaaSearchTex: {fileID: 2800000, guid: 51eee22c2a633ef4aada830eed57c3fd, type: 3} + m_TexturesResourcesVersion: 0 + - rid: 6852985685364965376 + type: {class: URPShaderStrippingSetting, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_StripUnusedPostProcessingVariants: 1 + m_StripUnusedVariants: 1 + m_StripScreenCoordOverrideVariants: 1 + - rid: 6852985685364965377 + type: {class: UniversalRenderPipelineEditorShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_AutodeskInteractive: {fileID: 4800000, guid: 0e9d5a909a1f7e84882a534d0d11e49f, type: 3} + m_AutodeskInteractiveTransparent: {fileID: 4800000, guid: 5c81372d981403744adbdda4433c9c11, type: 3} + m_AutodeskInteractiveMasked: {fileID: 4800000, guid: 80aa867ac363ac043847b06ad71604cd, type: 3} + m_DefaultSpeedTree7Shader: {fileID: 4800000, guid: 0f4122b9a743b744abe2fb6a0a88868b, type: 3} + m_DefaultSpeedTree8Shader: {fileID: -6465566751694194690, guid: 9920c1f1781549a46ba081a2a15a16ec, type: 3} + m_DefaultSpeedTree9Shader: {fileID: -6465566751694194690, guid: cbd3e1cc4ae141c42a30e33b4d666a61, type: 3} + - rid: 6852985685364965378 + type: {class: UniversalRendererResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_CopyDepthPS: {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3} + m_CameraMotionVector: {fileID: 4800000, guid: c56b7e0d4c7cb484e959caeeedae9bbf, type: 3} + m_StencilDeferredPS: {fileID: 4800000, guid: e9155b26e1bc55942a41e518703fe304, type: 3} + m_ClusterDeferred: {fileID: 4800000, guid: 222cce62363a44a380c36bf03b392608, type: 3} + m_StencilDitherMaskSeedPS: {fileID: 4800000, guid: 8c3ee818f2efa514c889881ccb2e95a2, type: 3} + m_DBufferClear: {fileID: 4800000, guid: f056d8bd2a1c7e44e9729144b4c70395, type: 3} + - rid: 6852985685364965379 + type: {class: UniversalRenderPipelineDebugShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_DebugReplacementPS: {fileID: 4800000, guid: cf852408f2e174538bcd9b7fda1c5ae7, type: 3} + m_HdrDebugViewPS: {fileID: 4800000, guid: 573620ae32aec764abd4d728906d2587, type: 3} + m_ProbeVolumeSamplingDebugComputeShader: {fileID: 7200000, guid: 53626a513ea68ce47b59dc1299fe3959, type: 3} + - rid: 6852985685364965380 + type: {class: UniversalRenderPipelineRuntimeShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_FallbackErrorShader: {fileID: 4800000, guid: e6e9a19c3678ded42a3bc431ebef7dbd, type: 3} + m_BlitHDROverlay: {fileID: 4800000, guid: a89bee29cffa951418fc1e2da94d1959, type: 3} + m_CoreBlitPS: {fileID: 4800000, guid: 93446b5c5339d4f00b85c159e1159b7c, type: 3} + m_CoreBlitColorAndDepthPS: {fileID: 4800000, guid: d104b2fc1ca6445babb8e90b0758136b, type: 3} + m_SamplingPS: {fileID: 4800000, guid: 04c410c9937594faa893a11dceb85f7e, type: 3} + m_TerrainDetailLit: {fileID: 0} + m_TerrainDetailGrassBillboard: {fileID: 0} + m_TerrainDetailGrass: {fileID: 0} + - rid: 6852985685364965381 + type: {class: UniversalRenderPipelineRuntimeTextures, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 1 + m_BlueNoise64LTex: {fileID: 2800000, guid: e3d24661c1e055f45a7560c033dbb837, type: 3} + m_BayerMatrixTex: {fileID: 2800000, guid: f9ee4ed84c1d10c49aabb9b210b0fc44, type: 3} + m_DebugFontTex: {fileID: 2800000, guid: 26a413214480ef144b2915d6ff4d0beb, type: 3} + - rid: 6852985685364965382 + type: {class: Renderer2DResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_LightShader: {fileID: 4800000, guid: 3f6c848ca3d7bca4bbe846546ac701a1, type: 3} + m_ProjectedShadowShader: {fileID: 4800000, guid: ce09d4a80b88c5a4eb9768fab4f1ee00, type: 3} + m_SpriteShadowShader: {fileID: 4800000, guid: 44fc62292b65ab04eabcf310e799ccf6, type: 3} + m_SpriteUnshadowShader: {fileID: 4800000, guid: de02b375720b5c445afe83cd483bedf3, type: 3} + m_GeometryShadowShader: {fileID: 4800000, guid: 19349a0f9a7ed4c48a27445bcf92e5e1, type: 3} + m_GeometryUnshadowShader: {fileID: 4800000, guid: 77774d9009bb81447b048c907d4c6273, type: 3} + m_CopyDepthPS: {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3} + m_DefaultLitMaterial: {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2} + m_DefaultUnlitMaterial: {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, type: 2} + m_DefaultMaskMaterial: {fileID: 2100000, guid: 15d0c3709176029428a0da2f8cecf0b5, type: 2} + m_DefaultMesh2DLitMaterial: {fileID: 2100000, guid: 9452ae1262a74094f8a68013fbcd1834, type: 2} + - rid: 6852985685364965383 + type: {class: UniversalRenderPipelineEditorMaterials, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_DefaultMaterial: {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_SimpleLitMaterial: {fileID: 2100000, guid: 6a1143ee683302f4aa628c052723efc1, type: 2} + m_DefaultParticleMaterial: {fileID: 2100000, guid: e823cd5b5d27c0f4b8256e7c12ee3e6d, type: 2} + m_DefaultLineMaterial: {fileID: 2100000, guid: e823cd5b5d27c0f4b8256e7c12ee3e6d, type: 2} + m_DefaultTerrainMaterial: {fileID: 2100000, guid: 594ea882c5a793440b60ff72d896021e, type: 2} + m_DefaultDecalMaterial: {fileID: 2100000, guid: 31d0dcc6f2dd4e4408d18036a2c93862, type: 2} + m_DefaultSpriteMaterial: {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, type: 2} + - rid: 6852985685364965384 + type: {class: URPDefaultVolumeProfileSettings, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_VolumeProfile: {fileID: 11400000, guid: ab09877e2e707104187f6f83e2f62510, type: 2} + - rid: 6852985685364965385 + type: {class: RenderGraphSettings, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + - rid: 6852985685364965386 + type: {class: GPUResidentDrawerResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.GPUDriven.Runtime} + data: + m_Version: 0 + m_InstanceDataBufferCopyKernels: {fileID: 7200000, guid: f984aeb540ded8b4fbb8a2047ab5b2e2, type: 3} + m_InstanceDataBufferUploadKernels: {fileID: 7200000, guid: 53864816eb00f2343b60e1a2c5a262ef, type: 3} + m_TransformUpdaterKernels: {fileID: 7200000, guid: 2a567b9b2733f8d47a700c3c85bed75b, type: 3} + m_WindDataUpdaterKernels: {fileID: 7200000, guid: fde76746e4fd0ed418c224f6b4084114, type: 3} + m_OccluderDepthPyramidKernels: {fileID: 7200000, guid: 08b2b5fb307b0d249860612774a987da, type: 3} + m_InstanceOcclusionCullingKernels: {fileID: 7200000, guid: f6d223acabc2f974795a5a7864b50e6c, type: 3} + m_OcclusionCullingDebugKernels: {fileID: 7200000, guid: b23e766bcf50ca4438ef186b174557df, type: 3} + m_DebugOcclusionTestPS: {fileID: 4800000, guid: d3f0849180c2d0944bc71060693df100, type: 3} + m_DebugOccluderPS: {fileID: 4800000, guid: b3c92426a88625841ab15ca6a7917248, type: 3} + - rid: 6852985685364965387 + type: {class: STP/RuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_setupCS: {fileID: 7200000, guid: 33be2e9a5506b2843bdb2bdff9cad5e1, type: 3} + m_preTaaCS: {fileID: 7200000, guid: a679dba8ec4d9ce45884a270b0e22dda, type: 3} + m_taaCS: {fileID: 7200000, guid: 3923900e2b41b5e47bc25bfdcbcdc9e6, type: 3} + - rid: 6852985685364965388 + type: {class: ProbeVolumeBakingResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_Version: 1 + dilationShader: {fileID: 7200000, guid: 6bb382f7de370af41b775f54182e491d, type: 3} + subdivideSceneCS: {fileID: 7200000, guid: bb86f1f0af829fd45b2ebddda1245c22, type: 3} + voxelizeSceneShader: {fileID: 4800000, guid: c8b6a681c7b4e2e4785ffab093907f9e, type: 3} + traceVirtualOffsetCS: {fileID: -6772857160820960102, guid: ff2cbab5da58bf04d82c5f34037ed123, type: 3} + traceVirtualOffsetRT: {fileID: -5126288278712620388, guid: ff2cbab5da58bf04d82c5f34037ed123, type: 3} + skyOcclusionCS: {fileID: -6772857160820960102, guid: 5a2a534753fbdb44e96c3c78b5a6999d, type: 3} + skyOcclusionRT: {fileID: -5126288278712620388, guid: 5a2a534753fbdb44e96c3c78b5a6999d, type: 3} + renderingLayerCS: {fileID: -6772857160820960102, guid: 94a070d33e408384bafc1dea4a565df9, type: 3} + renderingLayerRT: {fileID: -5126288278712620388, guid: 94a070d33e408384bafc1dea4a565df9, type: 3} + - rid: 6852985685364965389 + type: {class: ProbeVolumeGlobalSettings, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_Version: 1 + m_ProbeVolumeDisableStreamingAssets: 0 + - rid: 6852985685364965390 + type: {class: ProbeVolumeDebugResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_Version: 1 + probeVolumeDebugShader: {fileID: 4800000, guid: 3b21275fd12d65f49babb5286f040f2d, type: 3} + probeVolumeFragmentationDebugShader: {fileID: 4800000, guid: 3a80877c579b9144ebdcc6d923bca303, type: 3} + probeVolumeSamplingDebugShader: {fileID: 4800000, guid: bf54e6528c79a224e96346799064c393, type: 3} + probeVolumeOffsetDebugShader: {fileID: 4800000, guid: db8bd7436dc2c5f4c92655307d198381, type: 3} + probeSamplingDebugMesh: {fileID: -3555484719484374845, guid: 20be25aac4e22ee49a7db76fb3df6de2, type: 3} + numbersDisplayTex: {fileID: 2800000, guid: 73fe53b428c5b3440b7e87ee830b608a, type: 3} + - rid: 6852985685364965391 + type: {class: IncludeAdditionalRPAssets, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_version: 0 + m_IncludeReferencedInScenes: 0 + m_IncludeAssetsByLabel: 0 + m_LabelToInclude: + - rid: 6852985685364965392 + type: {class: ShaderStrippingSetting, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_Version: 0 + m_ExportShaderVariants: 1 + m_ShaderVariantLogLevel: 0 + m_StripRuntimeDebugShaders: 1 + - rid: 6852985685364965393 + type: {class: ProbeVolumeRuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_Version: 1 + probeVolumeBlendStatesCS: {fileID: 7200000, guid: a3f7b8c99de28a94684cb1daebeccf5d, type: 3} + probeVolumeUploadDataCS: {fileID: 7200000, guid: 0951de5992461754fa73650732c4954c, type: 3} + probeVolumeUploadDataL2CS: {fileID: 7200000, guid: 6196f34ed825db14b81fb3eb0ea8d931, type: 3} + - rid: 6852985685364965394 + type: {class: RenderGraphGlobalSettings, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_version: 0 + m_EnableCompilationCaching: 1 + m_EnableValidityChecks: 1 + - rid: 8138915168729694208 + type: {class: RayTracingRenderPipelineResources, ns: UnityEngine.Rendering.UnifiedRayTracing, asm: Unity.UnifiedRayTracing.Runtime} + data: + m_Version: 1 + m_GeometryPoolKernels: {fileID: 7200000, guid: 98e3d58cae7210c4786f67f504c9e899, type: 3} + m_CopyBuffer: {fileID: 7200000, guid: 1b95b5dcf48d1914c9e1e7405c7660e3, type: 3} + m_CopyPositions: {fileID: 7200000, guid: 1ad53a96b58d3c3488dde4f14db1aaeb, type: 3} + m_BitHistogram: {fileID: 7200000, guid: 8670f7ce4b60cef43bed36148aa1b0a2, type: 3} + m_BlockReducePart: {fileID: 7200000, guid: 4e034cc8ea2635c4e9f063e5ddc7ea7a, type: 3} + m_BlockScan: {fileID: 7200000, guid: 4d6d5de35fa45ef4a92119397a045cc9, type: 3} + m_BuildHlbvh: {fileID: 7200000, guid: 2d70cd6be91bd7843a39a54b51c15b13, type: 3} + m_RestructureBvh: {fileID: 7200000, guid: 56641cb88dcb31a4398a4997ef7a7a8c, type: 3} + m_Scatter: {fileID: 7200000, guid: a2eaeefdac4637a44b734e85b7be9186, type: 3} + - rid: 8138915168729694209 + type: {class: OnTilePostProcessResource, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_UberPostShader: {fileID: 4800000, guid: fe4f13c1004a07d4ea1e30bfd0326d9e, type: 3} + - rid: 8138915168729694210 + type: {class: URPTerrainShaderSetting, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_IncludeTerrainShaders: 1 + - rid: 8138915168729694211 + type: {class: UniversalRenderPipelineRuntimeTerrainShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_TerrainDetailLit: {fileID: 4800000, guid: f6783ab646d374f94b199774402a5144, type: 3} + m_TerrainDetailGrassBillboard: {fileID: 4800000, guid: 29868e73b638e48ca99a19ea58c48d90, type: 3} + m_TerrainDetailGrass: {fileID: 4800000, guid: e507fdfead5ca47e8b9a768b51c291a1, type: 3} + - rid: 8138915168729694212 + type: {class: VrsRenderPipelineRuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_TextureComputeShader: {fileID: 7200000, guid: cacb30de6c40c7444bbc78cb0a81fd2a, type: 3} + m_VisualizationShader: {fileID: 4800000, guid: 620b55b8040a88d468e94abe55bed5ba, type: 3} + m_VisualizationLookupTable: + m_Data: + - {r: 0.785, g: 0.23, b: 0.2, a: 1} + - {r: 1, g: 0.8, b: 0.8, a: 1} + - {r: 0.4, g: 0.2, b: 0.2, a: 1} + - {r: 0.51, g: 0.8, b: 0.6, a: 1} + - {r: 0.6, g: 0.8, b: 1, a: 1} + - {r: 0.2, g: 0.4, b: 0.6, a: 1} + - {r: 0.8, g: 1, b: 0.8, a: 1} + - {r: 0.2, g: 0.4, b: 0.2, a: 1} + - {r: 0.125, g: 0.22, b: 0.36, a: 1} + m_ConversionLookupTable: + m_Data: + - {r: 0.785, g: 0.23, b: 0.2, a: 1} + - {r: 1, g: 0.8, b: 0.8, a: 1} + - {r: 0.4, g: 0.2, b: 0.2, a: 1} + - {r: 0.51, g: 0.8, b: 0.6, a: 1} + - {r: 0.6, g: 0.8, b: 1, a: 1} + - {r: 0.2, g: 0.4, b: 0.6, a: 1} + - {r: 0.8, g: 1, b: 0.8, a: 1} + - {r: 0.2, g: 0.4, b: 0.2, a: 1} + - {r: 0.125, g: 0.22, b: 0.36, a: 1} + - rid: 8138915168729694213 + type: {class: RenderingDebuggerRuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_version: 0 + m_PanelSettings: {fileID: 11400000, guid: fa69697be3070b04a893666f5947f18c, type: 2} + m_StyleSheets: + - {fileID: 7433441132597879392, guid: 0ff99fd36f66f1a41bcc1d3c90e0922a, type: 3} + - {fileID: 7433441132597879392, guid: 3a8aa4d508da46d4dace18b280f064aa, type: 3} + m_VisualTreeAsset: {fileID: 9197481963319205126, guid: b647ceb1e15264943b9b439971e71110, type: 3} + - rid: 8138915168729694214 + type: {class: LightmapSamplingSettings, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_Version: 1 + m_UseBicubicLightmapSampling: 0 + - rid: 8712630790384254976 + type: {class: RenderGraphUtilsResources, ns: UnityEngine.Rendering.RenderGraphModule.Util, asm: Unity.RenderPipelines.Core.Runtime} + data: + m_Version: 0 + m_CoreCopyPS: {fileID: 4800000, guid: 12dc59547ea167a4ab435097dd0f9add, type: 3} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset.meta b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset.meta new file mode 100644 index 00000000..81b84f2a --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 18dc0cd2c080841dea60987a38ce93fa +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Packages/manifest.json b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Packages/manifest.json new file mode 100644 index 00000000..7d5a2b9a --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Packages/manifest.json @@ -0,0 +1,50 @@ +{ + "dependencies": { + "com.apple.unityplugin.core": "file:../../../Apple.Core/Apple.Core_Unity/Assets/Apple.Core", + "com.unity.ai.navigation": "2.0.13", + "com.unity.collab-proxy": "2.12.4", + "com.unity.ide.rider": "3.0.40", + "com.unity.ide.visualstudio": "2.0.27", + "com.unity.inputsystem": "1.19.0", + "com.unity.multiplayer.center": "1.0.1", + "com.unity.render-pipelines.universal": "17.5.0", + "com.unity.test-framework": "1.7.0", + "com.unity.timeline": "1.8.12", + "com.unity.ugui": "2.5.0", + "com.unity.visualscripting": "1.9.11", + "com.unity.modules.accessibility": "1.0.0", + "com.unity.modules.adaptiveperformance": "1.0.0", + "com.unity.modules.ai": "1.0.0", + "com.unity.modules.androidjni": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.cloth": "1.0.0", + "com.unity.modules.director": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.physicscore2d": "1.0.0", + "com.unity.modules.screencapture": "1.0.0", + "com.unity.modules.terrain": "1.0.0", + "com.unity.modules.terrainphysics": "1.0.0", + "com.unity.modules.tilemap": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.umbra": "1.0.0", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.unitywebrequesttexture": "1.0.0", + "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vectorgraphics": "1.0.0", + "com.unity.modules.vehicles": "1.0.0", + "com.unity.modules.video": "1.0.0", + "com.unity.modules.wind": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } +} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Packages/packages-lock.json b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Packages/packages-lock.json new file mode 100644 index 00000000..e5b4c7f3 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/Packages/packages-lock.json @@ -0,0 +1,476 @@ +{ + "dependencies": { + "com.apple.unityplugin.core": { + "version": "file:../../../Apple.Core/Apple.Core_Unity/Assets/Apple.Core", + "depth": 0, + "source": "local", + "dependencies": {} + }, + "com.unity.ai.navigation": { + "version": "2.0.13", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.modules.ai": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.burst": { + "version": "1.8.29", + "depth": 2, + "source": "registry", + "dependencies": { + "com.unity.mathematics": "1.2.1", + "com.unity.modules.jsonserialize": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.collab-proxy": { + "version": "2.12.4", + "depth": 0, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.collections": { + "version": "6.5.0", + "depth": 2, + "source": "builtin", + "dependencies": { + "com.unity.burst": "1.8.25", + "com.unity.nuget.mono-cecil": "1.11.6", + "com.unity.test-framework": "1.4.6", + "com.unity.test-framework.performance": "3.2.0" + } + }, + "com.unity.ext.nunit": { + "version": "2.1.0", + "depth": 1, + "source": "builtin", + "dependencies": {} + }, + "com.unity.ide.rider": { + "version": "3.0.40", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ext.nunit": "1.0.6" + }, + "url": "https://packages.unity.com" + }, + "com.unity.ide.visualstudio": { + "version": "2.0.27", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.test-framework": "1.1.33" + }, + "url": "https://packages.unity.com" + }, + "com.unity.inputsystem": { + "version": "1.19.0", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.modules.uielements": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.mathematics": { + "version": "1.4.0", + "depth": 3, + "source": "builtin", + "dependencies": {} + }, + "com.unity.multiplayer.center": { + "version": "1.0.1", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.uielements": "1.0.0" + } + }, + "com.unity.nuget.mono-cecil": { + "version": "1.11.6", + "depth": 3, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.render-pipelines.core": { + "version": "17.5.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.burst": "1.8.14", + "com.unity.collections": "2.4.3", + "com.unity.modules.terrain": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.render-pipelines.universal": { + "version": "17.5.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.render-pipelines.core": "17.5.0", + "com.unity.shadergraph": "17.5.0", + "com.unity.render-pipelines.universal-config": "17.5.0" + } + }, + "com.unity.render-pipelines.universal-config": { + "version": "17.5.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.render-pipelines.core": "17.5.0" + } + }, + "com.unity.searcher": { + "version": "4.9.4", + "depth": 2, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.com" + }, + "com.unity.shadergraph": { + "version": "17.5.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.render-pipelines.core": "17.5.0", + "com.unity.searcher": "4.9.3" + } + }, + "com.unity.test-framework": { + "version": "1.7.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.ext.nunit": "2.1.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.test-framework.performance": { + "version": "3.5.0", + "depth": 3, + "source": "registry", + "dependencies": { + "com.unity.test-framework": "1.1.33", + "com.unity.modules.jsonserialize": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.timeline": { + "version": "1.8.12", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.director": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.ugui": { + "version": "2.5.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.physics": "1.0.0" + } + }, + "com.unity.visualscripting": { + "version": "1.9.11", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ugui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + }, + "url": "https://packages.unity.com" + }, + "com.unity.modules.accessibility": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.adaptiveperformance": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.subsystems": "1.0.0" + } + }, + "com.unity.modules.ai": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.androidjni": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.animation": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.assetbundle": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.audio": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.cloth": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0" + } + }, + "com.unity.modules.director": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.animation": "1.0.0" + } + }, + "com.unity.modules.hierarchycore": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.imageconversion": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.imgui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.jsonserialize": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.particlesystem": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.physics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.physics2d": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physicscore2d": "1.0.0" + } + }, + "com.unity.modules.physicscore2d": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.screencapture": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.subsystems": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.terrain": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.terrainphysics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.terrain": "1.0.0" + } + }, + "com.unity.modules.tilemap": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics2d": "1.0.0" + } + }, + "com.unity.modules.ui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.uielements": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.hierarchycore": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.animation": "1.0.0" + } + }, + "com.unity.modules.umbra": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.unityanalytics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.unitywebrequest": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.unitywebrequestassetbundle": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" + } + }, + "com.unity.modules.unitywebrequestaudio": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.audio": "1.0.0" + } + }, + "com.unity.modules.unitywebrequesttexture": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.unitywebrequestwww": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.vectorgraphics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0" + } + }, + "com.unity.modules.vehicles": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0" + } + }, + "com.unity.modules.video": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" + } + }, + "com.unity.modules.wind": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.xr": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.subsystems": "1.0.0" + } + } + } +} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/AudioManager.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/AudioManager.asset new file mode 100644 index 00000000..27287fec --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/AudioManager.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!11 &1 +AudioManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Volume: 1 + Rolloff Scale: 1 + Doppler Factor: 1 + Default Speaker Mode: 2 + m_SampleRate: 0 + m_DSPBufferSize: 1024 + m_VirtualVoiceCount: 512 + m_RealVoiceCount: 32 + m_SpatializerPlugin: + m_AmbisonicDecoderPlugin: + m_DisableAudio: 0 + m_VirtualizeEffects: 1 + m_RequestedDSPBufferSize: 0 diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/ClusterInputManager.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/ClusterInputManager.asset new file mode 100644 index 00000000..e7886b26 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/ClusterInputManager.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!236 &1 +ClusterInputManager: + m_ObjectHideFlags: 0 + m_Inputs: [] diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/DynamicsManager.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/DynamicsManager.asset new file mode 100644 index 00000000..fc90ab95 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/DynamicsManager.asset @@ -0,0 +1,36 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!55 &1 +PhysicsManager: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_Gravity: {x: 0, y: -9.81, z: 0} + m_DefaultMaterial: {fileID: 0} + m_BounceThreshold: 2 + m_SleepThreshold: 0.005 + m_DefaultContactOffset: 0.01 + m_DefaultSolverIterations: 6 + m_DefaultSolverVelocityIterations: 1 + m_QueriesHitBackfaces: 0 + m_QueriesHitTriggers: 1 + m_EnableAdaptiveForce: 0 + m_ClothInterCollisionDistance: 0.1 + m_ClothInterCollisionStiffness: 0.2 + m_ContactsGeneration: 1 + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + m_AutoSimulation: 1 + m_AutoSyncTransforms: 0 + m_ReuseCollisionCallbacks: 1 + m_ClothInterCollisionSettingsToggle: 0 + m_ClothGravity: {x: 0, y: -9.81, z: 0} + m_ContactPairsMode: 0 + m_BroadphaseType: 0 + m_WorldBounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 250, y: 250, z: 250} + m_WorldSubdivisions: 8 + m_FrictionType: 0 + m_EnableEnhancedDeterminism: 0 + m_EnableUnifiedHeightmaps: 1 + m_SolverType: 0 + m_DefaultMaxAngularSpeed: 50 diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/EditorBuildSettings.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/EditorBuildSettings.asset new file mode 100644 index 00000000..d057ba3d --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/EditorBuildSettings.asset @@ -0,0 +1,13 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1045 &1 +EditorBuildSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Scenes: + - enabled: 1 + path: Assets/Scenes/SampleScene.unity + guid: 99c9720ab356a0642a771bea13969a05 + m_configObjects: + com.unity.input.settings.actions: {fileID: -944628639613478452, guid: 052faaac586de48259a63d0c4782560b, type: 3} + m_UseUCBPForAssetBundles: 0 diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/EditorSettings.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/EditorSettings.asset new file mode 100644 index 00000000..878c4cb8 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/EditorSettings.asset @@ -0,0 +1,50 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!159 &1 +EditorSettings: + m_ObjectHideFlags: 0 + serializedVersion: 15 + m_SerializationMode: 2 + m_LineEndingsForNewScripts: 0 + m_DefaultBehaviorMode: 0 + m_PrefabRegularEnvironment: {fileID: 0} + m_PrefabUIEnvironment: {fileID: 0} + m_SpritePackerMode: 0 + m_SpritePackerCacheSize: 10 + m_SpritePackerPaddingPower: 1 + m_Bc7TextureCompressor: 0 + m_EtcTextureCompressorBehavior: 1 + m_EtcTextureFastCompressor: 1 + m_EtcTextureNormalCompressor: 2 + m_EtcTextureBestCompressor: 4 + m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp;asmref + m_ProjectGenerationRootNamespace: + m_EnableTextureStreamingInEditMode: 1 + m_EnableTextureStreamingInPlayMode: 1 + m_EnableEditorAsyncCPUTextureLoading: 0 + m_AsyncShaderCompilation: 1 + m_PrefabModeAllowAutoSave: 1 + m_EnterPlayModeOptionsEnabled: 1 + m_EnterPlayModeOptions: 0 + m_GameObjectNamingDigits: 1 + m_GameObjectNamingScheme: 0 + m_AssetNamingUsesSpace: 1 + m_InspectorUseIMGUIDefaultInspector: 0 + m_UseLegacyProbeSampleCount: 0 + m_SerializeInlineMappingsOnOneLine: 1 + m_DisableCookiesInLightmapper: 0 + m_ShadowmaskStitching: 0 + m_AssetPipelineMode: 1 + m_RefreshImportMode: 0 + m_CacheServerMode: 0 + m_CacheServerEndpoint: + m_CacheServerNamespacePrefix: default + m_CacheServerEnableDownload: 1 + m_CacheServerEnableUpload: 1 + m_CacheServerEnableAuth: 0 + m_CacheServerEnableTls: 0 + m_CacheServerValidationMode: 2 + m_CacheServerDownloadBatchSize: 128 + m_EnableEnlightenBakedGI: 0 + m_ReferencedClipsExactNaming: 1 + m_ForceAssetUnloadAndGCOnSceneLoad: 1 diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/GraphicsSettings.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/GraphicsSettings.asset new file mode 100644 index 00000000..b2f6eb8b --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/GraphicsSettings.asset @@ -0,0 +1,69 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!30 &1 +GraphicsSettings: + m_ObjectHideFlags: 0 + serializedVersion: 16 + m_Deferred: + m_Mode: 1 + m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} + m_DeferredReflections: + m_Mode: 1 + m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} + m_ScreenSpaceShadows: + m_Mode: 1 + m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} + m_DepthNormals: + m_Mode: 1 + m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} + m_MotionVectors: + m_Mode: 1 + m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} + m_LightHalo: + m_Mode: 1 + m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} + m_LensFlare: + m_Mode: 1 + m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} + m_VideoShadersIncludeMode: 2 + m_AlwaysIncludedShaders: + - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0} + m_PreloadedShaders: [] + m_PreloadShadersBatchTimeLimit: -1 + m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + m_CustomRenderPipeline: {fileID: 0} + m_TransparencySortMode: 0 + m_TransparencySortAxis: {x: 0, y: 0, z: 1} + m_DefaultRenderingPath: 1 + m_DefaultMobileRenderingPath: 1 + m_TierSettings: [] + m_LightmapStripping: 0 + m_FogStripping: 0 + m_InstancingStripping: 0 + m_BrgStripping: 2 + m_LightmapKeepPlain: 1 + m_LightmapKeepDirCombined: 1 + m_LightmapKeepDynamicPlain: 1 + m_LightmapKeepDynamicDirCombined: 1 + m_LightmapKeepShadowMask: 1 + m_LightmapKeepSubtractive: 1 + m_FogKeepLinear: 1 + m_FogKeepExp: 1 + m_FogKeepExp2: 1 + m_AlbedoSwatchInfos: [] + m_RenderPipelineGlobalSettingsMap: + UnityEngine.Rendering.Universal.UniversalRenderPipeline: {fileID: 11400000, guid: 18dc0cd2c080841dea60987a38ce93fa, type: 2} + m_ShaderBuildSettings: + keywordDeclarationOverrides: [] + m_LightsUseLinearIntensity: 1 + m_LightsUseColorTemperature: 1 + m_LogWhenShaderIsCompiled: 0 + m_LightProbeOutsideHullStrategy: 0 + m_CameraRelativeLightCulling: 0 + m_CameraRelativeShadowCulling: 0 diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/InputManager.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/InputManager.asset new file mode 100644 index 00000000..b16147e9 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/InputManager.asset @@ -0,0 +1,487 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!13 &1 +InputManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Axes: + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: a + altPositiveButton: d + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: s + altPositiveButton: w + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: mouse 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: mouse 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: mouse 2 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: space + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse X + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse Y + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse ScrollWheel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 2 + joyNum: 0 + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 0 + type: 2 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 1 + type: 2 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 0 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 1 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 2 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 3 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: enter + altNegativeButton: + altPositiveButton: space + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Cancel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: escape + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Enable Debug Button 1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: joystick button 8 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Enable Debug Button 2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: backspace + altNegativeButton: + altPositiveButton: joystick button 9 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Reset + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Next + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: page down + altNegativeButton: + altPositiveButton: joystick button 5 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Previous + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: page up + altNegativeButton: + altPositiveButton: joystick button 4 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Validate + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Persistent + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: right shift + altNegativeButton: + altPositiveButton: joystick button 2 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Multiplier + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: joystick button 3 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 2 + axis: 6 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 2 + axis: 5 + joyNum: 0 diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/MemorySettings.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/MemorySettings.asset new file mode 100644 index 00000000..5b5facec --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/MemorySettings.asset @@ -0,0 +1,35 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!387306366 &1 +MemorySettings: + m_ObjectHideFlags: 0 + m_EditorMemorySettings: + m_MainAllocatorBlockSize: -1 + m_ThreadAllocatorBlockSize: -1 + m_MainGfxBlockSize: -1 + m_ThreadGfxBlockSize: -1 + m_CacheBlockSize: -1 + m_TypetreeBlockSize: -1 + m_ProfilerBlockSize: -1 + m_ProfilerEditorBlockSize: -1 + m_BucketAllocatorGranularity: -1 + m_BucketAllocatorBucketsCount: -1 + m_BucketAllocatorBlockSize: -1 + m_BucketAllocatorBlockCount: -1 + m_ProfilerBucketAllocatorGranularity: -1 + m_ProfilerBucketAllocatorBucketsCount: -1 + m_ProfilerBucketAllocatorBlockSize: -1 + m_ProfilerBucketAllocatorBlockCount: -1 + m_TempAllocatorSizeMain: -1 + m_JobTempAllocatorBlockSize: -1 + m_BackgroundJobTempAllocatorBlockSize: -1 + m_JobTempAllocatorReducedBlockSize: -1 + m_TempAllocatorSizeGIBakingWorker: -1 + m_TempAllocatorSizeNavMeshWorker: -1 + m_TempAllocatorSizeAudioWorker: -1 + m_TempAllocatorSizeCloudWorker: -1 + m_TempAllocatorSizeGfx: -1 + m_TempAllocatorSizeJobWorker: -1 + m_TempAllocatorSizeBackgroundWorker: -1 + m_TempAllocatorSizePreloadManager: -1 + m_PlatformMemorySettings: {} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/MultiplayerManager.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/MultiplayerManager.asset new file mode 100644 index 00000000..2a936644 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/MultiplayerManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!655991488 &1 +MultiplayerManager: + m_ObjectHideFlags: 0 + m_EnableMultiplayerRoles: 0 + m_StrippingTypes: {} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/NavMeshAreas.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/NavMeshAreas.asset new file mode 100644 index 00000000..3b0b7c3d --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/NavMeshAreas.asset @@ -0,0 +1,91 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!126 &1 +NavMeshProjectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + areas: + - name: Walkable + cost: 1 + - name: Not Walkable + cost: 1 + - name: Jump + cost: 2 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + m_LastAgentTypeID: -887442657 + m_Settings: + - serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.75 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_SettingNames: + - Humanoid diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/PackageManagerSettings.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/PackageManagerSettings.asset new file mode 100644 index 00000000..4b3c9237 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/PackageManagerSettings.asset @@ -0,0 +1,44 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_EnablePreReleasePackages: 0 + m_AdvancedSettingsExpanded: 1 + m_ScopedRegistriesSettingsExpanded: 1 + m_SeeAllPackageVersions: 0 + m_DismissPreviewPackagesInUse: 0 + oneTimeWarningShown: 0 + oneTimePackageErrorsPopUpShown: 0 + m_MainRegistry: + m_Id: main + m_Name: + m_Url: https://packages.unity.com + m_Scopes: [] + m_IsDefault: 1 + m_IsUnityRegistry: 1 + m_Capabilities: 7 + m_ConfigSource: 0 + m_Compliance: + m_Status: 0 + m_Violations: [] + m_ScopedRegistries: [] + m_UserSelectedRegistryName: + m_UserAddingNewScopedRegistry: 0 + m_RegistryInfoDraft: + m_Modified: 0 + m_ErrorMessage: + m_UserModificationsEntityId: + m_rawData: 568105589213756514 + m_OriginalEntityId: + m_rawData: 568105589213756512 + m_LoadAssets: 0 diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/Physics2DSettings.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/Physics2DSettings.asset new file mode 100644 index 00000000..47880b1c --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/Physics2DSettings.asset @@ -0,0 +1,56 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!19 &1 +Physics2DSettings: + m_ObjectHideFlags: 0 + serializedVersion: 4 + m_Gravity: {x: 0, y: -9.81} + m_DefaultMaterial: {fileID: 0} + m_VelocityIterations: 8 + m_PositionIterations: 3 + m_VelocityThreshold: 1 + m_MaxLinearCorrection: 0.2 + m_MaxAngularCorrection: 8 + m_MaxTranslationSpeed: 100 + m_MaxRotationSpeed: 360 + m_BaumgarteScale: 0.2 + m_BaumgarteTimeOfImpactScale: 0.75 + m_TimeToSleep: 0.5 + m_LinearSleepTolerance: 0.01 + m_AngularSleepTolerance: 2 + m_DefaultContactOffset: 0.01 + m_JobOptions: + serializedVersion: 2 + useMultithreading: 0 + useConsistencySorting: 0 + m_InterpolationPosesPerJob: 100 + m_NewContactsPerJob: 30 + m_CollideContactsPerJob: 100 + m_ClearFlagsPerJob: 200 + m_ClearBodyForcesPerJob: 200 + m_SyncDiscreteFixturesPerJob: 50 + m_SyncContinuousFixturesPerJob: 50 + m_FindNearestContactsPerJob: 100 + m_UpdateTriggerContactsPerJob: 100 + m_IslandSolverCostThreshold: 100 + m_IslandSolverBodyCostScale: 1 + m_IslandSolverContactCostScale: 10 + m_IslandSolverJointCostScale: 10 + m_IslandSolverBodiesPerJob: 50 + m_IslandSolverContactsPerJob: 50 + m_AutoSimulation: 1 + m_QueriesHitTriggers: 1 + m_QueriesStartInColliders: 1 + m_CallbacksOnDisable: 1 + m_ReuseCollisionCallbacks: 1 + m_AutoSyncTransforms: 0 + m_AlwaysShowColliders: 0 + m_ShowColliderSleep: 1 + m_ShowColliderContacts: 0 + m_ShowColliderAABB: 0 + m_ContactArrowScale: 0.2 + m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} + m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} + m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} + m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/PhysicsCoreProjectSettings2D.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/PhysicsCoreProjectSettings2D.asset new file mode 100644 index 00000000..049c7454 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/PhysicsCoreProjectSettings2D.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!176606843 &1 +PhysicsCoreProjectSettings2D: + m_ObjectHideFlags: 0 + m_PhysicsCoreSettings: {fileID: 0} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/PresetManager.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/PresetManager.asset new file mode 100644 index 00000000..67a94dae --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/PresetManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1386491679 &1 +PresetManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_DefaultPresets: {} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/ProjectSettings.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/ProjectSettings.asset new file mode 100644 index 00000000..a41f0464 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/ProjectSettings.asset @@ -0,0 +1,959 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!129 &1 +PlayerSettings: + m_ObjectHideFlags: 0 + serializedVersion: 28 + productGUID: 086758a48be2e4a8a877ffcc340fb069 + AndroidProfiler: 0 + AndroidFilterTouchesWhenObscured: 0 + AndroidEnableSustainedPerformanceMode: 0 + defaultScreenOrientation: 4 + targetDevice: 2 + useOnDemandResources: 0 + accelerometerFrequency: 60 + companyName: DefaultCompany + productName: Apple.BackgroundAssets_Unity + defaultCursor: {fileID: 0} + cursorHotspot: {x: 0, y: 0} + m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} + m_ShowUnitySplashScreen: 1 + m_ShowUnitySplashLogo: 1 + m_SplashScreenOverlayOpacity: 1 + m_SplashScreenAnimation: 1 + m_SplashScreenLogoStyle: 1 + m_SplashScreenDrawMode: 0 + m_SplashScreenBackgroundAnimationZoom: 1 + m_SplashScreenLogoAnimationZoom: 1 + m_SplashScreenBackgroundLandscapeAspect: 1 + m_SplashScreenBackgroundPortraitAspect: 1 + m_SplashScreenBackgroundLandscapeUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenBackgroundPortraitUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenLogos: [] + m_VirtualRealitySplashScreen: {fileID: 0} + m_HolographicTrackingLossScreen: {fileID: 0} + defaultScreenWidth: 1024 + defaultScreenHeight: 768 + defaultScreenWidthWeb: 960 + defaultScreenHeightWeb: 600 + m_StereoRenderingPath: 0 + m_ActiveColorSpace: 1 + unsupportedMSAAFallback: 0 + m_SpriteBatchMaxVertexCount: 65535 + m_SpriteBatchVertexThreshold: 300 + m_MTRendering: 1 + mipStripping: 0 + numberOfMipsStripped: 0 + numberOfMipsStrippedPerMipmapLimitGroup: {} + m_StackTraceTypes: 010000000100000001000000010000000100000001000000 + iosShowActivityIndicatorOnLoading: -1 + androidShowActivityIndicatorOnLoading: -1 + iosUseCustomAppBackgroundBehavior: 0 + allowedAutorotateToPortrait: 1 + allowedAutorotateToPortraitUpsideDown: 1 + allowedAutorotateToLandscapeRight: 1 + allowedAutorotateToLandscapeLeft: 1 + useOSAutorotation: 1 + use32BitDisplayBuffer: 1 + preserveFramebufferAlpha: 0 + disableDepthAndStencilBuffers: 0 + androidStartInFullscreen: 1 + androidRenderOutsideSafeArea: 1 + androidUseSwappy: 0 + androidDisplayOptions: 1 + androidBlitType: 0 + androidResizeableActivity: 1 + androidDefaultWindowWidth: 1920 + androidDefaultWindowHeight: 1080 + androidMinimumWindowWidth: 400 + androidMinimumWindowHeight: 300 + androidFullscreenMode: 1 + androidAutoRotationBehavior: 1 + androidPredictiveBackSupport: 1 + androidApplicationEntry: 2 + defaultIsNativeResolution: 1 + macRetinaSupport: 1 + runInBackground: 0 + muteOtherAudioSources: 0 + Prepare IOS For Recording: 0 + Force IOS Speakers When Recording: 0 + audioSpatialExperience: 0 + deferSystemGesturesMode: 0 + hideHomeButton: 0 + submitAnalytics: 1 + usePlayerLog: 1 + dedicatedServerOptimizations: 1 + bakeCollisionMeshes: 0 + forceSingleInstance: 0 + useFlipModelSwapchain: 1 + resizableWindow: 0 + useMacAppStoreValidation: 0 + macAppStoreCategory: public.app-category.games + gpuSkinning: 1 + meshDeformation: 2 + xboxPIXTextureCapture: 0 + xboxEnableAvatar: 0 + xboxEnableKinect: 0 + xboxEnableKinectAutoTracking: 0 + xboxEnableFitness: 0 + visibleInBackground: 1 + allowFullscreenSwitch: 1 + fullscreenMode: 1 + xboxSpeechDB: 0 + xboxEnableHeadOrientation: 0 + xboxEnableGuest: 0 + xboxEnablePIXSampling: 0 + metalFramebufferOnly: 0 + xboxOneResolution: 0 + xboxOneSResolution: 0 + xboxOneXResolution: 3 + xboxOneMonoLoggingLevel: 0 + xboxOneLoggingLevel: 1 + xboxOneDisableEsram: 0 + xboxOneEnableTypeOptimization: 0 + xboxOnePresentImmediateThreshold: 0 + switchQueueCommandMemory: 1048576 + switchQueueControlMemory: 16384 + switchQueueComputeMemory: 262144 + switchNVNShaderPoolsGranularity: 33554432 + switchNVNDefaultPoolsGranularity: 16777216 + switchNVNOtherPoolsGranularity: 16777216 + switchGpuScratchPoolGranularity: 2097152 + switchAllowGpuScratchShrinking: 0 + switchNVNMaxPublicTextureIDCount: 0 + switchNVNMaxPublicSamplerIDCount: 0 + switchMaxWorkerMultiple: 8 + switchNVNGraphicsFirmwareMemory: 32 + switchGraphicsJobsSyncAfterKick: 1 + vulkanNumSwapchainBuffers: 3 + vulkanEnableSetSRGBWrite: 0 + vulkanEnablePreTransform: 1 + vulkanEnableLateAcquireNextImage: 0 + vulkanEnableCommandBufferRecycling: 1 + loadStoreDebugModeEnabled: 0 + visionOSBundleVersion: 1.0 + tvOSBundleVersion: 1.0 + bundleVersion: 0.1.0 + preloadedAssets: + - {fileID: -944628639613478452, guid: 052faaac586de48259a63d0c4782560b, type: 3} + metroInputSource: 0 + wsaTransparentSwapchain: 0 + m_HolographicPauseOnTrackingLoss: 1 + xboxOneDisableKinectGpuReservation: 1 + xboxOneEnable7thCore: 1 + vrSettings: + enable360StereoCapture: 0 + isWsaHolographicRemotingEnabled: 0 + enableFrameTimingStats: 0 + enableOpenGLProfilerGPURecorders: 1 + allowHDRDisplaySupport: 0 + useHDRDisplay: 0 + hdrBitDepth: 0 + m_ColorGamuts: 00000000 + targetPixelDensity: 30 + resolutionScalingMode: 0 + resetResolutionOnWindowResize: 0 + androidSupportedAspectRatio: 1 + androidMaxAspectRatio: 2.4 + androidMinAspectRatio: 1 + applicationIdentifier: + Android: com.UnityTechnologies.com.unity.template.urpblank + Standalone: com.Unity-Technologies.com.unity.template.urp-blank + iPhone: com.Unity-Technologies.com.unity.template.urp-blank + buildNumber: + Standalone: 0 + VisionOS: 0 + iPhone: 0 + tvOS: 0 + overrideDefaultApplicationIdentifier: 1 + AndroidBundleVersionCode: 1 + AndroidMinSdkVersion: 25 + AndroidTargetSdkVersion: 0 + AndroidPreferredInstallLocation: 1 + AndroidPreferredDataLocation: 1 + aotOptions: + stripEngineCode: 1 + iPhoneStrippingLevel: 0 + iPhoneScriptCallOptimization: 0 + ForceInternetPermission: 0 + ForceSDCardPermission: 0 + CreateWallpaper: 0 + androidSplitApplicationBinary: 0 + keepLoadedShadersAlive: 0 + StripUnusedMeshComponents: 0 + strictShaderVariantMatching: 0 + VertexChannelCompressionMask: 4054 + iPhoneSdkVersion: 988 + iOSSimulatorArchitecture: 0 + iOSTargetOSVersionString: 18.0 + tvOSSdkVersion: 0 + tvOSSimulatorArchitecture: 0 + tvOSRequireExtendedGameController: 0 + tvOSTargetOSVersionString: 18.0 + VisionOSSdkVersion: 0 + VisionOSTargetOSVersionString: 2.0 + uIPrerenderedIcon: 0 + uIRequiresPersistentWiFi: 0 + uIRequiresFullScreen: 1 + uIStatusBarHidden: 1 + uIExitOnSuspend: 0 + uIStatusBarStyle: 0 + appleTVSplashScreen: {fileID: 0} + appleTVSplashScreen2x: {fileID: 0} + tvOSSmallIconLayers: [] + tvOSSmallIconLayers2x: [] + tvOSLargeIconLayers: [] + tvOSLargeIconLayers2x: [] + tvOSTopShelfImageLayers: [] + tvOSTopShelfImageLayers2x: [] + tvOSTopShelfImageWideLayers: [] + tvOSTopShelfImageWideLayers2x: [] + iOSLaunchScreenType: 0 + iOSLaunchScreenPortrait: {fileID: 0} + iOSLaunchScreenLandscape: {fileID: 0} + iOSLaunchScreenBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreenFillPct: 100 + iOSLaunchScreenSize: 100 + iOSLaunchScreeniPadType: 0 + iOSLaunchScreeniPadImage: {fileID: 0} + iOSLaunchScreeniPadBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreeniPadFillPct: 100 + iOSLaunchScreeniPadSize: 100 + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: + iOSDeviceRequirements: [] + iOSURLSchemes: [] + macOSURLSchemes: [] + iOSBackgroundModes: 0 + iOSMetalForceHardShadows: 0 + metalEditorSupport: 1 + metalAPIValidation: 1 + metalCompileShaderBinary: 0 + iOSRenderExtraFrameOnPause: 0 + iosCopyPluginsCodeInsteadOfSymlink: 0 + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + VisionOSManualSigningProvisioningProfileID: + iOSManualSigningProvisioningProfileType: 0 + tvOSManualSigningProvisioningProfileType: 0 + VisionOSManualSigningProvisioningProfileType: 0 + appleEnableAutomaticSigning: 0 + iOSRequireARKit: 0 + iOSAutomaticallyDetectAndAddCapabilities: 1 + appleEnableProMotion: 0 + shaderPrecisionModel: 0 + clonedFromGUID: 3c72c65a16f0acb438eed22b8b16c24a + templatePackageId: com.unity.template.urp-blank@17.1.0 + templateDefaultScene: Assets/Scenes/SampleScene.unity + useCustomMainManifest: 0 + useCustomLauncherManifest: 0 + useCustomMainGradleTemplate: 0 + useCustomLauncherGradleManifest: 0 + useCustomBaseGradleTemplate: 0 + useCustomGradlePropertiesTemplate: 0 + useCustomGradleSettingsTemplate: 0 + useCustomProguardFile: 0 + AndroidTargetArchitectures: 2 + AndroidAllowedArchitectures: -13 + AndroidSplashScreenScale: 0 + androidSplashScreen: {fileID: 0} + AndroidKeystoreName: + AndroidKeyaliasName: + AndroidEnableArmv9SecurityFeatures: 0 + AndroidEnableArm64MTE: 0 + AndroidBuildApkPerCpuArchitecture: 0 + AndroidTVCompatibility: 0 + AndroidIsGame: 1 + androidAppCategory: 3 + useAndroidAppCategory: 1 + androidAppCategoryOther: + AndroidEnableTango: 0 + androidEnableBanner: 1 + androidUseLowAccuracyLocation: 0 + androidUseCustomKeystore: 0 + m_AndroidBanners: + - width: 320 + height: 180 + banner: {fileID: 0} + androidGamepadSupportLevel: 0 + AndroidMinifyRelease: 0 + AndroidMinifyDebug: 0 + AndroidValidateAppBundleSize: 1 + AndroidAppBundleSizeToValidate: 150 + AndroidReportGooglePlayAppDependencies: 1 + androidSymbolsSizeThreshold: 800 + m_BuildTargetIcons: [] + m_BuildTargetPlatformIcons: + - m_BuildTarget: iPhone + m_Icons: + - m_Textures: [] + m_Width: 180 + m_Height: 180 + m_Kind: 0 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 120 + m_Height: 120 + m_Kind: 0 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 167 + m_Height: 167 + m_Kind: 0 + m_SubKind: iPad + - m_Textures: [] + m_Width: 152 + m_Height: 152 + m_Kind: 0 + m_SubKind: iPad + - m_Textures: [] + m_Width: 76 + m_Height: 76 + m_Kind: 0 + m_SubKind: iPad + - m_Textures: [] + m_Width: 120 + m_Height: 120 + m_Kind: 3 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 80 + m_Height: 80 + m_Kind: 3 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 80 + m_Height: 80 + m_Kind: 3 + m_SubKind: iPad + - m_Textures: [] + m_Width: 40 + m_Height: 40 + m_Kind: 3 + m_SubKind: iPad + - m_Textures: [] + m_Width: 87 + m_Height: 87 + m_Kind: 1 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 58 + m_Height: 58 + m_Kind: 1 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 29 + m_Height: 29 + m_Kind: 1 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 58 + m_Height: 58 + m_Kind: 1 + m_SubKind: iPad + - m_Textures: [] + m_Width: 29 + m_Height: 29 + m_Kind: 1 + m_SubKind: iPad + - m_Textures: [] + m_Width: 60 + m_Height: 60 + m_Kind: 2 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 40 + m_Height: 40 + m_Kind: 2 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 40 + m_Height: 40 + m_Kind: 2 + m_SubKind: iPad + - m_Textures: [] + m_Width: 20 + m_Height: 20 + m_Kind: 2 + m_SubKind: iPad + - m_Textures: [] + m_Width: 1024 + m_Height: 1024 + m_Kind: 4 + m_SubKind: App Store + - m_BuildTarget: Android + m_Icons: + - m_Textures: [] + m_Width: 432 + m_Height: 432 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 324 + m_Height: 324 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 216 + m_Height: 216 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 162 + m_Height: 162 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 108 + m_Height: 108 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 81 + m_Height: 81 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 192 + m_Height: 192 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 144 + m_Height: 144 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 96 + m_Height: 96 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 72 + m_Height: 72 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 48 + m_Height: 48 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 36 + m_Height: 36 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 192 + m_Height: 192 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 144 + m_Height: 144 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 96 + m_Height: 96 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 72 + m_Height: 72 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 48 + m_Height: 48 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 36 + m_Height: 36 + m_Kind: 0 + m_SubKind: + - m_BuildTarget: tvOS + m_Icons: + - m_Textures: [] + m_Width: 1280 + m_Height: 768 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 800 + m_Height: 480 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 400 + m_Height: 240 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 4640 + m_Height: 1440 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 2320 + m_Height: 720 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 3840 + m_Height: 1440 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 1920 + m_Height: 720 + m_Kind: 1 + m_SubKind: + - m_BuildTarget: VisionOS + m_Icons: + - m_Textures: [] + m_Width: 1024 + m_Height: 1024 + m_Kind: 0 + m_SubKind: + m_BuildTargetBatching: + - m_BuildTarget: Standalone + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: iPhone + m_StaticBatching: 1 + m_DynamicBatching: 0 + m_BuildTargetShaderSettings: [] + m_BuildTargetGraphicsJobs: [] + m_BuildTargetGraphicsJobMode: [] + m_BuildTargetGraphicsAPIs: + - m_BuildTarget: iOSSupport + m_APIs: 10000000 + m_Automatic: 1 + - m_BuildTarget: AndroidPlayer + m_APIs: 150000000b000000 + m_Automatic: 0 + m_BuildTargetVRSettings: [] + m_DefaultShaderChunkSizeInMB: 16 + m_DefaultShaderChunkCount: 0 + openGLRequireES31: 0 + openGLRequireES31AEP: 0 + openGLRequireES32: 0 + m_TemplateCustomTags: {} + mobileMTRendering: + Android: 1 + iPhone: 1 + tvOS: 1 + m_BuildTargetGroupLightmapEncodingQuality: + - serializedVersion: 2 + m_BuildTarget: Android + m_EncodingQuality: 1 + m_BuildTargetGroupHDRCubemapEncodingQuality: [] + m_BuildTargetGroupLightmapSettings: [] + m_BuildTargetGroupLoadStoreDebugModeSettings: [] + m_BuildTargetNormalMapEncoding: + - m_BuildTarget: Android + m_Encoding: 1 + m_BuildTargetDefaultTextureCompressionFormat: + - serializedVersion: 3 + m_BuildTarget: Android + m_Formats: 03000000 + - serializedVersion: 3 + m_BuildTarget: iOS + m_Formats: 03000000 + playModeTestRunnerEnabled: 0 + runPlayModeTestAsEditModeTest: 0 + actionOnDotNetUnhandledException: 1 + editorGfxJobOverride: 1 + enableInternalProfiler: 0 + logObjCUncaughtExceptions: 1 + enableCrashReportAPI: 0 + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: + macOSTargetOSVersion: 12.0 + switchNMETAOverride: + switchNetLibKey: + switchSocketMemoryPoolSize: 6144 + switchSocketAllocatorPoolSize: 128 + switchSocketConcurrencyLimit: 14 + switchScreenResolutionBehavior: 2 + switchUseCPUProfiler: 0 + switchEnableFileSystemTrace: 0 + switchLTOSetting: 0 + switchApplicationID: 0x01004b9000490000 + switchNSODependencies: + switchCompilerFlags: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchTitleNames_15: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchPublisherNames_15: + switchIcons_0: {fileID: 0} + switchIcons_1: {fileID: 0} + switchIcons_2: {fileID: 0} + switchIcons_3: {fileID: 0} + switchIcons_4: {fileID: 0} + switchIcons_5: {fileID: 0} + switchIcons_6: {fileID: 0} + switchIcons_7: {fileID: 0} + switchIcons_8: {fileID: 0} + switchIcons_9: {fileID: 0} + switchIcons_10: {fileID: 0} + switchIcons_11: {fileID: 0} + switchIcons_12: {fileID: 0} + switchIcons_13: {fileID: 0} + switchIcons_14: {fileID: 0} + switchIcons_15: {fileID: 0} + switchSmallIcons_0: {fileID: 0} + switchSmallIcons_1: {fileID: 0} + switchSmallIcons_2: {fileID: 0} + switchSmallIcons_3: {fileID: 0} + switchSmallIcons_4: {fileID: 0} + switchSmallIcons_5: {fileID: 0} + switchSmallIcons_6: {fileID: 0} + switchSmallIcons_7: {fileID: 0} + switchSmallIcons_8: {fileID: 0} + switchSmallIcons_9: {fileID: 0} + switchSmallIcons_10: {fileID: 0} + switchSmallIcons_11: {fileID: 0} + switchSmallIcons_12: {fileID: 0} + switchSmallIcons_13: {fileID: 0} + switchSmallIcons_14: {fileID: 0} + switchSmallIcons_15: {fileID: 0} + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: + switchMainThreadStackSize: 1048576 + switchPresenceGroupId: + switchLogoHandling: 0 + switchReleaseVersion: 0 + switchDisplayVersion: 1.0.0 + switchStartupUserAccount: 0 + switchSupportedLanguagesMask: 0 + switchLogoType: 0 + switchApplicationErrorCodeCategory: + switchUserAccountSaveDataSize: 0 + switchUserAccountSaveDataJournalSize: 0 + switchApplicationAttribute: 0 + switchCardSpecSize: -1 + switchCardSpecClock: -1 + switchRatingsMask: 0 + switchRatingsInt_0: 0 + switchRatingsInt_1: 0 + switchRatingsInt_2: 0 + switchRatingsInt_3: 0 + switchRatingsInt_4: 0 + switchRatingsInt_5: 0 + switchRatingsInt_6: 0 + switchRatingsInt_7: 0 + switchRatingsInt_8: 0 + switchRatingsInt_9: 0 + switchRatingsInt_10: 0 + switchRatingsInt_11: 0 + switchRatingsInt_12: 0 + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: + switchParentalControl: 0 + switchAllowsScreenshot: 1 + switchAllowsVideoCapturing: 1 + switchAllowsRuntimeAddOnContentInstall: 0 + switchDataLossConfirmation: 0 + switchUserAccountLockEnabled: 0 + switchSystemResourceMemory: 16777216 + switchSupportedNpadStyles: 22 + switchNativeFsCacheSize: 32 + switchIsHoldTypeHorizontal: 0 + switchSupportedNpadCount: 8 + switchEnableTouchScreen: 1 + switchSocketConfigEnabled: 0 + switchTcpInitialSendBufferSize: 32 + switchTcpInitialReceiveBufferSize: 64 + switchTcpAutoSendBufferSizeMax: 256 + switchTcpAutoReceiveBufferSizeMax: 256 + switchUdpSendBufferSize: 9 + switchUdpReceiveBufferSize: 42 + switchSocketBufferEfficiency: 4 + switchSocketInitializeEnabled: 1 + switchNetworkInterfaceManagerInitializeEnabled: 1 + switchDisableHTCSPlayerConnection: 0 + switchUseNewStyleFilepaths: 0 + switchUseLegacyFmodPriorities: 0 + switchUseMicroSleepForYield: 1 + switchEnableRamDiskSupport: 0 + switchMicroSleepForYieldTime: 25 + switchRamDiskSpaceSize: 12 + switchUpgradedPlayerSettingsToNMETA: 0 + ps4NPAgeRating: 12 + ps4NPTitleSecret: + ps4NPTrophyPackPath: + ps4ParentalLevel: 11 + ps4ContentID: ED1633-NPXX51362_00-0000000000000000 + ps4Category: 0 + ps4MasterVersion: 01.00 + ps4AppVersion: 01.00 + ps4AppType: 0 + ps4ParamSfxPath: + ps4VideoOutPixelFormat: 0 + ps4VideoOutInitialWidth: 1920 + ps4VideoOutBaseModeInitialWidth: 1920 + ps4VideoOutReprojectionRate: 60 + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: + ps4RemotePlayKeyAssignment: -1 + ps4RemotePlayKeyMappingDir: + ps4PlayTogetherPlayerCount: 0 + ps4EnterButtonAssignment: 2 + ps4ApplicationParam1: 0 + ps4ApplicationParam2: 0 + ps4ApplicationParam3: 0 + ps4ApplicationParam4: 0 + ps4DownloadDataSize: 0 + ps4GarlicHeapSize: 2048 + ps4ProGarlicHeapSize: 2560 + playerPrefsMaxSize: 32768 + ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ + ps4pnSessions: 1 + ps4pnPresence: 1 + ps4pnFriends: 1 + ps4pnGameCustomData: 1 + playerPrefsSupport: 0 + enableApplicationExit: 0 + resetTempFolder: 1 + restrictedAudioUsageRights: 0 + ps4UseResolutionFallback: 0 + ps4ReprojectionSupport: 0 + ps4UseAudio3dBackend: 0 + ps4UseLowGarlicFragmentationMode: 1 + ps4SocialScreenEnabled: 0 + ps4ScriptOptimizationLevel: 2 + ps4Audio3dVirtualSpeakerCount: 14 + ps4attribCpuUsage: 0 + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: + ps4PatchDayOne: 0 + ps4attribUserManagement: 0 + ps4attribMoveSupport: 0 + ps4attrib3DSupport: 0 + ps4attribShareSupport: 0 + ps4attribExclusiveVR: 0 + ps4disableAutoHideSplash: 0 + ps4videoRecordingFeaturesUsed: 0 + ps4contentSearchFeaturesUsed: 0 + ps4CompatibilityPS5: 0 + ps4AllowPS5Detection: 0 + ps4GPU800MHz: 1 + ps4attribEyeToEyeDistanceSettingVR: 0 + ps4IncludedModules: [] + ps4attribVROutputEnabled: 0 + monoEnv: + splashScreenBackgroundSourceLandscape: {fileID: 0} + splashScreenBackgroundSourcePortrait: {fileID: 0} + blurSplashScreenBackground: 1 + spritePackerPolicy: + webGLMemorySize: 32 + webGLExceptionSupport: 1 + webGLNameFilesAsHashes: 0 + webGLShowDiagnostics: 0 + webGLDataCaching: 1 + webGLDebugSymbols: 0 + webGLEmscriptenArgs: + webGLModulesDirectory: + webGLTemplate: APPLICATION:Default + webGLAnalyzeBuildSize: 0 + webGLUseEmbeddedResources: 0 + webGLCompressionFormat: 0 + webGLWasmArithmeticExceptions: 0 + webGLLinkerTarget: 1 + webGLThreadsSupport: 0 + webGLDecompressionFallback: 0 + webGLInitialMemorySize: 32 + webGLMaximumMemorySize: 2048 + webGLMemoryGrowthMode: 2 + webGLMemoryLinearGrowthStep: 16 + webGLMemoryGeometricGrowthStep: 0.2 + webGLMemoryGeometricGrowthCap: 96 + webGLPowerPreference: 2 + webGLWebAssemblyTable: 0 + webGLWebAssemblyBigInt: 0 + webGLCloseOnQuit: 0 + webWasm2023: 0 + webEnableSubmoduleStrippingCompatibility: 0 + scriptingDefineSymbols: {} + additionalCompilerArguments: {} + platformArchitecture: {} + scriptingBackend: + Android: 1 + il2cppCompilerConfiguration: {} + il2cppCodeGeneration: {} + il2cppStacktraceInformation: {} + managedStrippingLevel: {} + incrementalIl2cppBuild: {} + suppressCommonWarnings: 1 + allowUnsafeCode: 1 + useDeterministicCompilation: 1 + additionalIl2CppArgs: + scriptingRuntimeVersion: 1 + gcIncremental: 1 + gcWBarrierValidation: 0 + apiCompatibilityLevelPerPlatform: {} + editorAssembliesCompatibilityLevel: 1 + m_RenderingPath: 1 + m_MobileRenderingPath: 1 + metroPackageName: Apple.BackgroundAssets_Unity + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: + metroCertificateNotAfter: 0000000000000000 + metroApplicationDescription: Apple.BackgroundAssets_Unity + wsaImages: {} + metroTileShortName: + metroTileShowName: 0 + metroMediumTileShowName: 0 + metroLargeTileShowName: 0 + metroWideTileShowName: 0 + metroSupportStreamingInstall: 0 + metroLastRequiredScene: 0 + metroDefaultTileSize: 1 + metroTileForegroundText: 2 + metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} + metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1} + metroSplashScreenUseBackgroundColor: 0 + syncCapabilities: 0 + platformCapabilities: {} + metroTargetDeviceFamilies: {} + metroFTAName: + metroFTAFileTypes: [] + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: + XboxOneVersion: 1.0.0.0 + XboxOnePackageEncryption: 0 + XboxOnePackageUpdateGranularity: 2 + XboxOneDescription: + XboxOneLanguage: + - enus + XboxOneCapability: [] + XboxOneGameRating: {} + XboxOneIsContentPackage: 0 + XboxOneEnhancedXboxCompatibilityMode: 0 + XboxOneEnableGPUVariability: 1 + XboxOneSockets: {} + XboxOneSplashScreen: {fileID: 0} + XboxOneAllowedProductIds: [] + XboxOnePersistentLocalStorageSize: 0 + XboxOneXTitleMemory: 8 + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: + vrEditorSettings: {} + cloudServicesEnabled: {} + luminIcon: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: + luminCert: + m_CertPath: + m_SignPackage: 1 + luminIsChannelApp: 0 + luminVersion: + m_VersionCode: 1 + m_VersionName: + hmiPlayerDataPath: + hmiForceSRGBBlit: 1 + embeddedLinuxEnableGamepadInput: 0 + hmiCpuConfiguration: + hmiLogStartupTiming: 0 + qnxGraphicConfPath: + apiCompatibilityLevel: 6 + captureStartupLogs: {} + activeInputHandler: 1 + windowsGamepadBackendHint: 0 + cloudProjectId: + framebufferDepthMemorylessMode: 0 + qualitySettingsNames: [] + projectName: + organizationId: + cloudEnabled: 0 + legacyClampBlendShapeWeights: 0 + hmiLoadingImage: {fileID: 0} + platformRequiresReadableAssets: 0 + virtualTexturingSupportEnabled: 0 + insecureHttpOption: 0 + androidVulkanDenyFilterList: [] + androidVulkanAllowFilterList: [] + androidVulkanDeviceFilterListAsset: {fileID: 0} + d3d12DeviceFilterListAsset: {fileID: 0} + allowedHttpConnections: 3 diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/ProjectVersion.txt b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/ProjectVersion.txt new file mode 100644 index 00000000..c1608124 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/ProjectVersion.txt @@ -0,0 +1,2 @@ +m_EditorVersion: 6000.5.2f1 +m_EditorVersionWithRevision: 6000.5.2f1 (eb73d3b415a1) diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/QualitySettings.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/QualitySettings.asset new file mode 100644 index 00000000..06e9a342 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/QualitySettings.asset @@ -0,0 +1,135 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!47 &1 +QualitySettings: + m_ObjectHideFlags: 0 + serializedVersion: 5 + m_CurrentQuality: 1 + m_QualitySettings: + - serializedVersion: 4 + name: Mobile + pixelLightCount: 2 + shadows: 2 + shadowResolution: 1 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 40 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + skinWeights: 2 + globalTextureMipmapLimit: 0 + textureMipmapLimitSettings: [] + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 1 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 1 + useLegacyDetailDistribution: 1 + adaptiveVsync: 0 + vSyncCount: 0 + realtimeGICPUUsage: 100 + adaptiveVsyncExtraA: 0 + adaptiveVsyncExtraB: 0 + lodBias: 1 + maximumLODLevel: 0 + enableLODCrossFade: 1 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 256 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 11400000, guid: 5e6cbd92db86f4b18aec3ed561671858, type: 2} + terrainQualityOverrides: 0 + terrainPixelError: 1 + terrainDetailDensityScale: 1 + terrainBasemapDistance: 1000 + terrainDetailDistance: 80 + terrainTreeDistance: 5000 + terrainBillboardStart: 50 + terrainFadeLength: 5 + terrainMaxTrees: 50 + excludedTargetPlatforms: + - Standalone + - serializedVersion: 4 + name: PC + pixelLightCount: 2 + shadows: 2 + shadowResolution: 1 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 40 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + skinWeights: 4 + globalTextureMipmapLimit: 0 + textureMipmapLimitSettings: [] + anisotropicTextures: 2 + antiAliasing: 0 + softParticles: 0 + softVegetation: 1 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 1 + useLegacyDetailDistribution: 1 + adaptiveVsync: 0 + vSyncCount: 0 + realtimeGICPUUsage: 100 + adaptiveVsyncExtraA: 0 + adaptiveVsyncExtraB: 0 + lodBias: 2 + maximumLODLevel: 0 + enableLODCrossFade: 1 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 256 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 11400000, guid: 4b83569d67af61e458304325a23e5dfd, type: 2} + terrainQualityOverrides: 0 + terrainPixelError: 1 + terrainDetailDensityScale: 1 + terrainBasemapDistance: 1000 + terrainDetailDistance: 80 + terrainTreeDistance: 5000 + terrainBillboardStart: 50 + terrainFadeLength: 5 + terrainMaxTrees: 50 + excludedTargetPlatforms: + - Android + - iPhone + m_TextureMipmapLimitGroupNames: [] + m_PerPlatformDefaultQuality: + Android: 0 + AndroidXR: 0 + GameCoreScarlett: 1 + GameCoreXboxOne: 1 + Lumin: 0 + MetaQuest: 0 + Nintendo Switch: 1 + Nintendo Switch 2: 1 + PS4: 1 + PS5: 1 + Server: 0 + Stadia: 0 + Standalone: 1 + WebGL: 0 + Windows Store Apps: 0 + XboxOne: 0 + iPhone: 0 + tvOS: 0 diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/ShaderGraphSettings.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/ShaderGraphSettings.asset new file mode 100644 index 00000000..ce8c2432 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/ShaderGraphSettings.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: de02f9e1d18f588468e474319d09a723, type: 3} + m_Name: + m_EditorClassIdentifier: + shaderVariantLimit: 128 + overrideShaderVariantLimit: 0 + customInterpolatorErrorThreshold: 32 + customInterpolatorWarningThreshold: 16 + customHeatmapValues: {fileID: 0} diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/TagManager.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/TagManager.asset new file mode 100644 index 00000000..6413d11f --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/TagManager.asset @@ -0,0 +1,76 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!78 &1 +TagManager: + serializedVersion: 2 + tags: [] + layers: + - Default + - TransparentFX + - Ignore Raycast + - + - Water + - UI + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + m_SortingLayers: + - name: Default + uniqueID: 0 + locked: 0 + m_RenderingLayers: + - Default + - Light Layer 1 + - Light Layer 2 + - Light Layer 3 + - Light Layer 4 + - Light Layer 5 + - Light Layer 6 + - Light Layer 7 + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/TimeManager.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/TimeManager.asset new file mode 100644 index 00000000..558a017e --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/TimeManager.asset @@ -0,0 +1,9 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!5 &1 +TimeManager: + m_ObjectHideFlags: 0 + Fixed Timestep: 0.02 + Maximum Allowed Timestep: 0.33333334 + m_TimeScale: 1 + Maximum Particle Timestep: 0.03 diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/URPProjectSettings.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/URPProjectSettings.asset new file mode 100644 index 00000000..64a8674a --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/URPProjectSettings.asset @@ -0,0 +1,15 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 247994e1f5a72c2419c26a37e9334c01, type: 3} + m_Name: + m_EditorClassIdentifier: + m_LastMaterialVersion: 10 diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/UnityConnectSettings.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/UnityConnectSettings.asset new file mode 100644 index 00000000..029ad8b9 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/UnityConnectSettings.asset @@ -0,0 +1,40 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!310 &1 +UnityConnectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 1 + m_Enabled: 0 + m_TestMode: 0 + m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events + m_EventUrl: https://cdp.cloud.unity3d.com/v1/events + m_ConfigUrl: https://config.uca.cloud.unity3d.com + m_DashboardUrl: https://dashboard.unity3d.com + m_TestInitMode: 0 + InsightsSettings: + m_EngineDiagnosticsEnabled: 1 + m_Enabled: 0 + CrashReportingSettings: + serializedVersion: 2 + m_EventUrl: https://perf-events.cloud.unity3d.com + m_EnableCloudDiagnosticsReporting: 0 + m_LogBufferSize: 10 + m_CaptureEditorExceptions: 1 + UnityPurchasingSettings: + m_Enabled: 0 + m_TestMode: 0 + UnityAnalyticsSettings: + m_Enabled: 0 + m_TestMode: 0 + m_InitializeOnStartup: 1 + m_PackageRequiringCoreStatsPresent: 0 + UnityAdsSettings: + m_Enabled: 0 + m_InitializeOnStartup: 1 + m_TestMode: 0 + m_IosGameId: + m_AndroidGameId: + m_GameIds: {} + m_GameId: + PerformanceReportingSettings: + m_Enabled: 0 diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/VFXManager.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/VFXManager.asset new file mode 100644 index 00000000..3a95c98b --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/VFXManager.asset @@ -0,0 +1,12 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!937362698 &1 +VFXManager: + m_ObjectHideFlags: 0 + m_IndirectShader: {fileID: 0} + m_CopyBufferShader: {fileID: 0} + m_SortShader: {fileID: 0} + m_StripUpdateShader: {fileID: 0} + m_RenderPipeSettingsPath: + m_FixedTimeStep: 0.016666668 + m_MaxDeltaTime: 0.05 diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/VersionControlSettings.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/VersionControlSettings.asset new file mode 100644 index 00000000..dca28814 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/VersionControlSettings.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!890905787 &1 +VersionControlSettings: + m_ObjectHideFlags: 0 + m_Mode: Visible Meta Files + m_CollabEditorSettings: + inProgressEnabled: 1 diff --git a/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/XRSettings.asset b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/XRSettings.asset new file mode 100644 index 00000000..482590c1 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Apple.BackgroundAssets_Unity/ProjectSettings/XRSettings.asset @@ -0,0 +1,10 @@ +{ + "m_SettingKeys": [ + "VR Device Disabled", + "VR Device User Alert" + ], + "m_SettingValues": [ + "False", + "False" + ] +} \ No newline at end of file diff --git a/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/AssetPack.swift b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/AssetPack.swift new file mode 100644 index 00000000..699b356a --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/AssetPack.swift @@ -0,0 +1,101 @@ +// +// AssetPack.swift +// Background Assets Wrapper +// +// Created by Gabriel Jacoby-Cooper on 4/20/26. +// Copyright © 2026 Apple. All rights reserved. +// + +import BackgroundAssets + +extension baw_assetpack { + + init(_ assetPack: AssetPack) { + let pointer = UnsafeMutablePointer.allocate(capacity: 1) + pointer.initialize(to: assetPack) + self.init(impl: pointer) + } + + func deinitialize() { + self.impl? + .assumingMemoryBound(to: AssetPack.self) + .deinitialize(count: 1) + .deallocate() + } + +} + +extension AssetPack { + + init?(_ cAssetPack: baw_assetpack) { + guard let assetPack = cAssetPack.impl?.load(as: Self.self) else { + return nil + } + self = assetPack + } + +} + +@c @implementation +public func baw_assetpack_deinit(_ cAssetPack: baw_assetpack) { + cAssetPack.deinitialize() +} + +@c @implementation +public func baw_assetpack_is_nonnull(_ cAssetPack: baw_assetpack) -> CBool { + return cAssetPack.impl != nil +} + +@c @implementation +public func baw_assetpack_id(_ cAssetPack: baw_assetpack) -> UnsafeMutablePointer? { + return AssetPack(cAssetPack)?.id.cStringCopy +} + +@c @implementation +public func baw_assetpack_id_deinit(_ cID: UnsafeMutablePointer?) { + guard let cID else { + return + } + let count = strlen(cID) + 1 + cID + .deinitialize(count: count) + .deallocate() +} + +@c @implementation +public func baw_assetpack_downloadsize(_ cAssetPack: baw_assetpack) -> Int { + return AssetPack(cAssetPack)?.downloadSize ?? 0 +} + +@c @implementation +public func baw_assetpack_version(_ cAssetPack: baw_assetpack) -> UInt16 { + return (AssetPack(cAssetPack)?.version).map(UInt16.init(_:)) ?? 0 +} + +@c @implementation +public func baw_assetpack_lang(_ cAssetPack: baw_assetpack) -> baw_lang { + guard #available(iOS 27, macOS 27, tvOS 27, visionOS 27, *) else { + return baw_lang() + } + return baw_lang(AssetPack(cAssetPack)?.language) +} + +@c @implementation +public func baw_assetpack_userinfo( + _ cAssetPack: baw_assetpack, + _ userInfoPointer: UnsafeMutableRawPointer?, + _ userInfoCount: UnsafeMutablePointer? +) { + guard let userInfoPointer, let userInfoCount else { + return + } + guard let userInfo = AssetPack(cAssetPack)?.userInfo else { + userInfoCount.pointee = 0 + return + } + userInfoCount.pointee = min(userInfo.count, userInfoCount.pointee) + userInfo.copyBytes( + to: userInfoPointer.assumingMemoryBound(to: UInt8.self), + count: userInfoCount.pointee + ) +} diff --git a/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/AssetPackManager.swift b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/AssetPackManager.swift new file mode 100644 index 00000000..a7458b5f --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/AssetPackManager.swift @@ -0,0 +1,531 @@ +// +// AssetPackManager.swift +// Background Assets Wrapper +// +// Created by Gabriel Jacoby-Cooper on 3/26/26. +// Copyright © 2026 Apple. All rights reserved. +// + +private import BackgroundAssets +private import Synchronization +private import System + +fileprivate final class DownloadStatusUpdatesObserver: Sendable { + + struct ContextPointerWrapper: Sendable { + + nonisolated(unsafe) let contextPointer: UnsafeMutableRawPointer? + + init(_ contextPointer: UnsafeMutableRawPointer?) { + self.contextPointer = contextPointer + } + + } + + static let shared = DownloadStatusUpdatesObserver() + + let handlers = Mutex<[String?: [(@convention(c) (baw_assetpackmanager_downloadstatusupdate, UnsafeMutableRawPointer?) -> Void, ContextPointerWrapper)]]>([:]) + + init() { + Task { + for await statusUpdate in await AssetPackManager.shared.statusUpdates { + self.handlers.withLock { (handlers) in + func callHandlers( + for assetPack: AssetPack, + kind cKind: baw_assetpackmanager_downloadstatusupdate_kind, + with cPayload: baw_assetpackmanager_downloadstatusupdate.__Unnamed_union_payload + ) { + for (handler, contextPointerWrapper) in handlers[nil] ?? [] + (handlers[assetPack.id] ?? []) { + handler( + baw_assetpackmanager_downloadstatusupdate( + kind: cKind, + assetpack: baw_assetpack(assetPack), + payload: cPayload + ), + contextPointerWrapper.contextPointer + ) + } + } + + switch statusUpdate { + case .began(let assetPack): + callHandlers( + for: assetPack, + kind: baw_assetpackmanager_downloadstatusupdate_kind_began, + with: baw_assetpackmanager_downloadstatusupdate.__Unnamed_union_payload() + ) + case .paused(let assetPack): + callHandlers( + for: assetPack, + kind: baw_assetpackmanager_downloadstatusupdate_kind_paused, + with: baw_assetpackmanager_downloadstatusupdate.__Unnamed_union_payload() + ) + case .downloading(let assetPack, let progress): + callHandlers( + for: assetPack, + kind: baw_assetpackmanager_downloadstatusupdate_kind_downloading, + with: baw_assetpackmanager_downloadstatusupdate.__Unnamed_union_payload(progress: progress.fractionCompleted) + ) + case .finished(let assetPack): + callHandlers( + for: assetPack, + kind: baw_assetpackmanager_downloadstatusupdate_kind_finished, + with: baw_assetpackmanager_downloadstatusupdate.__Unnamed_union_payload() + ) + case .failed(let assetPack, let error): + callHandlers( + for: assetPack, + kind: baw_assetpackmanager_downloadstatusupdate_kind_failed, + with: baw_assetpackmanager_downloadstatusupdate.__Unnamed_union_payload(err: baw_err(error)) + ) + @unknown default: + break + } + } + } + } + } + +} + +@c @implementation +public func baw_assetpackmanager_downloadstatusupdates( + _ cID: UnsafePointer?, + _ contextPointer: UnsafeMutableRawPointer?, + _ handler: (@convention(c) (baw_assetpackmanager_downloadstatusupdate, UnsafeMutableRawPointer?) -> Void)? +) { + guard let handler else { + return + } + + let contextPointerWrapper = DownloadStatusUpdatesObserver.ContextPointerWrapper(contextPointer) + DownloadStatusUpdatesObserver.shared.handlers.withLock { (handlers) in + handlers[cID.map(String.init(cString:)), default: []].append((handler, contextPointerWrapper)) + } +} + +@c @implementation +public func baw_assetpackmanager_manifest( + _ contextPointer: UnsafeMutableRawPointer?, + _ completionHandler: (@convention(c) (baw_assetpackmanifest_res, baw_res_kind, UnsafeMutableRawPointer?) -> Void)? +) { + nonisolated(unsafe) let contextPointer = contextPointer + Task { + guard let completionHandler else { + return + } + do { + if #available(iOS 27, macOS 27, tvOS 27, visionOS 27, *) { + let cManifest: baw_assetpackmanifest + do { + cManifest = baw_assetpackmanifest(try await AssetPackManager.shared.manifest) + completionHandler( + baw_assetpackmanifest_res( + success: cManifest + ), + baw_res_kind_success, + contextPointer + ) + } + } else { + let assetPacks = Array(try await AssetPackManager.shared.allAssetPacks) + let buffer = UnsafeMutableBufferPointer.allocate(capacity: assetPacks.count) + let initializedCount = buffer.initialize(fromContentsOf: assetPacks.map(baw_assetpack.init(_:))) + assert(initializedCount == buffer.count) + completionHandler( + baw_assetpackmanifest_res( + success: baw_assetpackmanifest( + compat: baw_assetpackmanifest_compat( + assetpackc: buffer.count, + assetpackv: buffer.baseAddress + ) + ) + ), + baw_res_kind_success, + contextPointer + ) + } + } catch { + completionHandler( + baw_assetpackmanifest_res( + failure: baw_err(error) + ), + baw_res_kind_failure, + contextPointer + ) + } + } +} + +@c @implementation +public func baw_assetpackmanager_assetpack_status( + _ cAssetPack: baw_assetpack, + _ contextPointer: UnsafeMutableRawPointer?, + _ completionHandler: (@convention(c) (baw_assetpack_status_res, baw_res_kind, UnsafeMutableRawPointer?) -> Void)? +) { + guard let assetPack = AssetPack(cAssetPack) else { + completionHandler?( + baw_assetpack_status_res(success: 0), + baw_res_kind_success, + contextPointer + ) + return + } + nonisolated(unsafe) let contextPointer = contextPointer + Task { + guard let completionHandler else { + return + } + do { + let status = if #available(iOS 26.4, macOS 26.4, tvOS 26.4, visionOS 26.4, *) { + try await AssetPackManager.shared.status(relativeTo: assetPack) + } else { + try await AssetPackManager.shared.status(ofAssetPackWithID: assetPack.id) + } + completionHandler( + baw_assetpack_status_res(success: UInt8(status.rawValue)), + baw_res_kind_success, + contextPointer + ) + } catch { + completionHandler( + baw_assetpack_status_res(failure: baw_err(error)), + baw_res_kind_failure, + contextPointer + ) + } + } +} + +@c @implementation +public func baw_assetpackmanager_assetpack_status_local( + _ cID: UnsafePointer?, + _ contextPointer: UnsafeMutableRawPointer?, + _ completionHandler: (@convention(c) (UInt8, UnsafeMutableRawPointer?) -> Void)? +) { + guard #available(iOS 26.4, macOS 26.4, tvOS 26.4, visionOS 26.4, *), let cID else { + completionHandler?(0, contextPointer) + return + } + let id = String(cString: cID) + nonisolated(unsafe) let contextPointer = contextPointer + Task { + completionHandler?( + UInt8( + await AssetPackManager.shared.localStatus(ofAssetPackWithID: id).rawValue + ), + contextPointer + ) + } +} + +@c @implementation +public func baw_assetpackmanager_assetpack_local(_ cID: UnsafePointer?) -> CBool { + guard #available(iOS 26.4, macOS 26.4, tvOS 26.4, visionOS 26.4, *), let cID else { + return false + } + return AssetPackManager.shared.assetPackIsAvailableLocally( + withID: String(cString: cID) + ) +} + +@c @implementation +public func baw_assetpackmanager_assetpack_local_ensure( + _ cAssetPack: baw_assetpack, + _ contextPointer: UnsafeMutableRawPointer?, + _ completionHandler: (@convention(c) (baw_err, baw_res_kind, UnsafeMutableRawPointer?) -> Void)? +) { + guard let assetPack = AssetPack(cAssetPack) else { + completionHandler?(.missing, baw_res_kind_failure, contextPointer) + return + } + nonisolated(unsafe) let contextPointer = contextPointer + Task { + do { + if #available(iOS 26.4, macOS 26.4, tvOS 26.4, visionOS 26.4, *) { + try await AssetPackManager.shared.ensureLocalAvailability(of: assetPack) + } else { + try await AssetPackManager.shared.ensureLocalAvailability(of: assetPack) + } + } catch { + completionHandler?(baw_err(error), baw_res_kind_failure, contextPointer) + } + } +} + +@c @implementation +public func baw_assetpackmanager_assetpack_local_ensure_update( + _ cAssetPack: baw_assetpack, + _ shouldUpdate: CBool, + _ contextPointer: UnsafeMutableRawPointer?, + _ completionHandler: (@convention(c) (baw_err, baw_res_kind, UnsafeMutableRawPointer?) -> Void)? +) { + guard #available(iOS 26.4, macOS 26.4, tvOS 26.4, visionOS 26.4, *) else { + completionHandler?(.operationUnavailable, baw_res_kind_failure, contextPointer) + return + } + guard let assetPack = AssetPack(cAssetPack) else { + completionHandler?(.missing, baw_res_kind_failure, contextPointer) + return + } + nonisolated(unsafe) let contextPointer = contextPointer + Task { + do { + try await AssetPackManager.shared.ensureLocalAvailability(of: assetPack, requireLatestVersion: shouldUpdate) + } catch { + completionHandler?(baw_err(error), baw_res_kind_failure, contextPointer) + } + } +} + +@c @implementation +public func baw_assetpackmanager_assetpack_local_ensure_updatev( + _ cAssetPacksCount: Int, + _ cAssetPacksPointer: UnsafePointer?, + _ shouldUpdate: CBool, + _ contextPointer: UnsafeMutableRawPointer?, + _ completionHandler: (@convention(c) (baw_err, baw_res_kind, UnsafeMutableRawPointer?) -> Void)? +) { + guard #available(iOS 27, macOS 27, tvOS 27, visionOS 27, *) else { + completionHandler?(.operationUnavailable, baw_res_kind_failure, contextPointer) + return + } + guard let cAssetPacksPointer else { + completionHandler?(.missing, baw_res_kind_failure, contextPointer) + return + } + let assetPacks = Set(UnsafeBufferPointer(start: cAssetPacksPointer, count: cAssetPacksCount).compactMap(AssetPack.init(_:))) + nonisolated(unsafe) let contextPointer = contextPointer + Task { + do { + try await AssetPackManager.shared.ensureLocalAvailability(of: assetPacks, requireLatestVersions: shouldUpdate) + } catch { + completionHandler?(baw_err(error), baw_res_kind_failure, contextPointer) + } + } +} + +@c @implementation +public func baw_assetpackmanager_assetpack_update( + _ contextPointer: UnsafeMutableRawPointer?, + _ completionHandler: (@convention(c) (baw_assetpackmanager_assetpack_update_res, baw_res_kind, UnsafeMutableRawPointer?) -> Void)? +) { + nonisolated(unsafe) let contextPointer = contextPointer + Task { + do { + let (updatingIDs, removedIDs) = try await AssetPackManager.shared.checkForUpdates() + let cUpdatingIDs = updatingIDs.map(\.cStringCopy) + let cRemovedIDs = removedIDs.map(\.cStringCopy) + defer { + for cID in cUpdatingIDs + cRemovedIDs { + let count = strlen(cID) + 1 + cID + .deinitialize(count: count) + .deallocate() + } + } + withUnsafeTemporaryAllocation(of: UnsafePointer?.self, capacity: cUpdatingIDs.count) { (cUpdatingIDsBuffer) in + let cUpdatingIDsCount = cUpdatingIDsBuffer.initialize(fromContentsOf: cUpdatingIDs) + withUnsafeTemporaryAllocation(of: UnsafePointer?.self, capacity: cRemovedIDs.count) { (cRemovedIDsBuffer) in + let cRemovedIDsCount = cRemovedIDsBuffer.initialize(fromContentsOf: cRemovedIDs) + completionHandler?( + baw_assetpackmanager_assetpack_update_res( + success: baw_assetpackmanager_assetpack_update_res.__Unnamed_struct_success( + updatingc: cUpdatingIDsCount, + updatingv: cUpdatingIDsBuffer.baseAddress, + removedc: cRemovedIDsCount, + removedv: cRemovedIDsBuffer.baseAddress + ) + ), + baw_res_kind_success, + contextPointer + ) + } + } + } catch { + completionHandler?( + baw_assetpackmanager_assetpack_update_res(failure: baw_err(error)), + baw_res_kind_failure, + contextPointer + ) + } + } +} + +@c @implementation +public func baw_assetpackmanager_assetpack_remove( + _ cID: UnsafePointer?, + _ contextPointer: UnsafeMutableRawPointer?, + _ completionHandler: (@convention(c) (baw_err, baw_res_kind, UnsafeMutableRawPointer?) -> Void)? +) { + guard let cID else { + completionHandler?(.missing, baw_res_kind_failure, contextPointer) + return + } + let id = String(cString: cID) + nonisolated(unsafe) let contextPointer = contextPointer + Task { + do { + try await AssetPackManager.shared.remove(assetPackWithID: id) + } catch { + completionHandler?(baw_err(error), baw_res_kind_failure, contextPointer) + } + } +} + +@c @implementation +public func baw_assetpackmanager_lang_resolved() -> baw_lang { + guard #available(iOS 27, macOS 27, tvOS 27, visionOS 27, *) else { + return baw_lang() + } + return baw_lang(AssetPackManager.shared.resolvedLanguage) +} + +@c @implementation +public func baw_assetpackmanager_lang_resolved_set(_ cLanguage: baw_lang) { + guard #available(iOS 27, macOS 27, tvOS 27, visionOS 27, *) else { + return + } + AssetPackManager.shared.resolvedLanguage = Locale.Language(cLanguage) +} + +@c @implementation +public func baw_assetpackmanager_lang_local( + _ contextPointer: UnsafeMutableRawPointer?, + _ completionHandler: (@convention(c) (Int, UnsafePointer?, UnsafeMutableRawPointer?) -> Void)? +) { + guard #available(iOS 27, macOS 27, tvOS 27, visionOS 27, *) else { + completionHandler?(0, nil, contextPointer) + return + } + nonisolated(unsafe) let contextPointer = contextPointer + Task { + guard let completionHandler else { + return + } + let cLanguages = await AssetPackManager.shared.locallyAvailableLanguages.map(baw_lang.init(_:)) + cLanguages.withUnsafeBufferPointer { (buffer) in + completionHandler(buffer.count, buffer.baseAddress, contextPointer) + } + } +} + +@c @implementation +public func baw_assetpackmanager_lang_reconcile( + _ contextPointer: UnsafeMutableRawPointer?, + _ completionHandler: (@convention(c) (baw_err, baw_res_kind, UnsafeMutableRawPointer?) -> Void)? +) { + guard #available(iOS 27, macOS 27, tvOS 27, visionOS 27, *) else { + completionHandler?(.operationUnavailable, baw_res_kind_failure, contextPointer) + return + } + nonisolated(unsafe) let contextPointer = contextPointer + Task { + do { + try await AssetPackManager.shared.reconcilePreferredLanguages() + } catch { + completionHandler?(baw_err(error), baw_res_kind_failure, contextPointer) + } + } +} + +@c @implementation +public func baw_assetpackmanager_open( + _ cPath: UnsafePointer?, + _ cID: UnsafePointer?, + _ cError: UnsafeMutablePointer? +) -> CInt { + guard let cPath else { + cError?.pointee = .missing + return -1 + } + do { + return try AssetPackManager.shared.descriptor( + for: FilePath(platformString: cPath), + searchingInAssetPackWithID: cID.map(String.init(cString:)) + ).rawValue + } catch { + cError?.pointee = baw_err(error) + return -1 + } +} + +@c @implementation +public func baw_assetpackmanager_open_lang( + _ cPath: UnsafePointer?, + _ cLanguage: baw_lang, + _ cError: UnsafeMutablePointer? +) -> CInt { + guard #available(iOS 27, macOS 27, tvOS 27, visionOS 27, *) else { + cError?.pointee = .operationUnavailable + return -1 + } + guard let cPath, let language = Locale.Language(cLanguage) else { + cError?.pointee = .missing + return -1 + } + do { + return try AssetPackManager.shared.descriptor( + for: FilePath(platformString: cPath), + asLocalizedFor: language + ).rawValue + } catch { + cError?.pointee = baw_err(error) + return -1 + } +} + +@c @implementation +public func baw_assetpackmanager_url( + _ cPath: UnsafePointer?, + _ cError: UnsafeMutablePointer? +) -> UnsafeMutablePointer? { + guard let cPath else { + cError?.pointee = .missing + return nil + } + do { + return try AssetPackManager.shared.url( + for: FilePath(platformString: cPath) + ).absoluteString.cStringCopy + } catch { + cError?.pointee = baw_err(error) + return nil + } +} + +@c @implementation +public func baw_assetpackmanager_url_lang( + _ cPath: UnsafePointer?, + _ cLanguage: baw_lang, + _ cError: UnsafeMutablePointer? +) -> UnsafeMutablePointer? { + guard #available(iOS 27, macOS 27, tvOS 27, visionOS 27, *) else { + cError?.pointee = .operationUnavailable + return nil + } + guard let cPath, let language = Locale.Language(cLanguage) else { + cError?.pointee = .missing + return nil + } + do { + return try AssetPackManager.shared.url( + for: FilePath(platformString: cPath), + asLocalizedFor: language + ).absoluteString.cStringCopy + } catch { + cError?.pointee = baw_err(error) + return nil + } +} + +@c @implementation +public func baw_assetpackmanager_url_deinit(_ cURL: UnsafeMutablePointer?) { + guard let cURL else { + return + } + let count = strlen(cURL) + 1 + cURL + .deinitialize(count: count) + .deallocate() +} diff --git a/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/AssetPackManifest.swift b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/AssetPackManifest.swift new file mode 100644 index 00000000..5ecf9464 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/AssetPackManifest.swift @@ -0,0 +1,184 @@ +// +// AssetPackManifest.swift +// Background Assets Wrapper +// +// Created by Gabriel Jacoby-Cooper on 4/20/26. +// Copyright © 2026 Apple. All rights reserved. +// + +import BackgroundAssets + +fileprivate import OSLog +fileprivate let logger = Logger(subsystem: "com.apple.backgroundassets.wrapper", category: "AssetPackManifest") + +extension AssetPackManifest { + + @available(iOS 27, macOS 27, tvOS 27, visionOS 27, *) + init?(_ cManifest: baw_assetpackmanifest) { + guard let manifest = cManifest.opaque?.load(as: Self.self) else { + return nil + } + self = manifest + } + +} + +extension baw_assetpackmanifest { + + @available(iOS 27, macOS 27, tvOS 27, visionOS 27, *) + init(_ manifest: AssetPackManifest) { + let pointer = UnsafeMutablePointer.allocate(capacity: 1) + pointer.initialize(to: manifest) + self.init(opaque: pointer) + } + +} + +@c +@implementation public func baw_assetpackmanifest_deinit(_ cManifest: baw_assetpackmanifest) { + if #available(iOS 27, macOS 27, tvOS 27, visionOS 27, *) { + cManifest.opaque? + .assumingMemoryBound(to: AssetPackManifest.self) + .deinitialize(count: 1) + .deallocate() + } else { + let cAssetPacks = UnsafeMutableBufferPointer(start: cManifest.compat.assetpackv, count: cManifest.compat.assetpackc) + for cAssetPack in cAssetPacks { + cAssetPack.deinitialize() + } + cAssetPacks + .deinitialize() + .deallocate() + } +} + +@c +@implementation public func baw_assetpackmanifest_assetpack( + _ cManifest: baw_assetpackmanifest, + _ cID: UnsafePointer? +) -> baw_assetpack { + guard let cID else { + return baw_assetpack() + } + if #available(iOS 27, macOS 27, tvOS 27, visionOS 27, *) { + return AssetPackManifest(cManifest)? + .assetPack( + withID: String(cString: cID) + ) + .flatMap(baw_assetpack.init(_:)) ?? baw_assetpack() + } else { + for cAssetPack in UnsafeBufferPointer(start: cManifest.compat.assetpackv, count: cManifest.compat.assetpackc) { + guard let assetPack = cAssetPack.impl?.load(as: AssetPack.self) else { + continue + } + if assetPack.id == String(cString: cID) { + return baw_assetpack(assetPack) // Return a copy + } + } + return baw_assetpack() + } +} + +@c @implementation +public func baw_assetpackmanifest_assetpackv( + _ cManifest: baw_assetpackmanifest, + _ countPointer: UnsafeMutablePointer? +) -> UnsafeMutablePointer? { + logger.log(level: .fault, "C manifest: \(String(describing: cManifest))") + logger.log(level: .fault, "C manifest opaque: \(String(describing: cManifest.opaque))") + logger.log(level: .fault, "Count pointer: \(String(describing: countPointer))") + if #available(iOS 27, macOS 27, tvOS 27, visionOS 27, *) { + guard let manifest = AssetPackManifest(cManifest) else { + return nil + } + logger.log(level: .fault, "Manifest: \(manifest)") + logger.log(level: .fault, "Count: \(manifest.assetPacks.count)") + let buffer = UnsafeMutableBufferPointer.allocate(capacity: manifest.assetPacks.count) + countPointer?.pointee = buffer.initialize(fromContentsOf: manifest.assetPacks.map(baw_assetpack.init(_:))) + return buffer.baseAddress + } else { + let buffer = UnsafeMutableBufferPointer.allocate(capacity: cManifest.compat.assetpackc) + countPointer?.pointee = buffer.initialize( + fromContentsOf: UnsafeBufferPointer( + start: cManifest.compat.assetpackv, + count: cManifest.compat.assetpackc + ).compactMap { (cAssetPack) in + return baw_assetpack( + cAssetPack.impl.load(as: AssetPack.self) + ) // Return a copy + } + ) + return buffer.baseAddress + } +} + +@c +@implementation public func baw_assetpackmanifest_assetpackv_localized( + _ cManifest: baw_assetpackmanifest, + _ countPointer: UnsafeMutablePointer? +) -> UnsafeMutablePointer? { + guard #available(iOS 27, macOS 27, tvOS 27, visionOS 27, *), let manifest = AssetPackManifest(cManifest) else { + return nil + } + let buffer = UnsafeMutableBufferPointer.allocate(capacity: manifest.localizedAssetPacks.count) + countPointer?.pointee = buffer.initialize(fromContentsOf: manifest.localizedAssetPacks.map(baw_assetpack.init(_:))) + return buffer.baseAddress +} + +@c +@implementation public func baw_assetpackmanifest_assetpackv_localized_lang( + _ cManifest: baw_assetpackmanifest, + _ cLanguage: baw_lang, + _ countPointer: UnsafeMutablePointer? +) -> UnsafeMutablePointer? { + guard #available(iOS 27, macOS 27, tvOS 27, visionOS 27, *), let manifest = AssetPackManifest(cManifest), let language = Locale.Language(cLanguage) else { + return nil + } + let assetPacks = manifest.localizedAssetPacks(for: language) + let buffer = UnsafeMutableBufferPointer.allocate(capacity: assetPacks.count) + countPointer?.pointee = buffer.initialize(fromContentsOf: assetPacks.map(baw_assetpack.init(_:))) + return buffer.baseAddress +} + +@c +@implementation public func baw_assetpackmanifest_assetpackv_deinit(_ count: Int, _ cAssetPacks: UnsafeMutablePointer?) { + cAssetPacks? + .deinitialize(count: count) + .deallocate() +} + +@c +@implementation public func baw_assetpackmanifest_lang_primary(_ cManifest: baw_assetpackmanifest) -> baw_lang { + guard #available(iOS 27, macOS 27, tvOS 27, visionOS 27, *), let manifest = AssetPackManifest(cManifest) else { + return baw_lang() + } + return baw_lang(manifest.primaryLanguage) +} + +@c +@implementation public func baw_assetpackmanifest_lang_resolved(_ cManifest: baw_assetpackmanifest) -> baw_lang { + guard #available(iOS 27, macOS 27, tvOS 27, visionOS 27, *), let manifest = AssetPackManifest(cManifest) else { + return baw_lang() + } + return baw_lang(manifest.resolvedLanguage) +} + +@c +@implementation public func baw_assetpackmanifest_langv( + _ cManifest: baw_assetpackmanifest, + _ countPointer: UnsafeMutablePointer? +) -> UnsafeMutablePointer? { + guard #available(iOS 27, macOS 27, tvOS 27, visionOS 27, *), let manifest = AssetPackManifest(cManifest) else { + return nil + } + let buffer = UnsafeMutableBufferPointer.allocate(capacity: manifest.availableLanguages.count) + countPointer?.pointee = buffer.initialize(fromContentsOf: manifest.availableLanguages.map(baw_lang.init(_:))) + return buffer.baseAddress +} + +@c +@implementation public func baw_assetpackmanifest_langv_deinit(_ count: Int, _ cLanguages: UnsafeMutablePointer?) { + cLanguages? + .deinitialize(count: count) + .deallocate() +} diff --git a/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/BackgroundAssetsWrapper.h b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/BackgroundAssetsWrapper.h new file mode 100644 index 00000000..7ea4e6d3 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/BackgroundAssetsWrapper.h @@ -0,0 +1,14 @@ +// +// BackgroundAssetsWrapper.h +// Background Assets Wrapper +// +// Created by Gabriel Jacoby-Cooper on 4/20/26. +// Copyright © 2026 Apple. All rights reserved. +// + +#import +#import +#import +#import +#import +#import diff --git a/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/Bridging.h b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/Bridging.h new file mode 100644 index 00000000..cfebcdc1 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/Bridging.h @@ -0,0 +1,14 @@ +// +// Bridging.h +// Background Assets Wrapper (macOS) +// +// Created by Gabriel Jacoby-Cooper on 4/28/26. +// Copyright © 2026 Apple. All rights reserved. +// + +#import "assetpack.h" +#import "assetpackmanager.h" +#import "assetpackmanifest.h" +#import "err.h" +#import "lang.h" +#import "res.h" diff --git a/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/Error.swift b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/Error.swift new file mode 100644 index 00000000..bfb6b02a --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/Error.swift @@ -0,0 +1,45 @@ +// +// Error.swift +// Background Assets Wrapper +// +// Created by Gabriel Jacoby-Cooper on 4/20/26. +// Copyright © 2026 Apple. All rights reserved. +// + +private import Foundation + +extension baw_err { + + static var missing: Self { + return Self(staticDescription: "The data are missing.") + } + + static var operationUnavailable: Self { + return Self(staticDescription: "The operation is unavailable.") + } + + private init(staticDescription: StaticString) { + self.init( + description: baw_err_description(str_static: staticDescription.utf8Start), + _static: true + ) + } + + init(_ error: some Error) { + self.init( + description: baw_err_description(str: error.localizedDescription.cStringCopy), + _static: false + ) + } + +} + +@c @implementation +public func baw_err_deinit(_ cError: baw_err) { + if !cError._static, let cDescription = cError.description.str { + let count = strlen(cDescription) + 1 + cDescription + .deinitialize(count: count) + .deallocate() + } +} diff --git a/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/Language.swift b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/Language.swift new file mode 100644 index 00000000..8b855ca3 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/Language.swift @@ -0,0 +1,91 @@ +// +// Language.swift +// Background Assets Wrapper +// +// Created by Gabriel Jacoby-Cooper on 4/20/26. +// Copyright © 2026 Apple. All rights reserved. +// + +import Foundation + +extension baw_lang { + + init(_ language: Locale.Language?) { + if let language { + let pointer = UnsafeMutablePointer.allocate(capacity: 1) + pointer.initialize(to: language) + self.init(impl: pointer) + } else { + self.init(impl: nil) + } + } + + func deinitialize() { + self.impl? + .assumingMemoryBound(to: Locale.Language.self) + .deinitialize(count: 1) + .deallocate() + } + +} + +extension Locale.Language { + + init?(_ cLanguage: baw_lang) { + guard let language = cLanguage.impl?.load(as: Self.self) else { + return nil + } + self = language + } + +} + +@c @implementation +public func baw_lang_init(_ cID: UnsafePointer?) -> baw_lang { + return baw_lang( + cID.map { (cID) in + return Locale.Language( + identifier: String(cString: cID) + ) + } + ) +} + +@c @implementation +public func baw_lang_deinit(_ cLanguage: baw_lang) { + cLanguage.deinitialize() +} + +@c @implementation +public func baw_lang_is_nonnull(_ cLanguage: baw_lang) -> CBool { + return cLanguage.impl != nil +} + +@c @implementation +public func baw_lang_id_min(_ cLanguage: baw_lang) -> UnsafeMutablePointer? { + return Locale.Language(cLanguage)?.minimalIdentifier.cStringCopy +} + +@c @implementation +public func baw_lang_id_max(_ cLanguage: baw_lang) -> UnsafeMutablePointer? { + return Locale.Language(cLanguage)?.maximalIdentifier.cStringCopy +} + +@c @implementation +public func baw_lang_id_deinit(_ cID: UnsafeMutablePointer?) { + guard let cID else { + return + } + let count = strlen(cID) + 1 + cID + .deinitialize(count: count) + .deallocate() +} + +@c @implementation +public func baw_lang_equivalent(_ firstCLanguage: baw_lang, _ secondCLanguage: baw_lang) -> CBool { + guard let firstLanguage = Locale.Language(firstCLanguage), let secondLanguage = Locale.Language(secondCLanguage) else { + return firstCLanguage.impl == secondCLanguage.impl + } + return firstLanguage.isEquivalent(to: secondLanguage) +} diff --git a/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/String.swift b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/String.swift new file mode 100644 index 00000000..7a00f7f7 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/String.swift @@ -0,0 +1,19 @@ +// +// String.swift +// Background Assets Wrapper +// +// Created by Gabriel Jacoby-Cooper on 4/20/26. +// Copyright © 2026 Apple. All rights reserved. +// + +private import Darwin + +extension String { + + var cStringCopy: UnsafeMutablePointer { + let cString = UnsafeMutablePointer.allocate(capacity: self.utf8CString.count) + cString.initialize(from: Array(self.utf8CString), count: self.utf8CString.count) + return cString + } + +} diff --git a/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/assetpack.h b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/assetpack.h new file mode 100644 index 00000000..25aa7ca8 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/assetpack.h @@ -0,0 +1,43 @@ +// +// assetpack.h +// Background Assets Wrapper +// +// Created by Gabriel Jacoby-Cooper on 4/20/26. +// Copyright © 2026 Apple. All rights reserved. +// + +#import +#import + +#define baw_assetpack_status_downloadavailable(status) status & 0b0000001 +#define baw_assetpack_status_updateavailable(status) status & 0b0000010 +#define baw_assetpack_status_uptodate(status) status & 0b0000100 +#define baw_assetpack_status_outofdate(status) status & 0b0001000 +#define baw_assetpack_status_obsolete(status) status & 0b0010000 +#define baw_assetpack_status_downloading(status) status & 0b0100000 +#define baw_assetpack_status_downloaded(status) status & 0b1000000 + +union baw_assetpack_status_res { + unsigned char success; + struct baw_err failure; +}; + +struct baw_assetpack { + void *impl; +}; + +void baw_assetpack_deinit(struct baw_assetpack assetpack); + +bool baw_assetpack_is_nonnull(struct baw_assetpack assetpack); + +char *baw_assetpack_id(struct baw_assetpack assetpack); + +void baw_assetpack_id_deinit(char *id); + +size_t baw_assetpack_downloadsize(struct baw_assetpack assetpack); + +unsigned short int baw_assetpack_version(struct baw_assetpack assetpack); + +struct baw_lang baw_assetpack_lang(struct baw_assetpack assetpack); + +void baw_assetpack_userinfo(struct baw_assetpack assetpack, void *buf, size_t *len); diff --git a/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/assetpackmanager.h b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/assetpackmanager.h new file mode 100644 index 00000000..03bd8d0f --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/assetpackmanager.h @@ -0,0 +1,75 @@ +// +// assetpackmanager.h +// Background Assets Wrapper +// +// Created by Gabriel Jacoby-Cooper on 4/20/26. +// Copyright © 2026 Apple. All rights reserved. +// + +#import +#import + +enum baw_assetpackmanager_downloadstatusupdate_kind { + baw_assetpackmanager_downloadstatusupdate_kind_began, + baw_assetpackmanager_downloadstatusupdate_kind_paused, + baw_assetpackmanager_downloadstatusupdate_kind_downloading, + baw_assetpackmanager_downloadstatusupdate_kind_finished, + baw_assetpackmanager_downloadstatusupdate_kind_failed +}; + +struct baw_assetpackmanager_downloadstatusupdate { + enum baw_assetpackmanager_downloadstatusupdate_kind kind; + struct baw_assetpack assetpack; + union { + double progress; + struct baw_err err; + } payload; +}; + +union baw_assetpackmanager_assetpack_update_res { + struct { + size_t updatingc; + const char * const *updatingv; + size_t removedc; + const char * const *removedv; + } success; + struct baw_err failure; +}; + +void baw_assetpackmanager_downloadstatusupdates(const char *id, void *ctx, void (*cb)(struct baw_assetpackmanager_downloadstatusupdate downloadstatusupdate, void *ctx)); + +void baw_assetpackmanager_manifest(void *ctx, void (*cb)(union baw_assetpackmanifest_res res, enum baw_res_kind res_kind, void *ctx)); + +void baw_assetpackmanager_assetpack_status(struct baw_assetpack assetpack, void *ctx, void (*cb)(union baw_assetpack_status_res res, enum baw_res_kind res_kind, void *ctx)); + +void baw_assetpackmanager_assetpack_status_local(const char *id, void *ctx, void (*cb)(unsigned char status, void *ctx)); + +bool baw_assetpackmanager_assetpack_local(const char *id); + +void baw_assetpackmanager_assetpack_local_ensure(struct baw_assetpack assetpack, void *ctx, void (*cb)(struct baw_err err, enum baw_res_kind res_kind, void *ctx)); + +void baw_assetpackmanager_assetpack_local_ensure_update(struct baw_assetpack assetpack, bool update, void *ctx, void (*cb)(struct baw_err err, enum baw_res_kind res_kind, void *ctx)); + +void baw_assetpackmanager_assetpack_local_ensure_updatev(size_t assetpackc, const struct baw_assetpack *assetpackv, bool update, void *ctx, void (*cb)(struct baw_err err, enum baw_res_kind res_kind, void *ctx)); + +void baw_assetpackmanager_assetpack_update(void *ctx, void (*cb)(union baw_assetpackmanager_assetpack_update_res res, enum baw_res_kind res_kind, void *ctx)); + +void baw_assetpackmanager_assetpack_remove(const char *id, void *ctx, void (*cb)(struct baw_err err, enum baw_res_kind res_kind, void *ctx)); + +struct baw_lang baw_assetpackmanager_lang_resolved(void); + +void baw_assetpackmanager_lang_resolved_set(struct baw_lang lang); + +void baw_assetpackmanager_lang_local(void *ctx, void (*cb)(size_t langc, const struct baw_lang *langv, void *ctx)); + +void baw_assetpackmanager_lang_reconcile(void *ctx, void (*cb)(struct baw_err err, enum baw_res_kind res_kind, void *ctx)); + +signed int baw_assetpackmanager_open(const char *path, const char *id, struct baw_err *err); + +signed int baw_assetpackmanager_open_lang(const char *path, struct baw_lang lang, struct baw_err *err); + +char *baw_assetpackmanager_url(const char *path, struct baw_err *err); + +char *baw_assetpackmanager_url_lang(const char *path, struct baw_lang lang, struct baw_err *err); + +void baw_assetpackmanager_url_deinit(char *url); diff --git a/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/assetpackmanifest.h b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/assetpackmanifest.h new file mode 100644 index 00000000..9802a1ef --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/assetpackmanifest.h @@ -0,0 +1,44 @@ +// +// assetpackmanifest.h +// Background Assets Wrapper +// +// Created by Gabriel Jacoby-Cooper on 4/20/26. +// Copyright © 2026 Apple. All rights reserved. +// + +#import + +struct baw_assetpackmanifest_compat { + size_t assetpackc; + struct baw_assetpack *assetpackv; +}; + +union baw_assetpackmanifest { + void *opaque; + struct baw_assetpackmanifest_compat compat; +}; + +union baw_assetpackmanifest_res { + union baw_assetpackmanifest success; + struct baw_err failure; +}; + +void baw_assetpackmanifest_deinit(union baw_assetpackmanifest manifest); + +struct baw_assetpack baw_assetpackmanifest_assetpack(union baw_assetpackmanifest manifest, const char *id); + +struct baw_assetpack *baw_assetpackmanifest_assetpackv(union baw_assetpackmanifest manifest, size_t *assetpackc); + +struct baw_assetpack *baw_assetpackmanifest_assetpackv_localized(union baw_assetpackmanifest manifest, size_t *assetpackc); + +struct baw_assetpack *baw_assetpackmanifest_assetpackv_localized_lang(union baw_assetpackmanifest manifest, struct baw_lang lang, size_t *assetpackc); + +void baw_assetpackmanifest_assetpackv_deinit(size_t assetpackc, struct baw_assetpack *assetpackv); + +struct baw_lang baw_assetpackmanifest_lang_primary(union baw_assetpackmanifest manifest); + +struct baw_lang baw_assetpackmanifest_lang_resolved(union baw_assetpackmanifest manifest); + +struct baw_lang *baw_assetpackmanifest_langv(union baw_assetpackmanifest manifest, size_t *langc); + +void baw_assetpackmanifest_langv_deinit(size_t langc, struct baw_lang *langv); diff --git a/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/err.h b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/err.h new file mode 100644 index 00000000..54d07579 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/err.h @@ -0,0 +1,31 @@ +// +// err.h +// Background Assets Wrapper +// +// Created by Gabriel Jacoby-Cooper on 4/20/26. +// Copyright © 2026 Apple. All rights reserved. +// + +#import +#import + +union baw_err_description { + const unsigned char *str_static; + char *str; +}; + +struct baw_err { + union baw_err_description description; + bool _static; +}; + +struct baw_err_localavailability { + struct baw_err base; + size_t successc; + const char * const *success_idv; + size_t failurev; + const char * const *failure_idv; + struct baw_err *failure_errv; +}; + +void baw_err_deinit(struct baw_err err); diff --git a/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/lang.h b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/lang.h new file mode 100644 index 00000000..685e5e56 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/lang.h @@ -0,0 +1,27 @@ +// +// lang.h +// Background Assets Wrapper +// +// Created by Gabriel Jacoby-Cooper on 4/20/26. +// Copyright © 2026 Apple. All rights reserved. +// + +#import + +struct baw_lang { + void *impl; +}; + +struct baw_lang baw_lang_init(const char *id); + +void baw_lang_deinit(struct baw_lang lang); + +bool baw_lang_is_nonnull(struct baw_lang lang); + +char *baw_lang_id_min(struct baw_lang lang); + +char *baw_lang_id_max(struct baw_lang lang); + +void baw_lang_id_deinit(char *lang_id); + +bool baw_lang_equivalent(struct baw_lang lang_first, struct baw_lang lang_second); diff --git a/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/res.h b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/res.h new file mode 100644 index 00000000..316a4383 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/Background Assets Wrapper/res.h @@ -0,0 +1,12 @@ +// +// res.h +// Background Assets Wrapper +// +// Created by Gabriel Jacoby-Cooper on 4/20/26. +// Copyright © 2026 Apple. All rights reserved. +// + +enum baw_res_kind { + baw_res_kind_success, + baw_res_kind_failure +}; diff --git a/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/project.pbxproj b/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c3584313 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/project.pbxproj @@ -0,0 +1,805 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 110; + objects = { + +/* Begin PBXBuildFile section */ + C03426972F96E9E600711B1D /* assetpackmanager.h in Headers */ = {isa = PBXBuildFile; fileRef = C03426962F96E9E600711B1D /* assetpackmanager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C03426982F96E9E600711B1D /* assetpackmanager.h in Headers */ = {isa = PBXBuildFile; fileRef = C03426962F96E9E600711B1D /* assetpackmanager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C03426992F96E9E600711B1D /* assetpackmanager.h in Headers */ = {isa = PBXBuildFile; fileRef = C03426962F96E9E600711B1D /* assetpackmanager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C034269B2F96F13800711B1D /* assetpackmanifest.h in Headers */ = {isa = PBXBuildFile; fileRef = C034269A2F96F13800711B1D /* assetpackmanifest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C034269C2F96F13800711B1D /* assetpackmanifest.h in Headers */ = {isa = PBXBuildFile; fileRef = C034269A2F96F13800711B1D /* assetpackmanifest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C034269D2F96F13800711B1D /* assetpackmanifest.h in Headers */ = {isa = PBXBuildFile; fileRef = C034269A2F96F13800711B1D /* assetpackmanifest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C034269F2F96F1D600711B1D /* AssetPackManifest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C034269E2F96F1D600711B1D /* AssetPackManifest.swift */; }; + C03426A12F96F1D600711B1D /* AssetPackManifest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C034269E2F96F1D600711B1D /* AssetPackManifest.swift */; }; + C03426A22F96F1D600711B1D /* AssetPackManifest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C034269E2F96F1D600711B1D /* AssetPackManifest.swift */; }; + C03426A42F96F32C00711B1D /* err.h in Headers */ = {isa = PBXBuildFile; fileRef = C03426A32F96F32C00711B1D /* err.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C03426A52F96F32C00711B1D /* err.h in Headers */ = {isa = PBXBuildFile; fileRef = C03426A32F96F32C00711B1D /* err.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C03426A62F96F32C00711B1D /* err.h in Headers */ = {isa = PBXBuildFile; fileRef = C03426A32F96F32C00711B1D /* err.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C03426A82F96F37700711B1D /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = C03426A72F96F37700711B1D /* Error.swift */; }; + C03426AA2F96F37700711B1D /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = C03426A72F96F37700711B1D /* Error.swift */; }; + C03426AB2F96F37700711B1D /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = C03426A72F96F37700711B1D /* Error.swift */; }; + C03426AD2F96F45D00711B1D /* res.h in Headers */ = {isa = PBXBuildFile; fileRef = C03426AC2F96F45D00711B1D /* res.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C03426AE2F96F45D00711B1D /* res.h in Headers */ = {isa = PBXBuildFile; fileRef = C03426AC2F96F45D00711B1D /* res.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C03426AF2F96F45D00711B1D /* res.h in Headers */ = {isa = PBXBuildFile; fileRef = C03426AC2F96F45D00711B1D /* res.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C03426B12F9711E600711B1D /* AssetPack.swift in Sources */ = {isa = PBXBuildFile; fileRef = C03426B02F9711E600711B1D /* AssetPack.swift */; }; + C03426B22F9711E600711B1D /* AssetPack.swift in Sources */ = {isa = PBXBuildFile; fileRef = C03426B02F9711E600711B1D /* AssetPack.swift */; }; + C03426B32F9711E600711B1D /* AssetPack.swift in Sources */ = {isa = PBXBuildFile; fileRef = C03426B02F9711E600711B1D /* AssetPack.swift */; }; + C03426B72F9719E000711B1D /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = C03426B52F9719E000711B1D /* String.swift */; }; + C03426B82F9719E000711B1D /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = C03426B52F9719E000711B1D /* String.swift */; }; + C03426B92F9719E000711B1D /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = C03426B52F9719E000711B1D /* String.swift */; }; + C0477AED2FA16C9B006F7CFF /* AssetPackManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C068C6322F96B5E00061B2DA /* AssetPackManager.swift */; }; + C0477AEE2FA16C9B006F7CFF /* AssetPackManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C068C6322F96B5E00061B2DA /* AssetPackManager.swift */; }; + C0477AEF2FA16C9E006F7CFF /* AssetPack.swift in Sources */ = {isa = PBXBuildFile; fileRef = C03426B02F9711E600711B1D /* AssetPack.swift */; }; + C0477AF02FA16C9E006F7CFF /* AssetPackManifest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C034269E2F96F1D600711B1D /* AssetPackManifest.swift */; }; + C0477AF12FA16C9E006F7CFF /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = C03426A72F96F37700711B1D /* Error.swift */; }; + C0477AF22FA16C9E006F7CFF /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = C03426B52F9719E000711B1D /* String.swift */; }; + C0477AF32FA16C9E006F7CFF /* Language.swift in Sources */ = {isa = PBXBuildFile; fileRef = C068C63F2F96B6600061B2DA /* Language.swift */; }; + C0477AF42FA16C9E006F7CFF /* AssetPackManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C068C6322F96B5E00061B2DA /* AssetPackManager.swift */; }; + C0477B042FA16CFA006F7CFF /* Bridging.h in Headers */ = {isa = PBXBuildFile; fileRef = C0477B032FA16CFA006F7CFF /* Bridging.h */; }; + C0477B052FA16CFA006F7CFF /* Bridging.h in Headers */ = {isa = PBXBuildFile; fileRef = C0477B032FA16CFA006F7CFF /* Bridging.h */; }; + C0477B062FA16CFA006F7CFF /* Bridging.h in Headers */ = {isa = PBXBuildFile; fileRef = C0477B032FA16CFA006F7CFF /* Bridging.h */; }; + C068C6352F96B5E00061B2DA /* assetpack.h in Headers */ = {isa = PBXBuildFile; fileRef = C068C6312F96B5E00061B2DA /* assetpack.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C068C6362F96B5E00061B2DA /* lang.h in Headers */ = {isa = PBXBuildFile; fileRef = C068C6332F96B5E00061B2DA /* lang.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C068C6372F96B5E00061B2DA /* AssetPackManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C068C6322F96B5E00061B2DA /* AssetPackManager.swift */; }; + C068C6382F96B5E00061B2DA /* assetpack.h in Headers */ = {isa = PBXBuildFile; fileRef = C068C6312F96B5E00061B2DA /* assetpack.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C068C6392F96B5E00061B2DA /* lang.h in Headers */ = {isa = PBXBuildFile; fileRef = C068C6332F96B5E00061B2DA /* lang.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C068C63C2F96B5E00061B2DA /* assetpack.h in Headers */ = {isa = PBXBuildFile; fileRef = C068C6312F96B5E00061B2DA /* assetpack.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C068C63D2F96B5E00061B2DA /* lang.h in Headers */ = {isa = PBXBuildFile; fileRef = C068C6332F96B5E00061B2DA /* lang.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C068C6402F96B6600061B2DA /* Language.swift in Sources */ = {isa = PBXBuildFile; fileRef = C068C63F2F96B6600061B2DA /* Language.swift */; }; + C068C6422F96B6600061B2DA /* Language.swift in Sources */ = {isa = PBXBuildFile; fileRef = C068C63F2F96B6600061B2DA /* Language.swift */; }; + C068C6432F96B6600061B2DA /* Language.swift in Sources */ = {isa = PBXBuildFile; fileRef = C068C63F2F96B6600061B2DA /* Language.swift */; }; + C068C6452F96B6FF0061B2DA /* BackgroundAssetsWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = C068C6442F96B6FF0061B2DA /* BackgroundAssetsWrapper.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C068C6462F96B6FF0061B2DA /* BackgroundAssetsWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = C068C6442F96B6FF0061B2DA /* BackgroundAssetsWrapper.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C068C6472F96B6FF0061B2DA /* BackgroundAssetsWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = C068C6442F96B6FF0061B2DA /* BackgroundAssetsWrapper.h */; settings = {ATTRIBUTES = (Public, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + C03426962F96E9E600711B1D /* assetpackmanager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = assetpackmanager.h; sourceTree = ""; }; + C034269A2F96F13800711B1D /* assetpackmanifest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = assetpackmanifest.h; sourceTree = ""; }; + C034269E2F96F1D600711B1D /* AssetPackManifest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AssetPackManifest.swift; sourceTree = ""; }; + C03426A32F96F32C00711B1D /* err.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = err.h; sourceTree = ""; }; + C03426A72F96F37700711B1D /* Error.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Error.swift; sourceTree = ""; }; + C03426AC2F96F45D00711B1D /* res.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = res.h; sourceTree = ""; }; + C03426B02F9711E600711B1D /* AssetPack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AssetPack.swift; sourceTree = ""; }; + C03426B52F9719E000711B1D /* String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = String.swift; sourceTree = ""; }; + C0477B032FA16CFA006F7CFF /* Bridging.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Bridging.h; sourceTree = ""; }; + C068C6312F96B5E00061B2DA /* assetpack.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = assetpack.h; sourceTree = ""; }; + C068C6322F96B5E00061B2DA /* AssetPackManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AssetPackManager.swift; sourceTree = ""; }; + C068C6332F96B5E00061B2DA /* lang.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = lang.h; sourceTree = ""; }; + C068C63F2F96B6600061B2DA /* Language.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Language.swift; sourceTree = ""; }; + C068C6442F96B6FF0061B2DA /* BackgroundAssetsWrapper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BackgroundAssetsWrapper.h; sourceTree = ""; }; + C09880D62F75C6FC007F1CDC /* BackgroundAssetsWrapper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BackgroundAssetsWrapper.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C09880F22F75CDAE007F1CDC /* BackgroundAssetsWrapper.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BackgroundAssetsWrapper.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; + C09880FE2F75D093007F1CDC /* BackgroundAssetsWrapper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BackgroundAssetsWrapper.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C09881082F75D12D007F1CDC /* BackgroundAssetsWrapper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BackgroundAssetsWrapper.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + C09880D32F75C6FC007F1CDC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + files = ( + ); + }; + C09880EF2F75CDAE007F1CDC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + files = ( + ); + }; + C09880F92F75D093007F1CDC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + files = ( + ); + }; + C09881032F75D12D007F1CDC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + files = ( + ); + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + C068C6342F96B5E00061B2DA /* Background Assets Wrapper */ = { + isa = PBXGroup; + children = ( + C068C6442F96B6FF0061B2DA /* BackgroundAssetsWrapper.h */, + C068C6312F96B5E00061B2DA /* assetpack.h */, + C03426B02F9711E600711B1D /* AssetPack.swift */, + C03426962F96E9E600711B1D /* assetpackmanager.h */, + C068C6322F96B5E00061B2DA /* AssetPackManager.swift */, + C034269A2F96F13800711B1D /* assetpackmanifest.h */, + C034269E2F96F1D600711B1D /* AssetPackManifest.swift */, + C03426A32F96F32C00711B1D /* err.h */, + C03426A72F96F37700711B1D /* Error.swift */, + C068C6332F96B5E00061B2DA /* lang.h */, + C068C63F2F96B6600061B2DA /* Language.swift */, + C03426AC2F96F45D00711B1D /* res.h */, + C03426B52F9719E000711B1D /* String.swift */, + C0477B032FA16CFA006F7CFF /* Bridging.h */, + ); + path = "Background Assets Wrapper"; + sourceTree = ""; + }; + C09880CC2F75C6FC007F1CDC = { + isa = PBXGroup; + children = ( + C068C6342F96B5E00061B2DA /* Background Assets Wrapper */, + C09880D72F75C6FC007F1CDC /* Products */, + ); + sourceTree = ""; + }; + C09880D72F75C6FC007F1CDC /* Products */ = { + isa = PBXGroup; + children = ( + C09880D62F75C6FC007F1CDC /* BackgroundAssetsWrapper.framework */, + C09880F22F75CDAE007F1CDC /* BackgroundAssetsWrapper.bundle */, + C09880FE2F75D093007F1CDC /* BackgroundAssetsWrapper.framework */, + C09881082F75D12D007F1CDC /* BackgroundAssetsWrapper.framework */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + C09880D12F75C6FC007F1CDC /* Headers */ = { + isa = PBXHeadersBuildPhase; + files = ( + C03426A52F96F32C00711B1D /* err.h in Headers */, + C03426AD2F96F45D00711B1D /* res.h in Headers */, + C034269C2F96F13800711B1D /* assetpackmanifest.h in Headers */, + C068C6452F96B6FF0061B2DA /* BackgroundAssetsWrapper.h in Headers */, + C068C6352F96B5E00061B2DA /* assetpack.h in Headers */, + C068C6362F96B5E00061B2DA /* lang.h in Headers */, + C0477B062FA16CFA006F7CFF /* Bridging.h in Headers */, + C03426992F96E9E600711B1D /* assetpackmanager.h in Headers */, + ); + }; + C09880F72F75D093007F1CDC /* Headers */ = { + isa = PBXHeadersBuildPhase; + files = ( + C03426A62F96F32C00711B1D /* err.h in Headers */, + C03426AE2F96F45D00711B1D /* res.h in Headers */, + C034269D2F96F13800711B1D /* assetpackmanifest.h in Headers */, + C068C6472F96B6FF0061B2DA /* BackgroundAssetsWrapper.h in Headers */, + C068C6382F96B5E00061B2DA /* assetpack.h in Headers */, + C068C6392F96B5E00061B2DA /* lang.h in Headers */, + C0477B052FA16CFA006F7CFF /* Bridging.h in Headers */, + C03426972F96E9E600711B1D /* assetpackmanager.h in Headers */, + ); + }; + C09881012F75D12D007F1CDC /* Headers */ = { + isa = PBXHeadersBuildPhase; + files = ( + C03426A42F96F32C00711B1D /* err.h in Headers */, + C03426AF2F96F45D00711B1D /* res.h in Headers */, + C034269B2F96F13800711B1D /* assetpackmanifest.h in Headers */, + C068C6462F96B6FF0061B2DA /* BackgroundAssetsWrapper.h in Headers */, + C068C63C2F96B5E00061B2DA /* assetpack.h in Headers */, + C068C63D2F96B5E00061B2DA /* lang.h in Headers */, + C0477B042FA16CFA006F7CFF /* Bridging.h in Headers */, + C03426982F96E9E600711B1D /* assetpackmanager.h in Headers */, + ); + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + C09880D52F75C6FC007F1CDC /* Background Assets Wrapper (iOS) */ = { + isa = PBXNativeTarget; + buildConfigurationList = C09880DD2F75C6FC007F1CDC /* Build configuration list for PBXNativeTarget "Background Assets Wrapper (iOS)" */; + buildPhases = ( + C09880D12F75C6FC007F1CDC /* Headers */, + C09880D22F75C6FC007F1CDC /* Sources */, + C09880D32F75C6FC007F1CDC /* Frameworks */, + C09880D42F75C6FC007F1CDC /* Resources */, + ); + buildRules = ( + ); + name = "Background Assets Wrapper (iOS)"; + productName = "Background Assets Wrapper"; + productReference = C09880D62F75C6FC007F1CDC /* BackgroundAssetsWrapper.framework */; + productType = "com.apple.product-type.framework"; + }; + C09880F12F75CDAE007F1CDC /* Background Assets Wrapper (macOS) */ = { + isa = PBXNativeTarget; + buildConfigurationList = C09880F32F75CDAE007F1CDC /* Build configuration list for PBXNativeTarget "Background Assets Wrapper (macOS)" */; + buildPhases = ( + C09880EE2F75CDAE007F1CDC /* Sources */, + C09880EF2F75CDAE007F1CDC /* Frameworks */, + C09880F02F75CDAE007F1CDC /* Resources */, + ); + buildRules = ( + ); + name = "Background Assets Wrapper (macOS)"; + productName = "Background Assets Wrapper (macOS)"; + productReference = C09880F22F75CDAE007F1CDC /* BackgroundAssetsWrapper.bundle */; + productType = "com.apple.product-type.bundle"; + }; + C09880F62F75D093007F1CDC /* Background Assets Wrapper (tvOS) */ = { + isa = PBXNativeTarget; + buildConfigurationList = C09880FB2F75D093007F1CDC /* Build configuration list for PBXNativeTarget "Background Assets Wrapper (tvOS)" */; + buildPhases = ( + C09880F72F75D093007F1CDC /* Headers */, + C09880F82F75D093007F1CDC /* Sources */, + C09880F92F75D093007F1CDC /* Frameworks */, + C09880FA2F75D093007F1CDC /* Resources */, + ); + buildRules = ( + ); + name = "Background Assets Wrapper (tvOS)"; + productName = "Background Assets Wrapper"; + productReference = C09880FE2F75D093007F1CDC /* BackgroundAssetsWrapper.framework */; + productType = "com.apple.product-type.framework"; + }; + C09881002F75D12D007F1CDC /* Background Assets Wrapper (visionOS) */ = { + isa = PBXNativeTarget; + buildConfigurationList = C09881052F75D12D007F1CDC /* Build configuration list for PBXNativeTarget "Background Assets Wrapper (visionOS)" */; + buildPhases = ( + C09881012F75D12D007F1CDC /* Headers */, + C09881022F75D12D007F1CDC /* Sources */, + C09881032F75D12D007F1CDC /* Frameworks */, + C09881042F75D12D007F1CDC /* Resources */, + ); + buildRules = ( + ); + name = "Background Assets Wrapper (visionOS)"; + productName = "Background Assets Wrapper"; + productReference = C09881082F75D12D007F1CDC /* BackgroundAssetsWrapper.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + C09880CD2F75C6FC007F1CDC /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + CLASSPREFIX = BAW; + LastSwiftUpdateCheck = 2700; + LastUpgradeCheck = 2700; + ORGANIZATIONNAME = Apple; + TargetAttributes = { + C09880D52F75C6FC007F1CDC = { + CreatedOnToolsVersion = 27.0; + }; + C09880F12F75CDAE007F1CDC = { + CreatedOnToolsVersion = 27.0; + LastSwiftMigration = 2700; + }; + C09880F62F75D093007F1CDC = { + LastSwiftMigration = 2700; + }; + C09881002F75D12D007F1CDC = { + LastSwiftMigration = 2700; + }; + }; + }; + buildConfigurationList = C09880D02F75C6FC007F1CDC /* Build configuration list for PBXProject "BackgroundAssetsWrapper" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = C09880CC2F75C6FC007F1CDC; + minimizedProjectReferenceProxies = 1; + preferredProjectObjectVersion = 110; + productRefGroup = C09880D72F75C6FC007F1CDC /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + C09880D52F75C6FC007F1CDC /* Background Assets Wrapper (iOS) */, + C09880F12F75CDAE007F1CDC /* Background Assets Wrapper (macOS) */, + C09880F62F75D093007F1CDC /* Background Assets Wrapper (tvOS) */, + C09881002F75D12D007F1CDC /* Background Assets Wrapper (visionOS) */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + C09880D42F75C6FC007F1CDC /* Resources */ = { + isa = PBXResourcesBuildPhase; + files = ( + ); + }; + C09880F02F75CDAE007F1CDC /* Resources */ = { + isa = PBXResourcesBuildPhase; + files = ( + ); + }; + C09880FA2F75D093007F1CDC /* Resources */ = { + isa = PBXResourcesBuildPhase; + files = ( + ); + }; + C09881042F75D12D007F1CDC /* Resources */ = { + isa = PBXResourcesBuildPhase; + files = ( + ); + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + C09880D22F75C6FC007F1CDC /* Sources */ = { + isa = PBXSourcesBuildPhase; + files = ( + C03426B92F9719E000711B1D /* String.swift in Sources */, + C03426B12F9711E600711B1D /* AssetPack.swift in Sources */, + C03426A82F96F37700711B1D /* Error.swift in Sources */, + C068C6372F96B5E00061B2DA /* AssetPackManager.swift in Sources */, + C068C6402F96B6600061B2DA /* Language.swift in Sources */, + C034269F2F96F1D600711B1D /* AssetPackManifest.swift in Sources */, + ); + }; + C09880EE2F75CDAE007F1CDC /* Sources */ = { + isa = PBXSourcesBuildPhase; + files = ( + C0477AEF2FA16C9E006F7CFF /* AssetPack.swift in Sources */, + C0477AF02FA16C9E006F7CFF /* AssetPackManifest.swift in Sources */, + C0477AF12FA16C9E006F7CFF /* Error.swift in Sources */, + C0477AF22FA16C9E006F7CFF /* String.swift in Sources */, + C0477AF32FA16C9E006F7CFF /* Language.swift in Sources */, + C0477AF42FA16C9E006F7CFF /* AssetPackManager.swift in Sources */, + ); + }; + C09880F82F75D093007F1CDC /* Sources */ = { + isa = PBXSourcesBuildPhase; + files = ( + C03426A22F96F1D600711B1D /* AssetPackManifest.swift in Sources */, + C03426B32F9711E600711B1D /* AssetPack.swift in Sources */, + C03426B82F9719E000711B1D /* String.swift in Sources */, + C0477AED2FA16C9B006F7CFF /* AssetPackManager.swift in Sources */, + C03426AB2F96F37700711B1D /* Error.swift in Sources */, + C068C6422F96B6600061B2DA /* Language.swift in Sources */, + ); + }; + C09881022F75D12D007F1CDC /* Sources */ = { + isa = PBXSourcesBuildPhase; + files = ( + C03426A12F96F1D600711B1D /* AssetPackManifest.swift in Sources */, + C03426B22F9711E600711B1D /* AssetPack.swift in Sources */, + C03426B72F9719E000711B1D /* String.swift in Sources */, + C0477AEE2FA16C9B006F7CFF /* AssetPackManager.swift in Sources */, + C03426AA2F96F37700711B1D /* Error.swift in Sources */, + C068C6432F96B6600061B2DA /* Language.swift in Sources */, + ); + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + C09880DB2F75C6FC007F1CDC /* Debug configuration for PBXProject "BackgroundAssetsWrapper" */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + AUP_SHELL_SCRIPT_PATH = "$(PROJECT_DIR)/../../../scripts/shell"; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ANALYZER_GCD_PERFORMANCE = YES; + CLANG_ANALYZER_LOCALIZABILITY_EMPTY_CONTEXT = YES; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_ANALYZER_OSOBJECT_C_STYLE_CAST = YES; + CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES; + CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES; + CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES; + CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; + CLANG_WARN_ASSIGN_ENUM = YES; + CLANG_WARN_ATOMIC_IMPLICIT_SEQ_CST = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_COMPLETION_HANDLER_MISUSE = YES; + CLANG_WARN_CXX0X_EXTENSIONS = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_FRAMEWORK_INCLUDE_PRIVATE_FROM_PUBLIC = YES; + CLANG_WARN_IMPLICIT_FALLTHROUGH = YES; + CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES; + CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_INTERFACE_IVARS = YES; + CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = YES; + CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES_AGGRESSIVE; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SEMICOLON_BEFORE_METHOD_BODY = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES_AGGRESSIVE; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DOCC_EXTRACT_OBJC_INFO_FOR_SWIFT_SYMBOLS = YES; + DOCC_EXTRACT_SWIFT_INFO_FOR_OBJC_SYMBOLS = YES; + ENABLE_MODULE_VERIFIER = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; + GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES; + GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; + GCC_WARN_ABOUT_MISSING_NEWLINE = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES; + GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; + GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; + GCC_WARN_SHADOW = YES; + GCC_WARN_SIGN_COMPARE = YES; + GCC_WARN_STRICT_SELECTOR_MATCH = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNKNOWN_PRAGMAS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_LABEL = YES; + GCC_WARN_UNUSED_PARAMETER = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + GENERATE_INFOPLIST_FILE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "c c++ objective-c objective-c++"; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + NATIVE_LIBRARY_ROOT_FOLDER_NAME = Apple.BackgroundAssets; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = BackgroundAssetsWrapper; + SUPPORTED_PLATFORMS = "xrsimulator xros watchsimulator watchos macosx kernelkit.xros kernelkit.watchos kernelkit.iphoneos kernelkit.appletvos iphonesimulator iphoneos appletvsimulator appletvos"; + SUPPORTS_MACCATALYST = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_UPCOMING_FEATURE_EXISTENTIAL_ANY = YES; + SWIFT_UPCOMING_FEATURE_INTERNAL_IMPORTS_BY_DEFAULT = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 6.0; + UNITY_PROJECT_FOLDER_NAME = Apple.BackgroundAssets_Unity; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + C09880DC2F75C6FC007F1CDC /* Release configuration for PBXProject "BackgroundAssetsWrapper" */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES; + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + AUP_SHELL_SCRIPT_PATH = "$(PROJECT_DIR)/../../../scripts/shell"; + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ANALYZER_GCD_PERFORMANCE = YES; + CLANG_ANALYZER_LOCALIZABILITY_EMPTY_CONTEXT = YES; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_ANALYZER_OSOBJECT_C_STYLE_CAST = YES; + CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES; + CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES; + CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_TIDY_BUGPRONE_REDUNDANT_BRANCH_CONDITION = YES; + CLANG_TIDY_MISC_REDUNDANT_EXPRESSION = YES; + CLANG_WARN_ASSIGN_ENUM = YES; + CLANG_WARN_ATOMIC_IMPLICIT_SEQ_CST = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_COMPLETION_HANDLER_MISUSE = YES; + CLANG_WARN_CXX0X_EXTENSIONS = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_FRAMEWORK_INCLUDE_PRIVATE_FROM_PUBLIC = YES; + CLANG_WARN_IMPLICIT_FALLTHROUGH = YES; + CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES; + CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_INTERFACE_IVARS = YES; + CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = YES; + CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES_AGGRESSIVE; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SEMICOLON_BEFORE_METHOD_BODY = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES_AGGRESSIVE; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DOCC_EXTRACT_OBJC_INFO_FOR_SWIFT_SYMBOLS = YES; + DOCC_EXTRACT_SWIFT_INFO_FOR_OBJC_SYMBOLS = YES; + ENABLE_MODULE_VERIFIER = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; + GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES; + GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; + GCC_WARN_ABOUT_MISSING_NEWLINE = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES; + GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; + GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; + GCC_WARN_SHADOW = YES; + GCC_WARN_SIGN_COMPARE = YES; + GCC_WARN_STRICT_SELECTOR_MATCH = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNKNOWN_PRAGMAS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_LABEL = YES; + GCC_WARN_UNUSED_PARAMETER = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + GENERATE_INFOPLIST_FILE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "c c++ objective-c objective-c++"; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + NATIVE_LIBRARY_ROOT_FOLDER_NAME = Apple.BackgroundAssets; + PRODUCT_NAME = BackgroundAssetsWrapper; + SUPPORTED_PLATFORMS = "xrsimulator xros watchsimulator watchos macosx kernelkit.xros kernelkit.watchos kernelkit.iphoneos kernelkit.appletvos iphonesimulator iphoneos appletvsimulator appletvos"; + SUPPORTS_MACCATALYST = YES; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_UPCOMING_FEATURE_EXISTENTIAL_ANY = YES; + SWIFT_UPCOMING_FEATURE_INTERNAL_IMPORTS_BY_DEFAULT = YES; + SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES; + SWIFT_VERSION = 6.0; + UNITY_PROJECT_FOLDER_NAME = Apple.BackgroundAssets_Unity; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + C09880DE2F75C6FC007F1CDC /* Debug configuration for PBXNativeTarget "Background Assets Wrapper (iOS)" */ = { + isa = XCBuildConfiguration; + buildSettings = { + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; + LD_RUNPATH_SEARCH_PATHS = ( + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = ( + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.BackgroundAssetsWrapper-iOS"; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + C09880DF2F75C6FC007F1CDC /* Release configuration for PBXNativeTarget "Background Assets Wrapper (iOS)" */ = { + isa = XCBuildConfiguration; + buildSettings = { + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + IPHONEOS_DEPLOYMENT_TARGET = 26.0; + LD_RUNPATH_SEARCH_PATHS = ( + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = ( + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.BackgroundAssetsWrapper-iOS"; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + C09880F42F75CDAE007F1CDC /* Debug configuration for PBXNativeTarget "Background Assets Wrapper (macOS)" */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = NO; + MACOSX_DEPLOYMENT_TARGET = 26.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.BackgroundAssetsWrapper-macOS"; + SDKROOT = macosx; + SUPPORTED_PLATFORMS = macosx; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_OBJC_BRIDGING_HEADER = "Background Assets Wrapper/Bridging.h"; + }; + name = Debug; + }; + C09880F52F75CDAE007F1CDC /* Release configuration for PBXNativeTarget "Background Assets Wrapper (macOS)" */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = NO; + MACOSX_DEPLOYMENT_TARGET = 26.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.BackgroundAssetsWrapper-macOS"; + SDKROOT = macosx; + SUPPORTED_PLATFORMS = macosx; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_OBJC_BRIDGING_HEADER = "Background Assets Wrapper/Bridging.h"; + }; + name = Release; + }; + C09880FC2F75D093007F1CDC /* Debug configuration for PBXNativeTarget "Background Assets Wrapper (tvOS)" */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = ( + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = ( + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.BackgroundAssetsWrapper-tvOS"; + SDKROOT = appletvos; + SUPPORTED_PLATFORMS = "appletvos appletvsimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 26.0; + }; + name = Debug; + }; + C09880FD2F75D093007F1CDC /* Release configuration for PBXNativeTarget "Background Assets Wrapper (tvOS)" */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = ( + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = ( + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.BackgroundAssetsWrapper-tvOS"; + SDKROOT = appletvos; + SUPPORTED_PLATFORMS = "appletvos appletvsimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 26.0; + }; + name = Release; + }; + C09881062F75D12D007F1CDC /* Debug configuration for PBXNativeTarget "Background Assets Wrapper (visionOS)" */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = ( + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = ( + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.BackgroundAssetsWrapper-visionOS"; + SDKROOT = xros; + SUPPORTED_PLATFORMS = "xros xrsimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + TARGETED_DEVICE_FAMILY = 7; + XROS_DEPLOYMENT_TARGET = 26.0; + }; + name = Debug; + }; + C09881072F75D12D007F1CDC /* Release configuration for PBXNativeTarget "Background Assets Wrapper (visionOS)" */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = ( + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = ( + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.BackgroundAssetsWrapper-visionOS"; + SDKROOT = xros; + SUPPORTED_PLATFORMS = "xros xrsimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + TARGETED_DEVICE_FAMILY = 7; + XROS_DEPLOYMENT_TARGET = 26.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + C09880D02F75C6FC007F1CDC /* Build configuration list for PBXProject "BackgroundAssetsWrapper" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C09880DB2F75C6FC007F1CDC /* Debug configuration for PBXProject "BackgroundAssetsWrapper" */, + C09880DC2F75C6FC007F1CDC /* Release configuration for PBXProject "BackgroundAssetsWrapper" */, + ); + defaultConfigurationName = Release; + }; + C09880DD2F75C6FC007F1CDC /* Build configuration list for PBXNativeTarget "Background Assets Wrapper (iOS)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C09880DE2F75C6FC007F1CDC /* Debug configuration for PBXNativeTarget "Background Assets Wrapper (iOS)" */, + C09880DF2F75C6FC007F1CDC /* Release configuration for PBXNativeTarget "Background Assets Wrapper (iOS)" */, + ); + defaultConfigurationName = Release; + }; + C09880F32F75CDAE007F1CDC /* Build configuration list for PBXNativeTarget "Background Assets Wrapper (macOS)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C09880F42F75CDAE007F1CDC /* Debug configuration for PBXNativeTarget "Background Assets Wrapper (macOS)" */, + C09880F52F75CDAE007F1CDC /* Release configuration for PBXNativeTarget "Background Assets Wrapper (macOS)" */, + ); + defaultConfigurationName = Release; + }; + C09880FB2F75D093007F1CDC /* Build configuration list for PBXNativeTarget "Background Assets Wrapper (tvOS)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C09880FC2F75D093007F1CDC /* Debug configuration for PBXNativeTarget "Background Assets Wrapper (tvOS)" */, + C09880FD2F75D093007F1CDC /* Release configuration for PBXNativeTarget "Background Assets Wrapper (tvOS)" */, + ); + defaultConfigurationName = Release; + }; + C09881052F75D12D007F1CDC /* Build configuration list for PBXNativeTarget "Background Assets Wrapper (visionOS)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C09881062F75D12D007F1CDC /* Debug configuration for PBXNativeTarget "Background Assets Wrapper (visionOS)" */, + C09881072F75D12D007F1CDC /* Release configuration for PBXNativeTarget "Background Assets Wrapper (visionOS)" */, + ); + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = C09880CD2F75C6FC007F1CDC /* Project object */; +} diff --git a/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/iOS - Debug.xcscheme b/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/iOS - Debug.xcscheme new file mode 100644 index 00000000..694863d8 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/iOS - Debug.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/iOS - Release.xcscheme b/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/iOS - Release.xcscheme new file mode 100644 index 00000000..0f4ac2c1 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/iOS - Release.xcscheme @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/macOS - Debug.xcscheme b/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/macOS - Debug.xcscheme new file mode 100644 index 00000000..79c3bafc --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/macOS - Debug.xcscheme @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/macOS - Release.xcscheme b/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/macOS - Release.xcscheme new file mode 100644 index 00000000..bdf02331 --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/macOS - Release.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/tvOS - Debug.xcscheme b/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/tvOS - Debug.xcscheme new file mode 100644 index 00000000..1983675a --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/tvOS - Debug.xcscheme @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/tvOS - Release.xcscheme b/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/tvOS - Release.xcscheme new file mode 100644 index 00000000..e0afb5eb --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/tvOS - Release.xcscheme @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/visionOS - Debug.xcscheme b/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/visionOS - Debug.xcscheme new file mode 100644 index 00000000..432df08d --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/visionOS - Debug.xcscheme @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/visionOS - Release.xcscheme b/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/visionOS - Release.xcscheme new file mode 100644 index 00000000..9610a6be --- /dev/null +++ b/plug-ins/Apple.BackgroundAssets/Native/BackgroundAssetsWrapper.xcodeproj/xcshareddata/xcschemes/visionOS - Release.xcscheme @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/CHANGELOG.md b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/CHANGELOG.md index ab000d7e..a25e5873 100644 --- a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/CHANGELOG.md +++ b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/CHANGELOG.md @@ -1,6 +1,27 @@ # CHANGELOG All notable changes to this project will be documented in this file. +## [3.3.0] - 2026-09-16 +### Added +- `ObjectExtensions.GetLongId()`, giving callers version-agnostic access to a Unity object's + identity across the `GetInstanceID()` to `GetEntityId()` change in Unity 6000.4. +- Expanded the Swift/Objective-C interop runtime (`NSObject`, `SwiftArray`, `AsyncStream`, + `Currency`, interop delegates and tasks) to support the new StoreKit plug-in and the latest-OS + (iOS 26, macOS 26, tvOS 26, visionOS 26) APIs. + +### Changed +- Updated the native projects for Xcode 27 and raised their deployment targets to iOS 15.0, + tvOS 15.0, and macOS 12.0, matching the minimum OS versions the plug-ins already document as + supported. +- `ApplePlugInEnvironment` now reports an error instead of a warning when a plug-in has neither a + Debug nor a Release native library available, rather than failing later in the Xcode build. +- Removed the unused editor shell-command infrastructure (`ShellCommandRunner`, + `XcodeBuildCommand`, `XcrunCommand`, `CodsignCommand`, `KeychainCommand`, `ProductBuildCommand`, + and `ProductSignCommand`). + +### Fixed +- Fixed plug-in builds when the source root path contains a space character. + ## [3.2.0] - 2025-10-13 - Added wrappers around NSCalendarUnit and NSDateComponents diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/AppleBuildProfileEditor.cs b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/AppleBuildProfileEditor.cs index 82c17ae8..37d4703d 100644 --- a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/AppleBuildProfileEditor.cs +++ b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/AppleBuildProfileEditor.cs @@ -180,11 +180,7 @@ public override void OnInspectorGUI() { if (_serializedDefaultInfoPlist.objectReferenceValue != null) { -#if UNITY_6000_4_OR_NEWER - string filePath = AssetDatabase.GetAssetPath(_serializedDefaultInfoPlist.objectReferenceValue.GetEntityId()); -#else - string filePath = AssetDatabase.GetAssetPath(_serializedDefaultInfoPlist.objectReferenceValue.GetInstanceID()); -#endif + string filePath = AssetDatabase.GetAssetPath(_serializedDefaultInfoPlist.objectReferenceValue); if (!filePath.EndsWith(".plist")) { _serializedDefaultInfoPlist.objectReferenceValue = null; @@ -236,11 +232,7 @@ public override void OnInspectorGUI() EditorGUILayout.ObjectField(_serializedDefaultEntitlements, typeof(UnityEngine.Object), defaultEntitlementsLabel, GUILayout.MinWidth(_minLabelWidth)); if (EditorGUI.EndChangeCheck() && !(_serializedDefaultEntitlements.objectReferenceValue is null)) { -#if UNITY_6000_4_OR_NEWER - string filePath = AssetDatabase.GetAssetPath(_serializedDefaultEntitlements.objectReferenceValue.GetEntityId()); -#else - string filePath = AssetDatabase.GetAssetPath(_serializedDefaultEntitlements.objectReferenceValue.GetInstanceID()); -#endif + string filePath = AssetDatabase.GetAssetPath(_serializedDefaultEntitlements.objectReferenceValue); if (!filePath.EndsWith(".entitlements")) { _serializedDefaultEntitlements.objectReferenceValue = null; diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/ApplePlugInEnvironment.cs b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/ApplePlugInEnvironment.cs index 574009f1..0dfb2c9a 100644 --- a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/ApplePlugInEnvironment.cs +++ b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/ApplePlugInEnvironment.cs @@ -322,12 +322,24 @@ private static void ValidateLibraries() AppleNativeLibrary currLibrary = GetLibrary(applePackage.DisplayName, _trackedAppleConfig.Principal, _trackedApplePlatform); if (!currLibrary.IsValid) { - string warningMessage = $"[Apple Unity Plug-Ins] Missing {_trackedAppleConfig.Principal} {applePackage.DisplayName} native library for {_trackedApplePlatform}\n" - + $" {_trackedAppleConfig.Fallback} {applePackage.DisplayName} native library for {_trackedApplePlatform} will be used as a fallback.\n" - + $" To generate the {_trackedAppleConfig.Principal} native library for {applePackage.DisplayName}, try re-building the {applePackage.DisplayName} plug-in with the following command line (assuming the working directory is the Apple Unity Plug-In project root folder):\n\n" - + $" $> python3 ./build.py -p {applePackage.ShortName}\n"; + AppleNativeLibrary fallbackLibrary = GetLibrary(applePackage.DisplayName, _trackedAppleConfig.Fallback, _trackedApplePlatform); + if (fallbackLibrary.IsValid) + { + string warningMessage = $"[Apple Unity Plug-Ins] Missing {_trackedAppleConfig.Principal} {applePackage.DisplayName} native library for {_trackedApplePlatform}\n" + + $" {_trackedAppleConfig.Fallback} {applePackage.DisplayName} native library for {_trackedApplePlatform} will be used as a fallback.\n" + + $" To generate the {_trackedAppleConfig.Principal} native library for {applePackage.DisplayName}, try re-building the {applePackage.DisplayName} plug-in with the following command line (assuming the working directory is the Apple Unity Plug-In project root folder):\n\n" + + $" $> python3 ./build.py -p {applePackage.ShortName}\n"; - Debug.LogWarning(warningMessage); + Debug.LogWarning(warningMessage); + } + else + { + string errorMessage = $"[Apple Unity Plug-Ins] No usable {applePackage.DisplayName} native library found for {_trackedApplePlatform}. Both the {_trackedAppleConfig.Principal} and {_trackedAppleConfig.Fallback} native libraries are missing.\n" + + $" To generate the native library for {applePackage.DisplayName}, try re-building the {applePackage.DisplayName} plug-in with the following command line (assuming the working directory is the Apple Unity Plug-In project root folder):\n\n" + + $" $> python3 ./build.py -p {applePackage.ShortName}\n"; + + Debug.LogError(errorMessage); + } } } else if (buildStep.IsEnabled) diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/CodsignCommand.cs b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/CodsignCommand.cs deleted file mode 100644 index 8b540339..00000000 --- a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/CodsignCommand.cs +++ /dev/null @@ -1,94 +0,0 @@ -#if (UNITY_EDITOR_OSX && (UNITY_IOS || UNITY_TVOS || UNITY_STANDALONE_OSX || UNITY_VISIONOS)) -using System.Collections.Generic; -using System.IO; - -namespace Apple.Core -{ - public class CodsignCommand - { - private List _parameters; - private List _targets; - - public CodsignCommand() - { - _parameters = new List(); - _targets = new List(); - } - - public CodsignCommand WithForce() - { - _parameters.Add("--force"); - return this; - } - - public CodsignCommand WithVerify() - { - _parameters.Add("--verify"); - return this; - } - - public CodsignCommand WithDeep() - { - _parameters.Add("--deep"); - return this; - } - - public CodsignCommand WithVerbose() - { - _parameters.Add("--verbose"); - return this; - } - - public CodsignCommand WithKeychainPath(string keychainPath) - { - _parameters.Add($"--keychain {Path.GetFullPath(keychainPath)}"); - return this; - } - - public CodsignCommand WithPreserveMetaData(string metaData) - { - _parameters.Add($"--preserve-metadata={metaData}"); - return this; - } - - public CodsignCommand WithSigningIdentity(string signingIdentityName) - { - _parameters.Add($"--sign '{signingIdentityName}'"); - return this; - } - - public CodsignCommand WithEntitlementsPath(string entitlementsPath) - { - _parameters.Add($"--entitlements {entitlementsPath}"); - return this; - } - - public CodsignCommand WithTarget(string targetPath) - { - _targets.Add(targetPath); - return this; - } - - public CodsignCommand WithTargets(IEnumerable targetPaths) - { - _targets.AddRange(targetPaths); - return this; - } - - public int Run() - { - var commands = new List(); - - foreach(var target in _targets) - { - var command = $"codesign {string.Join(" ", _parameters)} {target}"; - commands.Add(command); - } - - var compoundCommand = string.Join(" && ", commands); - - return ShellCommandRunner.Run(compoundCommand); - } - } -} -#endif // (UNITY_EDITOR_OSX && (UNITY_IOS || UNITY_TVOS || UNITY_STANDALONE_OSX || UNITY_VISIONOS)) diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/KeychainCommand.cs b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/KeychainCommand.cs deleted file mode 100644 index 42c55644..00000000 --- a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/KeychainCommand.cs +++ /dev/null @@ -1,78 +0,0 @@ -#if (UNITY_EDITOR_OSX && (UNITY_IOS || UNITY_TVOS || UNITY_STANDALONE_OSX || UNITY_VISIONOS)) -using System.IO; - -namespace Apple.Core -{ - public class KeychainCommand - { - private string _keychainPath; - private string _keychainPassword; - public bool _verbose; - - public KeychainCommand WithKeychainPath(string keychainPath) - { - _keychainPath = Path.GetFullPath(keychainPath); - return this; - } - - public KeychainCommand WithKeychainPassword(string keychainPassword) - { - _keychainPassword = keychainPassword; - return this; - } - - public KeychainCommand WithVerbose(bool verbose) - { - _verbose = verbose; - return this; - } - - public int Unlock() - { - var command = $"(security {GetVerboseString()} unlock-keychain -p {_keychainPassword} {_keychainPath} && security {GetVerboseString()} set-keychain-settings -lut 7200 {_keychainPath})"; - - return ShellCommandRunner.Run(command, new string[] { _keychainPassword }); - } - - private string GetVerboseString() - { - if(_verbose) - { - return "-v"; - } - - return string.Empty; - } - - public int AddGenericPassword(string account, string keychainItemName, string password) - { - var command = $"security add-generic-password -a '{account}' -s '{keychainItemName}' -w '{password}'"; - return ShellCommandRunner.Run(command, new []{password}, out _, out _); - } - - public int FindGenericPassword(string account, string keychainItemName, out string password) - { - var command = $"security find-generic-password -a '{account}' -s '{keychainItemName}' -w"; - return ShellCommandRunner.Run(command, null, out password, out _); - } - - public int DeleteGenericPassword(string account, string keychainItemName) - { - var command = $"security delete-generic-password -a '{account}' -s '{keychainItemName}'"; - return ShellCommandRunner.Run(command, null, out _, out _); - } - - public int SetAsDefaultKeychain() - { - var command = $"(security {GetVerboseString()} list-keychain -d user -s {_keychainPath} && security {GetVerboseString()} default-keychain -d user -s '{_keychainPath}')"; - return ShellCommandRunner.Run(command); - } - - public int RestoreLoginDefaultKeychain() - { - var command = $"(security {GetVerboseString()} list-keychain -d user -s login.keychain && security {GetVerboseString()} default-keychain -d user -s login.keychain)"; - return ShellCommandRunner.Run(command); - } - } -} -#endif // (UNITY_EDITOR_OSX && (UNITY_IOS || UNITY_TVOS || UNITY_STANDALONE_OSX || UNITY_VISIONOS)) diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/ProductBuildCommand.cs b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/ProductBuildCommand.cs deleted file mode 100644 index 46693b60..00000000 --- a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/ProductBuildCommand.cs +++ /dev/null @@ -1,48 +0,0 @@ -#if (UNITY_EDITOR_OSX && (UNITY_IOS || UNITY_TVOS || UNITY_STANDALONE_OSX || UNITY_VISIONOS)) -using System.Collections.Generic; -using System.IO; - -namespace Apple.Core -{ - public class ProductBuildCommand - { - private List _parameters; - - public ProductBuildCommand() - { - _parameters = new List(); - } - - public ProductBuildCommand WithComponent(string component, string installPath = "/Applications") - { - _parameters.Add($"--component {component} {installPath}"); - return this; - } - - public ProductBuildCommand WithSigningIdentity(string codeSigningIdentifier) - { - _parameters.Add($"--sign '{codeSigningIdentifier}'"); - return this; - } - - public ProductBuildCommand WithKeychainPath(string keychainPath) - { - _parameters.Add($"--keychain '{Path.GetFullPath(keychainPath)}'"); - return this; - } - - public ProductBuildCommand WithVersion(string version) - { - _parameters.Add($"--version '{version}'"); - return this; - } - - public int Run(string pkgOutputPath) - { - var command = $"productbuild {string.Join(" ", _parameters)} {pkgOutputPath}"; - - return ShellCommandRunner.Run(command); - } - } -} -#endif // (UNITY_EDITOR_OSX && (UNITY_IOS || UNITY_TVOS || UNITY_STANDALONE_OSX || UNITY_VISIONOS)) diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/ProductSignCommand.cs b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/ProductSignCommand.cs deleted file mode 100644 index 5ec52806..00000000 --- a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/ProductSignCommand.cs +++ /dev/null @@ -1,15 +0,0 @@ -#if (UNITY_EDITOR_OSX && (UNITY_IOS || UNITY_TVOS || UNITY_STANDALONE_OSX || UNITY_VISIONOS)) - -namespace Apple.Core -{ - public class ProductSignCommand - { - public int Run(string codeSigningIdentifier, string unsignedPKGPath, string signedOutputPKGPath) - { - var command = $"productsign --sign {codeSigningIdentifier} {unsignedPKGPath} {signedOutputPKGPath}"; - - return ShellCommandRunner.Run(command); - } - } -} -#endif // (UNITY_EDITOR_OSX && (UNITY_IOS || UNITY_TVOS || UNITY_STANDALONE_OSX || UNITY_VISIONOS)) diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/ShellCommandRunner.cs b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/ShellCommandRunner.cs deleted file mode 100644 index 9ea48401..00000000 --- a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/ShellCommandRunner.cs +++ /dev/null @@ -1,99 +0,0 @@ -#if (UNITY_EDITOR_OSX && (UNITY_IOS || UNITY_TVOS || UNITY_STANDALONE_OSX || UNITY_VISIONOS)) -using System; -using UnityEngine; - -namespace Apple.Core -{ - public static class ShellCommandRunner - { - public static bool DisplayUnityProgressBar = true; - - /// - /// Executies the shell command and masks any values - /// specified in maskValues with [Masked] from logs. - /// - /// - /// - /// - public static int Run(string command, string[] maskValues = null) - { - var exitCode = Run(command, maskValues, out var standardOutput, out var standardError); - - if (!string.IsNullOrEmpty(standardOutput)) - { - Debug.Log(SanitizeForLog(standardOutput, maskValues)); - } - - if (!string.IsNullOrEmpty(standardError)) - { - Debug.LogError(SanitizeForLog(standardError, maskValues)); - } - - return exitCode; - } - - public static int Run(string command, string[] maskValues, out string standardOutput, out string standardError) - { - standardOutput = null; - standardError = null; - - Debug.Log($"ShellCommandRunner: Running => {SanitizeForLog(command, maskValues)}"); - - if(!Application.isBatchMode && DisplayUnityProgressBar) - { - UnityEditor.EditorUtility.DisplayProgressBar("ShellCommandRunner", SanitizeForLog(command, maskValues), .25f); - } - - var proc = new System.Diagnostics.Process(); - proc.StartInfo.FileName = @"/bin/bash"; - proc.StartInfo.Arguments = "-c \" " + command + " \""; - proc.StartInfo.UseShellExecute = false; - proc.StartInfo.CreateNoWindow = true; - proc.StartInfo.RedirectStandardOutput = true; - proc.StartInfo.RedirectStandardError = true; - proc.Start(); - - var output = proc.StandardOutput.ReadToEnd(); - var error = proc.StandardError.ReadToEnd(); - proc.WaitForExit(); - - // Log output... - if (!string.IsNullOrEmpty(output)) - { - standardOutput = output; - } - - // Log errors... - if(!string.IsNullOrEmpty(error)) - { - standardError = output; - } - - if (!Application.isBatchMode && DisplayUnityProgressBar) - { - UnityEditor.EditorUtility.ClearProgressBar(); - } - - return proc.ExitCode; - } - - private static string SanitizeForLog(string outputLog, string[] maskValues) - { - if (maskValues == null) - return outputLog; - - var sanitizedCommand = outputLog; - - foreach(var value in maskValues) - { - if (string.IsNullOrEmpty(value)) - continue; - - sanitizedCommand = sanitizedCommand.Replace(value, "[Masked]"); - } - - return sanitizedCommand; - } - } -} -#endif // (UNITY_EDITOR_OSX && (UNITY_IOS || UNITY_TVOS || UNITY_STANDALONE_OSX || UNITY_VISIONOS)) diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/ShellCommandRunner.cs.meta b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/ShellCommandRunner.cs.meta deleted file mode 100644 index de80dbe1..00000000 --- a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/ShellCommandRunner.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0e9a7c23a5a5947058def4f3d7f1722f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/XcodeBuildCommand.cs b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/XcodeBuildCommand.cs deleted file mode 100644 index 47b3f0ff..00000000 --- a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/XcodeBuildCommand.cs +++ /dev/null @@ -1,128 +0,0 @@ -#if (UNITY_EDITOR_OSX && (UNITY_IOS || UNITY_TVOS || UNITY_STANDALONE_OSX || UNITY_VISIONOS)) -using System.Collections.Generic; -using System.IO; - -namespace Apple.Core -{ - public class XcodeBuildCommand - { - private List _parameters; - - public XcodeBuildCommand() - { - _parameters = new List(); - } - - public XcodeBuildCommand WithScheme(string scheme) - { - _parameters.Add($"-scheme {scheme}"); - return this; - } - - public XcodeBuildCommand WithProject(string projectPath) - { - _parameters.Add($"-project {projectPath}"); - return this; - } - - public XcodeBuildCommand WithDestination(string destination) - { - _parameters.Add($"-destination {destination}"); - return this; - } - - public XcodeBuildCommand WithSDK(string sdk) - { - _parameters.Add($"-sdk {sdk}"); - return this; - } - - public XcodeBuildCommand WithConfiguration(string configuration) - { - _parameters.Add($"-configuration {configuration}"); - return this; - } - - public XcodeBuildCommand WithArchivePath(string archivePath) - { - _parameters.Add($"-archivePath {archivePath}"); - return this; - } - - public XcodeBuildCommand WithDevelopmentTeam(string developmentTeam) - { - _parameters.Add($"DEVELOPMENT_TEAM={developmentTeam}"); - return this; - } - - public XcodeBuildCommand WithCodeSignStyle(string codeSignStyle) - { - _parameters.Add($"CODE_SIGN_STYLE={codeSignStyle}"); - return this; - } - - public XcodeBuildCommand WithProvisionProfileSpecifierApp(string provisionProfileSpecifier) - { - _parameters.Add($"PROVISIONING_PROFILE_SPECIFIER_APP='{provisionProfileSpecifier}'"); - return this; - } - - public XcodeBuildCommand WithProvisionProfileSpecifier(string provisionProfileSpecifier) - { - _parameters.Add($"PROVISIONING_PROFILE_SPECIFIER='{provisionProfileSpecifier}'"); - return this; - } - - public XcodeBuildCommand WithCodeSigningIdentity(string codeSigningIdentity) - { - _parameters.Add($"CODE_SIGN_IDENTITY='{codeSigningIdentity}'"); - return this; - } - - public XcodeBuildCommand WithEntitlementsFile(string entitlementsPath) - { - _parameters.Add($"CODE_SIGN_ENTITLEMENTS={entitlementsPath}"); - return this; - } - - public XcodeBuildCommand WithExportOptionsPlist(string exportOptionsPlist) - { - _parameters.Add($"-exportOptionsPlist {exportOptionsPlist}"); - return this; - } - - public XcodeBuildCommand WithKeychainPath(string keychainPath) - { - _parameters.Add($"OTHER_CODE_SIGN_FLAGS='--keychain={Path.GetFullPath(keychainPath)}'"); - return this; - } - - public XcodeBuildCommand WithExportPath(string exportPath) - { - _parameters.Add($"-exportPath {exportPath}"); - return this; - } - - public XcodeBuildCommand WithUseModernBuildSystem(bool useModernBuildSystem) - { - var param = useModernBuildSystem ? "YES" : "NO"; - _parameters.Add($"-UseModernBuildSystem={param}"); - - return this; - } - - public int Archive() - { - var command = $"xcodebuild {string.Join(" ", _parameters)} archive"; - return ShellCommandRunner.Run(command); - } - - - public int Export() - { - var command = $"xcodebuild -exportArchive {string.Join(" ", _parameters)}"; - return ShellCommandRunner.Run(command); - } - } -} -#endif // (UNITY_EDITOR_OSX && (UNITY_IOS || UNITY_TVOS || UNITY_STANDALONE_OSX || UNITY_VISIONOS)) diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/XcodeBuildCommand.cs.meta b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/XcodeBuildCommand.cs.meta deleted file mode 100644 index effc259a..00000000 --- a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/XcodeBuildCommand.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4a192431c6bd84c1d99b8ce55467c946 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/XcrunCommand.cs b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/XcrunCommand.cs deleted file mode 100644 index 1419f572..00000000 --- a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/XcrunCommand.cs +++ /dev/null @@ -1,53 +0,0 @@ -#if (UNITY_EDITOR_OSX && (UNITY_IOS || UNITY_TVOS || UNITY_STANDALONE_OSX || UNITY_VISIONOS)) -using System.Collections.Generic; -using System.IO; - -namespace Apple.Core -{ - public class XcrunCommand - { - private List _parameters; - private List _maskedParameters; - - public XcrunCommand() - { - _parameters = new List(); - _maskedParameters = new List(); - } - - public XcrunCommand WithCredentials(string username, string password) - { - _parameters.Add($"--username '{username}' --password '{password}'"); - _maskedParameters.Add(username); - _maskedParameters.Add(password); - return this; - } - - public XcrunCommand WithType(string type) - { - _parameters.Add($"--type {type}"); - return this; - } - - public XcrunCommand WithFile(string filePath) - { - _parameters.Add($"--file {Path.GetFullPath(filePath)}"); - return this; - } - - public int ValidateApp() - { - var command = $"xcrun altool --validate-app {string.Join(" ", _parameters)}"; - - return ShellCommandRunner.Run(command, _maskedParameters.ToArray()); - } - - public int UploadApp() - { - var command = $"xcrun altool --upload-app {string.Join(" ", _parameters)}"; - - return ShellCommandRunner.Run(command, _maskedParameters.ToArray()); - } - } -} -#endif // (UNITY_EDITOR_OSX && (UNITY_IOS || UNITY_TVOS || UNITY_STANDALONE_OSX || UNITY_VISIONOS)) diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/XcrunCommand.cs.meta b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/XcrunCommand.cs.meta deleted file mode 100644 index a33d77eb..00000000 --- a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/XcrunCommand.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b27f6421b079441b192d76ce9cd7f4e3 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/AsyncStream.cs b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/AsyncStream.cs new file mode 100644 index 00000000..5e4bef55 --- /dev/null +++ b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/AsyncStream.cs @@ -0,0 +1,254 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using AOT; +using Apple.Core.Runtime; +using UnityEngine; + +namespace Apple.Core +{ + public interface IAsyncSequence : IAsyncEnumerable + { + long Id { get; } + } + public static class AsyncStreamInterop + { + private static Dictionary _streamMap = new Dictionary(); + private static long _streamId = long.MinValue; + private static object _lock = new object(); + + public static IAsyncSequence Create(Func create) + where T: class + { + Debug.Log("AsyncStreamInterop.Create"); + lock(_lock) + { + if (_streamId == long.MaxValue) + _streamId = long.MinValue; + + var id = _streamId++; + var stream = new PrivateStream(id, create); + _streamMap.Add(id, stream); + return stream; + } + } + + [MonoPInvokeCallback(typeof(SuccessTaskCallback))] + public static void AddValue(long id, IntPtr value) + { + Debug.Log("AsyncStreamInterop.AddValue"); + IPrivateStream stream = null; + + lock (_lock) + { + if (!_streamMap.TryGetValue(id, out var obj)) + { + Debug.Log("Stream map did not have id: " + id); + return; + } + + stream = (IPrivateStream)obj; + } + + stream?.AddValue(value); + } + + [MonoPInvokeCallback(typeof(SuccessTaskCallback))] + public static void Completed(long id) + { + Debug.Log("AsyncStreamInterop.Completed"); + IPrivateStream stream = null; + + lock (_lock) + { + if (!_streamMap.TryGetValue(id, out var obj)) + { + return; + } + + stream = (IPrivateStream)obj; + } + + stream?.Completed(); + } + + private static void Remove(long id) + { + lock(_lock) + { + if (_streamMap.ContainsKey(id)) + { + _streamMap.Remove(id); + } + else + { + Debug.Log("Stream map did not have id: " + id); + } + } + } + + // Type erasure for generics + private interface IPrivateStream + { + void AddValue(IntPtr value); + void Completed(); + } + + private sealed class PrivateStream : IAsyncSequence, IPrivateStream + where T: class + { + private readonly Func _create; + private List _items = new(); + private volatile bool _completed = false; + private ReaderWriterLockSlim _rwLock = new ReaderWriterLockSlim(); + + public long Id { get; } + + public PrivateStream(long id, Func create) + { + Id = id; + _create = create; + } + + public void AddValue(IntPtr ptr) + { + Debug.Log("PrivateStream.AddValue"); + var item = _create(ptr); + + _rwLock.EnterWriteLock(); + try + { + _items.Add(item); + Debug.Log("PrivateStream.AddValue: Added item, total count: " + _items.Count); + } + finally + { + _rwLock.ExitWriteLock(); + } + } + + public void Completed() + { + Debug.Log("PrivateStream.Completed"); + _completed = true; + + // The static map no longer needs to hold onto this. At this point an enumerator will + // keep this alive as long as there is a consumer for it. + Debug.Log($"PrivateStream.Completed: Removing {Id} from map"); + AsyncStreamInterop.Remove(Id); + } + + // Async method causes state machine building, so use synchronous first to avoid + // emitting a state machine when not needed + public ValueTask<(bool, T)> TryGetValue(int index, CancellationToken cancellationToken) + { + Debug.Log("PrivateStream.TryGetValue: Attempting to get item at index " + index); + // Synchronous attempt + _rwLock.EnterReadLock(); + try + { + if (_items.Count > index) + { + Debug.Log("PrivateStream.TryGetValue: Found item at index " + index); + var result = (true, _items[index]); + return new ValueTask<(bool, T)>(result); + } + } + finally + { + _rwLock.ExitReadLock(); + } + + return TryGetValueAsync(index, cancellationToken); + } + + private async ValueTask<(bool, T)> TryGetValueAsync(int index, CancellationToken cancellationToken) + { + // Loop until copmletion with a delay + Debug.Log("PrivateStream.TryGetValueAsync: Waiting for item at index " + index); + while(!_completed) + { + await Task.Delay(100 /*ms*/, cancellationToken); + + _rwLock.EnterReadLock(); + try + { + if (_items.Count > index) + { + return (true, _items[index]); + } + } + finally + { + _rwLock.ExitReadLock(); + } + } + + // One last try after completed just to make sure it wasn't added after the lock + _rwLock.EnterReadLock(); + try + { + if (_items.Count > index) + { + return (true, _items[index]); + } + } + finally + { + _rwLock.ExitReadLock(); + } + + return (false, null); + } + + public IAsyncEnumerator GetAsyncEnumerator(CancellationToken cancellationToken = default) + { + return new AsyncEnumerator(this, cancellationToken); + } + } + + private sealed class AsyncEnumerator : IAsyncEnumerator + where T: class + { + private readonly PrivateStream _stream; + private readonly CancellationTokenSource _cts; + private int _index = -1; // Incremented on every MoveNextAsync + + public AsyncEnumerator(PrivateStream stream, CancellationToken cancellationToken) + { + _stream = stream; + _cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); + } + + public T Current { get; private set; } + + public ValueTask DisposeAsync() + { + Debug.Log("AsyncEnumerator.DisposeAsync"); + _cts.Cancel(); + _cts.Dispose(); + + return default; + } + + public async ValueTask MoveNextAsync() + { + Debug.Log("AsyncEnumerator.MoveNextAsync"); + if (_cts.IsCancellationRequested) + { + Debug.Log("AsyncEnumerator.MoveNextAsync: Cancellation requested"); + return false; + } + + var index = Interlocked.Increment(ref _index); + Debug.Log("AsyncEnumerator.MoveNextAsync: Moving to index " + index); + var (success, value) = await _stream.TryGetValue(index, _cts.Token); + Debug.Log("AsyncEnumerator.MoveNextAsync: TryGetValue returned success=" + success); + Current = value; + + return success; + } + } + } +} \ No newline at end of file diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/ProductBuildCommand.cs.meta b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/AsyncStream.cs.meta similarity index 83% rename from plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/ProductBuildCommand.cs.meta rename to plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/AsyncStream.cs.meta index fa6f478e..251063f0 100644 --- a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/ProductBuildCommand.cs.meta +++ b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/AsyncStream.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 32d941bcf84954d83a9b1ebbe5341043 +guid: b3b637e270c184e76b23dcce14f62afc MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/Currency.cs b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/Currency.cs new file mode 100644 index 00000000..60c85589 --- /dev/null +++ b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/Currency.cs @@ -0,0 +1,39 @@ +using System; +using System.Runtime.InteropServices; + +namespace Apple.Core.Runtime +{ + [Introduced(iOS: "16.0", macOS: "13.0", tvOS: "16.0", visionOS: "1.0")] + public class Currency : InteropReference + { + public Currency(IntPtr pointer) : base(pointer) { } + + public string Identifier => Interop.Currency_GetIdentifier(Pointer); + + public bool IsISOCurrency => Interop.Currency_GetIsISOCurrency(Pointer); + + public override string ToString() => Identifier; + + protected override void OnDispose(bool isDisposing) + { + if (Pointer != IntPtr.Zero) + { + Interop.Currency_Free(Pointer); + Pointer = IntPtr.Zero; + } + } + + private static class Interop + { + [DllImport(InteropUtility.DLLName)] + public static extern void Currency_Free(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string Currency_GetIdentifier(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.U1)] + public static extern bool Currency_GetIsISOCurrency(IntPtr pointer); + } + } +} diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/Currency.cs.meta b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/Currency.cs.meta new file mode 100644 index 00000000..7aaecf7a --- /dev/null +++ b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/Currency.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a7c3e8f1b2d4456789abcdef01234567 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/InteropDelegates.cs b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/InteropDelegates.cs index a36d6c05..897a8140 100644 --- a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/InteropDelegates.cs +++ b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/InteropDelegates.cs @@ -1,4 +1,5 @@ using System; +using System.Runtime.InteropServices; namespace Apple.Core.Runtime { @@ -6,6 +7,12 @@ namespace Apple.Core.Runtime public delegate void SuccessCallback(TResponse response); public delegate void SuccessTaskCallback(long taskId); public delegate void SuccessTaskCallback(long taskId, TResponse response); + + [return: MarshalAs(UnmanagedType.I1)] + public delegate bool SuccessTaskBoolReturningCallback(long taskId, TResponse response); + + public delegate void SuccessTaskArrayCallback(long taskId, IntPtr arrayPointer, int count); + public delegate void ErrorCallback(InteropError error); public delegate void NSErrorTaskCallback(long taskId, IntPtr errorPointer); public delegate void NSErrorCallback(IntPtr errorPointer); diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/InteropTasks.cs b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/InteropTasks.cs index f1e6ef88..4946dd6b 100644 --- a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/InteropTasks.cs +++ b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/InteropTasks.cs @@ -12,9 +12,27 @@ public static class InteropTasks private static readonly object _taskLock = new object(); private static long _callbackId = long.MinValue; - public static TaskCompletionSource Create(out long callbackId) + public static CleanupTaskCompletionSource Create(out long callbackId) { - var tcs = new TaskCompletionSource(); + var tcs = new CleanupTaskCompletionSource(); + + lock (_taskLock) + { + if (_callbackId == long.MaxValue) + _callbackId = long.MinValue; + + _callbackId++; + callbackId = _callbackId; + + _taskCompletionSources.Add(callbackId, tcs); + } + + return tcs; + } + + public static CleanupTaskCompletionSource Create(Action cleanup, out long callbackId) + { + var tcs = new CleanupTaskCompletionSource(cleanup); lock (_taskLock) { @@ -32,14 +50,14 @@ public static TaskCompletionSource Create(out long callbackId) public static bool TrySetResultAndRemove(long callbackId, TResult result) { - TaskCompletionSource tcs = null; + CleanupTaskCompletionSource tcs = null; lock (_taskLock) { if (!_taskCompletionSources.ContainsKey(callbackId)) return false; - tcs = (TaskCompletionSource)_taskCompletionSources[callbackId]; + tcs = (CleanupTaskCompletionSource)_taskCompletionSources[callbackId]; _taskCompletionSources.Remove(callbackId); } @@ -48,21 +66,21 @@ public static bool TrySetResultAndRemove(long callbackId, TResult resul public static bool TrySetExceptionAndRemove(long callbackId, Exception exception) { - TaskCompletionSource tcs = null; + CleanupTaskCompletionSource tcs = null; lock (_taskLock) { if (!_taskCompletionSources.ContainsKey(callbackId)) return false; - tcs = (TaskCompletionSource)_taskCompletionSources[callbackId]; + tcs = (CleanupTaskCompletionSource)_taskCompletionSources[callbackId]; _taskCompletionSources.Remove(callbackId); } return tcs.TrySetException(exception); } - public static bool TryGet(long callbackId, out TaskCompletionSource tcs) + public static bool TryGet(long callbackId, out CleanupTaskCompletionSource tcs) { tcs = null; @@ -71,7 +89,7 @@ public static bool TryGet(long callbackId, out TaskCompletionSource)_taskCompletionSources[callbackId]; + tcs = (CleanupTaskCompletionSource)_taskCompletionSources[callbackId]; } return true; @@ -85,4 +103,40 @@ public static void Remove(long callbackId) } } } + + public class CleanupTaskCompletionSource + { + private readonly Action _cleanup; + private readonly TaskCompletionSource _tcs = new TaskCompletionSource(); + public Task Task => _tcs.Task; + + public CleanupTaskCompletionSource(Action cleanup = null) + { + _cleanup = cleanup; + } + + public bool TrySetException(Exception exception) + { + _cleanup?.Invoke(); + return _tcs.TrySetException(exception); + } + + public bool TrySetResult(TResult result) + { + _cleanup?.Invoke(); + return _tcs.TrySetResult(result); + } + + public bool TrySetCanceled() + { + _cleanup?.Invoke(); + return _tcs.TrySetCanceled(); + } + + public bool TrySetCanceled(System.Threading.CancellationToken token) + { + _cleanup?.Invoke(); + return _tcs.TrySetCanceled(token); + } + } } diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/NSObject.cs b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/NSObject.cs index 5b833e15..b3ed3b24 100644 --- a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/NSObject.cs +++ b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/NSObject.cs @@ -68,7 +68,7 @@ private IntPtr NSObject_As(IntPtr nsObjectPtr, string targetClassName) // This isn't necessarily fatal but might indicate a problematic type naming inconsistency between C# and Objective-C. if (ptr == IntPtr.Zero) { - Debug.LogWarning($"Unable to convert object to type {targetClassName}"); + Debug.LogWarning($"Unable to convert {nsObjectPtr} to type {targetClassName}"); } return ptr; diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/ObjectExtensions.cs b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/ObjectExtensions.cs new file mode 100644 index 00000000..86f6ddb1 --- /dev/null +++ b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/ObjectExtensions.cs @@ -0,0 +1,34 @@ +using UnityEngine; + +namespace Apple.Core +{ + /// + /// Version-agnostic access to a Unity object's identity. + /// + /// Unity 6000.4 deprecated Object.GetInstanceID() in favour of GetEntityId(); from 2022.3 + /// through 6000.3 the int instance ID is still the current, non-obsolete API. This helper picks + /// whichever is right for the editor being compiled against, so call sites don't have to. + /// + /// Deliberately exposes no EntityId type of its own: UnityEngine.EntityId exists from Unity 6 + /// onward, and a second one in this namespace would make every file importing both ambiguous. + /// + public static class ObjectExtensions + { + /// + /// The object's identity widened to 64 bits, for passing across the native boundary. + /// + /// Treat the result as an opaque, process-local handle. The two branches below draw from + /// different number spaces — a genuine 64-bit entity ID on 6000.4 and newer, a sign-extended + /// 32-bit instance ID before that — so a value must never be serialized, nor compared + /// against one produced by a different editor version. + /// + public static ulong GetLongId(this Object @object) + { +#if UNITY_6000_4_OR_NEWER + return EntityId.ToULong(@object.GetEntityId()); +#else + return (ulong)@object.GetInstanceID(); +#endif + } + } +} diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/CodsignCommand.cs.meta b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/ObjectExtensions.cs.meta similarity index 83% rename from plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/CodsignCommand.cs.meta rename to plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/ObjectExtensions.cs.meta index 253ee9ec..3d810f2d 100644 --- a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/CodsignCommand.cs.meta +++ b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/ObjectExtensions.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 1df49a3e423714f618401ed26f55ed7a +guid: 983a60064dbaa4e44ab173b534466fd7 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/SwiftArray.cs b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/SwiftArray.cs new file mode 100644 index 00000000..d512b981 --- /dev/null +++ b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/SwiftArray.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using UnityEngine.Scripting; + +namespace Apple.Core.Runtime +{ + /// + /// Array of Swift InteropReference types. Each will use + /// to cast the pointer to the correct type. + /// + /// + [System.Diagnostics.DebuggerDisplay("Count = {Count}")] + [Preserve] + public class SwiftArray : InteropReference, IReadOnlyList + where T : InteropReference + { + public SwiftArray(IntPtr pointer, int count) : base(pointer) + { + Count = count; + } + + protected override void OnDispose(bool isDisposing) + { + if (Pointer != IntPtr.Zero) + { + SwiftArrayInterop._Apple_Core_SwiftArray_Free(Pointer); + Pointer = IntPtr.Zero; + } + } + + public T this[int index] + { + get + { + var elementPtr = SwiftArrayInterop._Apple_Core_SwiftArray_GetElementAt(Pointer, Count, index); + return InteropReference.PointerCast(elementPtr); + } + } + public int Count { get; } + + public IEnumerator GetEnumerator() => new SwiftArrayEnumerator(this); + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + private class SwiftArrayEnumerator : IEnumerator + { + private readonly SwiftArray _array; + private int _currentIndex = -1; + + public SwiftArrayEnumerator(SwiftArray array) + { + _array = array; + } + + public T Current => _array[_currentIndex]; + + object IEnumerator.Current => Current; + + public void Dispose() + { + } + + public bool MoveNext() + { + _currentIndex++; + return _currentIndex < _array.Count; + } + + public void Reset() + { + _currentIndex = -1; + } + } + } + + internal static class SwiftArrayInterop + { + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr _Apple_Core_SwiftArray_GetElementAt(IntPtr arrayPtr, int count, int index); + + [DllImport(InteropUtility.DLLName)] + public static extern void _Apple_Core_SwiftArray_Free(IntPtr arrayPtr); + } +} \ No newline at end of file diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/ProductSignCommand.cs.meta b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/SwiftArray.cs.meta similarity index 83% rename from plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/ProductSignCommand.cs.meta rename to plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/SwiftArray.cs.meta index 1a9c0809..a36c372d 100644 --- a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/ProductSignCommand.cs.meta +++ b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/SwiftArray.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 4cb53356e27f64c01b37cdb54e96bc60 +guid: dbe633e24a9354111bfb6977fc26f01e MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/package.json b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/package.json index 4840f263..44c60934 100644 --- a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/package.json +++ b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/package.json @@ -2,7 +2,7 @@ "name": "com.apple.unityplugin.core", "displayName": "Apple.Core", "description": "Provides project settings, post-build automation tools, and other shared functionality for Apple Unity Plug-ins.", - "version": "3.2.0", + "version": "3.3.0", "unity": "2022.3", "keywords": [ "apple" @@ -16,7 +16,7 @@ { "displayName": "API Availability Demo", "description": "Demo for API Availability Checking", - "path": "Demos~/Apple.Core.AvailabilitySample" + "path": "Demos/Apple.Core.AvailabilitySample" } ] } diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Packages/manifest.json b/plug-ins/Apple.Core/Apple.Core_Unity/Packages/manifest.json index 8b183712..5d664270 100644 --- a/plug-ins/Apple.Core/Apple.Core_Unity/Packages/manifest.json +++ b/plug-ins/Apple.Core/Apple.Core_Unity/Packages/manifest.json @@ -1,11 +1,12 @@ { "dependencies": { - "com.unity.ide.rider": "3.0.36", - "com.unity.ide.visualstudio": "2.0.22", - "com.unity.ide.vscode": "1.2.5", - "com.unity.test-framework": "1.4.5", - "com.unity.textmeshpro": "3.0.9", - "com.unity.ugui": "1.0.0", + "com.unity.ide.rider": "3.0.39", + "com.unity.ide.visualstudio": "2.0.26", + "com.unity.multiplayer.center": "1.0.1", + "com.unity.test-framework": "1.7.0", + "com.unity.ugui": "2.5.0", + "com.unity.modules.accessibility": "1.0.0", + "com.unity.modules.adaptiveperformance": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", "com.unity.modules.animation": "1.0.0", @@ -19,6 +20,7 @@ "com.unity.modules.particlesystem": "1.0.0", "com.unity.modules.physics": "1.0.0", "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.physicscore2d": "1.0.0", "com.unity.modules.screencapture": "1.0.0", "com.unity.modules.terrain": "1.0.0", "com.unity.modules.terrainphysics": "1.0.0", @@ -32,9 +34,9 @@ "com.unity.modules.unitywebrequestaudio": "1.0.0", "com.unity.modules.unitywebrequesttexture": "1.0.0", "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vectorgraphics": "1.0.0", "com.unity.modules.vehicles": "1.0.0", "com.unity.modules.video": "1.0.0", - "com.unity.modules.vr": "1.0.0", "com.unity.modules.wind": "1.0.0", "com.unity.modules.xr": "1.0.0" } diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Packages/packages-lock.json b/plug-ins/Apple.Core/Apple.Core_Unity/Packages/packages-lock.json index 72387985..02c50da4 100644 --- a/plug-ins/Apple.Core/Apple.Core_Unity/Packages/packages-lock.json +++ b/plug-ins/Apple.Core/Apple.Core_Unity/Packages/packages-lock.json @@ -1,14 +1,13 @@ { "dependencies": { "com.unity.ext.nunit": { - "version": "2.0.3", + "version": "2.1.0", "depth": 1, - "source": "registry", - "dependencies": {}, - "url": "https://packages.unity.com" + "source": "builtin", + "dependencies": {} }, "com.unity.ide.rider": { - "version": "3.0.36", + "version": "3.0.39", "depth": 0, "source": "registry", "dependencies": { @@ -17,48 +16,56 @@ "url": "https://packages.unity.com" }, "com.unity.ide.visualstudio": { - "version": "2.0.22", + "version": "2.0.26", "depth": 0, "source": "registry", "dependencies": { - "com.unity.test-framework": "1.1.9" + "com.unity.test-framework": "1.1.33" }, "url": "https://packages.unity.com" }, - "com.unity.ide.vscode": { - "version": "1.2.5", + "com.unity.multiplayer.center": { + "version": "1.0.1", "depth": 0, - "source": "registry", - "dependencies": {}, - "url": "https://packages.unity.com" + "source": "builtin", + "dependencies": { + "com.unity.modules.uielements": "1.0.0" + } }, "com.unity.test-framework": { - "version": "1.4.5", + "version": "1.7.0", "depth": 0, - "source": "registry", + "source": "builtin", "dependencies": { - "com.unity.ext.nunit": "2.0.3", + "com.unity.ext.nunit": "2.1.0", "com.unity.modules.imgui": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0" - }, - "url": "https://packages.unity.com" + } }, - "com.unity.textmeshpro": { - "version": "3.0.9", + "com.unity.ugui": { + "version": "2.5.0", "depth": 0, - "source": "registry", + "source": "builtin", "dependencies": { - "com.unity.ugui": "1.0.0" - }, - "url": "https://packages.unity.com" + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.physics": "1.0.0" + } }, - "com.unity.ugui": { + "com.unity.modules.accessibility": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.adaptiveperformance": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.ui": "1.0.0", - "com.unity.modules.imgui": "1.0.0" + "com.unity.modules.subsystems": "1.0.0" } }, "com.unity.modules.ai": { @@ -71,7 +78,9 @@ "version": "1.0.0", "depth": 0, "source": "builtin", - "dependencies": {} + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0" + } }, "com.unity.modules.animation": { "version": "1.0.0", @@ -108,6 +117,12 @@ "com.unity.modules.animation": "1.0.0" } }, + "com.unity.modules.hierarchycore": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": {} + }, "com.unity.modules.imageconversion": { "version": "1.0.0", "depth": 0, @@ -139,6 +154,14 @@ "dependencies": {} }, "com.unity.modules.physics2d": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physicscore2d": "1.0.0" + } + }, + "com.unity.modules.physicscore2d": { "version": "1.0.0", "depth": 0, "source": "builtin", @@ -196,7 +219,10 @@ "dependencies": { "com.unity.modules.ui": "1.0.0", "com.unity.modules.imgui": "1.0.0", - "com.unity.modules.jsonserialize": "1.0.0" + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.hierarchycore": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.animation": "1.0.0" } }, "com.unity.modules.umbra": { @@ -260,32 +286,32 @@ "com.unity.modules.imageconversion": "1.0.0" } }, - "com.unity.modules.vehicles": { + "com.unity.modules.vectorgraphics": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.physics": "1.0.0" + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0" } }, - "com.unity.modules.video": { + "com.unity.modules.vehicles": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.audio": "1.0.0", - "com.unity.modules.ui": "1.0.0", - "com.unity.modules.unitywebrequest": "1.0.0" + "com.unity.modules.physics": "1.0.0" } }, - "com.unity.modules.vr": { + "com.unity.modules.video": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.jsonserialize": "1.0.0", - "com.unity.modules.physics": "1.0.0", - "com.unity.modules.xr": "1.0.0" + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" } }, "com.unity.modules.wind": { diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/ProjectSettings/MultiplayerManager.asset b/plug-ins/Apple.Core/Apple.Core_Unity/ProjectSettings/MultiplayerManager.asset new file mode 100644 index 00000000..2a936644 --- /dev/null +++ b/plug-ins/Apple.Core/Apple.Core_Unity/ProjectSettings/MultiplayerManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!655991488 &1 +MultiplayerManager: + m_ObjectHideFlags: 0 + m_EnableMultiplayerRoles: 0 + m_StrippingTypes: {} diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/ProjectSettings/PackageManagerSettings.asset b/plug-ins/Apple.Core/Apple.Core_Unity/ProjectSettings/PackageManagerSettings.asset index be4a7974..d8f7921a 100644 --- a/plug-ins/Apple.Core/Apple.Core_Unity/ProjectSettings/PackageManagerSettings.asset +++ b/plug-ins/Apple.Core/Apple.Core_Unity/ProjectSettings/PackageManagerSettings.asset @@ -12,32 +12,33 @@ MonoBehaviour: m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} m_Name: m_EditorClassIdentifier: - m_EnablePreviewPackages: 0 - m_EnablePackageDependencies: 0 + m_EnablePreReleasePackages: 0 m_AdvancedSettingsExpanded: 1 m_ScopedRegistriesSettingsExpanded: 1 + m_SeeAllPackageVersions: 0 + m_DismissPreviewPackagesInUse: 0 oneTimeWarningShown: 0 - m_Registries: - - m_Id: main + oneTimePackageErrorsPopUpShown: 0 + m_MainRegistry: + m_Id: main m_Name: m_Url: https://packages.unity.com m_Scopes: [] m_IsDefault: 1 + m_IsUnityRegistry: 1 m_Capabilities: 7 + m_ConfigSource: 0 + m_Compliance: + m_Status: 0 + m_Violations: [] + m_ScopedRegistries: [] m_UserSelectedRegistryName: m_UserAddingNewScopedRegistry: 0 m_RegistryInfoDraft: - m_ErrorMessage: - m_Original: - m_Id: - m_Name: - m_Url: - m_Scopes: [] - m_IsDefault: 0 - m_Capabilities: 0 m_Modified: 0 - m_Name: - m_Url: - m_Scopes: - - - m_SelectedScopeIndex: 0 + m_ErrorMessage: + m_UserModificationsEntityId: + m_rawData: 568105589213756492 + m_OriginalEntityId: + m_rawData: 568105589213756490 + m_LoadAssets: 0 diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/ProjectSettings/PhysicsCoreProjectSettings2D.asset b/plug-ins/Apple.Core/Apple.Core_Unity/ProjectSettings/PhysicsCoreProjectSettings2D.asset new file mode 100644 index 00000000..049c7454 --- /dev/null +++ b/plug-ins/Apple.Core/Apple.Core_Unity/ProjectSettings/PhysicsCoreProjectSettings2D.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!176606843 &1 +PhysicsCoreProjectSettings2D: + m_ObjectHideFlags: 0 + m_PhysicsCoreSettings: {fileID: 0} diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/ProjectSettings/ProjectVersion.txt b/plug-ins/Apple.Core/Apple.Core_Unity/ProjectSettings/ProjectVersion.txt index b8523623..c1608124 100644 --- a/plug-ins/Apple.Core/Apple.Core_Unity/ProjectSettings/ProjectVersion.txt +++ b/plug-ins/Apple.Core/Apple.Core_Unity/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2022.3.62f2 -m_EditorVersionWithRevision: 2022.3.62f2 (7670c08855a9) +m_EditorVersion: 6000.5.2f1 +m_EditorVersionWithRevision: 6000.5.2f1 (eb73d3b415a1) diff --git a/plug-ins/Apple.Core/Native/AppleCoreNative.xcodeproj/project.pbxproj b/plug-ins/Apple.Core/Native/AppleCoreNative.xcodeproj/project.pbxproj index be90d6c4..84b2a086 100644 --- a/plug-ins/Apple.Core/Native/AppleCoreNative.xcodeproj/project.pbxproj +++ b/plug-ins/Apple.Core/Native/AppleCoreNative.xcodeproj/project.pbxproj @@ -35,6 +35,10 @@ 24B8F1892A73397C00914A67 /* ACRuntimeEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24B8F1882A73397C00914A67 /* ACRuntimeEnvironment.swift */; }; 24B8F18A2A73397C00914A67 /* ACRuntimeEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24B8F1882A73397C00914A67 /* ACRuntimeEnvironment.swift */; }; 24B8F18B2A73397C00914A67 /* ACRuntimeEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24B8F1882A73397C00914A67 /* ACRuntimeEnvironment.swift */; }; + 49BB7DF02F33104E0014A4F7 /* NativeArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49BB7DEF2F3310460014A4F7 /* NativeArray.swift */; }; + 49BB7DF12F33104E0014A4F7 /* NativeArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49BB7DEF2F3310460014A4F7 /* NativeArray.swift */; }; + 49BB7DF22F33104E0014A4F7 /* NativeArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49BB7DEF2F3310460014A4F7 /* NativeArray.swift */; }; + 49BB7DF32F33104E0014A4F7 /* NativeArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49BB7DEF2F3310460014A4F7 /* NativeArray.swift */; }; CFE53391263B6CCC00078448 /* AppleCoreNative.h in Headers */ = {isa = PBXBuildFile; fileRef = CFE5338F263B6CCC00078448 /* AppleCoreNative.h */; settings = {ATTRIBUTES = (Public, ); }; }; CFE53399263B6D1400078448 /* CoreUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFE53398263B6D1400078448 /* CoreUtilities.swift */; }; CFE533A1263B6E2200078448 /* AppleCoreNative.h in Headers */ = {isa = PBXBuildFile; fileRef = CFE5338F263B6CCC00078448 /* AppleCoreNative.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -75,6 +79,10 @@ FBB2BEC42ACB2FDE0040E5E0 /* NSString.m in Sources */ = {isa = PBXBuildFile; fileRef = FBB2BEC32ACB2FDE0040E5E0 /* NSString.m */; }; FBB2BEC52ACB2FDE0040E5E0 /* NSString.m in Sources */ = {isa = PBXBuildFile; fileRef = FBB2BEC32ACB2FDE0040E5E0 /* NSString.m */; }; FBB2BEC62ACB2FDE0040E5E0 /* NSString.m in Sources */ = {isa = PBXBuildFile; fileRef = FBB2BEC32ACB2FDE0040E5E0 /* NSString.m */; }; + AA00000100000001000000A1 /* Currency.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA00000100000001000000A0 /* Currency.swift */; }; + AA00000100000002000000A1 /* Currency.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA00000100000001000000A0 /* Currency.swift */; }; + AA00000100000003000000A1 /* Currency.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA00000100000001000000A0 /* Currency.swift */; }; + AA00000100000004000000A1 /* Currency.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA00000100000001000000A0 /* Currency.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -85,6 +93,7 @@ 245B212627DEA521007479CE /* NSError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSError.swift; sourceTree = ""; }; 24B063FC2B7EDC73007ABBB8 /* AppleCoreNative.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AppleCoreNative.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 24B8F1882A73397C00914A67 /* ACRuntimeEnvironment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ACRuntimeEnvironment.swift; sourceTree = ""; }; + 49BB7DEF2F3310460014A4F7 /* NativeArray.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NativeArray.swift; sourceTree = ""; }; CFE5338C263B6CCC00078448 /* AppleCoreNative.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AppleCoreNative.framework; sourceTree = BUILT_PRODUCTS_DIR; }; CFE5338F263B6CCC00078448 /* AppleCoreNative.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppleCoreNative.h; sourceTree = ""; }; CFE53398263B6D1400078448 /* CoreUtilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreUtilities.swift; sourceTree = ""; }; @@ -101,6 +110,7 @@ FB8FF4912B338A110058B918 /* NSData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSData.m; sourceTree = ""; }; FBB2BEBF2AC77D160040E5E0 /* NSNumber.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSNumber.m; sourceTree = ""; }; FBB2BEC32ACB2FDE0040E5E0 /* NSString.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NSString.m; sourceTree = ""; }; + AA00000100000001000000A0 /* Currency.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Currency.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -159,6 +169,8 @@ CFE5338E263B6CCC00078448 /* AppleCoreNative */ = { isa = PBXGroup; children = ( + AA00000100000001000000A0 /* Currency.swift */, + 49BB7DEF2F3310460014A4F7 /* NativeArray.swift */, 24B8F1882A73397C00914A67 /* ACRuntimeEnvironment.swift */, 244F33522A6F0A2B005099AE /* AppleCore_BridgingHeader.h */, CFE5338F263B6CCC00078448 /* AppleCoreNative.h */, @@ -376,6 +388,7 @@ files = ( 24B0640C2B7EE01C007ABBB8 /* NSException.m in Sources */, 24B064082B7EE010007ABBB8 /* NSArray.m in Sources */, + 49BB7DF02F33104E0014A4F7 /* NativeArray.swift in Sources */, 24B064032B7EDFE5007ABBB8 /* ACRuntimeEnvironment.swift in Sources */, 24B0640E2B7EE028007ABBB8 /* NSMutableDictionary.m in Sources */, 24B0640B2B7EE019007ABBB8 /* NSError.swift in Sources */, @@ -389,6 +402,7 @@ 24B064092B7EE012007ABBB8 /* NSData.m in Sources */, FB077BE32D88B329007E6FA6 /* NSDateComponents.m in Sources */, 24B064072B7EDFFD007ABBB8 /* CoreUtilities.swift in Sources */, + AA00000100000001000000A1 /* Currency.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -397,7 +411,9 @@ buildActionMask = 2147483647; files = ( CFE53399263B6D1400078448 /* CoreUtilities.swift in Sources */, + AA00000100000002000000A1 /* Currency.swift in Sources */, 24B8F1892A73397C00914A67 /* ACRuntimeEnvironment.swift in Sources */, + 49BB7DF22F33104E0014A4F7 /* NativeArray.swift in Sources */, FBB2BEC02AC77D160040E5E0 /* NSNumber.m in Sources */, FBB2BEC42ACB2FDE0040E5E0 /* NSString.m in Sources */, FB32D87D2AF97A09006A8FE4 /* NSMutableArray.m in Sources */, @@ -419,7 +435,9 @@ buildActionMask = 2147483647; files = ( CFE533A3263B6E2200078448 /* CoreUtilities.swift in Sources */, + AA00000100000003000000A1 /* Currency.swift in Sources */, 24B8F18A2A73397C00914A67 /* ACRuntimeEnvironment.swift in Sources */, + 49BB7DF32F33104E0014A4F7 /* NativeArray.swift in Sources */, FBB2BEC12AC77D160040E5E0 /* NSNumber.m in Sources */, FBB2BEC52ACB2FDE0040E5E0 /* NSString.m in Sources */, FB32D87E2AF97A09006A8FE4 /* NSMutableArray.m in Sources */, @@ -442,8 +460,10 @@ files = ( 24B8F18B2A73397C00914A67 /* ACRuntimeEnvironment.swift in Sources */, FBB2BEC22AC77D160040E5E0 /* NSNumber.m in Sources */, + 49BB7DF12F33104E0014A4F7 /* NativeArray.swift in Sources */, FBB2BEC62ACB2FDE0040E5E0 /* NSString.m in Sources */, CFE5340C263B700A00078448 /* CoreUtilities.swift in Sources */, + AA00000100000004000000A1 /* Currency.swift in Sources */, FB32D87F2AF97A09006A8FE4 /* NSMutableArray.m in Sources */, 245B212527DEA517007479CE /* AppleCoreRuntimeShared.swift in Sources */, FB8FF4942B338A1A0058B918 /* NSData.m in Sources */, @@ -473,14 +493,14 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_KEY_NSHumanReadableCopyright = "\"Copyright © 2021 - 2024 Apple, Inc. All rights reserved.\""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.0; PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.AppleCoreNative-visionOS"; PRODUCT_NAME = AppleCoreNative; SDKROOT = xros; @@ -489,7 +509,7 @@ SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 7; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; WATCHOS_DEPLOYMENT_TARGET = ""; XROS_DEPLOYMENT_TARGET = 1.0; }; @@ -507,14 +527,14 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_KEY_NSHumanReadableCopyright = "\"Copyright © 2021 - 2024 Apple, Inc. All rights reserved.\""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.0; PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.AppleCoreNative-visionOS"; PRODUCT_NAME = AppleCoreNative; SDKROOT = xros; @@ -523,7 +543,7 @@ SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 7; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; VALIDATE_PRODUCT = YES; WATCHOS_DEPLOYMENT_TARGET = ""; XROS_DEPLOYMENT_TARGET = 1.0; @@ -582,7 +602,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 11.0; + MACOSX_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -639,7 +659,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 11.0; + MACOSX_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = macosx; @@ -661,13 +681,13 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_KEY_NSHumanReadableCopyright = "\"Copyright © 2021 - 2024 Apple, Inc. All rights reserved.\""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.0; PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.AppleCoreNative-iOS"; PRODUCT_NAME = AppleCoreNative; SDKROOT = iphoneos; @@ -676,7 +696,7 @@ SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; WATCHOS_DEPLOYMENT_TARGET = ""; }; name = Debug; @@ -693,13 +713,13 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_KEY_NSHumanReadableCopyright = "\"Copyright © 2021 - 2024 Apple, Inc. All rights reserved.\""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.0; PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.AppleCoreNative-iOS"; PRODUCT_NAME = AppleCoreNative; SDKROOT = iphoneos; @@ -707,7 +727,7 @@ SUPPORTS_MACCATALYST = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; WATCHOS_DEPLOYMENT_TARGET = ""; }; name = Release; @@ -724,13 +744,13 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_KEY_NSHumanReadableCopyright = "\"Copyright © 2021 - 2024 Apple, Inc. All rights reserved.\""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.0; PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.AppleCoreNative-tvOS"; PRODUCT_NAME = AppleCoreNative; SDKROOT = appletvos; @@ -738,7 +758,7 @@ SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; WATCHOS_DEPLOYMENT_TARGET = ""; }; name = Debug; @@ -755,20 +775,20 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_KEY_NSHumanReadableCopyright = "\"Copyright © 2021 - 2024 Apple, Inc. All rights reserved.\""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.0; PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.AppleCoreNative-tvOS"; PRODUCT_NAME = AppleCoreNative; SDKROOT = appletvos; SKIP_INSTALL = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; WATCHOS_DEPLOYMENT_TARGET = ""; }; name = Release; @@ -780,14 +800,14 @@ COMBINE_HIDPI_IMAGES = YES; INFOPLIST_KEY_NSHumanReadableCopyright = "\"Copyright © 2021 - 2024 Apple, Inc. All rights reserved.\""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - MACOSX_DEPLOYMENT_TARGET = 10.15; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MACOSX_DEPLOYMENT_TARGET = 12.0; PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.AppleCoreNative-macOS"; PRODUCT_NAME = AppleCoreNativeMac; SKIP_INSTALL = YES; SWIFT_OBJC_BRIDGING_HEADER = AppleCoreNative/AppleCore_BridgingHeader.h; SWIFT_VERSION = 5.0; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; WATCHOS_DEPLOYMENT_TARGET = ""; WRAPPER_EXTENSION = bundle; }; @@ -800,14 +820,14 @@ COMBINE_HIDPI_IMAGES = YES; INFOPLIST_KEY_NSHumanReadableCopyright = "\"Copyright © 2021 - 2024 Apple, Inc. All rights reserved.\""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - MACOSX_DEPLOYMENT_TARGET = 10.15; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MACOSX_DEPLOYMENT_TARGET = 12.0; PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.AppleCoreNative-macOS"; PRODUCT_NAME = AppleCoreNativeMac; SKIP_INSTALL = YES; SWIFT_OBJC_BRIDGING_HEADER = AppleCoreNative/AppleCore_BridgingHeader.h; SWIFT_VERSION = 5.0; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; WATCHOS_DEPLOYMENT_TARGET = ""; WRAPPER_EXTENSION = bundle; }; diff --git a/plug-ins/Apple.Core/Native/AppleCoreNative.xcodeproj/xcshareddata/xcschemes/iOS - Debug.xcscheme b/plug-ins/Apple.Core/Native/AppleCoreNative.xcodeproj/xcshareddata/xcschemes/AppleCoreNative - iOS - Debug.xcscheme similarity index 97% rename from plug-ins/Apple.Core/Native/AppleCoreNative.xcodeproj/xcshareddata/xcschemes/iOS - Debug.xcscheme rename to plug-ins/Apple.Core/Native/AppleCoreNative.xcodeproj/xcshareddata/xcschemes/AppleCoreNative - iOS - Debug.xcscheme index c77ec323..9151b3dc 100644 --- a/plug-ins/Apple.Core/Native/AppleCoreNative.xcodeproj/xcshareddata/xcschemes/iOS - Debug.xcscheme +++ b/plug-ins/Apple.Core/Native/AppleCoreNative.xcodeproj/xcshareddata/xcschemes/AppleCoreNative - iOS - Debug.xcscheme @@ -10,7 +10,7 @@ ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction"> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> char_p +{ + let currency = pointer.assumingMemoryBound(to: Locale.Currency.self).pointee + return currency.identifier.toCharPCopy() +} + +@available(iOS 16.0, macOS 13.0, tvOS 16.0, visionOS 1.0, *) +@_cdecl("Currency_GetIsISOCurrency") +public func Currency_GetIsISOCurrency(pointer: UnsafeMutableRawPointer) -> Bool +{ + let currency = pointer.assumingMemoryBound(to: Locale.Currency.self).pointee + return currency.isISOCurrency +} diff --git a/plug-ins/Apple.Core/Native/AppleCoreNative/NSObject.m b/plug-ins/Apple.Core/Native/AppleCoreNative/NSObject.m index 570fa282..4d71b671 100644 --- a/plug-ins/Apple.Core/Native/AppleCoreNative/NSObject.m +++ b/plug-ins/Apple.Core/Native/AppleCoreNative/NSObject.m @@ -23,6 +23,8 @@ void NSObject_Free(void * nsObjectPtr) { NSObject * nsObject = (__bridge NSObject *)nsObjectPtr; if ([nsObject isKindOfClass:targetClass]) { return (void *)CFBridgingRetain(nsObject); + } else { + NSLog(@"NSObject_As: Object at %@ is not of target class %@", nsObjectPtr, targetClass); } } } diff --git a/plug-ins/Apple.Core/Native/AppleCoreNative/NativeArray.swift b/plug-ins/Apple.Core/Native/AppleCoreNative/NativeArray.swift new file mode 100644 index 00000000..96979006 --- /dev/null +++ b/plug-ins/Apple.Core/Native/AppleCoreNative/NativeArray.swift @@ -0,0 +1,28 @@ +// +// NativeArray.swift +// AppleCoreNative +// +// Created by Andrew Hall on 2/4/26. +// + + +@_cdecl("_Apple_Core_SwiftArray_GetElementAt") +public func _Apple_Core_SwiftArray_GetElementAt +( + _ arrayPointer: UnsafeMutableRawPointer, + _ arraySize: Int, + _ index: Int) -> UnsafeMutableRawPointer? +{ + let arr = arrayPointer.assumingMemoryBound(to: UnsafeMutableRawPointer.self); + return arr[index]; +} + +@_cdecl("_Apple_Core_SwiftArray_Free") +public func _Apple_Core_SwiftArray_Free +( + _ arrayPointer: UnsafeMutableRawPointer +) +{ + let arr = arrayPointer.assumingMemoryBound(to: UnsafeMutableRawPointer.self); + arr.deallocate(); +} diff --git a/plug-ins/Apple.Core/Native/Core.xcconfig b/plug-ins/Apple.Core/Native/Core.xcconfig index 5951aeb5..22c3e022 100644 --- a/plug-ins/Apple.Core/Native/Core.xcconfig +++ b/plug-ins/Apple.Core/Native/Core.xcconfig @@ -25,7 +25,7 @@ NATIVE_LIBRARY_ROOT_FOLDER_NAME=Apple.Core // ------------------ GENERATE_INFOPLIST_FILE = YES -CURRENT_PROJECT_VERSION = 3.2.0 +CURRENT_PROJECT_VERSION = 3.3.0 MARKETING_VERSION = $CURRENT_PROJECT_VERSION VERSIONING_SYSTEM = apple-generic INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2021 - 2024 Apple, Inc. All rights reserved." diff --git a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/CHANGELOG.md b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/CHANGELOG.md index 0029a1a5..ce51093f 100644 --- a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/CHANGELOG.md +++ b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/CHANGELOG.md @@ -1,6 +1,23 @@ # CHANGELOG All notable changes to this project will be documented in this file. +## [1.3.2] - 2026-09-16 +### Changed +- Updated the asset picker and Ricochet sample for APIs deprecated in Unity 6 (`HierarchyProperty`, + `Object.GetInstanceID()`, `Rigidbody2D.velocity`, `Resolution.refreshRate`), while still building + against the Unity 2022.3 floor. +- Updated the native project for Xcode 27 and raised its deployment targets to iOS 15.0, tvOS 15.0, + and macOS 12.0, matching the minimum OS versions the plug-ins already document as supported. +- Now requires Apple.Core 3.3.0. + +### Fixed +- Added `[MarshalAs(UnmanagedType.I1)]` to `bool` P/Invoke declarations so `bool` results marshal + correctly. +- Fixed `UnityPickers.AssetPickerDrawer` exceptions when `assetType` or `fieldInfo` is null. Thanks + to [@ilterbilguven](https://github.com/ilterbilguven) + ([#47](https://github.com/apple/unityplugins/pull/47)). +- Fixed plug-in builds when the source root path contains a space character. + ## [1.3.1] - 2025-01-29 - Remove references to some unused packages. diff --git a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Demos/Ricochet/Scripts/BallManager.cs b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Demos/Ricochet/Scripts/BallManager.cs index ffe30934..069e7595 100644 --- a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Demos/Ricochet/Scripts/BallManager.cs +++ b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Demos/Ricochet/Scripts/BallManager.cs @@ -132,7 +132,7 @@ public void FixedUpdate() var shieldPos = _shield.transform.position; var newPos = new Vector3(shieldPos.x, shieldPos.y, shieldPos.z - 0.1f); transform.position = newPos; - _rigidbody.velocity = _shield.gameObject.GetComponent().velocity; + _rigidbody.SetVelocity(_shield.gameObject.GetComponent().GetVelocity()); } if (HasTexture && !(_textureHapticPlayer is null)) @@ -184,17 +184,17 @@ private void ImplosionHapticCompletion() public void OnCollisionEnter2D(Collision2D collision) { - if (Math.Abs(_rigidbody.velocity.y) < (0.1 * _maximumReasonableVelocity) + if (Math.Abs(_rigidbody.GetVelocity().y) < (0.1 * _maximumReasonableVelocity) && (collision.gameObject.name.Equals("Top") || collision.gameObject.name.Equals("Bottom"))) { - _rigidbody.velocity = new Vector3(_rigidbody.velocity.x, 0f, 0f); + _rigidbody.SetVelocity(new Vector2(_rigidbody.GetVelocity().x, 0f)); return; } - if (Math.Abs(_rigidbody.velocity.x) < (0.1 * _maximumReasonableVelocity) + if (Math.Abs(_rigidbody.GetVelocity().x) < (0.1 * _maximumReasonableVelocity) && (collision.gameObject.name.Equals("Left") || collision.gameObject.name.Equals("Right"))) { - _rigidbody.velocity = new Vector3(0f, _rigidbody.velocity.y, 0f); + _rigidbody.SetVelocity(new Vector2(0f, _rigidbody.GetVelocity().y)); return; } @@ -278,7 +278,7 @@ public void ShieldZero() Debug.Log("Playing implosion haptics."); _rigidbody.gravityScale = 0f; - _rigidbody.velocity = Vector2.zero; + _rigidbody.SetVelocity(Vector2.zero); Destroy(_shield); _shield = null; @@ -288,7 +288,7 @@ public void ShieldZero() private void UpdateTextureIntensity() { - var currentSpeed = _rigidbody.velocity.magnitude; + var currentSpeed = _rigidbody.GetVelocity().magnitude; var intensity = Math.Min(currentSpeed / _maximumReasonableVelocity, 1f); var hapticParameters = new List { diff --git a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Demos/Ricochet/Scripts/EdgeColliderSetup.cs b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Demos/Ricochet/Scripts/EdgeColliderSetup.cs index 5d2e73a0..6faca3b9 100644 --- a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Demos/Ricochet/Scripts/EdgeColliderSetup.cs +++ b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Demos/Ricochet/Scripts/EdgeColliderSetup.cs @@ -23,7 +23,7 @@ public void Start() Screen.orientation = ScreenOrientation.Portrait; - Application.targetFrameRate = Screen.currentResolution.refreshRate; + Application.targetFrameRate = (int)Screen.currentResolution.refreshRateRatio.value; } public void Update() diff --git a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Demos/Ricochet/Scripts/GameManager.cs b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Demos/Ricochet/Scripts/GameManager.cs index 708baa5f..9d397128 100644 --- a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Demos/Ricochet/Scripts/GameManager.cs +++ b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Demos/Ricochet/Scripts/GameManager.cs @@ -56,7 +56,7 @@ private bool HasTexture public void Start() { - Application.targetFrameRate = Screen.currentResolution.refreshRate; + Application.targetFrameRate = (int)Screen.currentResolution.refreshRateRatio.value; _mainCam = Camera.main; diff --git a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Demos/Ricochet/Scripts/Rigidbody2DCompat.cs b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Demos/Ricochet/Scripts/Rigidbody2DCompat.cs new file mode 100644 index 00000000..686b55f0 --- /dev/null +++ b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Demos/Ricochet/Scripts/Rigidbody2DCompat.cs @@ -0,0 +1,27 @@ +using UnityEngine; + +namespace Apple.CoreHaptics +{ + // Unity 6000+ deprecates Rigidbody2D.velocity in favor of linearVelocity, which + // doesn't exist on the 2022.3 floor. Branch on the Unity version to support both. + internal static class Rigidbody2DCompat + { + public static Vector2 GetVelocity(this Rigidbody2D rigidbody) + { +#if UNITY_6000_0_OR_NEWER + return rigidbody.linearVelocity; +#else + return rigidbody.velocity; +#endif + } + + public static void SetVelocity(this Rigidbody2D rigidbody, Vector2 value) + { +#if UNITY_6000_0_OR_NEWER + rigidbody.linearVelocity = value; +#else + rigidbody.velocity = value; +#endif + } + } +} diff --git a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/KeychainCommand.cs.meta b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Demos/Ricochet/Scripts/Rigidbody2DCompat.cs.meta similarity index 83% rename from plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/KeychainCommand.cs.meta rename to plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Demos/Ricochet/Scripts/Rigidbody2DCompat.cs.meta index 9545768d..48e59cf1 100644 --- a/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Editor/KeychainCommand.cs.meta +++ b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Demos/Ricochet/Scripts/Rigidbody2DCompat.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 1d2e3f14bd1b84140a250932018e23e5 +guid: a886e242f386464da9c68d0a8e11c64b MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Demos/Ricochet/Scripts/ShieldBehavior.cs b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Demos/Ricochet/Scripts/ShieldBehavior.cs index c4f889a8..918a68a9 100644 --- a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Demos/Ricochet/Scripts/ShieldBehavior.cs +++ b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Demos/Ricochet/Scripts/ShieldBehavior.cs @@ -1,4 +1,4 @@ -using System; +using System; using Apple.CoreHaptics; using UnityEngine; @@ -59,17 +59,17 @@ void Start() public void OnCollisionEnter2D(Collision2D collision) { - if (Math.Abs(_rigidbody.velocity.y) < (0.1 * _maximumReasonableVelocity) + if (Math.Abs(_rigidbody.GetVelocity().y) < (0.1 * _maximumReasonableVelocity) && (collision.gameObject.name.Equals("Top") || collision.gameObject.name.Equals("Bottom"))) { - _rigidbody.velocity = new Vector3(_rigidbody.velocity.x, 0f, 0f); + _rigidbody.SetVelocity(new Vector2(_rigidbody.GetVelocity().x, 0f)); return; } - if (Math.Abs(_rigidbody.velocity.x) < (0.1 * _maximumReasonableVelocity) + if (Math.Abs(_rigidbody.GetVelocity().x) < (0.1 * _maximumReasonableVelocity) && (collision.gameObject.name.Equals("Left") || collision.gameObject.name.Equals("Right"))) { - _rigidbody.velocity = new Vector3(0f, _rigidbody.velocity.y, 0f); + _rigidbody.SetVelocity(new Vector2(0f, _rigidbody.GetVelocity().y)); return; } @@ -80,7 +80,7 @@ public void OnCollisionEnter2D(Collision2D collision) Debug.Log("Shield health zero'ed."); _rigidbody.gravityScale = 0f; - _rigidbody.velocity = Vector2.zero; + _rigidbody.SetVelocity(Vector2.zero); _ballManager.ShieldZero(); } diff --git a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Editor/UnityPickers/AssetPicker.cs b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Editor/UnityPickers/AssetPicker.cs index a072e78a..b67c1d8b 100644 --- a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Editor/UnityPickers/AssetPicker.cs +++ b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Editor/UnityPickers/AssetPicker.cs @@ -3,11 +3,20 @@ using System.Linq; using System.Reflection; using System.Text; +using Apple.Core; using JetBrains.Annotations; using UnityEditor; using UnityEngine; using UnityPickers.Utility; using Object = UnityEngine.Object; +// Unity 6000.3 deprecated HierarchyProperty in favour of HierarchyIterator, which doesn't exist +// on the 2022.3 floor. The two expose the same surface we use here — a HierarchyType ctor, +// SetSearchFilter, Next and the name/guid pair — so aliasing the type keeps one code path. +#if UNITY_6000_3_OR_NEWER +using AssetHierarchy = UnityEditor.HierarchyIterator; +#else +using AssetHierarchy = UnityEditor.HierarchyProperty; +#endif namespace UnityPickers { @@ -129,11 +138,7 @@ private Type AssetType [SerializeField] private string nameFilter; -#if UNITY_6000_4_OR_NEWER - private HierarchyIterator hierarchyIterator; -#else - private HierarchyProperty hierarchyProperty; -#endif + private AssetHierarchy assetHierarchy; private List loadedAssets; @@ -233,8 +238,6 @@ public static void Show( w.Focus(); } - // todo: c# docs - /// /// Shows built-in ObjectField with custom value source and pick target /// @@ -255,11 +258,7 @@ public static void PropertyField( buttonPos.xMin = buttonPos.xMax - EditorGUIUtility.singleLineHeight; var requesterWindow = focusedWindow; -#if UNITY_6000_4_OR_NEWER - string controlName = property.serializedObject.targetObject.GetEntityId() + "_" + property.propertyPath; -#else - string controlName = property.serializedObject.targetObject.GetInstanceID() + "_" + property.propertyPath; -#endif + string controlName = property.serializedObject.targetObject.GetLongId() + "_" + property.propertyPath; var e = Event.current; bool showHotKey = GUI.GetNameOfFocusedControl() == controlName && @@ -937,23 +936,13 @@ private void UpdateAssetList() loadedAssets = new List(); loadedAssetsFlat.Clear(); -#if UNITY_6000_4_OR_NEWER - hierarchyIterator = new HierarchyIterator(HierarchyType.Assets); - hierarchyIterator.SetSearchFilter(GetFilter(), (int)SearchableEditorWindow.SearchMode.All); - - while (hierarchyIterator.Next(null)) - { - AddAssetInfo(hierarchyIterator); - } -#else - hierarchyProperty = new HierarchyProperty(HierarchyType.Assets); - hierarchyProperty.SetSearchFilter(GetFilter(), (int)SearchableEditorWindow.SearchMode.All); + assetHierarchy = new AssetHierarchy(HierarchyType.Assets); + assetHierarchy.SetSearchFilter(GetFilter(), (int)SearchableEditorWindow.SearchMode.All); - while (hierarchyProperty.Next(null)) + while (assetHierarchy.Next(null)) { - AddAssetInfo(hierarchyProperty); + AddAssetInfo(assetHierarchy); } -#endif FilterAssets(ref loadedAssets); loadedAssets.ForEach(SortChildren); @@ -985,15 +974,9 @@ private string GetFilter() return stringBuilder.ToString(); } -#if UNITY_6000_4_OR_NEWER - private void AddAssetInfo(HierarchyIterator hi) - { - var path = AssetDatabase.GUIDToAssetPath(hi.guid); -#else - private void AddAssetInfo(HierarchyProperty hp) + private void AddAssetInfo(AssetHierarchy hierarchy) { - var path = AssetDatabase.GUIDToAssetPath(hp.guid); -#endif + var path = AssetDatabase.GUIDToAssetPath(hierarchy.guid); var folders = path.Split('/'); var list = loadedAssets; HierarchyEntry parent = null; @@ -1017,17 +1000,10 @@ private void AddAssetInfo(HierarchyProperty hp) } var hierarchyEntry = new HierarchyEntry { -#if UNITY_6000_4_OR_NEWER Parent = parent, - Name = hi.name, + Name = hierarchy.name, Path = path, - AssetGuid = hi.guid, -#else - Parent = parent, - Name = hp.name, - Path = path, - AssetGuid = hp.guid, -#endif + AssetGuid = hierarchy.guid, }; list.Add(hierarchyEntry); } diff --git a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Source/CHHapticEngine/CHHapticEngineInterface.cs b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Source/CHHapticEngine/CHHapticEngineInterface.cs index a4492248..af472cf6 100644 --- a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Source/CHHapticEngine/CHHapticEngineInterface.cs +++ b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Source/CHHapticEngine/CHHapticEngineInterface.cs @@ -48,40 +48,45 @@ internal static class CHHapticEngineInterface #region NotifyWhenPlayersFinished [DllImport(CHInteropUtility.DllName, EntryPoint = "CoreHaptics_CHHapticEngine_NotifyWhenPlayersFinished")] - internal static extern void NotifyWhenPlayersFinished(IntPtr enginePointer, bool leaveEngineRunning, CHHapticEngine.AllPlayersFinishedStatic onFinished, ErrorWithPointerCallback onError); + internal static extern void NotifyWhenPlayersFinished(IntPtr enginePointer, [MarshalAs(UnmanagedType.I1)] bool leaveEngineRunning, CHHapticEngine.AllPlayersFinishedStatic onFinished, ErrorWithPointerCallback onError); #endregion #region HardwareSupportsHaptics [DllImport(CHInteropUtility.DllName, EntryPoint = "CoreHaptics_CHHapticEngine_HardwareSupportsHaptics")] + [return: MarshalAs(UnmanagedType.I1)] internal static extern bool HardwareSupportsHaptics(); #endregion #region PlayHapticsOnly [DllImport(CHInteropUtility.DllName, EntryPoint = "CoreHaptics_CHHapticEngine_Get_PlaysHapticsOnly")] + [return: MarshalAs(UnmanagedType.I1)] internal static extern bool Get_PlaysHapticsOnly(IntPtr enginePointer); [DllImport(CHInteropUtility.DllName, EntryPoint = "CoreHaptics_CHHapticEngine_Set_PlaysHapticsOnly")] - internal static extern void Set_PlaysHapticsOnly(IntPtr enginePointer, bool playsHapticsOnly); + internal static extern void Set_PlaysHapticsOnly(IntPtr enginePointer, [MarshalAs(UnmanagedType.I1)] bool playsHapticsOnly); #endregion #region IsMutedForAudio [DllImport(CHInteropUtility.DllName, EntryPoint = "CoreHaptics_CHHapticEngine_Get_IsMutedForAudio")] + [return: MarshalAs(UnmanagedType.I1)] internal static extern bool Get_IsMutedForAudio(IntPtr enginePointer); [DllImport(CHInteropUtility.DllName, EntryPoint = "CoreHaptics_CHHapticEngine_Set_IsMutedForAudio")] - internal static extern void Set_IsMutedForAudio(IntPtr enginePointer, bool isMutedForAudio); + internal static extern void Set_IsMutedForAudio(IntPtr enginePointer, [MarshalAs(UnmanagedType.I1)] bool isMutedForAudio); #endregion #region IsMutedForHaptics [DllImport(CHInteropUtility.DllName, EntryPoint = "CoreHaptics_CHHapticEngine_Get_IsMutedForHaptics")] + [return: MarshalAs(UnmanagedType.I1)] internal static extern bool Get_IsMutedForHaptics(IntPtr enginePointer); [DllImport(CHInteropUtility.DllName, EntryPoint = "CoreHaptics_CHHapticEngine_Set_IsMutedForHaptics")] - internal static extern void Set_IsMutedForHaptics(IntPtr enginePointer, bool isMutedForHaptics); + internal static extern void Set_IsMutedForHaptics(IntPtr enginePointer, [MarshalAs(UnmanagedType.I1)] bool isMutedForHaptics); #endregion #region IsAutoShutdownEnabled [DllImport(CHInteropUtility.DllName, EntryPoint = "CoreHaptics_CHHapticEngine_Get_IsAutoShutdownEnabled")] + [return: MarshalAs(UnmanagedType.I1)] internal static extern bool Get_IsAutoShutdownEnabled(IntPtr enginePointer); [DllImport(CHInteropUtility.DllName, EntryPoint = "CoreHaptics_CHHapticEngine_Set_IsAutoShutdownEnabled")] - internal static extern void Set_IsAutoShutdownEnabled(IntPtr enginePointer, bool isAutoShutdownEnabled); + internal static extern void Set_IsAutoShutdownEnabled(IntPtr enginePointer, [MarshalAs(UnmanagedType.I1)] bool isAutoShutdownEnabled); #endregion #region CurrentTime diff --git a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Source/CHHapticPatternPlayer/CHHapticAdvancedPatternPlayerInterface.cs b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Source/CHHapticPatternPlayer/CHHapticAdvancedPatternPlayerInterface.cs index 76ad8b71..4f779227 100644 --- a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Source/CHHapticPatternPlayer/CHHapticAdvancedPatternPlayerInterface.cs +++ b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Source/CHHapticPatternPlayer/CHHapticAdvancedPatternPlayerInterface.cs @@ -12,9 +12,10 @@ internal static class CHHapticAdvancedPatternPlayerInterface #region Muted [DllImport(CHInteropUtility.DllName, EntryPoint = "CoreHaptics_CHHapticAdvancedPatternPlayer_GetIsMuted")] + [return: MarshalAs(UnmanagedType.I1)] internal static extern bool GetIsMuted(IntPtr playerId); [DllImport(CHInteropUtility.DllName, EntryPoint = "CoreHaptics_CHHapticAdvancedPatternPlayer_SetIsMuted")] - internal static extern void SetIsMuted(IntPtr playerId, bool isMuted); + internal static extern void SetIsMuted(IntPtr playerId, [MarshalAs(UnmanagedType.I1)] bool isMuted); #endregion #region Play @@ -44,9 +45,10 @@ internal static class CHHapticAdvancedPatternPlayerInterface #region LoopEnabled [DllImport(CHInteropUtility.DllName, EntryPoint = "CoreHaptics_CHHapticAdvancedPatternPlayer_GetLoopEnabled")] + [return: MarshalAs(UnmanagedType.I1)] internal static extern bool GetLoopEnabled(IntPtr playerId); [DllImport(CHInteropUtility.DllName, EntryPoint = "CoreHaptics_CHHapticAdvancedPatternPlayer_SetLoopEnabled")] - internal static extern void SetLoopEnabled(IntPtr playerId, bool loopEnabled); + internal static extern void SetLoopEnabled(IntPtr playerId, [MarshalAs(UnmanagedType.I1)] bool loopEnabled); #endregion #region LoopEnd diff --git a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Source/CHHapticPatternPlayer/CHHapticPlayerInterface.cs b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Source/CHHapticPatternPlayer/CHHapticPlayerInterface.cs index 04cfe72d..db9ffffd 100644 --- a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Source/CHHapticPatternPlayer/CHHapticPlayerInterface.cs +++ b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Source/CHHapticPatternPlayer/CHHapticPlayerInterface.cs @@ -12,9 +12,10 @@ internal static class CHHapticPatternPlayerInterface #region Muted [DllImport(CHInteropUtility.DllName, EntryPoint = "CoreHaptics_CHHapticPatternPlayer_GetIsMuted")] + [return: MarshalAs(UnmanagedType.I1)] internal static extern bool GetIsMuted(IntPtr playerId); [DllImport(CHInteropUtility.DllName, EntryPoint = "CoreHaptics_CHHapticPatternPlayer_SetIsMuted")] - internal static extern void SetIsMuted(IntPtr playerId, bool isMuted); + internal static extern void SetIsMuted(IntPtr playerId, [MarshalAs(UnmanagedType.I1)] bool isMuted); #endregion #region Play diff --git a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/package.json b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/package.json index bf990f5d..f312e250 100644 --- a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/package.json +++ b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/package.json @@ -1,11 +1,11 @@ { "name": "com.apple.unityplugin.corehaptics", - "version": "1.3.1", + "version": "1.3.2", "displayName": "Apple.CoreHaptics", "description": "Apple's CoreHaptics.framework ported to Unity", "unity": "2022.3", "dependencies": { - "com.apple.unityplugin.core": "3.1.8" + "com.apple.unityplugin.core": "3.3.0" }, "keywords": [ "haptics", @@ -23,12 +23,12 @@ { "displayName": "Apple.CoreHaptics HapticRicochet", "description": "Sample game for the Apple.CoreHaptics Unity Plug-in", - "path": "Demos~/Ricochet" + "path": "Demos/Ricochet" }, { "displayName": "Apple.CoreHaptics Sample AHAPs", "description": "A collection of AHAPs to be used in games and inspire great haptic experiences", - "path": "Demos~/SampleAHAPs" + "path": "Demos/SampleAHAPs" } ] } diff --git a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Packages/manifest.json b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Packages/manifest.json index f1b1b659..7f527319 100644 --- a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Packages/manifest.json +++ b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Packages/manifest.json @@ -1,12 +1,14 @@ { "dependencies": { "com.apple.unityplugin.core": "file:../../../Apple.Core/Apple.Core_Unity/Assets/Apple.Core", - "com.unity.ide.rider": "3.0.36", - "com.unity.ide.visualstudio": "2.0.22", + "com.unity.ide.rider": "3.0.38", + "com.unity.ide.visualstudio": "2.0.26", "com.unity.ide.vscode": "1.2.5", - "com.unity.test-framework": "1.1.33", - "com.unity.textmeshpro": "3.0.9", - "com.unity.ugui": "1.0.0", + "com.unity.multiplayer.center": "1.0.1", + "com.unity.test-framework": "1.7.0", + "com.unity.ugui": "2.5.0", + "com.unity.modules.accessibility": "1.0.0", + "com.unity.modules.adaptiveperformance": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", "com.unity.modules.animation": "1.0.0", @@ -20,6 +22,7 @@ "com.unity.modules.particlesystem": "1.0.0", "com.unity.modules.physics": "1.0.0", "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.physicscore2d": "1.0.0", "com.unity.modules.screencapture": "1.0.0", "com.unity.modules.terrain": "1.0.0", "com.unity.modules.terrainphysics": "1.0.0", @@ -33,9 +36,9 @@ "com.unity.modules.unitywebrequestaudio": "1.0.0", "com.unity.modules.unitywebrequesttexture": "1.0.0", "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vectorgraphics": "1.0.0", "com.unity.modules.vehicles": "1.0.0", "com.unity.modules.video": "1.0.0", - "com.unity.modules.vr": "1.0.0", "com.unity.modules.wind": "1.0.0", "com.unity.modules.xr": "1.0.0" }, diff --git a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Packages/packages-lock.json b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Packages/packages-lock.json index ecc08a63..0705d4d0 100644 --- a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Packages/packages-lock.json +++ b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Packages/packages-lock.json @@ -7,14 +7,13 @@ "dependencies": {} }, "com.unity.ext.nunit": { - "version": "1.0.6", + "version": "2.1.0", "depth": 1, - "source": "registry", - "dependencies": {}, - "url": "https://packages.unity.com" + "source": "builtin", + "dependencies": {} }, "com.unity.ide.rider": { - "version": "3.0.36", + "version": "3.0.38", "depth": 0, "source": "registry", "dependencies": { @@ -23,11 +22,11 @@ "url": "https://packages.unity.com" }, "com.unity.ide.visualstudio": { - "version": "2.0.22", + "version": "2.0.26", "depth": 0, "source": "registry", "dependencies": { - "com.unity.test-framework": "1.1.9" + "com.unity.test-framework": "1.1.33" }, "url": "https://packages.unity.com" }, @@ -38,33 +37,48 @@ "dependencies": {}, "url": "https://packages.unity.com" }, + "com.unity.multiplayer.center": { + "version": "1.0.1", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.uielements": "1.0.0" + } + }, "com.unity.test-framework": { - "version": "1.1.33", + "version": "1.7.0", "depth": 0, - "source": "registry", + "source": "builtin", "dependencies": { - "com.unity.ext.nunit": "1.0.6", + "com.unity.ext.nunit": "2.1.0", "com.unity.modules.imgui": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0" - }, - "url": "https://packages.unity.com" + } }, - "com.unity.textmeshpro": { - "version": "3.0.9", + "com.unity.ugui": { + "version": "2.5.0", "depth": 0, - "source": "registry", + "source": "builtin", "dependencies": { - "com.unity.ugui": "1.0.0" - }, - "url": "https://packages.unity.com" + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.physics": "1.0.0" + } }, - "com.unity.ugui": { + "com.unity.modules.accessibility": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.adaptiveperformance": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.ui": "1.0.0", - "com.unity.modules.imgui": "1.0.0" + "com.unity.modules.subsystems": "1.0.0" } }, "com.unity.modules.ai": { @@ -77,7 +91,9 @@ "version": "1.0.0", "depth": 0, "source": "builtin", - "dependencies": {} + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0" + } }, "com.unity.modules.animation": { "version": "1.0.0", @@ -114,6 +130,12 @@ "com.unity.modules.animation": "1.0.0" } }, + "com.unity.modules.hierarchycore": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": {} + }, "com.unity.modules.imageconversion": { "version": "1.0.0", "depth": 0, @@ -145,6 +167,14 @@ "dependencies": {} }, "com.unity.modules.physics2d": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physicscore2d": "1.0.0" + } + }, + "com.unity.modules.physicscore2d": { "version": "1.0.0", "depth": 0, "source": "builtin", @@ -202,7 +232,10 @@ "dependencies": { "com.unity.modules.ui": "1.0.0", "com.unity.modules.imgui": "1.0.0", - "com.unity.modules.jsonserialize": "1.0.0" + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.hierarchycore": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.animation": "1.0.0" } }, "com.unity.modules.umbra": { @@ -266,32 +299,32 @@ "com.unity.modules.imageconversion": "1.0.0" } }, - "com.unity.modules.vehicles": { + "com.unity.modules.vectorgraphics": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.physics": "1.0.0" + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0" } }, - "com.unity.modules.video": { + "com.unity.modules.vehicles": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.audio": "1.0.0", - "com.unity.modules.ui": "1.0.0", - "com.unity.modules.unitywebrequest": "1.0.0" + "com.unity.modules.physics": "1.0.0" } }, - "com.unity.modules.vr": { + "com.unity.modules.video": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.jsonserialize": "1.0.0", - "com.unity.modules.physics": "1.0.0", - "com.unity.modules.xr": "1.0.0" + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" } }, "com.unity.modules.wind": { diff --git a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/ProjectSettings/MultiplayerManager.asset b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/ProjectSettings/MultiplayerManager.asset new file mode 100644 index 00000000..2a936644 --- /dev/null +++ b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/ProjectSettings/MultiplayerManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!655991488 &1 +MultiplayerManager: + m_ObjectHideFlags: 0 + m_EnableMultiplayerRoles: 0 + m_StrippingTypes: {} diff --git a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/ProjectSettings/PackageManagerSettings.asset b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/ProjectSettings/PackageManagerSettings.asset index be4a7974..4b3c9237 100644 --- a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/ProjectSettings/PackageManagerSettings.asset +++ b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/ProjectSettings/PackageManagerSettings.asset @@ -12,32 +12,33 @@ MonoBehaviour: m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} m_Name: m_EditorClassIdentifier: - m_EnablePreviewPackages: 0 - m_EnablePackageDependencies: 0 + m_EnablePreReleasePackages: 0 m_AdvancedSettingsExpanded: 1 m_ScopedRegistriesSettingsExpanded: 1 + m_SeeAllPackageVersions: 0 + m_DismissPreviewPackagesInUse: 0 oneTimeWarningShown: 0 - m_Registries: - - m_Id: main + oneTimePackageErrorsPopUpShown: 0 + m_MainRegistry: + m_Id: main m_Name: m_Url: https://packages.unity.com m_Scopes: [] m_IsDefault: 1 + m_IsUnityRegistry: 1 m_Capabilities: 7 + m_ConfigSource: 0 + m_Compliance: + m_Status: 0 + m_Violations: [] + m_ScopedRegistries: [] m_UserSelectedRegistryName: m_UserAddingNewScopedRegistry: 0 m_RegistryInfoDraft: - m_ErrorMessage: - m_Original: - m_Id: - m_Name: - m_Url: - m_Scopes: [] - m_IsDefault: 0 - m_Capabilities: 0 m_Modified: 0 - m_Name: - m_Url: - m_Scopes: - - - m_SelectedScopeIndex: 0 + m_ErrorMessage: + m_UserModificationsEntityId: + m_rawData: 568105589213756514 + m_OriginalEntityId: + m_rawData: 568105589213756512 + m_LoadAssets: 0 diff --git a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/ProjectSettings/PhysicsCoreProjectSettings2D.asset b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/ProjectSettings/PhysicsCoreProjectSettings2D.asset new file mode 100644 index 00000000..049c7454 --- /dev/null +++ b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/ProjectSettings/PhysicsCoreProjectSettings2D.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!176606843 &1 +PhysicsCoreProjectSettings2D: + m_ObjectHideFlags: 0 + m_PhysicsCoreSettings: {fileID: 0} diff --git a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/ProjectSettings/ProjectVersion.txt b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/ProjectSettings/ProjectVersion.txt index b8523623..c1608124 100644 --- a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/ProjectSettings/ProjectVersion.txt +++ b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2022.3.62f2 -m_EditorVersionWithRevision: 2022.3.62f2 (7670c08855a9) +m_EditorVersion: 6000.5.2f1 +m_EditorVersionWithRevision: 6000.5.2f1 (eb73d3b415a1) diff --git a/plug-ins/Apple.CoreHaptics/Native/CoreHaptics.xcconfig b/plug-ins/Apple.CoreHaptics/Native/CoreHaptics.xcconfig index 12f94d84..ed2584bd 100644 --- a/plug-ins/Apple.CoreHaptics/Native/CoreHaptics.xcconfig +++ b/plug-ins/Apple.CoreHaptics/Native/CoreHaptics.xcconfig @@ -25,7 +25,7 @@ NATIVE_LIBRARY_ROOT_FOLDER_NAME=Apple.CoreHaptics // ------------------ GENERATE_INFOPLIST_FILE = YES -CURRENT_PROJECT_VERSION = 1.2.4 +CURRENT_PROJECT_VERSION = 1.3.2 MARKETING_VERSION = $CURRENT_PROJECT_VERSION VERSIONING_SYSTEM = apple-generic INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2021 - 2024 Apple, Inc. All rights reserved." diff --git a/plug-ins/Apple.CoreHaptics/Native/CoreHapticsWrapper.xcodeproj/project.pbxproj b/plug-ins/Apple.CoreHaptics/Native/CoreHapticsWrapper.xcodeproj/project.pbxproj index e1e2042a..1deed869 100644 --- a/plug-ins/Apple.CoreHaptics/Native/CoreHapticsWrapper.xcodeproj/project.pbxproj +++ b/plug-ins/Apple.CoreHaptics/Native/CoreHapticsWrapper.xcodeproj/project.pbxproj @@ -615,13 +615,13 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.0; PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.CoreHapticsWrapper-visionOS"; PRODUCT_NAME = CoreHapticsWrapper; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -631,7 +631,7 @@ SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 7; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Debug; }; @@ -645,13 +645,13 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.0; PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.CoreHapticsWrapper-visionOS"; PRODUCT_NAME = CoreHapticsWrapper; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -660,7 +660,7 @@ SUPPORTS_MACCATALYST = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 7; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Release; }; @@ -716,7 +716,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.6; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -773,7 +773,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.6; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; @@ -794,13 +794,13 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.0; PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.CoreHapticsWrapper-iOS"; PRODUCT_NAME = CoreHapticsWrapper; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -809,7 +809,7 @@ SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Debug; }; @@ -823,13 +823,13 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.0; PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.CoreHapticsWrapper-iOS"; PRODUCT_NAME = CoreHapticsWrapper; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -837,7 +837,7 @@ SUPPORTS_MACCATALYST = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Release; }; @@ -848,13 +848,13 @@ CLANG_ENABLE_MODULES = YES; COMBINE_HIDPI_IMAGES = YES; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", "@loader_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.0; PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.CoreHapticsWrapper-macOS"; PRODUCT_NAME = CoreHapticsWrapper; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -863,7 +863,7 @@ SWIFT_OBJC_BRIDGING_HEADER = "CoreHapticsWrapper/BridgingHeader-macOS.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; WRAPPER_EXTENSION = bundle; }; name = Debug; @@ -875,13 +875,13 @@ CLANG_ENABLE_MODULES = YES; COMBINE_HIDPI_IMAGES = YES; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", "@loader_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.0; PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.CoreHapticsWrapper-macOS"; PRODUCT_NAME = CoreHapticsWrapper; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -889,7 +889,7 @@ SKIP_INSTALL = YES; SWIFT_OBJC_BRIDGING_HEADER = "CoreHapticsWrapper/BridgingHeader-macOS.h"; SWIFT_VERSION = 5.0; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; WRAPPER_EXTENSION = bundle; }; name = Release; @@ -904,13 +904,13 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.0; PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.CoreHapticsWrapper-tvOS"; PRODUCT_NAME = CoreHapticsWrapper; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -920,7 +920,7 @@ SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Debug; }; @@ -934,13 +934,13 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.0; PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.CoreHapticsWrapper-tvOS"; PRODUCT_NAME = CoreHapticsWrapper; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -949,7 +949,7 @@ SUPPORTS_MACCATALYST = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Release; }; diff --git a/plug-ins/Apple.CoreHaptics/Native/CoreHapticsWrapper.xcodeproj/xcshareddata/xcschemes/iOS - Debug.xcscheme b/plug-ins/Apple.CoreHaptics/Native/CoreHapticsWrapper.xcodeproj/xcshareddata/xcschemes/iOS - Debug.xcscheme index 8011b320..2d237f9e 100644 --- a/plug-ins/Apple.CoreHaptics/Native/CoreHapticsWrapper.xcodeproj/xcshareddata/xcschemes/iOS - Debug.xcscheme +++ b/plug-ins/Apple.CoreHaptics/Native/CoreHapticsWrapper.xcodeproj/xcshareddata/xcschemes/iOS - Debug.xcscheme @@ -10,7 +10,7 @@ ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction"> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> (); @@ -37,6 +38,13 @@ private readonly bool IsTriggerForFriendingAvailable = false; #endif + private readonly bool IsTriggerForArcadeAvailable +#if UNITY_IOS || UNITY_STANDALONE_OSX + = Availability.IsMethodAvailable(nameof(GKAccessPoint.TriggerForArcade)); +#else + = false; +#endif + void Start() { @@ -47,6 +55,7 @@ void Start() _triggerForChallengesButton.interactable = IsTriggerForChallengesAvailable; _triggerForPlayTogetherButton.interactable = IsTriggerForPlayTogetherAvailable; _triggerForFriendingButton.interactable = IsTriggerForFriendingAvailable; + _triggerForArcadeButton.interactable = IsTriggerForArcadeAvailable; } public void OnToggleAccessPoint() @@ -106,5 +115,15 @@ public async void OnTriggerForFriending() #endif } + public async void OnTriggerForArcade() + { +#if UNITY_IOS || UNITY_STANDALONE_OSX + if (IsTriggerForArcadeAvailable) + { + await GKAccessPoint.Shared.TriggerForArcade(); + } +#endif + } + } } diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKAccessPoint.cs b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKAccessPoint.cs index 96fd56a8..18e15fb9 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKAccessPoint.cs +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKAccessPoint.cs @@ -244,6 +244,21 @@ public Task TriggerForFriending() } #endif +#if UNITY_IOS || UNITY_STANDALONE_OSX + /// + /// Brings up the arcade view. + /// + /// c:objc(cs)GKAccessPoint(im)triggerAccessPointForArcadeWithHandler: + [Unavailable(RuntimeOperatingSystem.tvOS, RuntimeOperatingSystem.visionOS)] + [Introduced(iOS: "26.2.0", macOS: "26.2.0")] + public Task TriggerForArcade() + { + var tcs = InteropTasks.Create(out var taskId); + Interop.GKAccessPoint_TriggerForArcade(Pointer, taskId, OnTriggerSuccess, OnTriggerError); + return tcs.Task; + } +#endif + #if UNITY_IOS || UNITY_STANDALONE_OSX /// /// Brings up the game activity play together flow for the provided definition. @@ -295,20 +310,25 @@ private static class Interop [DllImport(InteropUtility.DLLName)] public static extern GKAccessPointFrameInScreenCoordinates GKAccessPoint_GetFrameInUnitCoordinates(IntPtr pointer); [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKAccessPoint_GetIsActive(IntPtr pointer); [DllImport(InteropUtility.DLLName)] - public static extern void GKAccessPoint_SetIsActive(IntPtr pointer, bool isActive); + public static extern void GKAccessPoint_SetIsActive(IntPtr pointer, [MarshalAs(UnmanagedType.I1)] bool isActive); [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKAccessPoint_GetIsPresentingGameCenter(IntPtr pointer); [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKAccessPoint_GetIsVisible(IntPtr pointer); [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKAccessPoint_GetShowHighlights(IntPtr pointer); [DllImport(InteropUtility.DLLName)] - public static extern void GKAccessPoint_SetShowHighlights(IntPtr pointer, bool isActive); + public static extern void GKAccessPoint_SetShowHighlights(IntPtr pointer, [MarshalAs(UnmanagedType.I1)] bool isActive); #if UNITY_TVOS [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKAccessPoint_GetIsFocused(IntPtr pointer); #endif @@ -338,6 +358,8 @@ private static class Interop public static extern void GKAccessPoint_TriggerForFriending(IntPtr pointer, long taskId, SuccessTaskCallback onSuccess, NSErrorTaskCallback onError); [DllImport(InteropUtility.DLLName)] public static extern void GKAccessPoint_TriggerWithGameActivity(IntPtr pointer, IntPtr gameActivityPtr, long taskId, SuccessTaskCallback onSuccess, NSErrorTaskCallback onError); + [DllImport(InteropUtility.DLLName)] + public static extern void GKAccessPoint_TriggerForArcade(IntPtr pointer, long taskId, SuccessTaskCallback onSuccess, NSErrorTaskCallback onError); #endif } diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKAchievement.cs b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKAchievement.cs index e6122fe4..9ce67857 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKAchievement.cs +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKAchievement.cs @@ -223,13 +223,15 @@ private static class Interop [DllImport(InteropUtility.DLLName)] public static extern void GKAchievement_SetPercentComplete(IntPtr pointer, double value); [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKAchievement_GetIsCompleted(IntPtr pointer); [DllImport(InteropUtility.DLLName)] public static extern double GKAchievement_GetLastReportedDate(IntPtr pointer); [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKAchievement_GetShowCompletionBanner(IntPtr pointer); [DllImport(InteropUtility.DLLName)] - public static extern void GKAchievement_SetShowCompletionBanner(IntPtr pointer, bool value); + public static extern void GKAchievement_SetShowCompletionBanner(IntPtr pointer, [MarshalAs(UnmanagedType.I1)] bool value); [DllImport(InteropUtility.DLLName)] public static extern void GKAchievement_Report(long taskId, IntPtr array, SuccessTaskCallback onSuccess, NSErrorTaskCallback onError); [DllImport(InteropUtility.DLLName)] diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKAchievementDescription.cs b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKAchievementDescription.cs index fe973a48..bd94334f 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKAchievementDescription.cs +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKAchievementDescription.cs @@ -176,8 +176,10 @@ private static class Interop [DllImport(InteropUtility.DLLName)] public static extern long GKAchievementDescription_GetMaximumPoints(IntPtr pointer); [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKAchievementDescription_GetIsHidden(IntPtr pointer); [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKAchievementDescription_GetIsReplayable(IntPtr pointer); [DllImport(InteropUtility.DLLName)] public static extern double GKAchievementDescription_GetRarityPercent(IntPtr pointer); diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKChallengeDefinition.cs b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKChallengeDefinition.cs index cf89fbd4..e5cab883 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKChallengeDefinition.cs +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKChallengeDefinition.cs @@ -52,7 +52,7 @@ public Task HasActiveChallenges() } [MonoPInvokeCallback(typeof(SuccessTaskCallback))] - private static void OnHasActiveChallenges(long taskId, bool hasActiveChallenges) + private static void OnHasActiveChallenges(long taskId, [MarshalAs(UnmanagedType.I1)] bool hasActiveChallenges) { InteropTasks.TrySetResultAndRemove(taskId, hasActiveChallenges); } @@ -160,6 +160,7 @@ private static class Interop [DllImport(InteropUtility.DLLName)] public static extern string GKChallengeDefinition_GetIdentifier(IntPtr pointer); [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKChallengeDefinition_GetIsRepeatable(IntPtr pointer); [DllImport(InteropUtility.DLLName)] public static extern IntPtr GKChallengeDefinition_GetLeaderboard(IntPtr pointer); diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKGameActivity.cs b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKGameActivity.cs index 46e56e83..90ad7231 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKGameActivity.cs +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKGameActivity.cs @@ -114,7 +114,7 @@ public static Task CheckPendingGameActivityExistence() } [MonoPInvokeCallback(typeof(SuccessTaskCallback))] - private static void OnCheckPendingGameActivityExistence(long taskId, bool hasActiveChallenges) + private static void OnCheckPendingGameActivityExistence(long taskId, [MarshalAs(UnmanagedType.I1)] bool hasActiveChallenges) { InteropTasks.TrySetResultAndRemove(taskId, hasActiveChallenges); } @@ -410,7 +410,7 @@ private static class Interop [DllImport(InteropUtility.DLLName)] public static extern void GKGameActivity_SetWantsToPlayCallback(InteropWantsToPlayHandler callback); [DllImport(InteropUtility.DLLName)] - public static extern void GKGameActivity_WantsToPlayCallbackCompletionHandler_Invoke(IntPtr context, bool result); + public static extern void GKGameActivity_WantsToPlayCallbackCompletionHandler_Invoke(IntPtr context, [MarshalAs(UnmanagedType.I1)] bool result); [DllImport(InteropUtility.DLLName)] public static extern IntPtr GKGameActivity_GetAchievementsAsArray(IntPtr pointer); [DllImport(InteropUtility.DLLName)] diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKGameActivityDefinition.cs b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKGameActivityDefinition.cs index 17234f74..06ea3620 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKGameActivityDefinition.cs +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKGameActivityDefinition.cs @@ -269,8 +269,10 @@ private static class Interop [DllImport(InteropUtility.DLLName)] public static extern GKReleaseState GKGameActivityDefinition_GetReleaseState(IntPtr pointer); [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKGameActivityDefinition_GetSupportsPartyCode(IntPtr pointer); [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKGameActivityDefinition_GetSupportsUnlimitedPlayers(IntPtr pointer); [DllImport(InteropUtility.DLLName)] public static extern string GKGameActivityDefinition_GetTitle(IntPtr pointer); diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKLocalPlayer.cs b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKLocalPlayer.cs index 3488ab96..36d0c7d5 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKLocalPlayer.cs +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKLocalPlayer.cs @@ -442,12 +442,16 @@ private static void OnDeleteSavedGamesError(long taskId, IntPtr errorPointer) private static class Interop { [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKLocalPlayer_GetIsAuthenticated(IntPtr pointer); [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKLocalPlayer_GetIsUnderage(IntPtr pointer); [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKLocalPlayer_GetIsMultiplayerGamingRestricted(IntPtr pointer); [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKLocalPlayer_GetIsPersonalizedCommunicationRestricted(IntPtr pointer); [DllImport(InteropUtility.DLLName)] public static extern IntPtr GKLocalPlayer_GetLocal(); diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKPlayer.cs b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKPlayer.cs index 59a7543a..6fb0346d 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKPlayer.cs +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/GKPlayer.cs @@ -110,12 +110,14 @@ private static class Interop [DllImport(InteropUtility.DLLName)] public static extern string GKPlayer_GetTeamPlayerId(IntPtr pointer); [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKPlayer_GetScopedIdsArePersistent(IntPtr pointer); [DllImport(InteropUtility.DLLName)] public static extern string GKPlayer_GetAlias(IntPtr pointer); [DllImport(InteropUtility.DLLName)] public static extern string GKPlayer_GetDisplayName(IntPtr pointer); [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKPlayer_GetIsInvitable(IntPtr pointer); [DllImport(InteropUtility.DLLName)] public static extern string GKPlayer_GetGuestIdentifier(IntPtr pointer); diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Leaderboards/GKLeaderboard.cs b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Leaderboards/GKLeaderboard.cs index b5fe5b77..981e4b2b 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Leaderboards/GKLeaderboard.cs +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Leaderboards/GKLeaderboard.cs @@ -449,6 +449,7 @@ private static class Interop [DllImport(InteropUtility.DLLName)] public static extern GKReleaseState GKLeaderboard_GetReleaseState(IntPtr pointer); [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKLeaderboard_IsHidden(IntPtr pointer); } diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKInvite.cs b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKInvite.cs index 0d1a0127..278a396a 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKInvite.cs +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKInvite.cs @@ -76,6 +76,7 @@ private static class Interop [DllImport(InteropUtility.DLLName)] public static extern long GKInvite_GetPlayerGroup(IntPtr pointer); [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKInvite_GetIsHosted(IntPtr pointer); } } diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKMatchmaker.cs b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKMatchmaker.cs index a584cfac..d59088b9 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKMatchmaker.cs +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKMatchmaker.cs @@ -300,10 +300,10 @@ public void StopBrowsingForNearbyPlayers() public event NearbyPlayerReachableHandler NearbyPlayerReachable; public delegate void NearbyPlayerReachableHandler(GKPlayer player, bool isReachable); - internal delegate void InternalNearbyPlayerReachableHandler(IntPtr gkMatchmakerPtr, IntPtr gkPlayerPtr, bool isReachable); + internal delegate void InternalNearbyPlayerReachableHandler(IntPtr gkMatchmakerPtr, IntPtr gkPlayerPtr, [MarshalAs(UnmanagedType.I1)] bool isReachable); [MonoPInvokeCallback(typeof(InternalNearbyPlayerReachableHandler))] - private static void OnNearbyPlayerReachable(IntPtr gkMatchmakerPtr, IntPtr gkPlayerPtr, bool isReachable) + private static void OnNearbyPlayerReachable(IntPtr gkMatchmakerPtr, IntPtr gkPlayerPtr, [MarshalAs(UnmanagedType.I1)] bool isReachable) { InteropPInvokeExceptionHandler.CatchAndLog(() => { diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKMatchmakerViewController.cs b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKMatchmakerViewController.cs index 74a57871..4b4590f3 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKMatchmakerViewController.cs +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKMatchmakerViewController.cs @@ -278,19 +278,21 @@ private static class Interop [DllImport(InteropUtility.DLLName)] public static extern IntPtr GKMatchmakerViewController_GetMatchRequest(IntPtr pointer); [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKMatchmakerViewController_GetCanStartWithMinimumPlayers(IntPtr pointer); [DllImport(InteropUtility.DLLName)] - public static extern void GKMatchmakerViewController_SetCanStartWithMinimumPlayers(IntPtr pointer, bool value); + public static extern void GKMatchmakerViewController_SetCanStartWithMinimumPlayers(IntPtr pointer, [MarshalAs(UnmanagedType.I1)] bool value); [DllImport(InteropUtility.DLLName)] public static extern GKMatchmakingMode GKMatchmakerViewController_GetMatchmakingMode(IntPtr pointer); [DllImport(InteropUtility.DLLName)] public static extern void GKMatchmakerViewController_SetMatchmakingMode(IntPtr pointer, GKMatchmakingMode value); [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKMatchmakerViewController_GetIsHosted(IntPtr pointer); [DllImport(InteropUtility.DLLName)] - public static extern void GKMatchmakerViewController_SetIsHosted(IntPtr pointer, bool isHosted); + public static extern void GKMatchmakerViewController_SetIsHosted(IntPtr pointer, [MarshalAs(UnmanagedType.I1)] bool isHosted); [DllImport(InteropUtility.DLLName)] - public static extern void GKMatchmakerViewController_SetHostedPlayerDidConnect(IntPtr gkMatchmakerViewControllerPtr, IntPtr gkPlayerPtr, bool didConnect); + public static extern void GKMatchmakerViewController_SetHostedPlayerDidConnect(IntPtr gkMatchmakerViewControllerPtr, IntPtr gkPlayerPtr, [MarshalAs(UnmanagedType.I1)] bool didConnect); [DllImport(InteropUtility.DLLName)] public static extern void GKMatchmakerViewController_Present(IntPtr pointer); [DllImport(InteropUtility.DLLName)] diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKTurnBasedMatch.cs b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKTurnBasedMatch.cs index ac74f823..185a62a0 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKTurnBasedMatch.cs +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKTurnBasedMatch.cs @@ -26,7 +26,7 @@ public class GKTurnBasedMatch : NSObject public delegate void MatchEndedHandler(GKPlayer player, GKTurnBasedMatch match); private delegate void InteropMatchEndedHandler(IntPtr player, IntPtr match); public delegate void TurnEventReceivedHandler(GKPlayer player, GKTurnBasedMatch match, bool didBecomeActive); - private delegate void InteropTurnEventReceivedHandler(IntPtr player, IntPtr match, bool didBecomeActive); + private delegate void InteropTurnEventReceivedHandler(IntPtr player, IntPtr match, [MarshalAs(UnmanagedType.I1)] bool didBecomeActive); public delegate void PlayerWantsToQuitMatchHandler(GKPlayer player, GKTurnBasedMatch match); private delegate void InteropPlayerWantsToQuitMatchHandler(IntPtr player, IntPtr match); #endregion @@ -129,7 +129,7 @@ private static void OnMatchEnded(IntPtr player, IntPtr match) } [MonoPInvokeCallback(typeof(InteropTurnEventReceivedHandler))] - private static void OnTurnEventReceived(IntPtr player, IntPtr match, bool didBecomeActive) + private static void OnTurnEventReceived(IntPtr player, IntPtr match, [MarshalAs(UnmanagedType.I1)] bool didBecomeActive) { InteropPInvokeExceptionHandler.CatchAndLog(() => TurnEventReceived?.Invoke(PointerCast(player), PointerCast(match), didBecomeActive)); } diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKTurnBasedMatchmakerViewController.cs b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKTurnBasedMatchmakerViewController.cs index 5076705a..bdb28bda 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKTurnBasedMatchmakerViewController.cs +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKTurnBasedMatchmakerViewController.cs @@ -92,9 +92,10 @@ private static class Interop [DllImport(InteropUtility.DLLName)] public static extern IntPtr GKTurnBasedMatchmakerViewController_InitWithMatchRequest(IntPtr matchRequest); [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKTurnBasedMatchmakerViewController_GetShowExistingMatches(IntPtr pointer); [DllImport(InteropUtility.DLLName)] - public static extern void GKTurnBasedMatchmakerViewController_SetShowExistingMatches(IntPtr pointer, bool value); + public static extern void GKTurnBasedMatchmakerViewController_SetShowExistingMatches(IntPtr pointer, [MarshalAs(UnmanagedType.I1)] bool value); [DllImport(InteropUtility.DLLName)] public static extern GKMatchmakingMode GKTurnBasedMatchmakerViewController_GetMatchmakingMode(IntPtr pointer); [DllImport(InteropUtility.DLLName)] diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKVoiceChat.cs b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKVoiceChat.cs index 05b2757d..a03a0d21 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKVoiceChat.cs +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Source/Multiplayer/GKVoiceChat.cs @@ -137,19 +137,21 @@ public enum PlayerState : long private static class Interop { [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKVoiceChat_GetIsVoIPAllowed(); [DllImport(InteropUtility.DLLName)] public static extern void GKVoiceChat_Start(IntPtr pointer); [DllImport(InteropUtility.DLLName)] public static extern void GKVoiceChat_Stop(IntPtr pointer); [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] public static extern bool GKVoiceChat_GetIsActive(IntPtr pointer); [DllImport(InteropUtility.DLLName)] - public static extern void GKVoiceChat_SetIsActive(IntPtr pointer, bool value); + public static extern void GKVoiceChat_SetIsActive(IntPtr pointer, [MarshalAs(UnmanagedType.I1)] bool value); [DllImport(InteropUtility.DLLName)] public static extern void GKVoiceChat_PlayerVoiceChatStateDidChangeHandler(IntPtr pointer, InternalPlayerVoiceChatStateDidChangeHandler onStateChanged); [DllImport(InteropUtility.DLLName)] - public static extern void GKVoiceChat_SetPlayer(IntPtr pointer, IntPtr playerPtr, bool isMuted); + public static extern void GKVoiceChat_SetPlayer(IntPtr pointer, IntPtr playerPtr, [MarshalAs(UnmanagedType.I1)] bool isMuted); [DllImport(InteropUtility.DLLName)] public static extern float GKVoiceChat_GetVolume(IntPtr pointer); [DllImport(InteropUtility.DLLName)] diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/package.json b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/package.json index cec78a56..5878258e 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/package.json +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/package.json @@ -2,10 +2,10 @@ "name": "com.apple.unityplugin.gamekit", "displayName": "Apple.GameKit", "description": "Exposes Apple's GameKit.framework to Unity developers via C# script API", - "version": "4.0.1", + "version": "4.1.0", "unity": "2022.3", "dependencies": { - "com.apple.unityplugin.core": "3.1.8" + "com.apple.unityplugin.core": "3.3.0" }, "keywords": [ "gamekit", @@ -23,7 +23,7 @@ { "displayName": "GameKit Demo", "description": "Demo for GameKit integration", - "path": "Demos~/Apple.GameKit.Sample" + "path": "Demos/Apple.GameKit.Sample" } ] } diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Packages/manifest.json b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Packages/manifest.json index d2cdf8b1..44d9ca3a 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Packages/manifest.json +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Packages/manifest.json @@ -2,12 +2,13 @@ "dependencies": { "com.apple.unityplugin.core": "file:../../../Apple.Core/Apple.Core_Unity/Assets/Apple.Core", "com.unity.ide.rider": "3.0.38", - "com.unity.ide.visualstudio": "2.0.23", - "com.unity.memoryprofiler": "1.1.9", - "com.unity.multiplayer.center": "1.0.0", - "com.unity.test-framework": "1.6.0", - "com.unity.ugui": "2.0.0", + "com.unity.ide.visualstudio": "2.0.26", + "com.unity.memoryprofiler": "1.1.12", + "com.unity.multiplayer.center": "1.0.1", + "com.unity.test-framework": "1.7.0", + "com.unity.ugui": "2.5.0", "com.unity.modules.accessibility": "1.0.0", + "com.unity.modules.adaptiveperformance": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", "com.unity.modules.animation": "1.0.0", @@ -21,6 +22,7 @@ "com.unity.modules.particlesystem": "1.0.0", "com.unity.modules.physics": "1.0.0", "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.physicscore2d": "1.0.0", "com.unity.modules.screencapture": "1.0.0", "com.unity.modules.terrain": "1.0.0", "com.unity.modules.terrainphysics": "1.0.0", @@ -34,9 +36,9 @@ "com.unity.modules.unitywebrequestaudio": "1.0.0", "com.unity.modules.unitywebrequesttexture": "1.0.0", "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vectorgraphics": "1.0.0", "com.unity.modules.vehicles": "1.0.0", "com.unity.modules.video": "1.0.0", - "com.unity.modules.vr": "1.0.0", "com.unity.modules.wind": "1.0.0", "com.unity.modules.xr": "1.0.0" } diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Packages/packages-lock.json b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Packages/packages-lock.json index a4d5078a..74105fce 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Packages/packages-lock.json +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Packages/packages-lock.json @@ -7,7 +7,7 @@ "dependencies": {} }, "com.unity.burst": { - "version": "1.8.24", + "version": "1.8.29", "depth": 1, "source": "registry", "dependencies": { @@ -17,27 +17,25 @@ "url": "https://packages.unity.com" }, "com.unity.collections": { - "version": "2.5.7", + "version": "6.5.0", "depth": 1, - "source": "registry", + "source": "builtin", "dependencies": { - "com.unity.burst": "1.8.19", - "com.unity.mathematics": "1.3.2", + "com.unity.burst": "1.8.25", + "com.unity.nuget.mono-cecil": "1.11.6", "com.unity.test-framework": "1.4.6", - "com.unity.nuget.mono-cecil": "1.11.5", - "com.unity.test-framework.performance": "3.0.3" - }, - "url": "https://packages.unity.com" + "com.unity.test-framework.performance": "3.2.0" + } }, "com.unity.editorcoroutines": { - "version": "1.0.0", + "version": "1.1.0", "depth": 1, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, "com.unity.ext.nunit": { - "version": "2.0.5", + "version": "2.1.0", "depth": 1, "source": "builtin", "dependencies": {} @@ -52,23 +50,22 @@ "url": "https://packages.unity.com" }, "com.unity.ide.visualstudio": { - "version": "2.0.23", + "version": "2.0.26", "depth": 0, "source": "registry", "dependencies": { - "com.unity.test-framework": "1.1.9" + "com.unity.test-framework": "1.1.33" }, "url": "https://packages.unity.com" }, "com.unity.mathematics": { - "version": "1.3.2", + "version": "1.4.0", "depth": 1, - "source": "registry", - "dependencies": {}, - "url": "https://packages.unity.com" + "source": "builtin", + "dependencies": {} }, "com.unity.memoryprofiler": { - "version": "1.1.9", + "version": "1.1.12", "depth": 0, "source": "registry", "dependencies": { @@ -81,7 +78,7 @@ "url": "https://packages.unity.com" }, "com.unity.multiplayer.center": { - "version": "1.0.0", + "version": "1.0.1", "depth": 0, "source": "builtin", "dependencies": { @@ -89,31 +86,31 @@ } }, "com.unity.nuget.mono-cecil": { - "version": "1.11.5", + "version": "1.11.6", "depth": 2, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, "com.unity.profiling.core": { - "version": "1.0.2", + "version": "1.0.3", "depth": 1, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, "com.unity.test-framework": { - "version": "1.6.0", + "version": "1.7.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.ext.nunit": "2.0.3", + "com.unity.ext.nunit": "2.1.0", "com.unity.modules.imgui": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0" } }, "com.unity.test-framework.performance": { - "version": "3.1.0", + "version": "3.5.0", "depth": 2, "source": "registry", "dependencies": { @@ -123,12 +120,15 @@ "url": "https://packages.unity.com" }, "com.unity.ugui": { - "version": "2.0.0", + "version": "2.5.0", "depth": 0, "source": "builtin", "dependencies": { "com.unity.modules.ui": "1.0.0", - "com.unity.modules.imgui": "1.0.0" + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.physics": "1.0.0" } }, "com.unity.modules.accessibility": { @@ -137,6 +137,14 @@ "source": "builtin", "dependencies": {} }, + "com.unity.modules.adaptiveperformance": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.subsystems": "1.0.0" + } + }, "com.unity.modules.ai": { "version": "1.0.0", "depth": 0, @@ -147,7 +155,9 @@ "version": "1.0.0", "depth": 0, "source": "builtin", - "dependencies": {} + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0" + } }, "com.unity.modules.animation": { "version": "1.0.0", @@ -221,6 +231,14 @@ "dependencies": {} }, "com.unity.modules.physics2d": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physicscore2d": "1.0.0" + } + }, + "com.unity.modules.physicscore2d": { "version": "1.0.0", "depth": 0, "source": "builtin", @@ -280,7 +298,8 @@ "com.unity.modules.imgui": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0", "com.unity.modules.hierarchycore": "1.0.0", - "com.unity.modules.physics": "1.0.0" + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.animation": "1.0.0" } }, "com.unity.modules.umbra": { @@ -344,32 +363,32 @@ "com.unity.modules.imageconversion": "1.0.0" } }, - "com.unity.modules.vehicles": { + "com.unity.modules.vectorgraphics": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.physics": "1.0.0" + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0" } }, - "com.unity.modules.video": { + "com.unity.modules.vehicles": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.audio": "1.0.0", - "com.unity.modules.ui": "1.0.0", - "com.unity.modules.unitywebrequest": "1.0.0" + "com.unity.modules.physics": "1.0.0" } }, - "com.unity.modules.vr": { + "com.unity.modules.video": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.jsonserialize": "1.0.0", - "com.unity.modules.physics": "1.0.0", - "com.unity.modules.xr": "1.0.0" + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" } }, "com.unity.modules.wind": { diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/ProjectSettings/PackageManagerSettings.asset b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/ProjectSettings/PackageManagerSettings.asset index be4a7974..d8f7921a 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/ProjectSettings/PackageManagerSettings.asset +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/ProjectSettings/PackageManagerSettings.asset @@ -12,32 +12,33 @@ MonoBehaviour: m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} m_Name: m_EditorClassIdentifier: - m_EnablePreviewPackages: 0 - m_EnablePackageDependencies: 0 + m_EnablePreReleasePackages: 0 m_AdvancedSettingsExpanded: 1 m_ScopedRegistriesSettingsExpanded: 1 + m_SeeAllPackageVersions: 0 + m_DismissPreviewPackagesInUse: 0 oneTimeWarningShown: 0 - m_Registries: - - m_Id: main + oneTimePackageErrorsPopUpShown: 0 + m_MainRegistry: + m_Id: main m_Name: m_Url: https://packages.unity.com m_Scopes: [] m_IsDefault: 1 + m_IsUnityRegistry: 1 m_Capabilities: 7 + m_ConfigSource: 0 + m_Compliance: + m_Status: 0 + m_Violations: [] + m_ScopedRegistries: [] m_UserSelectedRegistryName: m_UserAddingNewScopedRegistry: 0 m_RegistryInfoDraft: - m_ErrorMessage: - m_Original: - m_Id: - m_Name: - m_Url: - m_Scopes: [] - m_IsDefault: 0 - m_Capabilities: 0 m_Modified: 0 - m_Name: - m_Url: - m_Scopes: - - - m_SelectedScopeIndex: 0 + m_ErrorMessage: + m_UserModificationsEntityId: + m_rawData: 568105589213756492 + m_OriginalEntityId: + m_rawData: 568105589213756490 + m_LoadAssets: 0 diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/ProjectSettings/PhysicsCoreProjectSettings2D.asset b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/ProjectSettings/PhysicsCoreProjectSettings2D.asset new file mode 100644 index 00000000..049c7454 --- /dev/null +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/ProjectSettings/PhysicsCoreProjectSettings2D.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!176606843 &1 +PhysicsCoreProjectSettings2D: + m_ObjectHideFlags: 0 + m_PhysicsCoreSettings: {fileID: 0} diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/ProjectSettings/ProjectSettings.asset b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/ProjectSettings/ProjectSettings.asset index d8334aa1..605d1153 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/ProjectSettings/ProjectSettings.asset +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/ProjectSettings/ProjectSettings.asset @@ -3,7 +3,7 @@ --- !u!129 &1 PlayerSettings: m_ObjectHideFlags: 0 - serializedVersion: 26 + serializedVersion: 28 productGUID: ceb702fc7f532457bbaa3e5b50278107 AndroidProfiler: 0 AndroidFilterTouchesWhenObscured: 0 @@ -49,6 +49,7 @@ PlayerSettings: m_StereoRenderingPath: 0 m_ActiveColorSpace: 0 unsupportedMSAAFallback: 0 + m_SpriteBatchMaxVertexCount: 65535 m_SpriteBatchVertexThreshold: 300 m_MTRendering: 1 mipStripping: 0 @@ -70,17 +71,18 @@ PlayerSettings: androidRenderOutsideSafeArea: 1 androidUseSwappy: 1 androidBlitType: 0 - androidResizableWindow: 0 + androidResizeableActivity: 0 androidDefaultWindowWidth: 1920 androidDefaultWindowHeight: 1080 androidMinimumWindowWidth: 400 androidMinimumWindowHeight: 300 androidFullscreenMode: 1 androidAutoRotationBehavior: 1 + androidPredictiveBackSupport: 1 + androidApplicationEntry: 1 defaultIsNativeResolution: 1 macRetinaSupport: 1 runInBackground: 0 - captureSingleScreen: 0 muteOtherAudioSources: 0 Prepare IOS For Recording: 0 Force IOS Speakers When Recording: 0 @@ -97,6 +99,7 @@ PlayerSettings: useMacAppStoreValidation: 0 macAppStoreCategory: public.app-category.games gpuSkinning: 0 + meshDeformation: 0 xboxPIXTextureCapture: 0 xboxEnableAvatar: 0 xboxEnableKinect: 0 @@ -128,10 +131,9 @@ PlayerSettings: switchAllowGpuScratchShrinking: 0 switchNVNMaxPublicTextureIDCount: 0 switchNVNMaxPublicSamplerIDCount: 0 - switchNVNGraphicsFirmwareMemory: 32 switchMaxWorkerMultiple: 8 - stadiaPresentMode: 0 - stadiaTargetFramerate: 0 + switchNVNGraphicsFirmwareMemory: 32 + switchGraphicsJobsSyncAfterKick: 1 vulkanNumSwapchainBuffers: 3 vulkanEnableSetSRGBWrite: 0 vulkanEnablePreTransform: 0 @@ -161,8 +163,9 @@ PlayerSettings: resetResolutionOnWindowResize: 0 androidSupportedAspectRatio: 1 androidMaxAspectRatio: 2.1 + androidMinAspectRatio: 1 applicationIdentifier: - Standalone: com.DefaultCompany.Apple.GameKit-Unity + Standalone: com.scd.GameKitUnity iPhone: com.scd.GameKitUnity buildNumber: Standalone: 0 @@ -171,7 +174,7 @@ PlayerSettings: tvOS: 0 overrideDefaultApplicationIdentifier: 0 AndroidBundleVersionCode: 1 - AndroidMinSdkVersion: 22 + AndroidMinSdkVersion: 23 AndroidTargetSdkVersion: 0 AndroidPreferredInstallLocation: 1 aotOptions: @@ -181,7 +184,7 @@ PlayerSettings: ForceInternetPermission: 0 ForceSDCardPermission: 0 CreateWallpaper: 0 - APKExpansionFiles: 0 + androidSplitApplicationBinary: 0 keepLoadedShadersAlive: 0 StripUnusedMeshComponents: 0 strictShaderVariantMatching: 0 @@ -219,7 +222,6 @@ PlayerSettings: rgba: 0 iOSLaunchScreenFillPct: 100 iOSLaunchScreenSize: 100 - iOSLaunchScreenCustomXibPath: iOSLaunchScreeniPadType: 0 iOSLaunchScreeniPadImage: {fileID: 0} iOSLaunchScreeniPadBackgroundColor: @@ -227,7 +229,6 @@ PlayerSettings: rgba: 0 iOSLaunchScreeniPadFillPct: 100 iOSLaunchScreeniPadSize: 100 - iOSLaunchScreeniPadCustomXibPath: iOSLaunchScreenCustomStoryboardPath: iOSLaunchScreeniPadCustomStoryboardPath: iOSDeviceRequirements: [] @@ -264,15 +265,18 @@ PlayerSettings: useCustomGradleSettingsTemplate: 0 useCustomProguardFile: 0 AndroidTargetArchitectures: 1 - AndroidTargetDevices: 0 AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} AndroidKeystoreName: AndroidKeyaliasName: AndroidEnableArmv9SecurityFeatures: 0 + AndroidEnableArm64MTE: 0 AndroidBuildApkPerCpuArchitecture: 0 AndroidTVCompatibility: 0 AndroidIsGame: 1 + androidAppCategory: 3 + useAndroidAppCategory: 1 + androidAppCategoryOther: AndroidEnableTango: 0 androidEnableBanner: 1 androidUseLowAccuracyLocation: 0 @@ -282,11 +286,12 @@ PlayerSettings: height: 180 banner: {fileID: 0} androidGamepadSupportLevel: 0 - chromeosInputEmulation: 1 AndroidMinifyRelease: 0 AndroidMinifyDebug: 0 AndroidValidateAppBundleSize: 1 AndroidAppBundleSizeToValidate: 150 + AndroidReportGooglePlayAppDependencies: 1 + androidSymbolsSizeThreshold: 800 m_BuildTargetIcons: [] m_BuildTargetPlatformIcons: - m_BuildTarget: tvOS @@ -436,7 +441,7 @@ PlayerSettings: m_BuildTargetGraphicsJobMode: [] m_BuildTargetGraphicsAPIs: - m_BuildTarget: AndroidPlayer - m_APIs: 0b00000008000000 + m_APIs: 0b000000 m_Automatic: 0 m_BuildTargetVRSettings: [] m_DefaultShaderChunkSizeInMB: 16 @@ -458,6 +463,7 @@ PlayerSettings: playModeTestRunnerEnabled: 0 runPlayModeTestAsEditModeTest: 0 actionOnDotNetUnhandledException: 1 + editorGfxJobOverride: 1 enableInternalProfiler: 0 logObjCUncaughtExceptions: 1 enableCrashReportAPI: 0 @@ -465,7 +471,7 @@ PlayerSettings: locationUsageDescription: microphoneUsageDescription: bluetoothUsageDescription: - macOSTargetOSVersion: 10.15 + macOSTargetOSVersion: 11.0 switchNMETAOverride: switchNetLibKey: switchSocketMemoryPoolSize: 6144 @@ -610,6 +616,7 @@ PlayerSettings: switchEnableRamDiskSupport: 0 switchMicroSleepForYieldTime: 25 switchRamDiskSpaceSize: 12 + switchUpgradedPlayerSettingsToNMETA: 0 ps4NPAgeRating: 12 ps4NPTitleSecret: ps4NPTrophyPackPath: @@ -713,12 +720,18 @@ PlayerSettings: webGLMemoryGeometricGrowthStep: 0.2 webGLMemoryGeometricGrowthCap: 96 webGLPowerPreference: 2 + webGLWebAssemblyTable: 0 + webGLWebAssemblyBigInt: 0 + webGLCloseOnQuit: 0 + webWasm2023: 0 + webEnableSubmoduleStrippingCompatibility: 0 scriptingDefineSymbols: {} additionalCompilerArguments: {} platformArchitecture: {} scriptingBackend: {} il2cppCompilerConfiguration: {} il2cppCodeGeneration: {} + il2cppStacktraceInformation: {} managedStrippingLevel: EmbeddedLinux: 1 GameCoreScarlett: 1 @@ -743,6 +756,7 @@ PlayerSettings: gcIncremental: 1 gcWBarrierValidation: 0 apiCompatibilityLevelPerPlatform: {} + editorAssembliesCompatibilityLevel: 1 m_RenderingPath: 1 m_MobileRenderingPath: 1 metroPackageName: Apple.GameKit_Unity @@ -816,9 +830,11 @@ PlayerSettings: hmiPlayerDataPath: hmiForceSRGBBlit: 1 embeddedLinuxEnableGamepadInput: 1 - hmiLogStartupTiming: 0 hmiCpuConfiguration: + hmiLogStartupTiming: 0 + qnxGraphicConfPath: apiCompatibilityLevel: 6 + captureStartupLogs: {} activeInputHandler: 0 windowsGamepadBackendHint: 0 cloudProjectId: @@ -832,3 +848,6 @@ PlayerSettings: platformRequiresReadableAssets: 0 virtualTexturingSupportEnabled: 0 insecureHttpOption: 0 + androidVulkanDenyFilterList: [] + androidVulkanAllowFilterList: [] + androidVulkanDeviceFilterListAsset: {fileID: 0} diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/ProjectSettings/ProjectVersion.txt b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/ProjectSettings/ProjectVersion.txt index b5c96e15..c1608124 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/ProjectSettings/ProjectVersion.txt +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 6000.2.6f2 -m_EditorVersionWithRevision: 6000.2.6f2 (4a4dcaec6541) +m_EditorVersion: 6000.5.2f1 +m_EditorVersionWithRevision: 6000.5.2f1 (eb73d3b415a1) diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/ProjectSettings/QualitySettings.asset b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/ProjectSettings/QualitySettings.asset index 7c920b9e..846bf4c6 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/ProjectSettings/QualitySettings.asset +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/ProjectSettings/QualitySettings.asset @@ -6,7 +6,7 @@ QualitySettings: serializedVersion: 5 m_CurrentQuality: 5 m_QualitySettings: - - serializedVersion: 2 + - serializedVersion: 5 name: Very Low pixelLightCount: 0 shadows: 0 @@ -19,16 +19,24 @@ QualitySettings: shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} shadowmaskMode: 0 skinWeights: 1 - textureQuality: 1 + globalTextureMipmapLimit: 1 + textureMipmapLimitSettings: [] anisotropicTextures: 0 antiAliasing: 0 softParticles: 0 softVegetation: 0 realtimeReflectionProbes: 0 billboardsFaceCameraPosition: 0 + useLegacyDetailDistribution: 1 + adaptiveVsync: 0 vSyncCount: 0 + realtimeGICPUUsage: 25 + adaptiveVsyncExtraA: 0 + adaptiveVsyncExtraB: 0 lodBias: 0.3 + meshLodThreshold: 1 maximumLODLevel: 0 + enableLODCrossFade: 1 streamingMipmapsActive: 0 streamingMipmapsAddAllCameras: 1 streamingMipmapsMemoryBudget: 512 @@ -41,8 +49,17 @@ QualitySettings: asyncUploadPersistentBuffer: 1 resolutionScalingFixedDPIFactor: 1 customRenderPipeline: {fileID: 0} + terrainQualityOverrides: 0 + terrainPixelError: 1 + terrainDetailDensityScale: 1 + terrainBasemapDistance: 1000 + terrainDetailDistance: 80 + terrainTreeDistance: 5000 + terrainBillboardStart: 50 + terrainFadeLength: 5 + terrainMaxTrees: 50 excludedTargetPlatforms: [] - - serializedVersion: 2 + - serializedVersion: 5 name: Low pixelLightCount: 0 shadows: 0 @@ -55,16 +72,24 @@ QualitySettings: shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} shadowmaskMode: 0 skinWeights: 2 - textureQuality: 0 + globalTextureMipmapLimit: 0 + textureMipmapLimitSettings: [] anisotropicTextures: 0 antiAliasing: 0 softParticles: 0 softVegetation: 0 realtimeReflectionProbes: 0 billboardsFaceCameraPosition: 0 + useLegacyDetailDistribution: 1 + adaptiveVsync: 0 vSyncCount: 0 + realtimeGICPUUsage: 25 + adaptiveVsyncExtraA: 0 + adaptiveVsyncExtraB: 0 lodBias: 0.4 + meshLodThreshold: 1 maximumLODLevel: 0 + enableLODCrossFade: 1 streamingMipmapsActive: 0 streamingMipmapsAddAllCameras: 1 streamingMipmapsMemoryBudget: 512 @@ -77,8 +102,17 @@ QualitySettings: asyncUploadPersistentBuffer: 1 resolutionScalingFixedDPIFactor: 1 customRenderPipeline: {fileID: 0} + terrainQualityOverrides: 0 + terrainPixelError: 1 + terrainDetailDensityScale: 1 + terrainBasemapDistance: 1000 + terrainDetailDistance: 80 + terrainTreeDistance: 5000 + terrainBillboardStart: 50 + terrainFadeLength: 5 + terrainMaxTrees: 50 excludedTargetPlatforms: [] - - serializedVersion: 2 + - serializedVersion: 5 name: Medium pixelLightCount: 1 shadows: 1 @@ -91,16 +125,24 @@ QualitySettings: shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} shadowmaskMode: 0 skinWeights: 2 - textureQuality: 0 + globalTextureMipmapLimit: 0 + textureMipmapLimitSettings: [] anisotropicTextures: 1 antiAliasing: 0 softParticles: 0 softVegetation: 0 realtimeReflectionProbes: 0 billboardsFaceCameraPosition: 0 + useLegacyDetailDistribution: 1 + adaptiveVsync: 0 vSyncCount: 1 + realtimeGICPUUsage: 25 + adaptiveVsyncExtraA: 0 + adaptiveVsyncExtraB: 0 lodBias: 0.7 + meshLodThreshold: 1 maximumLODLevel: 0 + enableLODCrossFade: 1 streamingMipmapsActive: 0 streamingMipmapsAddAllCameras: 1 streamingMipmapsMemoryBudget: 512 @@ -113,8 +155,17 @@ QualitySettings: asyncUploadPersistentBuffer: 1 resolutionScalingFixedDPIFactor: 1 customRenderPipeline: {fileID: 0} + terrainQualityOverrides: 0 + terrainPixelError: 1 + terrainDetailDensityScale: 1 + terrainBasemapDistance: 1000 + terrainDetailDistance: 80 + terrainTreeDistance: 5000 + terrainBillboardStart: 50 + terrainFadeLength: 5 + terrainMaxTrees: 50 excludedTargetPlatforms: [] - - serializedVersion: 2 + - serializedVersion: 5 name: High pixelLightCount: 2 shadows: 2 @@ -127,16 +178,24 @@ QualitySettings: shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} shadowmaskMode: 1 skinWeights: 2 - textureQuality: 0 + globalTextureMipmapLimit: 0 + textureMipmapLimitSettings: [] anisotropicTextures: 1 antiAliasing: 0 softParticles: 0 softVegetation: 1 realtimeReflectionProbes: 1 billboardsFaceCameraPosition: 1 + useLegacyDetailDistribution: 1 + adaptiveVsync: 0 vSyncCount: 1 + realtimeGICPUUsage: 50 + adaptiveVsyncExtraA: 0 + adaptiveVsyncExtraB: 0 lodBias: 1 + meshLodThreshold: 1 maximumLODLevel: 0 + enableLODCrossFade: 1 streamingMipmapsActive: 0 streamingMipmapsAddAllCameras: 1 streamingMipmapsMemoryBudget: 512 @@ -149,8 +208,17 @@ QualitySettings: asyncUploadPersistentBuffer: 1 resolutionScalingFixedDPIFactor: 1 customRenderPipeline: {fileID: 0} + terrainQualityOverrides: 0 + terrainPixelError: 1 + terrainDetailDensityScale: 1 + terrainBasemapDistance: 1000 + terrainDetailDistance: 80 + terrainTreeDistance: 5000 + terrainBillboardStart: 50 + terrainFadeLength: 5 + terrainMaxTrees: 50 excludedTargetPlatforms: [] - - serializedVersion: 2 + - serializedVersion: 5 name: Very High pixelLightCount: 3 shadows: 2 @@ -163,16 +231,24 @@ QualitySettings: shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} shadowmaskMode: 1 skinWeights: 4 - textureQuality: 0 + globalTextureMipmapLimit: 0 + textureMipmapLimitSettings: [] anisotropicTextures: 2 antiAliasing: 2 softParticles: 1 softVegetation: 1 realtimeReflectionProbes: 1 billboardsFaceCameraPosition: 1 + useLegacyDetailDistribution: 1 + adaptiveVsync: 0 vSyncCount: 1 + realtimeGICPUUsage: 50 + adaptiveVsyncExtraA: 0 + adaptiveVsyncExtraB: 0 lodBias: 1.5 + meshLodThreshold: 1 maximumLODLevel: 0 + enableLODCrossFade: 1 streamingMipmapsActive: 0 streamingMipmapsAddAllCameras: 1 streamingMipmapsMemoryBudget: 512 @@ -185,8 +261,17 @@ QualitySettings: asyncUploadPersistentBuffer: 1 resolutionScalingFixedDPIFactor: 1 customRenderPipeline: {fileID: 0} + terrainQualityOverrides: 0 + terrainPixelError: 1 + terrainDetailDensityScale: 1 + terrainBasemapDistance: 1000 + terrainDetailDistance: 80 + terrainTreeDistance: 5000 + terrainBillboardStart: 50 + terrainFadeLength: 5 + terrainMaxTrees: 50 excludedTargetPlatforms: [] - - serializedVersion: 2 + - serializedVersion: 5 name: Ultra pixelLightCount: 4 shadows: 2 @@ -199,16 +284,24 @@ QualitySettings: shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} shadowmaskMode: 1 skinWeights: 255 - textureQuality: 0 + globalTextureMipmapLimit: 0 + textureMipmapLimitSettings: [] anisotropicTextures: 2 antiAliasing: 2 softParticles: 1 softVegetation: 1 realtimeReflectionProbes: 1 billboardsFaceCameraPosition: 1 + useLegacyDetailDistribution: 1 + adaptiveVsync: 0 vSyncCount: 1 + realtimeGICPUUsage: 100 + adaptiveVsyncExtraA: 0 + adaptiveVsyncExtraB: 0 lodBias: 2 + meshLodThreshold: 1 maximumLODLevel: 0 + enableLODCrossFade: 1 streamingMipmapsActive: 0 streamingMipmapsAddAllCameras: 1 streamingMipmapsMemoryBudget: 512 @@ -221,7 +314,17 @@ QualitySettings: asyncUploadPersistentBuffer: 1 resolutionScalingFixedDPIFactor: 1 customRenderPipeline: {fileID: 0} + terrainQualityOverrides: 0 + terrainPixelError: 1 + terrainDetailDensityScale: 1 + terrainBasemapDistance: 1000 + terrainDetailDistance: 80 + terrainTreeDistance: 5000 + terrainBillboardStart: 50 + terrainFadeLength: 5 + terrainMaxTrees: 50 excludedTargetPlatforms: [] + m_TextureMipmapLimitGroupNames: [] m_PerPlatformDefaultQuality: Android: 2 CloudRendering: 5 @@ -233,6 +336,7 @@ QualitySettings: PS5: 5 Stadia: 5 Standalone: 5 + VisionOS: 0 WebGL: 3 Windows Store Apps: 5 XboxOne: 5 diff --git a/plug-ins/Apple.GameKit/Native/GameKit.xcconfig b/plug-ins/Apple.GameKit/Native/GameKit.xcconfig index f6791c78..d04f45d0 100644 --- a/plug-ins/Apple.GameKit/Native/GameKit.xcconfig +++ b/plug-ins/Apple.GameKit/Native/GameKit.xcconfig @@ -25,7 +25,7 @@ NATIVE_LIBRARY_ROOT_FOLDER_NAME=Apple.GameKit // ------------------ GENERATE_INFOPLIST_FILE = YES -CURRENT_PROJECT_VERSION = 4.0.1 +CURRENT_PROJECT_VERSION = 4.1.0 MARKETING_VERSION = $CURRENT_PROJECT_VERSION VERSIONING_SYSTEM = apple-generic INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2021 - 2024 Apple, Inc. All rights reserved." diff --git a/plug-ins/Apple.GameKit/Native/GameKitWrapper.xcodeproj/project.pbxproj b/plug-ins/Apple.GameKit/Native/GameKitWrapper.xcodeproj/project.pbxproj index d265380f..b49cb455 100644 --- a/plug-ins/Apple.GameKit/Native/GameKitWrapper.xcodeproj/project.pbxproj +++ b/plug-ins/Apple.GameKit/Native/GameKitWrapper.xcodeproj/project.pbxproj @@ -797,7 +797,7 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -814,7 +814,7 @@ SWIFT_OBJC_BRIDGING_HEADER = ""; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; WATCHOS_DEPLOYMENT_TARGET = ""; XROS_DEPLOYMENT_TARGET = 1.0; }; @@ -832,7 +832,7 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -848,7 +848,7 @@ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_OBJC_BRIDGING_HEADER = ""; SWIFT_VERSION = 5.0; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; WATCHOS_DEPLOYMENT_TARGET = ""; XROS_DEPLOYMENT_TARGET = 1.0; }; @@ -866,7 +866,7 @@ COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.0; OTHER_SWIFT_FLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.GameKitWrapper-macOS"; PRODUCT_NAME = GameKitWrapper; @@ -893,7 +893,7 @@ COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = ""; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 12.0; OTHER_SWIFT_FLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = "com.apple-plugins.GameKitWrapper-macOS"; PRODUCT_NAME = GameKitWrapper; @@ -959,7 +959,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.2; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -1015,7 +1015,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.2; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; @@ -1038,7 +1038,7 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1053,7 +1053,7 @@ SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Debug; }; @@ -1069,7 +1069,7 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1083,7 +1083,7 @@ SWIFT_OBJC_BRIDGING_HEADER = ""; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Release; }; @@ -1099,7 +1099,7 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1115,7 +1115,7 @@ SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Debug; }; @@ -1131,7 +1131,7 @@ DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -1146,7 +1146,7 @@ SWIFT_OBJC_BRIDGING_HEADER = ""; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 3; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; }; name = Release; }; diff --git a/plug-ins/Apple.GameKit/Native/GameKitWrapper.xcodeproj/xcshareddata/xcschemes/iOS - Debug.xcscheme b/plug-ins/Apple.GameKit/Native/GameKitWrapper.xcodeproj/xcshareddata/xcschemes/iOS - Debug.xcscheme index cb125053..7eec9801 100644 --- a/plug-ins/Apple.GameKit/Native/GameKitWrapper.xcodeproj/xcshareddata/xcschemes/iOS - Debug.xcscheme +++ b/plug-ins/Apple.GameKit/Native/GameKitWrapper.xcodeproj/xcshareddata/xcschemes/iOS - Debug.xcscheme @@ -10,7 +10,7 @@ ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction"> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> loadedAssets; @@ -231,8 +236,6 @@ public static void Show( w.Focus(); } - // todo: c# docs - /// /// Shows built-in ObjectField with custom value source and pick target /// @@ -253,12 +256,9 @@ public static void PropertyField( buttonPos.xMin = buttonPos.xMax - EditorGUIUtility.singleLineHeight; var requesterWindow = focusedWindow; -#if UNITY_6000_4_OR_NEWER - string controlName = property.serializedObject.targetObject.GetEntityId() + "_" + property.propertyPath; -#else - string controlName = property.serializedObject.targetObject.GetInstanceID() + "_" + property.propertyPath; -#endif - var e = Event.current; + string controlName = property.serializedObject.targetObject.GetLongId() + "_" + property.propertyPath; + + var e = Event.current; bool showHotKey = GUI.GetNameOfFocusedControl() == controlName && e.type == EventType.KeyDown && @@ -927,25 +927,15 @@ private void UpdateAssetList() loadedAssets = new List(); loadedAssetsFlat.Clear(); -#if UNITY_6000_4_OR_NEWER - hierarchyIterator = new HierarchyIterator(HierarchyType.Assets); - hierarchyIterator.SetSearchFilter(GetFilter(), (int)SearchableEditorWindow.SearchMode.All); + assetHierarchy = new AssetHierarchy(HierarchyType.Assets); + assetHierarchy.SetSearchFilter(GetFilter(), (int)SearchableEditorWindow.SearchMode.All); - while (hierarchyIterator.Next(null)) - { - AddAssetInfo(hierarchyIterator); - } -#else - hierarchyProperty = new HierarchyProperty(HierarchyType.Assets); - hierarchyProperty.SetSearchFilter(GetFilter(), (int)SearchableEditorWindow.SearchMode.All); - - while (hierarchyProperty.Next(null)) + while (assetHierarchy.Next(null)) { - AddAssetInfo(hierarchyProperty); + AddAssetInfo(assetHierarchy); } -#endif - FilterAssets(ref loadedAssets); + FilterAssets(ref loadedAssets); loadedAssets.ForEach(SortChildren); loadedAssetsFlat.Clear(); @@ -975,18 +965,10 @@ private string GetFilter() return stringBuilder.ToString(); } -#if UNITY_6000_4_OR_NEWER - private void AddAssetInfo(HierarchyIterator hi) -#else - private void AddAssetInfo(HierarchyProperty hp) -#endif + private void AddAssetInfo(AssetHierarchy hierarchy) { -#if UNITY_6000_4_OR_NEWER - var path = AssetDatabase.GUIDToAssetPath(hi.guid); -#else - var path = AssetDatabase.GUIDToAssetPath(hp.guid); -#endif - var folders = path.Split('/'); + var path = AssetDatabase.GUIDToAssetPath(hierarchy.guid); + var folders = path.Split('/'); var list = loadedAssets; HierarchyEntry parent = null; for (int ii = 1; ii < folders.Length - 1; ii++) // 1 to skip Assets folder, -1 to skip asset name @@ -1010,18 +992,10 @@ private void AddAssetInfo(HierarchyProperty hp) var hierarchyEntry = new HierarchyEntry { Parent = parent, -#if UNITY_6000_4_OR_NEWER - Name = hi.name, -#else - Name = hp.name, -#endif - Path = path, -#if UNITY_6000_4_OR_NEWER - AssetGuid = hi.guid, -#else - AssetGuid = hp.guid, -#endif - }; + Name = hierarchy.name, + Path = path, + AssetGuid = hierarchy.guid, + }; list.Add(hierarchyEntry); } diff --git a/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/Runtime/PHASEListener.cs b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/Runtime/PHASEListener.cs index b51fb19e..6eea242d 100644 --- a/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/Runtime/PHASEListener.cs +++ b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/Runtime/PHASEListener.cs @@ -242,11 +242,7 @@ private void OnDrawGizmos() if (entry is PHASESpatialMixer) { PHASESpatialMixer mixer = entry as PHASESpatialMixer; -#if UNITY_6000_4_OR_NEWER - if (Selection.Contains(mixer.GetEntityId())) -#else - if (Selection.Contains(mixer.GetInstanceID())) -#endif + if (Selection.Contains(mixer)) { Helpers.DirectivityModelSubbandParameters subbandParameters = mixer.GetListenerDirectivityModelSubbandParameters(); switch (mixer.GetListenerDirectivityType()) diff --git a/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/Runtime/PHASESource.cs b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/Runtime/PHASESource.cs index 0f7453ff..a8e724ab 100644 --- a/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/Runtime/PHASESource.cs +++ b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/Runtime/PHASESource.cs @@ -456,7 +456,14 @@ private void OnDrawGizmos() // So we need to send it the info it needs to draw the visualization. if (_listener == null) { - PHASEListener[] listeners = FindObjectsOfType(); + // 6000.5 deprecated the FindObjectsSortMode overload in favour of a parameterless + // one, which is unsorted, so the two are equivalent here. Older editors, 6000.3 + // included, only have the overload that takes a sort mode. +#if UNITY_6000_5_OR_NEWER + PHASEListener[] listeners = FindObjectsByType(); +#else + PHASEListener[] listeners = FindObjectsByType(FindObjectsSortMode.None); +#endif if (listeners.Length > 0) { // Only one listener per scene allowed. @@ -473,12 +480,7 @@ private void OnDrawGizmos() if (entry is PHASESpatialMixer) { PHASESpatialMixer mixer = entry as PHASESpatialMixer; - -#if UNITY_6000_4_OR_NEWER - if (Selection.Contains(mixer.GetEntityId())) -#else - if (Selection.Contains(mixer.GetInstanceID())) -#endif + if (Selection.Contains(mixer)) { Helpers.DirectivityModelSubbandParameters subbandParameters = mixer.GetSourceDirectivityModelSubbandParameters(); switch (mixer.GetSourceDirectivityType()) diff --git a/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/Tests/Runtime/PHASETests.cs b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/Tests/Runtime/PHASETests.cs index dfea8925..77ddef97 100644 --- a/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/Tests/Runtime/PHASETests.cs +++ b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/Tests/Runtime/PHASETests.cs @@ -9,8 +9,6 @@ namespace Apple.PHASE.UnitTests { public class PHASETests { - static long InvalidId = -1; - static double InvalidGain = -1.0f; private string m_testResourcesDir = "TestAssets/"; @@ -35,11 +33,7 @@ public IEnumerator PHASETestsCreatePlayDestroySource([ValueSource(nameof(m_testS PHASESource source = sourceObject.GetComponent(); yield return new WaitForFixedUpdate(); -#if UNITY_6000_4_OR_NEWER - Assert.IsTrue(source.GetEntityId() != EntityId.None, $"Failed to create {testSourceName}"); -#else - Assert.IsTrue(source.GetInstanceID() != InvalidId, $"Failed to create {testSourceName}"); -#endif + Assert.IsTrue(source.GetSourceId() != Helpers.InvalidId, $"Failed to create {testSourceName}"); source.Play(); yield return new WaitForFixedUpdate(); @@ -63,11 +57,7 @@ public IEnumerator PHASETestSetInvalidGainOnSource() PHASESource source = sourceObject.GetComponent(); yield return new WaitForFixedUpdate(); -#if UNITY_6000_4_OR_NEWER - Assert.IsTrue(source.GetEntityId() != EntityId.None, "Failed to create looping source"); -#else - Assert.IsTrue(source.GetInstanceID() != InvalidId, "Failed to create looping source"); -#endif + Assert.IsTrue(source.GetSourceId() != Helpers.InvalidId, "Failed to create looping source"); source.Play(); yield return new WaitForSeconds(0.75f); @@ -94,11 +84,7 @@ public IEnumerator PHASETestsCreatePlaySwitchDestroySource() PHASESource source = sourceObject.GetComponent(); yield return new WaitForFixedUpdate(); -#if UNITY_6000_4_OR_NEWER - Assert.IsTrue(source.GetEntityId() != EntityId.None, "Failed to create Footsteps"); -#else - Assert.IsTrue(source.GetInstanceID() != InvalidId, "Failed to create Footsteps"); -#endif + Assert.IsTrue(source.GetSourceId() != Helpers.InvalidId, "Failed to create Footsteps"); source.Play(); yield return new WaitForSeconds(0.5f); @@ -128,11 +114,7 @@ public IEnumerator PHASETestsDestroyLoopingSource() PHASESource source = sourceObject.GetComponent(); yield return new WaitForFixedUpdate(); -#if UNITY_6000_4_OR_NEWER - Assert.IsTrue(source.GetEntityId() != EntityId.None, "Failed to create looping source"); -#else - Assert.IsTrue(source.GetInstanceID() != InvalidId, "Failed to create looping source"); -#endif + Assert.IsTrue(source.GetSourceId() != Helpers.InvalidId, "Failed to create looping source"); source.Play(); yield return new WaitForSeconds(0.75f); @@ -159,11 +141,7 @@ public IEnumerator PHASETestsDisableAndEnableLoopingSource() PHASESource source = sourceObject.GetComponent(); yield return new WaitForFixedUpdate(); -#if UNITY_6000_4_OR_NEWER - Assert.IsTrue(source.GetEntityId() != EntityId.None, "Failed to create looping source"); -#else - Assert.IsTrue(source.GetInstanceID() != InvalidId, "Failed to create looping source"); -#endif + Assert.IsTrue(source.GetSourceId() != Helpers.InvalidId, "Failed to create looping source"); source.Play(); yield return new WaitForSeconds(0.75f); @@ -202,11 +180,7 @@ public IEnumerator PHASETestOccluder() PHASESource source = sourceObject.GetComponent(); yield return new WaitForFixedUpdate(); -#if UNITY_6000_4_OR_NEWER - Assert.IsTrue(source.GetEntityId() != EntityId.None, "Failed to create looping source"); -#else - Assert.IsTrue(source.GetInstanceID() != InvalidId, "Failed to create looping source"); -#endif + Assert.IsTrue(source.GetSourceId() != Helpers.InvalidId, "Failed to create looping source"); source.Play(); yield return new WaitForSeconds(0.75f); @@ -215,7 +189,7 @@ public IEnumerator PHASETestOccluder() GameObject occluderObject = Object.Instantiate(Resources.Load(m_testResourcesDir + "PHASEOccluder")); PHASEOccluder occluder = occluderObject.GetComponent(); yield return new WaitForSeconds(0.75f); - Assert.That(occluder.GetOccluderId() != InvalidId, "Failed to instantiate PHASE Occluder"); + Assert.That(occluder.GetOccluderId() != Helpers.InvalidId, "Failed to instantiate PHASE Occluder"); Object.Destroy(occluderObject); yield return new WaitForFixedUpdate(); @@ -237,11 +211,7 @@ public IEnumerator PHASETestOccluderWithSubmeshesAndParentScaling() PHASESource source = sourceObject.GetComponent(); yield return new WaitForFixedUpdate(); -#if UNITY_6000_4_OR_NEWER - Assert.IsTrue(source.GetEntityId() != EntityId.None, "Failed to create looping source"); -#else - Assert.IsTrue(source.GetInstanceID() != InvalidId, "Failed to create looping source"); -#endif + Assert.IsTrue(source.GetSourceId() != Helpers.InvalidId, "Failed to create looping source"); source.Play(); yield return new WaitForSeconds(0.75f); @@ -250,7 +220,7 @@ public IEnumerator PHASETestOccluderWithSubmeshesAndParentScaling() GameObject occluderObject = Object.Instantiate(Resources.Load(m_testResourcesDir + "PHASEOccluderMultipleSubmeshesScaledParent")); PHASEOccluder occluder = occluderObject.GetComponent(); yield return new WaitForSeconds(0.75f); - Assert.That(occluder.GetOccluderId() != InvalidId, "Failed to instantiate PHASE Occluder with submesh and scaled parent"); + Assert.That(occluder.GetOccluderId() != Helpers.InvalidId, "Failed to instantiate PHASE Occluder with submesh and scaled parent"); Object.Destroy(occluderObject); yield return new WaitForFixedUpdate(); @@ -272,11 +242,7 @@ public IEnumerator PHASETestPlaySoundEventMultipleTimes() PHASESource source = sourceObject.GetComponent(); yield return new WaitForFixedUpdate(); -#if UNITY_6000_4_OR_NEWER - Assert.IsTrue(source.GetEntityId() != EntityId.None, "Failed to create looping source"); -#else - Assert.IsTrue(source.GetInstanceID() != InvalidId, "Failed to create looping source"); -#endif + Assert.IsTrue(source.GetSourceId() != Helpers.InvalidId, "Failed to create looping source"); source.Play(); yield return new WaitForSeconds(0.05f); @@ -302,11 +268,7 @@ public IEnumerator PHASETestOccluderDisableAndEnable() PHASESource source = sourceObject.GetComponent(); yield return new WaitForFixedUpdate(); -#if UNITY_6000_4_OR_NEWER - Assert.IsTrue(source.GetEntityId() != EntityId.None, "Failed to create looping source"); -#else - Assert.IsTrue(source.GetInstanceID() != InvalidId, "Failed to create looping source"); -#endif + Assert.IsTrue(source.GetSourceId() != Helpers.InvalidId, "Failed to create looping source"); source.Play(); yield return new WaitForSeconds(0.75f); @@ -315,7 +277,7 @@ public IEnumerator PHASETestOccluderDisableAndEnable() GameObject occluderObject = Object.Instantiate(Resources.Load(m_testResourcesDir + "PHASEOccluder")); PHASEOccluder occluder = occluderObject.GetComponent(); yield return new WaitForSeconds(0.75f); - Assert.That(occluder.GetOccluderId() != InvalidId, "Failed to instantiate PHASE Occluder"); + Assert.That(occluder.GetOccluderId() != Helpers.InvalidId, "Failed to instantiate PHASE Occluder"); occluderObject.SetActive(false); yield return new WaitForSeconds(0.1f); @@ -346,11 +308,7 @@ public IEnumerator PHASETestDisableAndEnableListener() PHASESource source = sourceObject.GetComponent(); yield return new WaitForFixedUpdate(); -#if UNITY_6000_4_OR_NEWER - Assert.IsTrue(source.GetEntityId() != EntityId.None, "Failed to create looping source"); -#else - Assert.IsTrue(source.GetInstanceID() != InvalidId, "Failed to create looping source"); -#endif + Assert.IsTrue(source.GetSourceId() != Helpers.InvalidId, "Failed to create looping source"); source.Play(); yield return new WaitForSeconds(0.75f); @@ -381,11 +339,7 @@ public IEnumerator PHASETestChangeReverbOnListener() PHASESource source = sourceObject.GetComponent(); yield return new WaitForFixedUpdate(); -#if UNITY_6000_4_OR_NEWER - Assert.IsTrue(source.GetEntityId() != EntityId.None, "Failed to create looping source"); -#else - Assert.IsTrue(source.GetInstanceID() != InvalidId, "Failed to create looping source"); -#endif + Assert.IsTrue(source.GetSourceId() != Helpers.InvalidId, "Failed to create looping source"); source.Play(); yield return new WaitForSeconds(0.5f); @@ -414,11 +368,7 @@ public IEnumerator PHASETestSetInvalidGainOnListener() PHASESource source = sourceObject.GetComponent(); yield return new WaitForFixedUpdate(); -#if UNITY_6000_4_OR_NEWER - Assert.IsTrue(source.GetEntityId() != EntityId.None, "Failed to create looping source"); -#else - Assert.IsTrue(source.GetInstanceID() != InvalidId, "Failed to create looping source"); -#endif + Assert.IsTrue(source.GetSourceId() != Helpers.InvalidId, "Failed to create looping source"); source.Play(); yield return new WaitForSeconds(0.75f); diff --git a/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/package.json b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/package.json index ab520688..238b82c5 100644 --- a/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/package.json +++ b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/package.json @@ -2,10 +2,10 @@ "name": "com.apple.unityplugin.phase", "displayName": "Apple.PHASE", "description": "A Unity plugin for Apple's PHASE.framework.", - "version": "1.2.7", + "version": "1.2.8", "unity": "2022.3", "dependencies": { - "com.apple.unityplugin.core": "3.1.8" + "com.apple.unityplugin.core": "3.3.0" }, "keywords": [ "audio", @@ -22,7 +22,7 @@ { "displayName": "PHASE Demo", "description": "Demo scene for PHASE", - "path": "Demos~" + "path": "Demos" } ] } diff --git a/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/xNode/Editor/NodeEditorUtilities.cs b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/xNode/Editor/NodeEditorUtilities.cs index fbfb38af..26f2cbe8 100644 --- a/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/xNode/Editor/NodeEditorUtilities.cs +++ b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/xNode/Editor/NodeEditorUtilities.cs @@ -278,9 +278,11 @@ public static void CreateFromTemplate(string initialName, string templatePath) { } #if UNITY_6000_4_OR_NEWER + // Unity 6000+ deprecates EndNameEditAction (int instance IDs) in favor of + // AssetCreationEndAction, which uses EntityId. /// Inherits from AssetCreationEndAction, must override AssetCreationEndAction.Action public class DoCreateCodeFile : UnityEditor.ProjectWindowCallback.AssetCreationEndAction { - public override void Action(EntityId entityId, string pathName, string resourceFile) { + public override void Action(UnityEngine.EntityId entityId, string pathName, string resourceFile) { #else /// Inherits from EndNameAction, must override EndNameAction.Action public class DoCreateCodeFile : UnityEditor.ProjectWindowCallback.EndNameEditAction { diff --git a/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/xNode/Editor/NodeEditorWindow.cs b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/xNode/Editor/NodeEditorWindow.cs index a674c578..1134fbb5 100644 --- a/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/xNode/Editor/NodeEditorWindow.cs +++ b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Assets/xNode/Editor/NodeEditorWindow.cs @@ -186,9 +186,9 @@ public void DeselectNode(XNode.Node node) { } [OnOpenAsset(0)] -#if UNITY_6000_4_OR_NEWER - public static bool OnOpen(EntityId entityId, int line) { - XNode.NodeGraph nodeGraph = EditorUtility.EntityIdToObject(entityId) as XNode.NodeGraph; +#if UNITY_6000_3_OR_NEWER + public static bool OnOpen(EntityId instanceID, int line) { + XNode.NodeGraph nodeGraph = EditorUtility.EntityIdToObject(instanceID) as XNode.NodeGraph; #else public static bool OnOpen(int instanceID, int line) { XNode.NodeGraph nodeGraph = EditorUtility.InstanceIDToObject(instanceID) as XNode.NodeGraph; diff --git a/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Packages/manifest.json b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Packages/manifest.json index c785f02e..045797f3 100644 --- a/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Packages/manifest.json +++ b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Packages/manifest.json @@ -1,13 +1,15 @@ { "dependencies": { "com.apple.unityplugin.core": "file:../../../Apple.Core/Apple.Core_Unity/Assets/Apple.Core", - "com.unity.ext.nunit": "1.0.6", - "com.unity.ide.rider": "3.0.36", - "com.unity.ide.visualstudio": "2.0.22", + "com.unity.ext.nunit": "2.1.0", + "com.unity.ide.rider": "3.0.38", + "com.unity.ide.visualstudio": "2.0.26", "com.unity.ide.vscode": "1.2.5", - "com.unity.test-framework": "1.1.33", - "com.unity.textmeshpro": "3.0.7", - "com.unity.ugui": "1.0.0", + "com.unity.multiplayer.center": "1.0.1", + "com.unity.test-framework": "1.7.0", + "com.unity.ugui": "2.5.0", + "com.unity.modules.accessibility": "1.0.0", + "com.unity.modules.adaptiveperformance": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", "com.unity.modules.animation": "1.0.0", @@ -21,6 +23,7 @@ "com.unity.modules.particlesystem": "1.0.0", "com.unity.modules.physics": "1.0.0", "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.physicscore2d": "1.0.0", "com.unity.modules.screencapture": "1.0.0", "com.unity.modules.terrain": "1.0.0", "com.unity.modules.terrainphysics": "1.0.0", @@ -34,9 +37,9 @@ "com.unity.modules.unitywebrequestaudio": "1.0.0", "com.unity.modules.unitywebrequesttexture": "1.0.0", "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vectorgraphics": "1.0.0", "com.unity.modules.vehicles": "1.0.0", "com.unity.modules.video": "1.0.0", - "com.unity.modules.vr": "1.0.0", "com.unity.modules.wind": "1.0.0", "com.unity.modules.xr": "1.0.0" }, diff --git a/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Packages/packages-lock.json b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Packages/packages-lock.json index c64a45a6..dc1d5ad4 100644 --- a/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Packages/packages-lock.json +++ b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/Packages/packages-lock.json @@ -7,14 +7,13 @@ "dependencies": {} }, "com.unity.ext.nunit": { - "version": "1.0.6", + "version": "2.1.0", "depth": 0, - "source": "registry", - "dependencies": {}, - "url": "https://packages.unity.com" + "source": "builtin", + "dependencies": {} }, "com.unity.ide.rider": { - "version": "3.0.36", + "version": "3.0.38", "depth": 0, "source": "registry", "dependencies": { @@ -23,11 +22,11 @@ "url": "https://packages.unity.com" }, "com.unity.ide.visualstudio": { - "version": "2.0.22", + "version": "2.0.26", "depth": 0, "source": "registry", "dependencies": { - "com.unity.test-framework": "1.1.9" + "com.unity.test-framework": "1.1.33" }, "url": "https://packages.unity.com" }, @@ -38,33 +37,48 @@ "dependencies": {}, "url": "https://packages.unity.com" }, + "com.unity.multiplayer.center": { + "version": "1.0.1", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.uielements": "1.0.0" + } + }, "com.unity.test-framework": { - "version": "1.1.33", + "version": "1.7.0", "depth": 0, - "source": "registry", + "source": "builtin", "dependencies": { - "com.unity.ext.nunit": "1.0.6", + "com.unity.ext.nunit": "2.1.0", "com.unity.modules.imgui": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0" - }, - "url": "https://packages.unity.com" + } }, - "com.unity.textmeshpro": { - "version": "3.0.7", + "com.unity.ugui": { + "version": "2.5.0", "depth": 0, - "source": "registry", + "source": "builtin", "dependencies": { - "com.unity.ugui": "1.0.0" - }, - "url": "https://packages.unity.com" + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.physics": "1.0.0" + } }, - "com.unity.ugui": { + "com.unity.modules.accessibility": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.adaptiveperformance": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.ui": "1.0.0", - "com.unity.modules.imgui": "1.0.0" + "com.unity.modules.subsystems": "1.0.0" } }, "com.unity.modules.ai": { @@ -77,7 +91,9 @@ "version": "1.0.0", "depth": 0, "source": "builtin", - "dependencies": {} + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0" + } }, "com.unity.modules.animation": { "version": "1.0.0", @@ -114,6 +130,12 @@ "com.unity.modules.animation": "1.0.0" } }, + "com.unity.modules.hierarchycore": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": {} + }, "com.unity.modules.imageconversion": { "version": "1.0.0", "depth": 0, @@ -145,6 +167,14 @@ "dependencies": {} }, "com.unity.modules.physics2d": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physicscore2d": "1.0.0" + } + }, + "com.unity.modules.physicscore2d": { "version": "1.0.0", "depth": 0, "source": "builtin", @@ -202,7 +232,10 @@ "dependencies": { "com.unity.modules.ui": "1.0.0", "com.unity.modules.imgui": "1.0.0", - "com.unity.modules.jsonserialize": "1.0.0" + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.hierarchycore": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.animation": "1.0.0" } }, "com.unity.modules.umbra": { @@ -266,32 +299,32 @@ "com.unity.modules.imageconversion": "1.0.0" } }, - "com.unity.modules.vehicles": { + "com.unity.modules.vectorgraphics": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.physics": "1.0.0" + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0" } }, - "com.unity.modules.video": { + "com.unity.modules.vehicles": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.audio": "1.0.0", - "com.unity.modules.ui": "1.0.0", - "com.unity.modules.unitywebrequest": "1.0.0" + "com.unity.modules.physics": "1.0.0" } }, - "com.unity.modules.vr": { + "com.unity.modules.video": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.jsonserialize": "1.0.0", - "com.unity.modules.physics": "1.0.0", - "com.unity.modules.xr": "1.0.0" + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" } }, "com.unity.modules.wind": { diff --git a/plug-ins/Apple.PHASE/Apple.PHASE_Unity/ProjectSettings/MultiplayerManager.asset b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/ProjectSettings/MultiplayerManager.asset new file mode 100644 index 00000000..2a936644 --- /dev/null +++ b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/ProjectSettings/MultiplayerManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!655991488 &1 +MultiplayerManager: + m_ObjectHideFlags: 0 + m_EnableMultiplayerRoles: 0 + m_StrippingTypes: {} diff --git a/plug-ins/Apple.PHASE/Apple.PHASE_Unity/ProjectSettings/PackageManagerSettings.asset b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/ProjectSettings/PackageManagerSettings.asset index be4a7974..4b3c9237 100644 --- a/plug-ins/Apple.PHASE/Apple.PHASE_Unity/ProjectSettings/PackageManagerSettings.asset +++ b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/ProjectSettings/PackageManagerSettings.asset @@ -12,32 +12,33 @@ MonoBehaviour: m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} m_Name: m_EditorClassIdentifier: - m_EnablePreviewPackages: 0 - m_EnablePackageDependencies: 0 + m_EnablePreReleasePackages: 0 m_AdvancedSettingsExpanded: 1 m_ScopedRegistriesSettingsExpanded: 1 + m_SeeAllPackageVersions: 0 + m_DismissPreviewPackagesInUse: 0 oneTimeWarningShown: 0 - m_Registries: - - m_Id: main + oneTimePackageErrorsPopUpShown: 0 + m_MainRegistry: + m_Id: main m_Name: m_Url: https://packages.unity.com m_Scopes: [] m_IsDefault: 1 + m_IsUnityRegistry: 1 m_Capabilities: 7 + m_ConfigSource: 0 + m_Compliance: + m_Status: 0 + m_Violations: [] + m_ScopedRegistries: [] m_UserSelectedRegistryName: m_UserAddingNewScopedRegistry: 0 m_RegistryInfoDraft: - m_ErrorMessage: - m_Original: - m_Id: - m_Name: - m_Url: - m_Scopes: [] - m_IsDefault: 0 - m_Capabilities: 0 m_Modified: 0 - m_Name: - m_Url: - m_Scopes: - - - m_SelectedScopeIndex: 0 + m_ErrorMessage: + m_UserModificationsEntityId: + m_rawData: 568105589213756514 + m_OriginalEntityId: + m_rawData: 568105589213756512 + m_LoadAssets: 0 diff --git a/plug-ins/Apple.PHASE/Apple.PHASE_Unity/ProjectSettings/PhysicsCoreProjectSettings2D.asset b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/ProjectSettings/PhysicsCoreProjectSettings2D.asset new file mode 100644 index 00000000..049c7454 --- /dev/null +++ b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/ProjectSettings/PhysicsCoreProjectSettings2D.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!176606843 &1 +PhysicsCoreProjectSettings2D: + m_ObjectHideFlags: 0 + m_PhysicsCoreSettings: {fileID: 0} diff --git a/plug-ins/Apple.PHASE/Apple.PHASE_Unity/ProjectSettings/ProjectVersion.txt b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/ProjectSettings/ProjectVersion.txt index b8523623..c1608124 100644 --- a/plug-ins/Apple.PHASE/Apple.PHASE_Unity/ProjectSettings/ProjectVersion.txt +++ b/plug-ins/Apple.PHASE/Apple.PHASE_Unity/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2022.3.62f2 -m_EditorVersionWithRevision: 2022.3.62f2 (7670c08855a9) +m_EditorVersion: 6000.5.2f1 +m_EditorVersionWithRevision: 6000.5.2f1 (eb73d3b415a1) diff --git a/plug-ins/Apple.PHASE/Native/AudioPluginPHASE.xcodeproj/project.pbxproj b/plug-ins/Apple.PHASE/Native/AudioPluginPHASE.xcodeproj/project.pbxproj index f14ca16e..1242e126 100755 --- a/plug-ins/Apple.PHASE/Native/AudioPluginPHASE.xcodeproj/project.pbxproj +++ b/plug-ins/Apple.PHASE/Native/AudioPluginPHASE.xcodeproj/project.pbxproj @@ -723,7 +723,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = "\"Copyright © 2021 - 2025 Apple, Inc. All rights reserved.\""; LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 12.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx.internal; }; @@ -763,7 +763,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_KEY_NSHumanReadableCopyright = "\"Copyright © 2021 - 2025 Apple, Inc. All rights reserved.\""; LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.11; + MACOSX_DEPLOYMENT_TARGET = 12.0; SDKROOT = macosx.internal; }; name = Release; diff --git a/plug-ins/Apple.PHASE/Native/AudioPluginPHASE.xcodeproj/xcshareddata/xcschemes/iOS - Debug.xcscheme b/plug-ins/Apple.PHASE/Native/AudioPluginPHASE.xcodeproj/xcshareddata/xcschemes/iOS - Debug.xcscheme index 2b0059bf..49a87e65 100644 --- a/plug-ins/Apple.PHASE/Native/AudioPluginPHASE.xcodeproj/xcshareddata/xcschemes/iOS - Debug.xcscheme +++ b/plug-ins/Apple.PHASE/Native/AudioPluginPHASE.xcodeproj/xcshareddata/xcschemes/iOS - Debug.xcscheme @@ -10,7 +10,7 @@ ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction"> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> - -#define PHASEInvalidInstanceHandle (-1) - -NS_HEADER_AUDIT_BEGIN(nullability) - -struct RandomNodeEntry -{ - const int64_t nodeId; - const float weight; -}; - -struct SwitchNodeEntry -{ - const int64_t nodeId; - const char* switchValue; -}; - -struct BlendNodeEntry -{ - const int64_t nodeId; - const float lowValue; - const float fullGainAtLow; - const float fullGainAtHigh; - const float highValue; -}; - -enum DirectivityType -{ - None, - Cardioid, - Cone -}; - -struct DirectivityModelSubbandParameters -{ - const float frequency; - const float pattern; - const float sharpness; - const float innerAngle; - const float outerAngle; - const float outerGain; -}; - -struct DirectivityModelParameters -{ - DirectivityType directivityType; - uint32_t subbandCount; - DirectivityModelSubbandParameters* subbandParameters; -}; - -enum EnvelopeCurveType -{ - EnvelopeCurveTypeLinear, - EnvelopeCurveTypeSquared, - EnvelopeCurveTypeInverseSquared, - EnvelopeCurveTypeCubed, - EnvelopeCurveTypeInverseCubed, - EnvelopeCurveTypeSine, - EnvelopeCurveTypeInverseSine, - EnvelopeCurveTypeSigmoid, - EnvelopeCurveTypeInverseSigmoid -}; - -struct EnvelopeSegment -{ - const float x; - const float y; - const EnvelopeCurveType curveType; -}; - -struct EnvelopeParameters -{ - float x; - float y; - uint32_t segmentCount; - EnvelopeSegment* envelopeSegments; -}; - -enum ChannelLayoutType -{ - ChannelLayoutTypeMono, - ChannelLayoutTypeStereo, - ChannelLayoutTypeFiveOne, - ChannelLayoutTypeSevenOne -}; - -struct Quaternion -{ - const float w; // cooresponds to 'r' in simd_quaternion - const float x; // ix - const float y; // iy - const float z; // iz -}; - -enum MaterialPreset -{ - MaterialPresetCardboard, - MaterialPresetGlass, - MaterialPresetBrick, - MaterialPresetConcrete, - MaterialPresetDrywall, - MaterialPresetWood -}; - -enum CalibrationMode -{ - CalibrationModeNone = 0, - CalibrationModeRelativeSpl = 1, - CalibrationModeAbsoluteSpl = 2 -}; - - - -/****************************************************************************************************/ -/*! @class PHASEEngineWrapper - @abstract A PHASEEngineWrapper allows creating and managing PHASE objects -*/ -@interface PHASEEngineWrapper : NSObject - -/*! @method phaseEngineWrapper - @abstract Singleton of PHASEEngineWrapper - performs all initialization requirements when accessed. - @return shared instance -*/ -+ (id)sharedInstance; - -/*! @method isInitialized - @abstract Returns whether the engine is created and started - @return true on success, false otherwise -*/ -- (BOOL)isInitialized; - -/*! @method createListener - @abstract Creates the listener object - @return true on success, false otherwise -*/ -- (BOOL)createListener; - -/*! @method setListenerTransform - @abstract Sets the 3D transform of the listener - @param listenerTransform transform to set - @return true on success, false otherwise -*/ -- (BOOL)setListenerTransform:(simd_float4x4)listenerTransform; - -/*! @method setListenerGain - @abstract Sets the gain linear scale value of the listener, range of [0,1] - @param listenerGain gain to set - @return true on success, false otherwise -*/ -- (BOOL)setListenerGain:(double)listenerGain; - -/*! @method getListenerGain - @abstract Gets the gain of the listener - @return double representing listener gain scalar value, range of [0,1] -*/ -- (double)getListenerGain; - -/*! @method setListenerHeadTracking - @abstract Sets the listener to head track - @param headTrackingEnabled bool representing headTracking enabled or disabled - @return true on success, false otherwise -*/ -- (BOOL)setListenerHeadTracking:(BOOL)headTrackingEnabled; - -/*! @method destroyListener - @abstract Destroys the listener object - @return true on success, false otherwise -*/ -- (BOOL)destroyListener; - -/*! @method createSourceWithMesh - @abstract Creates a volumetric source with a given mesh - @param mesh MDL mesh to create the source with - @return Id of created source -*/ -- (int64_t)createSourceWithMesh:(MDLMesh*)mesh; - -/*! @method createSource - @abstract Creates a point source - @return Id of created source -*/ -- (int64_t)createSource; - -/*! @method setSourceTransformWithId - @abstract Sets the 3D transform of the source - @param sourceId source ID to update transform for - @param transform transform to set - @return true on success, false otherwise -*/ -- (BOOL)setSourceTransformWithId:(int64_t)sourceId transform:(simd_float4x4)transform; - -/*! @method setSourceGainWithId - @abstract Sets the gain linear scale value of the source, range of [0,1]. Given gain values outside of this range will be clamped. - @param sourceId source ID to update gain for - @param sourceGain gain to set on source - @return true on success, false otherwise -*/ -- (BOOL)setSourceGainWithId:(int64_t)sourceId sourceGain:(double)sourceGain; - -/*! @method getSourceGainWithId - @abstract Gets the gain of the source - @param sourceId source ID to get gain for - @return double representing source's gain scalar value, range of [0,1] -*/ -- (double)getSourceGainWithId:(int64_t)sourceId; - -/*! @method destroySourceWithId - @abstract Destroys a source with a given Id - @param sourceId id of source to destroy -*/ -- (void)destroySourceWithId:(int64_t)sourceId; - -/*! @method createOccluderWithMesh - @abstract Creates an occluder with a given mesh - @param mesh MDL mesh to create the occluder with - @return Id of created occluder -*/ -- (int64_t)createOccluderWithMesh:(MDLMesh*)mesh; - -/*! @method setOccluderTransformWithId - @abstract Sets the 3D transform of the occluder - @param occluderId source ID to update transform for - @param transform transform to set - @return true on success, false otherwise -*/ -- (BOOL)setOccluderTransformWithId:(int64_t)occluderId transform:(simd_float4x4)transform; - -/*! @method setOccluderMaterial - @abstract Sets a material of a given name in an occluder - @param occluderId occluder ID to set material on - @param materialName name of material to set - @return true on success, false otherwise -*/ -- (BOOL)setOccluderMaterialWithId:(int64_t)occluderId materialName:(NSString*)materialName; - -/*! @method destroyOccluderWithId - @param occluderId id of occluder to destroy - @abstract Destroys the occluder with a given ID -*/ -- (void)destroyOccluderWithId:(int64_t)occluderId; - -/*! @method createMaterialWithName - @abstract Creates a material from the given preset - @param name name of the material to create - @param preset material preset of type MaterialPreset - @return true on success false otherwise - */ -- (BOOL)createMaterialWithName:(NSString*)name preset:(MaterialPreset)preset; - -/*! @method destroyMaterialWithName - @param name name of the material to destroy - @abstract Destroys an existing material -*/ -- (void)destroyMaterialWithName:(NSString*)name; - -/*! @method setSceneReverbWithPreset - @abstract Sets a reverb preset in the scene - @param preset Reverb preset to set on scene -*/ -- (void)setSceneReverbWithPreset:(PHASEReverbPreset)preset; - -/*! @method registerAudioBufferWithData - @abstract Registers an audio buffer in the system (data gets copied internally) - @param data buffer data to register - @param identifier unique identifier of buffer to register - @param audioFormat audio format of the buffer data - @return true on success, false otherwise -*/ -- (BOOL)registerAudioBufferWithData:(NSData*)data identifier:(NSString*)identifier audioFormat:(AVAudioFormat*)audioFormat; - -/*! @method registerAudioAssetWithURL - @abstract Registers an audio file into the system - @param url url of the audio asset to register - @param identifier unique identifier of buffer to register - @param audioFormat audio format of the buffer data - @return true on success, false otherwise -*/ -- (BOOL)registerAudioAssetWithURL:(NSURL*)url identifier:(NSString*)identifier audioFormat:(AVAudioFormat*)audioFormat; - -/*! @method unregisterAudioBufferWithIndentifier - @param identifier unique identifier of buffer to unregister - @abstract Unregisters an audio buffer with a given identifier -*/ -- (void)unregisterAudioBufferWithIdentifier:(NSString*)identifier; - -/*! @method createSpatialMixerWithName - @abstract Creates a spatial mixer with a given name and parameters - @param mixerName name of the mixer to create - @param enableDirectPath enable direct path modeling for this mixer - @param enableEarlyReflections enable early reflection modeling for this mixer - @param enableLateReverb enable late reverb modeling for this mixer - @param cullDistance distance at which the systems stops processing the sound - @param rolloffFactor rolloff factor for the geometric spreading distance model - @param sourceDirectivityModelParameters directivity parameters for mixer source ( cone or cardioid) - @param listenerDirectivityModelParameters directivity parameters for mixer listener ( cone or cardioid) - @return mixer id -*/ -- (int64_t)createSpatialMixerWithName:(NSString*)mixerName - enableDirectPath:(BOOL)enableDirectPath - enableEarlyReflections:(BOOL)enableEarlyReflections - enableLateReverb:(BOOL)enableLateReverb - cullDistance:(double)cullDistance - rolloffFactor:(float)rolloffFactor - sourceDirectivityModelParameters:(DirectivityModelParameters)sourceDirectivityModelParameters - listenerDirectivityModelParameters:(DirectivityModelParameters)listenerDirectivityModelParameters; - -/*! @method createChannelMixerWithName - @abstract Creates a channel mixer with a given name and parameters - @param mixerName name of the mixer to create - @param channelLayout channel layout tag - @return mixer id -*/ -- (int64_t)createChannelMixerWithName:(NSString*)mixerName channelLayout:(ChannelLayoutType)channelLayout; - -/*! @method createAmbientMixerWithName - @abstract Creates an ambient mixer with a given name and parameters - @param mixerName name of the mixer to create - @param channelLayout channel layout tag - @param orientation quaterion comprised of 4 float values x, y, z, w - @return mixer id -*/ -- (int64_t)createAmbientMixerWithName:(NSString*)mixerName - channelLayout:(ChannelLayoutType)channelLayout - orientation:(Quaternion)orientation; - -/*! @method destroyMixerWithId - @param mixerId mixer Id to destroy - @abstract Destroys a mixer with the given id -*/ -- (void)destroyMixerWithId:(int64_t)mixerId; - -/*! @method getChannelLayoutTag - @param channelLayout The internal ChannelLayoutType id. - @return The ChannelLayoutTag corresponding to channelLayout - @abstract Converts an internal ChannelLayoutType to an AudioChannelLayoutTag. - */ -+ (AudioChannelLayoutTag)getChannelLayoutTag:(ChannelLayoutType)channelLayout; - -/*! @method createMetaParameterWithName - @abstract Creates a integer meta parameter with a name and default value - @param name parameter name to create - @param defaultIntValue default integer value of parameter - @param minimumValue minimum value of the parameter - @param maximumValue maximum value of the parameter - @return parameter id -*/ -- (int64_t)createMetaParameterWithName:(NSString*)name defaultIntValue:(int)defaultIntValue minimumValue:(int)minimumValue maximumValue:(int)maximumValue; - -/*! @method getMetaParameterIntValueWithId - @abstract Gets the value of a given parameter of type integer on a sound event instance - @param instanceId sound event instance to get parameter from - @param parameterName name of the parameter to get - @return the value of the parameter -*/ -- (int)getMetaParameterIntValueWithId:(int64_t)instanceId parameterName:(NSString*)parameterName; - -/*! @method setMetaParameterWithId - @abstract Sets the value of a given parameter of type integer on an sound event instance - @param instanceId sound event instance to set parameter on - @param parameterName name of the parameter to set - @param intValue integer value of the parameter to set - @return true on success false otherwise -*/ -- (BOOL)setMetaParameterWithId:(int64_t)instanceId parameterName:(NSString*)parameterName intValue:(int)intValue; - -/*! @method createMetaParameterWithName - @abstract Creates a double meta parameter with a name and default value - @param name parameter name to create - @param defaultDblValue default double value of parameter - @param minimumValue minimum value of the parameter - @param maximumValue maximum value of the parameter - @return parameter id -*/ -- (int64_t)createMetaParameterWithName:(NSString*)name defaultDblValue:(double)defaultDblValue minimumValue:(double)minimumValue maximumValue:(double)maximumValue; - -/*! @method getMetaParameterDblValueWithId - @abstract Gets the value of a given parameter of type double on a sound event instance - @param instanceId sound event instance to get parameter from - @param parameterName name of the parameter to get - @return the value of the parameter -*/ -- (double)getMetaParameterDblValueWithId:(int64_t)instanceId parameterName:(NSString*)parameterName; - -/*! @method setMetaParameterWithIdDbl - @abstract Sets the value of a given parameter of type double on a sound event instance - @param instanceId instance to set parameter on - @param parameterName name of the parameter to set - @param doubleValue double value of the parameter to set - @return true on success false otherwise -*/ -- (BOOL)setMetaParameterWithId:(int64_t)instanceId parameterName:(NSString*)parameterName doubleValue:(double)doubleValue; - -/*! @method createMetaParameterWithName - @abstract Creates a string sound event meta parameter with a name and default value - @param name parameter name to create - @param defaultStrValue default stringvalue of parameter - @return parameter id -*/ -- (int64_t)createMetaParameterWithName:(NSString*)name defaultStrValue:(NSString*)defaultStrValue; - -/*! @method getMetaParameterStrValueWithId - @abstract Gets the value of a given parameter of type string on a sound event instance - @param instanceId sound event instance to get parameter from - @param parameterName name of the parameter to get - @return the value of the parameter -*/ -- (NSString*)getMetaParameterStrValueWithId:(int64_t)instanceId parameterName:(NSString*)parameterName; - -/*! @method setMetaParameterWithId - @abstract Sets the value of a given parameter of type string on a sound event instance - @param instanceId instance to set parameter on - @param parameterName name of the parameter to set - @param stringValue string value of the parameter to set - @return true on success false otherwise -*/ -- (BOOL)setMetaParameterWithId:(int64_t)instanceId parameterName:(NSString*)parameterName stringValue:(NSString*)stringValue; - -/*! @method destroyMetaParameterWithId - @abstract Destroys an sound event meta parameter - @param parameterId parameter id to destroy -*/ -- (void)destroyMetaParameterWithId:(int64_t)parameterId; - -/*! @method createMappedMetaParameterWithParameterId - @param parameterId of the input parameter - @param envelopeParameters parameters of the envelope to be created - @return return the instance ID of the mapped meta parameter -*/ -- (int64_t)createMappedMetaParameterWithParameterId:(int64_t)parameterId envelopeParameters:(EnvelopeParameters)envelopeParameters; - -/*! @method destoryMappedMetaParameterWithId - @param parameterId id of the mapped meta parameter -*/ -- (void)destoryMappedMetaParameterWithId:(int64_t)parameterId; - -/*! @method setMixerGainParameterOnMixerWithId - @abstract Sets the gainMetaParameterDefinition to the given parameter on the given mixer - @param parameterId parameter used to define the gainMetaParameter of the given mixer - @param mixerId mixerId mixer to set gainMetaParameterDefinition on - @return true on success false otherwise -*/ -- (BOOL)setMixerGainParameterOnMixerWithId:(int64_t)parameterId mixerId:(int64_t)mixerId; - -/*! @method createSoundEventSamplerNodeWithAsset - @abstract Creates an sound event sampler node with a given asset name and parameters - @param assetName name of the asset to create sampler node for - @param mixerId mixer Id to attach this sampler to - @param rateParameterId rate meta parameter Id to associated with this sampler - @param looping whether the asset loops or not - @param calibrationMode the PHASECalibrationMode of the sampler node - @param level the volume level - @return true on success, false otherwise -*/ -- (int64_t)createSoundEventSamplerNodeWithAsset:(NSString*)assetName - mixerId:(int64_t)mixerId - rateParameterId:(int64_t)rateParameterId - looping:(BOOL)looping - calibrationMode:(CalibrationMode)calibrationMode - level:(double)level; - -/*! @method createSoundEventPullStreamNodeWithAsset - @abstract Creates a sound event pull stream node with a given asset name and parameters - @param assetName name of the asset to create sampler node for - @param mixerId mixer Id to attach this stream to - @param format the AVAudioFormat for the stream - @param calibrationMode the PHASECalibrationMode of the sampler node - @param level the volume level - @return true on success, false otherwise -*/ -- (int64_t)createSoundEventPullStreamNodeWithAsset:(NSString*)assetName - mixerId:(int64_t)mixerId - format:(AVAudioFormat*)format - calibrationMode:(CalibrationMode)calibrationMode - level:(double)level; - -/*! @method createSoundEventSwitchNodeWithParameter - @abstract creates a sound event switch node with a given meta parameter id and switch entries - @param parameterId meta parameter Id that controls the switch node - @param switchEntries entries containing the different sound event nodes to switch from -*/ -- (int64_t)createSoundEventSwitchNodeWithParameter:(int64_t)parameterId switchEntries:(NSDictionary*)switchEntries; - -/*! @method createSoundEventRandomNodeWithEntries - @abstract creates a sound event random node with given random entries to select from - @param randomEntries entries to randomize - @param uniqueSelectionQueueLength Subtrees will not be repeated until after this random node is activated uniqueSelectionQueueLength number of times. -*/ -- (int64_t)createSoundEventRandomNodeWithEntries:(NSDictionary*)randomEntries uniqueSelectionQueueLength:(int64_t)uniqueSelectionQueueLength; - -/*! @method createSoundEventBlendNodeWithParameter - @abstract creates a sound event blend node with a given meta parameter id and blend entries - @param parameterId meta parameter Id that controls the switch node - @param blendRanges array of ranges - @param numRanges number of Ranges - @param useAutoDistanceBlend if true then the parameter passed in is a spatial mixer otherwise a manually controlled numeric parameter -*/ -- (int64_t)createSoundEventBlendNodeWithParameter:(int64_t)parameterId - blendRanges:(BlendNodeEntry*)blendRanges - numRanges:(uint32_t)numRanges - useAutoDistanceBlend:(bool)useAutoDistanceBlend; - -/*! @method createSoundEventContainerNodeWithChild - @param childIds array of child node ids - @param numChildren number of child nodes in the childIds array - @return container node instance id - */ -- (int64_t)createSoundEventContainerNodeWithChild:(int64_t*)childIds numChildren:(uint32_t)numChildren; - -/*! @method destroySoundEventNodeWithId - @param nodeId node id to destroy - @abstract destroys an sound event node -*/ -- (void)destroySoundEventNodeWithId:(int64_t)nodeId; - -/*! @method registerSoundEventWithName - @abstract Creates and registers an sound event asset with a given name and root node Id - @param name unique name to register the sound event with - @param rootNodeId id of the root node of the sound event - @return true on success, false otherwise -*/ -- (BOOL)registerSoundEventWithName:(NSString*)name rootNodeId:(int64_t)rootNodeId; - -/*! @method unregisterSoundEventWithName - @abstract Unregisters an sound event with a given name - @param name name of sound event to unregister -*/ -- (void)unregisterSoundEventWithName:(NSString*)name; - -/*! @method playSoundEventWithName - @abstract Play the sound event - @param name name of sound event to play - @param sourceId source Id of source to play sound event from - @param mixerIds an array of mixerIds - @param numMixers the length of the above mixerId array - @param streamName name of the Pull Stream Node when the SoundEvent is of type PHASEPullStreamSoundEvent - @param renderBlock the render block, only used when the SoundEvent is of type PHASEPullStreamSoundEvent - @param completionHandlerBlock callback function called when SoundEvent is completed - @return true on success, false otherwise -*/ -- (int64_t)playSoundEventWithName:(NSString*)name - sourceId:(int64_t)sourceId - mixerIds:(int64_t*)mixerIds - numMixers:(int64_t)numMixers - streamName:(nullable NSString*)streamName - renderBlock:(nullable PHASEPullStreamRenderBlock)renderBlock - completionHandlerBlock:(void (^_Nullable)(PHASESoundEventStartHandlerReason reason, int64_t sourceId, int64_t soundEventId))completionHandlerBlock; - -/*! @method stopSoundEventWithId - @abstract Stops an sound event instance - @param instanceId instance Id to stop - @return true on success false otherwise -*/ -- (BOOL)stopSoundEventWithId:(int64_t)instanceId; - -/*! @method start - @abstract Starts the PHASE engine -*/ -- (BOOL)start; - -/*! @method pause - @abstract Pauses the PHASE engine -*/ -- (void)pause; - -/*! @method stop - @abstract Stops the PHASE engine -*/ -- (void)stop; - -/*! @method update - @abstract Updates the PHASE engine -*/ -- (void)update; - -NS_HEADER_AUDIT_END(nullability) -@end +// +// PHASEWrapper.h +// AudioPluginPHASE +// +// Copyright © 2021, 2026 Apple Inc. +// + +#import + +#define PHASEInvalidInstanceHandle (-1) + +NS_HEADER_AUDIT_BEGIN(nullability) + +struct RandomNodeEntry +{ + const int64_t nodeId; + const float weight; +}; + +struct SwitchNodeEntry +{ + const int64_t nodeId; + const char* switchValue; +}; + +struct BlendNodeEntry +{ + const int64_t nodeId; + const float lowValue; + const float fullGainAtLow; + const float fullGainAtHigh; + const float highValue; +}; + +enum DirectivityType +{ + None, + Cardioid, + Cone +}; + +struct DirectivityModelSubbandParameters +{ + const float frequency; + const float pattern; + const float sharpness; + const float innerAngle; + const float outerAngle; + const float outerGain; +}; + +struct DirectivityModelParameters +{ + DirectivityType directivityType; + uint32_t subbandCount; + DirectivityModelSubbandParameters* subbandParameters; +}; + +enum EnvelopeCurveType +{ + EnvelopeCurveTypeLinear, + EnvelopeCurveTypeSquared, + EnvelopeCurveTypeInverseSquared, + EnvelopeCurveTypeCubed, + EnvelopeCurveTypeInverseCubed, + EnvelopeCurveTypeSine, + EnvelopeCurveTypeInverseSine, + EnvelopeCurveTypeSigmoid, + EnvelopeCurveTypeInverseSigmoid +}; + +struct EnvelopeSegment +{ + const float x; + const float y; + const EnvelopeCurveType curveType; +}; + +struct EnvelopeParameters +{ + float x; + float y; + uint32_t segmentCount; + EnvelopeSegment* envelopeSegments; +}; + +enum ChannelLayoutType +{ + ChannelLayoutTypeMono, + ChannelLayoutTypeStereo, + ChannelLayoutTypeFiveOne, + ChannelLayoutTypeSevenOne +}; + +struct Quaternion +{ + const float w; // corresponds to 'r' in simd_quaternion + const float x; // ix + const float y; // iy + const float z; // iz +}; + +enum MaterialPreset +{ + MaterialPresetCardboard, + MaterialPresetGlass, + MaterialPresetBrick, + MaterialPresetConcrete, + MaterialPresetDrywall, + MaterialPresetWood +}; + +enum CalibrationMode +{ + CalibrationModeNone = 0, + CalibrationModeRelativeSpl = 1, + CalibrationModeAbsoluteSpl = 2 +}; + +/****************************************************************************************************/ +/*! @class PHASEEngineWrapper + @abstract A PHASEEngineWrapper allows creating and managing PHASE objects +*/ +@interface PHASEEngineWrapper : NSObject + +/*! @method phaseEngineWrapper + @abstract Singleton of PHASEEngineWrapper - performs all initialization requirements when accessed. + @return shared instance +*/ ++ (id)sharedInstance; + +#if TARGET_OS_VISION +/*! @method setUseClientRenderingMode + @abstract Configure whether to initialize the PHASEEngine with PHASERenderingModeClient on visionOS. + Must be called before sharedInstance is first accessed. + @param enabled YES to use PHASERenderingModeClient (default NO uses PHASERenderingModeLocal) +*/ ++ (void)setUseClientRenderingMode:(BOOL)enabled; +#endif + +/*! @method isInitialized + @abstract Returns whether the engine is created and started + @return true on success, false otherwise +*/ +- (BOOL)isInitialized; + +#if TARGET_OS_VISION +/*! @method setWorldTransform + @abstract Transform the whole world, which can be used + to move the player in the virtual world, on visionOS. + @param worldTransform transform of the world + @return true on success, false otherwise +*/ +- (BOOL)setWorldTransform:(simd_float4x4)worldTransform; +#endif + +/*! @method createListener + @abstract Creates the listener object + @return true on success, false otherwise +*/ +- (BOOL)createListener; + +/*! @method setListenerTransform + @abstract Sets the 3D transform of the listener + @param listenerTransform transform to set + @return true on success, false otherwise +*/ +- (BOOL)setListenerTransform:(simd_float4x4)listenerTransform; + +/*! @method setListenerGain + @abstract Sets the gain linear scale value of the listener, range of [0,1] + @param listenerGain gain to set + @return true on success, false otherwise +*/ +- (BOOL)setListenerGain:(double)listenerGain; + +/*! @method getListenerGain + @abstract Gets the gain of the listener + @return double representing listener gain scalar value, range of [0,1] +*/ +- (double)getListenerGain; + +/*! @method setListenerHeadTracking + @abstract Sets the listener to head track + @param headTrackingEnabled bool representing headTracking enabled or disabled + @return true on success, false otherwise +*/ +- (BOOL)setListenerHeadTracking:(BOOL)headTrackingEnabled; + +/*! @method destroyListener + @abstract Destroys the listener object + @return true on success, false otherwise +*/ +- (BOOL)destroyListener; + +/*! @method createSourceWithMesh + @abstract Creates a volumetric source with a given mesh + @param mesh MDL mesh to create the source with + @return Id of created source +*/ +- (int64_t)createSourceWithMesh:(MDLMesh*)mesh; + +/*! @method createSource + @abstract Creates a point source + @return Id of created source +*/ +- (int64_t)createSource; + +/*! @method setSourceTransformWithId + @abstract Sets the 3D transform of the source + @param sourceId source ID to update transform for + @param transform transform to set + @return true on success, false otherwise +*/ +- (BOOL)setSourceTransformWithId:(int64_t)sourceId transform:(simd_float4x4)transform; + +/*! @method setSourceGainWithId + @abstract Sets the gain linear scale value of the source, range of [0,1]. Given gain values outside of this range will be clamped. + @param sourceId source ID to update gain for + @param sourceGain gain to set on source + @return true on success, false otherwise +*/ +- (BOOL)setSourceGainWithId:(int64_t)sourceId sourceGain:(double)sourceGain; + +/*! @method getSourceGainWithId + @abstract Gets the gain of the source + @param sourceId source ID to get gain for + @return double representing source's gain scalar value, range of [0,1] +*/ +- (double)getSourceGainWithId:(int64_t)sourceId; + +/*! @method destroySourceWithId + @abstract Destroys a source with a given Id + @param sourceId id of source to destroy +*/ +- (void)destroySourceWithId:(int64_t)sourceId; + +/*! @method createOccluderWithMesh + @abstract Creates an occluder with a given mesh + @param mesh MDL mesh to create the occluder with + @return Id of created occluder +*/ +- (int64_t)createOccluderWithMesh:(MDLMesh*)mesh; + +/*! @method setOccluderTransformWithId + @abstract Sets the 3D transform of the occluder + @param occluderId source ID to update transform for + @param transform transform to set + @return true on success, false otherwise +*/ +- (BOOL)setOccluderTransformWithId:(int64_t)occluderId transform:(simd_float4x4)transform; + +/*! @method setOccluderMaterial + @abstract Sets a material of a given name in an occluder + @param occluderId occluder ID to set material on + @param materialName name of material to set + @return true on success, false otherwise +*/ +- (BOOL)setOccluderMaterialWithId:(int64_t)occluderId materialName:(NSString*)materialName; + +/*! @method destroyOccluderWithId + @abstract Destroys the occluder with a given ID + @param occluderId id of occluder to destroy +*/ +- (void)destroyOccluderWithId:(int64_t)occluderId; + +/*! @method createMaterialWithName + @abstract Creates a material from the given preset + @param name name of the material to create + @param preset material preset of type MaterialPreset + @return true on success, false otherwise + */ +- (BOOL)createMaterialWithName:(NSString*)name preset:(MaterialPreset)preset; + +/*! @method destroyMaterialWithName + @abstract Destroys an existing material + @param name name of the material to destroy +*/ +- (void)destroyMaterialWithName:(NSString*)name; + +/*! @method setSceneReverbWithPreset + @abstract Sets a reverb preset in the scene + @param preset Reverb preset to set on scene +*/ +- (void)setSceneReverbWithPreset:(PHASEReverbPreset)preset; + +/*! @method setSceneReverbWithPresetIndex + @abstract Sets a reverb preset in the scene using a sequential index (0-11) + @param presetIndex Sequential index: 0=None, 1=SmallRoom, 2=MediumRoom, 3=LargeRoom, 4=LargeRoom2, + 5=MediumChamber, 6=LargeChamber, 7=MediumHall, 8=MediumHall2, 9=MediumHall3, + 10=LargeHall, 11=Cathedral +*/ +- (void)setSceneReverbWithPresetIndex:(int)presetIndex; + +/*! @method registerAudioBufferWithData + @abstract Registers an audio buffer in the system (data gets copied internally) + @param data buffer data to register + @param identifier unique identifier of buffer to register + @param audioFormat audio format of the buffer data + @return true on success, false otherwise +*/ +- (BOOL)registerAudioBufferWithData:(NSData*)data identifier:(NSString*)identifier audioFormat:(AVAudioFormat*)audioFormat; + +/*! @method registerAudioAssetWithURL + @abstract Registers an audio file into the system + @param url url of the audio asset to register + @param identifier unique identifier of buffer to register + @param audioFormat audio format of the buffer data + @return true on success, false otherwise +*/ +- (BOOL)registerAudioAssetWithURL:(NSURL*)url identifier:(NSString*)identifier audioFormat:(AVAudioFormat*)audioFormat; + +/*! @method unregisterAudioBufferWithIndentifier + @param identifier unique identifier of buffer to unregister + @abstract Unregisters an audio buffer with a given identifier +*/ +- (void)unregisterAudioBufferWithIdentifier:(NSString*)identifier; + +/*! @method createSpatialMixerWithName + @abstract Creates a spatial mixer with a given name and parameters + @param mixerName name of the mixer to create + @param enableDirectPath enable direct path modeling for this mixer + @param enableEarlyReflections enable early reflection modeling for this mixer + @param enableLateReverb enable late reverb modeling for this mixer + @param cullDistance distance at which the systems stops processing the sound + @param rolloffFactor rolloff factor for the geometric spreading distance model + @param sourceDirectivityModelParameters directivity parameters for mixer source ( cone or cardioid) + @param listenerDirectivityModelParameters directivity parameters for mixer listener ( cone or cardioid) + @return mixer id +*/ +- (int64_t)createSpatialMixerWithName:(NSString*)mixerName + enableDirectPath:(BOOL)enableDirectPath + enableEarlyReflections:(BOOL)enableEarlyReflections + enableLateReverb:(BOOL)enableLateReverb + cullDistance:(double)cullDistance + rolloffFactor:(float)rolloffFactor + sourceDirectivityModelParameters:(DirectivityModelParameters)sourceDirectivityModelParameters + listenerDirectivityModelParameters:(DirectivityModelParameters)listenerDirectivityModelParameters; + +/*! @method createChannelMixerWithName + @abstract Creates a channel mixer with a given name and parameters + @param mixerName name of the mixer to create + @param channelLayout channel layout tag + @return mixer id +*/ +- (int64_t)createChannelMixerWithName:(NSString*)mixerName channelLayout:(ChannelLayoutType)channelLayout; + +/*! @method createAmbientMixerWithName + @abstract Creates an ambient mixer with a given name and parameters + @param mixerName name of the mixer to create + @param channelLayout channel layout tag + @param orientation quaternion comprised of 4 float values x, y, z, w + @return mixer id +*/ +- (int64_t)createAmbientMixerWithName:(NSString*)mixerName + channelLayout:(ChannelLayoutType)channelLayout + orientation:(Quaternion)orientation; + +/*! @method destroyMixerWithId + @abstract Destroys a mixer with the given id + @param mixerId mixer Id to destroy +*/ +- (void)destroyMixerWithId:(int64_t)mixerId; + +/*! @method getChannelLayoutTag + @abstract Converts an internal ChannelLayoutType to an AudioChannelLayoutTag. + @param channelLayout The internal ChannelLayoutType id. + @return The ChannelLayoutTag corresponding to channelLayout + */ ++ (AudioChannelLayoutTag)getChannelLayoutTag:(ChannelLayoutType)channelLayout; + +/*! @method createMetaParameterWithName + @abstract Creates an integer meta parameter with a name and default value + @param name parameter name to create + @param defaultIntValue default integer value of parameter + @param minimumValue minimum value of the parameter + @param maximumValue maximum value of the parameter + @return parameter id +*/ +- (int64_t)createMetaParameterWithName:(NSString*)name defaultIntValue:(int)defaultIntValue minimumValue:(int)minimumValue maximumValue:(int)maximumValue; + +/*! @method getMetaParameterIntValueWithId + @abstract Gets the value of a given parameter of type integer on a sound event instance + @param instanceId sound event instance to get parameter from + @param parameterName name of the parameter to get + @return the value of the parameter +*/ +- (int)getMetaParameterIntValueWithId:(int64_t)instanceId parameterName:(NSString*)parameterName; + +/*! @method setMetaParameterWithId + @abstract Sets the value of a given parameter of type integer on a sound event instance + @param instanceId sound event instance to set parameter on + @param parameterName name of the parameter to set + @param intValue integer value of the parameter to set + @return true on success, false otherwise +*/ +- (BOOL)setMetaParameterWithId:(int64_t)instanceId parameterName:(NSString*)parameterName intValue:(int)intValue; + +/*! @method createMetaParameterWithName + @abstract Creates a double meta parameter with a name and default value + @param name parameter name to create + @param defaultDblValue default double value of parameter + @param minimumValue minimum value of the parameter + @param maximumValue maximum value of the parameter + @return parameter id +*/ +- (int64_t)createMetaParameterWithName:(NSString*)name defaultDblValue:(double)defaultDblValue minimumValue:(double)minimumValue maximumValue:(double)maximumValue; + +/*! @method getMetaParameterDblValueWithId + @abstract Gets the value of a given parameter of type double on a sound event instance + @param instanceId sound event instance to get parameter from + @param parameterName name of the parameter to get + @return the value of the parameter +*/ +- (double)getMetaParameterDblValueWithId:(int64_t)instanceId parameterName:(NSString*)parameterName; + +/*! @method setMetaParameterWithIdDbl + @abstract Sets the value of a given parameter of type double on a sound event instance + @param instanceId instance to set parameter on + @param parameterName name of the parameter to set + @param doubleValue double value of the parameter to set + @return true on success, false otherwise +*/ +- (BOOL)setMetaParameterWithId:(int64_t)instanceId parameterName:(NSString*)parameterName doubleValue:(double)doubleValue; + +/*! @method createMetaParameterWithName + @abstract Creates a string sound event meta parameter with a name and default value + @param name parameter name to create + @param defaultStrValue default string value of parameter + @return parameter id +*/ +- (int64_t)createMetaParameterWithName:(NSString*)name defaultStrValue:(NSString*)defaultStrValue; + +/*! @method getMetaParameterStrValueWithId + @abstract Gets the value of a given parameter of type string on a sound event instance + @param instanceId sound event instance to get parameter from + @param parameterName name of the parameter to get + @return the value of the parameter +*/ +- (NSString*)getMetaParameterStrValueWithId:(int64_t)instanceId parameterName:(NSString*)parameterName; + +/*! @method setMetaParameterWithId + @abstract Sets the value of a given parameter of type string on a sound event instance + @param instanceId instance to set parameter on + @param parameterName name of the parameter to set + @param stringValue string value of the parameter to set + @return true on success, false otherwise +*/ +- (BOOL)setMetaParameterWithId:(int64_t)instanceId parameterName:(NSString*)parameterName stringValue:(NSString*)stringValue; + +/*! @method destroyMetaParameterWithId + @abstract Destroys a sound event meta parameter + @param parameterId parameter id to destroy +*/ +- (void)destroyMetaParameterWithId:(int64_t)parameterId; + +/*! @method createMappedMetaParameterWithParameterId + @abstract Creates a mapped meta parameter that drives the given input parameter through an envelope + @param parameterId of the input parameter + @param envelopeParameters parameters of the envelope to be created + @return id of the mapped meta parameter +*/ +- (int64_t)createMappedMetaParameterWithParameterId:(int64_t)parameterId envelopeParameters:(EnvelopeParameters)envelopeParameters; + +/*! @method destroyMappedMetaParameterWithId + @abstract Destroys a mapped meta parameter with a given id + @param parameterId id of the mapped meta parameter +*/ +- (void)destroyMappedMetaParameterWithId:(int64_t)parameterId; + +/*! @method setMixerGainParameterOnMixerWithId + @abstract Sets the gainMetaParameterDefinition to the given parameter on the given mixer + @param parameterId parameter used to define the gainMetaParameter of the given mixer + @param mixerId mixerId mixer to set gainMetaParameterDefinition on + @return true on success, false otherwise +*/ +- (BOOL)setMixerGainParameterOnMixerWithId:(int64_t)parameterId mixerId:(int64_t)mixerId; + +/*! @method createSoundEventSamplerNodeWithAsset + @abstract Creates a sound event sampler node with a given asset name and parameters + @param assetName name of the asset to create sampler node for + @param mixerId mixer Id to attach this sampler to + @param rateParameterId rate meta parameter Id to associated with this sampler + @param looping whether the asset loops or not + @param calibrationMode the PHASECalibrationMode of the sampler node + @param level the volume level + @return true on success, false otherwise +*/ +- (int64_t)createSoundEventSamplerNodeWithAsset:(NSString*)assetName + mixerId:(int64_t)mixerId + rateParameterId:(int64_t)rateParameterId + looping:(BOOL)looping + calibrationMode:(CalibrationMode)calibrationMode + level:(double)level; + +/*! @method createSoundEventPullStreamNodeWithAsset + @abstract Creates a sound event pull stream node with a given asset name and parameters + @param assetName name of the asset to create sampler node for + @param mixerId mixer Id to attach this stream to + @param format the AVAudioFormat for the stream + @param calibrationMode the PHASECalibrationMode of the sampler node + @param level the volume level + @return true on success, false otherwise +*/ +- (int64_t)createSoundEventPullStreamNodeWithAsset:(NSString*)assetName + mixerId:(int64_t)mixerId + format:(AVAudioFormat*)format + calibrationMode:(CalibrationMode)calibrationMode + level:(double)level; + +/*! @method createSoundEventSwitchNodeWithParameter + @abstract creates a sound event switch node with a given meta parameter id and switch entries + @param parameterId meta parameter Id that controls the switch node + @param switchEntries entries containing the different sound event nodes to switch from +*/ +- (int64_t)createSoundEventSwitchNodeWithParameter:(int64_t)parameterId switchEntries:(NSDictionary*)switchEntries; + +/*! @method createSoundEventRandomNodeWithEntries + @abstract creates a sound event random node with given random entries to select from + @param randomEntries entries to randomize +*/ +- (int64_t)createSoundEventRandomNodeWithEntries:(NSDictionary*)randomEntries uniqueSelectionQueueLength:(int64_t)uniqueSelectionQueueLength; + +/*! @method createSoundEventBlendNodeWithParameter + @abstract creates a sound event blend node with a given meta parameter id and blend entries + @param parameterId meta parameter Id that controls the switch node + @param blendRanges array of ranges + @param numRanges number of Ranges + @param useAutoDistanceBlend if true then the parameter passed in is a spatial mixer otherwise a manually controlled numeric parameter +*/ +- (int64_t)createSoundEventBlendNodeWithParameter:(int64_t)parameterId + blendRanges:(BlendNodeEntry*)blendRanges + numRanges:(uint32_t)numRanges + useAutoDistanceBlend:(bool)useAutoDistanceBlend; + +/*! @method createSoundEventContainerNodeWithChild + @abstract Creates a sound event container node from the given child nodes + @param childIds array of child node ids + @param numChildren number of child nodes in the childIds array + @return container node instance id + */ +- (int64_t)createSoundEventContainerNodeWithChild:(int64_t*)childIds numChildren:(uint32_t)numChildren; + +/*! @method destroySoundEventNodeWithId + @abstract Destroys a sound event node + @param nodeId node id to destroy +*/ +- (void)destroySoundEventNodeWithId:(int64_t)nodeId; + +/*! @method registerSoundEventWithName + @abstract Creates and registers a sound event asset with a given name and root node Id + @param name unique name to register the sound event with + @param rootNodeId id of the root node of the sound event + @return true on success, false otherwise +*/ +- (BOOL)registerSoundEventWithName:(NSString*)name rootNodeId:(int64_t)rootNodeId; + +/*! @method unregisterSoundEventWithName + @abstract Unregisters a sound event with a given name + @param name name of sound event to unregister +*/ +- (void)unregisterSoundEventWithName:(NSString*)name; + +/*! @method playSoundEventWithName + @abstract Play the sound event + @param name name of sound event to play + @param sourceId source Id of source to play sound event from + @param mixerIds an array of mixerIds + @param numMixers the length of the above mixerId array + @param streamName name of the Pull Stream Node when the SoundEvent is of type PHASEPullStreamSoundEvent + @param renderBlock the render block, only used when the SoundEvent is of type PHASEPullStreamSoundEvent + @param completionHandlerBlock callback function called when SoundEvent is completed + @return true on success, false otherwise +*/ +- (int64_t)playSoundEventWithName:(NSString*)name + sourceId:(int64_t)sourceId + mixerIds:(int64_t*)mixerIds + numMixers:(int64_t)numMixers + streamName:(nullable NSString*)streamName + renderBlock:(nullable PHASEPullStreamRenderBlock)renderBlock + completionHandlerBlock:(void (^_Nullable)(PHASESoundEventStartHandlerReason reason, int64_t sourceId, int64_t soundEventId))completionHandlerBlock; + +/*! @method stopSoundEventWithId + @abstract Stops a sound event instance + @param instanceId instance Id to stop + @return true on success, false otherwise +*/ +- (BOOL)stopSoundEventWithId:(int64_t)instanceId; + +/*! @method start + @abstract Starts the PHASE engine +*/ +- (BOOL)start; + +/*! @method pause + @abstract Pauses the PHASE engine +*/ +- (void)pause; + +/*! @method stop + @abstract Stops the PHASE engine +*/ +- (void)stop; + +/*! @method update + @abstract Updates the PHASE engine +*/ +- (void)update; + +NS_HEADER_AUDIT_END(nullability) +@end diff --git a/plug-ins/Apple.PHASE/Native/PHASEWrapper/PHASEWrapper.mm b/plug-ins/Apple.PHASE/Native/PHASEWrapper/PHASEWrapper.mm index 599acbc1..53fec263 100644 --- a/plug-ins/Apple.PHASE/Native/PHASEWrapper/PHASEWrapper.mm +++ b/plug-ins/Apple.PHASE/Native/PHASEWrapper/PHASEWrapper.mm @@ -1,1561 +1,1633 @@ -// -// PHASEWrapper.mm -// AudioPluginPHASE -// -// Copyright © 2021 Apple Inc. All rights reserved. -// - -#import -#import - -#include "PHASEWrapper.h" -#include - -// For UI application background notifications -#if !TARGET_OS_OSX -#include -#endif //!TARGET_OS_OSX - -NS_HEADER_AUDIT_BEGIN(nullability) - -@interface PHASEEngineWrapper () { - PHASEEngine* mEngine; - PHASEListener* mListener; - NSMutableDictionary* mSources; - NSMutableDictionary* mOccluders; - NSMutableDictionary* mSoundEvents; - NSMutableDictionary* mSuspendedSoundEvents; - NSMutableDictionary* mMaterials; - - // Keep track of the number of sound events playing an sound event asset - // For destruction purposes - NSMutableDictionary* mActiveSoundEventAssets; - - // For sound event programatic creation - NSMutableDictionary* mSoundEventNodeDefinitions; - NSMutableDictionary* mSoundEventMixerDefinitions; - NSMutableDictionary* mSoundEventMetaParameterDefinitions; - NSMutableDictionary* mSoundEventMappedMetaParameterDefinitions; -} - -@end - -@implementation PHASEEngineWrapper : NSObject - -+ (id)sharedInstance -{ - static PHASEEngineWrapper* wrapper = nil; - static std::once_flag onceFlag; - std::call_once(onceFlag, [&self]() { wrapper = [[self alloc] init]; }); - return wrapper; -} - -- (BOOL)isInitialized -{ - return (nil != mEngine && nil != mListener && mEngine.renderingState == PHASERenderingStateStarted); -} - -#if !TARGET_OS_OSX -- (void)pauseSoundEvents -{ - NSLog(@"Phase Wrapper: Suspending sound events after application resign active notification"); - @synchronized(self->mSoundEvents) - { - // Go through all sound events and suspend / pause the ones that are playing. - for(id key in self->mSoundEvents) - { - PHASESoundEvent* soundevent = [self->mSoundEvents objectForKey:key]; - if ([soundevent renderingState] == PHASERenderingStateStarted) - { - [soundevent pause]; - self->mSuspendedSoundEvents[key] = soundevent; - } - - } - } -} - -- (void)resumeSoundEvents { - NSLog(@"Phase Wrapper: Resuming sound events after application active notification"); - @synchronized(self->mSoundEvents) - { - // Go through all sound events and resume the ones that were suspended. - for(id key in self->mSuspendedSoundEvents) - { - PHASESoundEvent* soundevent = [self->mSuspendedSoundEvents objectForKey:key]; - [soundevent resume]; - } - - // Remove all suspended sound events - [self->mSuspendedSoundEvents removeAllObjects]; - } -} - -- (void)setupAudioSession -{ - NSError* error = nil; - - // Configure the audio session - AVAudioSession *sessionInstance = [AVAudioSession sharedInstance]; - - // set the session category to ambient (implicitly sets the session to mix with others) - bool success = [sessionInstance setCategory:AVAudioSessionCategoryAmbient mode:AVAudioSessionModeDefault options:AVAudioSessionCategoryOptionMixWithOthers error:&error]; - if (!success) - { - NSLog(@"Phase Wrapper: Error setting AVAudioSession category! %@\n", [error localizedDescription]); - } - - // add AVAudioSession interruption handler - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(handleAudioSessionInterruption:) - name:AVAudioSessionInterruptionNotification - object:sessionInstance]; - - // add handler when application goes to the background - [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationWillResignActiveNotification object:nil queue:nil usingBlock:^(NSNotification *notification) - { - [[AVAudioSession sharedInstance] setActive:FALSE error:nil]; - [self pauseSoundEvents]; - }]; - - // add handler when application returns from the background - [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification object:nil queue:nil usingBlock:^(NSNotification *notification) - { - [[AVAudioSession sharedInstance] setActive:TRUE error:nil]; - [self resumeSoundEvents]; - }]; - - // On visionOS the system automatically virtualizes the output from the window anchor so disable that behavior here. - // Note: This plugin currently only supports fully immersive visionOS scenes. - -#if TARGET_OS_VISION - [sessionInstance setIntendedSpatialExperience:AVAudioSessionSpatialExperienceBypassed options:nil error:nil]; -#endif - - // activate the audio session - success = [sessionInstance setActive:YES error:&error]; - if (!success) NSLog(@"Phase Wrapper: Error setting session active! %@\n", [error localizedDescription]); -} - -- (void)handleAudioSessionInterruption:(NSNotification *)notification -{ - UInt8 interruptionType = [[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] intValue]; - - NSLog(@"Phase Wrapper: Session interrupted > --- %s ---\n", interruptionType == AVAudioSessionInterruptionTypeBegan ? "Begin Interruption" : "End Interruption"); - - if (interruptionType == AVAudioSessionInterruptionTypeBegan) - { - [self pauseSoundEvents]; - } - - if (interruptionType == AVAudioSessionInterruptionTypeEnded) - { - NSError *error; - bool success = [[AVAudioSession sharedInstance] setActive:YES error:&error]; - if (!success) - { - NSLog(@"Phase Wrapper: AVAudioSession set active failed with error: %@", [error localizedDescription]); - } - else - { - [self resumeSoundEvents]; - } - } -} -#endif // !TARGET_OS_OSX - -- (id)init -{ - if (self = [super init]) - { -#if !TARGET_OS_MAC - // Setup the audio session - [self setupAudioSession]; -#endif // !TARGET_OS_MAC - - // Create engine -#if TARGET_OS_VISION - if (@available(visionOS 26, *)) - { - mEngine = [[PHASEEngine alloc] initWithUpdateMode:PHASEUpdateModeManual renderingMode:PHASERenderingModeClient]; - } - else -#endif - { - mEngine = [[PHASEEngine alloc] initWithUpdateMode:PHASEUpdateModeManual]; - } - - // Create sources dictionary - mSources = [[NSMutableDictionary alloc] init]; - - // Create occluders dictionary - mOccluders = [[NSMutableDictionary alloc] init]; - - // Create sound events dictionary - mSoundEvents = [[NSMutableDictionary alloc] init]; - - // Create suspended sound events array - mSuspendedSoundEvents = [[NSMutableDictionary alloc] init]; - - // Create materials dictionary - mMaterials = [[NSMutableDictionary alloc] init]; - - // Creeate active sound event assets tracker dictionary - mActiveSoundEventAssets = [[NSMutableDictionary alloc] init]; - - // Create sound event nodes dictionary - mSoundEventNodeDefinitions = [[NSMutableDictionary alloc] init]; - - // Create sound event meta parameters dictionary - mSoundEventMetaParameterDefinitions = [[NSMutableDictionary alloc] init]; - - // Create mapped meta parameters dictionary - mSoundEventMappedMetaParameterDefinitions = [[NSMutableDictionary alloc] init]; - - // Create mixeres dictionary - mSoundEventMixerDefinitions = [[NSMutableDictionary alloc] init]; - - // Set default preset - [mEngine setDefaultReverbPreset:PHASEReverbPresetMediumRoom]; - - [self createListener]; - - // On visionOS the default spatialization mode is channels since the system will auto virtualize the output. - // We've configured the audio session to bypass system spatialization so we can set the mode to binaural. -#if TARGET_OS_VISION - [mEngine setOutputSpatializationMode:PHASESpatializationModeAlwaysUseBinaural]; -#endif - - NSLog(@"Phase Wrapper: Engine created successfully."); - return self; - } - - return nil; -} - -- (BOOL)createListener -{ - if (mListener != nil) - { - NSLog(@"Phase Wrapper: Listener already exists."); - return YES; - } - - // Create the listener object - mListener = [[PHASEListener alloc] initWithEngine:mEngine]; - if (mListener == nil) - { - NSLog(@"Phase Wrapper: Failed to create Listener."); - return NO; - } - - NSError* errorRef = [NSError alloc]; - const BOOL result = [mEngine.rootObject addChild:mListener error:&errorRef]; - if (!result) - { - NSLog(@"Phase Wrapper: Failed to add listener to the scene %@.", errorRef); - return NO; - } - - NSLog(@"Phase Wrapper: Listener created successfully."); - return YES; -} - -- (BOOL)setListenerTransform:(simd_float4x4)listenerTransform -{ -#if !TARGET_OS_VISION - if (mListener == nil) - { - NSLog(@"Phase Wrapper: Listener does not exist."); - return NO; - } - - mListener.transform = listenerTransform; -#endif //!TARGET_OS_VISION - - return YES; -} - -- (BOOL)setListenerGain:(double)listenerGain -{ -#if !TARGET_OS_VISION - if (mListener == nil) - { - NSLog(@"Phase Wrapper: Listener does not exist."); - return NO; - } - - mListener.gain = listenerGain; -#endif //!TARGET_OS_VISION - - return YES; -} - -- (double)getListenerGain -{ - if (mListener == nil) - { - NSLog(@"Phase Wrapper: Listener does not exist."); - return 0.f; - } - - return mListener.gain; -} - -- (BOOL)setListenerHeadTracking:(BOOL)headTrackingEnabled -{ - if (mListener == nil) - { - NSLog(@"Phase Wrapper: Listener does not exist."); - return false; - } - -#if !TARGET_OS_VISION - if (@available(macOS 15.0, iOS 18.0, tvOS 18.0, *)) { - if (headTrackingEnabled) - { - mListener.automaticHeadTrackingFlags = PHASEAutomaticHeadTrackingFlagOrientation; - } - else - { - mListener.automaticHeadTrackingFlags = 0; - } - - return true; - } -#endif - - NSLog(@"Phase Wrapper: Listener head-tracking is only available as of MacOS 15.0, iOS 18.0, tvOS 18.0"); - return false; -} - -- (BOOL)destroyListener -{ - if (mListener == nil) - { - NSLog(@"Phase Wrapper: Listener does not exist."); - return NO; - } - - // Remove from the hierarchy - [mEngine.rootObject removeChild:mListener]; - - mListener = nil; - - NSLog(@"Phase Wrapper: Listener destroyed successfully."); - return YES; -} - -- (int64_t)createSourceWithMesh:(MDLMesh*)mesh -{ - // Create the shape - PHASEShape* shape = [[PHASEShape alloc] initWithEngine:mEngine mesh:mesh]; - if (!shape) - { - [NSException raise:@"Node invalid" format:@"Failed to create shape."]; - } - - // Create the source object - PHASESource* source = [[PHASESource alloc] initWithEngine:mEngine shapes:@[ shape ]]; - if (source == nil) - { - [NSException raise:@"Source invalid" format:@"Failed to create source."]; - } - - NSError* errorRef = [NSError alloc]; - const BOOL result = [mEngine.rootObject addChild:source error:&errorRef]; - if (!result) - { - [NSException raise:@"Adding child error" format:@"Failed to add object to scene."]; - } - - const int64_t sourceId = reinterpret_cast(source); - [mSources setObject:source forKey:[NSNumber numberWithLongLong:sourceId]]; - - return sourceId; -} - -- (int64_t)createSource -{ - PHASESource* source = [[PHASESource alloc] initWithEngine:mEngine]; - if (source == nil) - { - [NSException raise:@"Source invalid" format:@"Failed to create source."]; - } - - NSError* errorRef = [NSError alloc]; - const BOOL result = [mEngine.rootObject addChild:source error:&errorRef]; - if (!result) - { - [NSException raise:@"Adding child error" format:@"Failed to add object to scene."]; - } - - const int64_t sourceId = reinterpret_cast(source); - [mSources setObject:source forKey:[NSNumber numberWithLongLong:sourceId]]; - - return sourceId; -} - -- (BOOL)setSourceTransformWithId:(int64_t)sourceId transform:(simd_float4x4)transform -{ - PHASESource* source = [mSources objectForKey:[NSNumber numberWithLongLong:sourceId]]; - if (source == nil) - { - NSLog(@"Phase Wrapper: Failed to find PHASE Source to set transform on."); - return NO; - } - - source.transform = transform; - return YES; -} - -- (BOOL)setSourceGainWithId:(int64_t)sourceId sourceGain:(double)sourceGain -{ - PHASESource* source = [mSources objectForKey:[NSNumber numberWithLongLong:sourceId]]; - if (source == nil) - { - NSLog(@"Phase Wrapper: Failed to find PHASE Source to set gain on."); - return NO; - } - - source.gain = sourceGain; - return YES; -} - -- (double)getSourceGainWithId:(int64_t)sourceId -{ - PHASESource* source = [mSources objectForKey:[NSNumber numberWithLongLong:sourceId]]; - if (source == nil) - { - NSLog(@"Phase Wrapper: Failed to find PHASE Source to get gain for."); - return 0.f; - } - - return source.gain; -} - -- (void)destroySourceWithId:(int64_t)sourceId -{ - PHASESource* source = [mSources objectForKey:[NSNumber numberWithLongLong:sourceId]]; - if (source != nil) - { - // Remove from the hierarchy - [mEngine.rootObject removeChild:source]; - - [mSources removeObjectForKey:[NSNumber numberWithLongLong:sourceId]]; - - source = nil; - } -} - -- (int64_t)createOccluderWithMesh:(MDLMesh*)mesh -{ - // Create the source node - PHASEShape* shape = [[PHASEShape alloc] initWithEngine:mEngine mesh:mesh]; - if (!shape) - { - [NSException raise:@"Node invalid" format:@"Failed to create shape."]; - } - - // Create the source object - PHASEOccluder* occluder = [[PHASEOccluder alloc] initWithEngine:mEngine shapes:@[ shape ]]; - if (occluder == nil) - { - [NSException raise:@"Occluder invalid" format:@"Failed to create occluder."]; - } - - NSError* errorRef = [NSError alloc]; - const BOOL result = [mEngine.rootObject addChild:occluder error:&errorRef]; - if (!result) - { - [NSException raise:@"Adding child error" format:@"Failed to add object to scene."]; - } - - const int64_t occluderId = reinterpret_cast(occluder); - [mOccluders setObject:occluder forKey:[NSNumber numberWithLongLong:occluderId]]; - - return occluderId; -} - -- (BOOL)setOccluderTransformWithId:(int64_t)occluderId transform:(simd_float4x4)transform -{ - PHASEOccluder* occluder = [mOccluders objectForKey:[NSNumber numberWithLongLong:occluderId]]; - if (occluder == nil) - { - return NO; - } - - occluder.transform = transform; - return YES; -} - -- (BOOL)setOccluderMaterialWithId:(int64_t)occluderId materialName:(NSString*)materialName -{ - PHASEOccluder* occluder = [mOccluders objectForKey:[NSNumber numberWithLongLong:occluderId]]; - if (occluder == nil) - { - return NO; - } - - // Set the material on the occluder - auto shapeElements = occluder.shapes[0].elements; - for (PHASEShapeElement* element : shapeElements) - { - element.material = [mMaterials objectForKey:materialName]; - } - - return YES; -} - -- (void)destroyOccluderWithId:(int64_t)occluderId -{ - PHASEOccluder* occluder = [mOccluders objectForKey:[NSNumber numberWithLongLong:occluderId]]; - if (occluder != nil) - { - // Remove from the hierarchy - [mEngine.rootObject removeChild:occluder]; - - [mOccluders removeObjectForKey:[NSNumber numberWithLongLong:occluderId]]; - - occluder = nil; - } -} - -- (BOOL)createMaterialWithName:(NSString*)name preset:(MaterialPreset)preset -{ - PHASEMaterialPreset phasePreset; - switch (preset) - { - case MaterialPresetCardboard: - phasePreset = PHASEMaterialPresetCardboard; - break; - case MaterialPresetGlass: - phasePreset = PHASEMaterialPresetGlass; - break; - case MaterialPresetBrick: - phasePreset = PHASEMaterialPresetBrick; - break; - case MaterialPresetConcrete: - phasePreset = PHASEMaterialPresetConcrete; - break; - case MaterialPresetDrywall: - phasePreset = PHASEMaterialPresetDrywall; - break; - case MaterialPresetWood: - phasePreset = PHASEMaterialPresetWood; - break; - } - - PHASEMaterial* material = [[PHASEMaterial alloc] initWithEngine:mEngine preset:phasePreset]; - - if (material == nil) - { - NSLog(@"Phase Wrapper: Failed to create material from preset."); - return NO; - } - [mMaterials setObject:material forKey:name]; - - return YES; -} - -- (void)destroyMaterialWithName:(NSString*)name -{ - [mMaterials removeObjectForKey:name]; -} - -- (void)setSceneReverbWithPreset:(PHASEReverbPreset)preset -{ - [mEngine setDefaultReverbPreset:preset]; -} - -- (BOOL)registerAudioBufferWithData:(NSData*)data identifier:(NSString*)uid audioFormat:(AVAudioFormat*)audioFormat -{ - NSError* error = nil; - [mEngine.assetRegistry registerSoundAssetWithData:data - identifier:uid - format:audioFormat - normalizationMode:PHASENormalizationModeDynamic - error:&error]; - - // If we get PHASEAssetErrorAlreadyExists, just return YES. - if (error && error.code == PHASEAssetErrorAlreadyExists) - { - NSLog(@"Phase Wrapper: Asset %@ already registered with PHASE.", uid); - } else if (error) - { - NSLog(@"Phase Wrapper: Failed to register audio buffer with error %@.", error); - return NO; - } - - return YES; -} - -- (BOOL)registerAudioAssetWithURL:(NSURL*)url identifier:(NSString*)uid audioFormat:(AVAudioFormat*)audioFormat -{ - NSError* error = nil; - [mEngine.assetRegistry registerSoundAssetAtURL:url - identifier:uid - assetType:PHASEAssetTypeStreamed - channelLayout:audioFormat.channelLayout - normalizationMode:PHASENormalizationModeDynamic - error:&error]; - - if (error) - { - NSLog(@"Phase Wrapper: Failed to register audio asset with error %@.", error); - return NO; - } - - return YES; -} - -- (void)unregisterAudioBufferWithIdentifier:(NSString*)uid -{ - [mEngine.assetRegistry unregisterAssetWithIdentifier:uid completion:nil]; -} - -- (int64_t)createSpatialMixerWithName:(NSString*)mixerName - enableDirectPath:(BOOL)enableDirectPath - enableEarlyReflections:(BOOL)enableEarlyReflections - enableLateReverb:(BOOL)enableLateReverb - cullDistance:(double)cullDistance - rolloffFactor:(float)rolloffFactor - sourceDirectivityModelParameters:(DirectivityModelParameters)sourceDirectivityModelParameters - listenerDirectivityModelParameters:(DirectivityModelParameters)listenerDirectivityModelParameters -{ - PHASESpatialPipelineFlags spatialPipelineFlags = 0UL; - if (enableDirectPath) - { - spatialPipelineFlags |= PHASESpatialPipelineFlagDirectPathTransmission; - } - if (enableEarlyReflections) - { - spatialPipelineFlags |= PHASESpatialPipelineFlagEarlyReflections; - } - if (enableLateReverb) - { - spatialPipelineFlags |= PHASESpatialPipelineFlagLateReverb; - } - - PHASESpatialPipeline* spatialPipeline = [[PHASESpatialPipeline alloc] initWithFlags:spatialPipelineFlags]; - - if (enableDirectPath == YES) - { - PHASENumberMetaParameterDefinition* directPathSend = - [[PHASENumberMetaParameterDefinition alloc] initWithValue:1.0 identifier:[mixerName stringByAppendingString:@"DirectPathSend"]]; - spatialPipeline.entries[PHASESpatialCategoryDirectPathTransmission].sendLevel = 1.0; - spatialPipeline.entries[PHASESpatialCategoryDirectPathTransmission].sendLevelMetaParameterDefinition = directPathSend; - } - - if (enableEarlyReflections == YES) - { - PHASENumberMetaParameterDefinition* earlyReflectionsSend = - [[PHASENumberMetaParameterDefinition alloc] initWithValue:1.0 - identifier:[mixerName stringByAppendingString:@"EarlyReflectionsSend"]]; - spatialPipeline.entries[PHASESpatialCategoryEarlyReflections].sendLevelMetaParameterDefinition = earlyReflectionsSend; - } - - if (enableLateReverb == YES) - { - PHASENumberMetaParameterDefinition* lateReverbSend = - [[PHASENumberMetaParameterDefinition alloc] initWithValue:1.0 identifier:[mixerName stringByAppendingString:@"LateReverbSend"]]; - spatialPipeline.entries[PHASESpatialCategoryLateReverb].sendLevelMetaParameterDefinition = lateReverbSend; - } - - // Create geometric distance model. - PHASEGeometricSpreadingDistanceModelParameters* geometricSpreadingDistanceModelParameters = - [[PHASEGeometricSpreadingDistanceModelParameters alloc] init]; - geometricSpreadingDistanceModelParameters.rolloffFactor = rolloffFactor; - - // Create distance model fade if we have fades - if (cullDistance > 0.0f) - { - PHASEDistanceModelFadeOutParameters* distanceModelFadeOutParameters = - [[PHASEDistanceModelFadeOutParameters alloc] initWithCullDistance:cullDistance]; - - // Set fade out model on geometric distance model - geometricSpreadingDistanceModelParameters.fadeOutParameters = distanceModelFadeOutParameters; - } - - // Create spatial mixer - PHASESpatialMixerDefinition* spatialMixer = [[PHASESpatialMixerDefinition alloc] initWithSpatialPipeline:spatialPipeline - identifier:mixerName]; - // Attach distance model parameters to the mixer - spatialMixer.distanceModelParameters = geometricSpreadingDistanceModelParameters; - - // Create Source Directivity Models if they exist - switch (sourceDirectivityModelParameters.directivityType) - { - case Cardioid: { - NSMutableArray* subbands = [[NSMutableArray alloc] init]; - for (int i = 0; i < sourceDirectivityModelParameters.subbandCount; i++) - { - // Set subband parameters - PHASECardioidDirectivityModelSubbandParameters* cardioidSubbandParameters = - [[PHASECardioidDirectivityModelSubbandParameters alloc] init]; - - cardioidSubbandParameters.frequency = sourceDirectivityModelParameters.subbandParameters[i].frequency; - cardioidSubbandParameters.pattern = sourceDirectivityModelParameters.subbandParameters[i].pattern; - cardioidSubbandParameters.sharpness = sourceDirectivityModelParameters.subbandParameters[i].sharpness; - - [subbands addObject:cardioidSubbandParameters]; - } - PHASECardioidDirectivityModelParameters* cardioidDirectivityModel = - [[PHASECardioidDirectivityModelParameters alloc] initWithSubbandParameters:subbands]; - - // Attach source directivity model - spatialMixer.sourceDirectivityModelParameters = cardioidDirectivityModel; - break; - } - case Cone: { - NSMutableArray* subbands = [[NSMutableArray alloc] init]; - for (int i = 0; i < sourceDirectivityModelParameters.subbandCount; i++) - { - // Set subband parameters - PHASEConeDirectivityModelSubbandParameters* coneSubbandParameters = - [[PHASEConeDirectivityModelSubbandParameters alloc] init]; - - coneSubbandParameters.frequency = sourceDirectivityModelParameters.subbandParameters[i].frequency; - [coneSubbandParameters setInnerAngle:sourceDirectivityModelParameters.subbandParameters[i].innerAngle - outerAngle:sourceDirectivityModelParameters.subbandParameters[i].outerAngle]; - coneSubbandParameters.outerGain = sourceDirectivityModelParameters.subbandParameters[i].outerGain; - - [subbands addObject:coneSubbandParameters]; - } - PHASEConeDirectivityModelParameters* coneDirectivityModel = - [[PHASEConeDirectivityModelParameters alloc] initWithSubbandParameters:subbands]; - // Attach source directivity model - spatialMixer.sourceDirectivityModelParameters = coneDirectivityModel; - break; - } - case None: - break; - } - - // Create Listener Directivity Models if they exist - switch (listenerDirectivityModelParameters.directivityType) - { - case Cardioid: { - NSMutableArray* subbands = [[NSMutableArray alloc] init]; - for (int i = 0; i < listenerDirectivityModelParameters.subbandCount; i++) - { - // Set subband parameters - PHASECardioidDirectivityModelSubbandParameters* cardioidSubbandParameters = - [[PHASECardioidDirectivityModelSubbandParameters alloc] init]; - - cardioidSubbandParameters.frequency = listenerDirectivityModelParameters.subbandParameters[i].frequency; - cardioidSubbandParameters.pattern = listenerDirectivityModelParameters.subbandParameters[i].pattern; - cardioidSubbandParameters.sharpness = listenerDirectivityModelParameters.subbandParameters[i].sharpness; - - [subbands addObject:cardioidSubbandParameters]; - } - - PHASECardioidDirectivityModelParameters* cardioidDirectivityModel = - [[PHASECardioidDirectivityModelParameters alloc] initWithSubbandParameters:subbands]; - // Attach listener directivity model - spatialMixer.listenerDirectivityModelParameters = cardioidDirectivityModel; - break; - } - case Cone: { - - NSMutableArray* subbands = [[NSMutableArray alloc] init]; - for (int i = 0; i < listenerDirectivityModelParameters.subbandCount; i++) - { - // Set subband parameters - PHASEConeDirectivityModelSubbandParameters* coneSubbandParameters = - [[PHASEConeDirectivityModelSubbandParameters alloc] init]; - - coneSubbandParameters.frequency = listenerDirectivityModelParameters.subbandParameters[i].frequency; - [coneSubbandParameters setInnerAngle:listenerDirectivityModelParameters.subbandParameters[i].innerAngle - outerAngle:listenerDirectivityModelParameters.subbandParameters[i].outerAngle]; - coneSubbandParameters.outerGain = listenerDirectivityModelParameters.subbandParameters[i].outerGain; - - - [subbands addObject:coneSubbandParameters]; - } - - PHASEConeDirectivityModelParameters* coneDirectivityModel = - [[PHASEConeDirectivityModelParameters alloc] initWithSubbandParameters:subbands]; - // Attach listener directivity model - spatialMixer.listenerDirectivityModelParameters = coneDirectivityModel; - break; - } - case None: - break; - } - - const int64_t mixerId = reinterpret_cast(spatialMixer); - [mSoundEventMixerDefinitions setObject:spatialMixer forKey:[NSNumber numberWithLongLong:mixerId]]; - return mixerId; -} - -+ (AudioChannelLayoutTag)getChannelLayoutTag:(ChannelLayoutType)channelLayout -{ - AudioChannelLayoutTag layoutTag; - switch (channelLayout) - { - case ChannelLayoutTypeMono: - layoutTag = kAudioChannelLayoutTag_Mono; - break; - case ChannelLayoutTypeStereo: - layoutTag = kAudioChannelLayoutTag_Stereo; - break; - case ChannelLayoutTypeFiveOne: - layoutTag = kAudioChannelLayoutTag_MPEG_5_1_B; - break; - case ChannelLayoutTypeSevenOne: - layoutTag = kAudioChannelLayoutTag_MPEG_7_1_B; - break; - default: - NSLog(@"Phase Wrapper: Failed to get channel layout tag for unsuported channel layout."); - } - return layoutTag; -} - -- (int64_t)createChannelMixerWithName:(NSString*)mixerName channelLayout:(ChannelLayoutType)channelLayout -{ - AudioChannelLayoutTag layoutTag = [PHASEEngineWrapper getChannelLayoutTag:channelLayout]; - AVAudioChannelLayout* layout = [[AVAudioChannelLayout alloc] initWithLayoutTag:layoutTag]; - PHASEChannelMixerDefinition* channelMixer = [[PHASEChannelMixerDefinition alloc] initWithChannelLayout:layout]; - const int64_t mixerId = reinterpret_cast(channelMixer); - [mSoundEventMixerDefinitions setObject:channelMixer forKey:[NSNumber numberWithLongLong:mixerId]]; - return mixerId; -} - -- (int64_t)createAmbientMixerWithName:(NSString*)mixerName - channelLayout:(ChannelLayoutType)channelLayout - orientation:(Quaternion)orientation -{ - AudioChannelLayoutTag layoutTag = [PHASEEngineWrapper getChannelLayoutTag:channelLayout]; - AVAudioChannelLayout* layout = [[AVAudioChannelLayout alloc] initWithLayoutTag:layoutTag]; - simd_quatf quat = simd_quaternion(orientation.x, orientation.y, orientation.z, orientation.w); - PHASEAmbientMixerDefinition* ambientMixer = [[PHASEAmbientMixerDefinition alloc] initWithChannelLayout:layout - orientation:quat - identifier:mixerName]; - const int64_t mixerId = reinterpret_cast(ambientMixer); - [mSoundEventMixerDefinitions setObject:ambientMixer forKey:[NSNumber numberWithLongLong:mixerId]]; - return mixerId; -} - -- (void)destroyMixerWithId:(int64_t)mixerId -{ - [mSoundEventMixerDefinitions removeObjectForKey:[NSNumber numberWithLongLong:mixerId]]; -} - -- (int64_t)createMetaParameterWithName:(NSString*)name defaultIntValue:(int)defaultIntValue minimumValue:(int)minimumValue maximumValue:(int)maximumValue -{ - PHASENumberMetaParameterDefinition* param = [[PHASENumberMetaParameterDefinition alloc] initWithValue:defaultIntValue minimum:minimumValue maximum:maximumValue identifier:name]; - - if (param != nil) - { - const int64_t paramId = reinterpret_cast(param); - [mSoundEventMetaParameterDefinitions setObject:param forKey:[NSNumber numberWithLongLong:paramId]]; - return paramId; - } - - return PHASEInvalidInstanceHandle; -} - -- (int)getMetaParameterIntValueWithId:(int64_t)instanceId parameterName:(NSString*)parameterName -{ - PHASESoundEvent* soundEvent = mSoundEvents[[NSNumber numberWithLongLong:instanceId]]; - if (soundEvent == nil) - { - NSLog(@"Phase Wrapper: Error: Failed to retrieve sound event associated with instance %@. Unable to get value for parameter %@", [NSNumber numberWithLongLong: instanceId], parameterName); - return 0; - } - - if (soundEvent.metaParameters[parameterName] == nil) - { - NSLog(@"Phase Wrapper: Error: Failed to retrieve meta parameter from sound event associated with instance %@. Unable to get value for parameter %@.", [NSNumber numberWithLongLong: instanceId], parameterName); - return 0; - } - - if ([soundEvent.metaParameters[parameterName] isKindOfClass:[PHASENumberMetaParameter class]]) - { - return [soundEvent.metaParameters[parameterName].value intValue]; - } - else - { - NSLog(@"Phase Wrapper: Warning: PHASE API misuse, cannot get class %@ with value of type int.", - [soundEvent.metaParameters[parameterName] class]); - return 0; - } -} - -- (BOOL)setMetaParameterWithId:(int64_t)instanceId parameterName:(NSString*)parameterName intValue:(int)intValue -{ - PHASESoundEvent* soundEvent = mSoundEvents[[NSNumber numberWithLongLong:instanceId]]; - if (soundEvent == nil || soundEvent.metaParameters[parameterName] == nil) - { - return NO; - } - - if ([soundEvent.metaParameters[parameterName] isKindOfClass:[PHASENumberMetaParameter class]]) - { - PHASENumberMetaParameter* param = (PHASENumberMetaParameter*)soundEvent.metaParameters[parameterName]; - if (intValue < param.minimum || intValue > param.maximum) - { - NSLog(@"Phase Wrapper: Warning: Failed to set value of meta parameter %@ to %@. Value is out of its min/max range of [%@,%@] and will be clamped", parameterName, [NSNumber numberWithInt:intValue], [NSNumber numberWithInt:param.minimum], - [NSNumber numberWithInt:param.maximum]); - } - - param.value = [NSNumber numberWithInt:intValue]; - return YES; - } - else - { - NSLog(@"Phase Wrapper: Warning: PHASE API misuse, cannot set class %@ with value of type int.", - [soundEvent.metaParameters[parameterName] class]); - return NO; - } - - -} - -- (int64_t)createMetaParameterWithName:(NSString*)name defaultDblValue:(double)defaultDblValue minimumValue:(double)minimumValue maximumValue:(double)maximumValue -{ - PHASENumberMetaParameterDefinition* param = [[PHASENumberMetaParameterDefinition alloc] initWithValue:defaultDblValue minimum:minimumValue maximum:maximumValue identifier:name]; - - if (param != nil) - { - const int64_t paramId = reinterpret_cast(param); - [mSoundEventMetaParameterDefinitions setObject:param forKey:[NSNumber numberWithLongLong:paramId]]; - return paramId; - } - - return PHASEInvalidInstanceHandle; -} - -- (double)getMetaParameterDblValueWithId:(int64_t)instanceId parameterName:(NSString*)parameterName -{ - PHASESoundEvent* soundEvent = mSoundEvents[[NSNumber numberWithLongLong:instanceId]]; - if (soundEvent == nil) - { - NSLog(@"Phase Wrapper: Error: Failed to retrieve sound event associated with instance %@. Unable to get value for parameter %@", [NSNumber numberWithLongLong: instanceId], parameterName); - return 0; - } - - if (soundEvent.metaParameters[parameterName] == nil) - { - NSLog(@"Phase Wrapper: Error: Failed to retrieve meta parameter from sound event associated with instance %@. Unable to get value for parameter %@.", [NSNumber numberWithLongLong: instanceId], parameterName); - return 0; - } - - if ([soundEvent.metaParameters[parameterName] isKindOfClass:[PHASENumberMetaParameter class]]) - { - return [soundEvent.metaParameters[parameterName].value doubleValue]; - } - else - { - NSLog(@"Phase Wrapper: Warning: PHASE API misuse, cannot get class %@ with value of type int.", - [soundEvent.metaParameters[parameterName] class]); - return 0; - } -} - -- (BOOL)setMetaParameterWithId:(int64_t)instanceId parameterName:(NSString*)parameterName doubleValue:(double)doubleValue -{ - PHASESoundEvent* soundEvent = mSoundEvents[[NSNumber numberWithLongLong:instanceId]]; - if (soundEvent == nil || soundEvent.metaParameters[parameterName] == nil) - { - return NO; - } - - if ([soundEvent.metaParameters[parameterName] isKindOfClass:[PHASENumberMetaParameter class]]) - { - PHASENumberMetaParameter* param = (PHASENumberMetaParameter*)soundEvent.metaParameters[parameterName]; - if (doubleValue < param.minimum || doubleValue > param.maximum) - { - NSLog(@"Phase Wrapper: Warning: Failed to set value of meta parameter %@ to %@. Value is out of its min/max range of [%@,%@] and will be clamped.", parameterName, [NSNumber numberWithDouble:doubleValue], [NSNumber numberWithDouble: param.minimum], - [NSNumber numberWithDouble:param.maximum]); - } - - param.value = [NSNumber numberWithDouble:doubleValue]; - return YES; - } - else - { - NSLog(@"Phase Wrapper: Warning: PHASE API misuse, cannot set class %@ with value of type double.", - [soundEvent.metaParameters[parameterName] class]); - return NO; - } -} - -- (int64_t)createMetaParameterWithName:(NSString*)name defaultStrValue:(NSString*)defaultStrValue -{ - PHASEStringMetaParameterDefinition* param = [[PHASEStringMetaParameterDefinition alloc] initWithValue:defaultStrValue identifier:name]; - - if (param != nil) - { - const int64_t paramId = reinterpret_cast(param); - [mSoundEventMetaParameterDefinitions setObject:param forKey:[NSNumber numberWithLongLong:paramId]]; - return paramId; - } - - return PHASEInvalidInstanceHandle; -} - -- (NSString*)getMetaParameterStrValueWithId:(int64_t)instanceId parameterName:(NSString*)parameterName -{ - PHASESoundEvent* soundEvent = mSoundEvents[[NSNumber numberWithLongLong:instanceId]]; - if (soundEvent == nil) - { - NSLog(@"Phase Wrapper: Error: Failed to retrieve sound event associated with instance %@. Unable to get value for parameter %@", [NSNumber numberWithLongLong: instanceId], parameterName); - return nil; - } - - if (soundEvent.metaParameters[parameterName] == nil) - { - NSLog(@"Phase Wrapper: Error: Failed to retrieve meta parameter from sound event associated with instance %@. Unable to get value for parameter %@.", [NSNumber numberWithLongLong: instanceId], parameterName); - return nil; - } - - if ([soundEvent.metaParameters[parameterName] isKindOfClass:[PHASEStringMetaParameter class]]) - { - return soundEvent.metaParameters[parameterName].value; - } - else - { - NSLog(@"Phase Wrapper: Warning: PHASE API misuse, cannot get class %@ with value of type string.", - [soundEvent.metaParameters[parameterName] class]); - return nil; - } -} - -- (BOOL)setMetaParameterWithId:(int64_t)instanceId parameterName:(NSString*)parameterName stringValue:(NSString*)stringValue; -{ - PHASESoundEvent* soundEvent = mSoundEvents[[NSNumber numberWithLongLong:instanceId]]; - if (soundEvent == nil || soundEvent.metaParameters[parameterName] == nil) - { - return NO; - } - - if ([soundEvent.metaParameters[parameterName] isKindOfClass:[PHASEStringMetaParameter class]]) - { - soundEvent.metaParameters[parameterName].value = stringValue; - return YES; - } - else - { - NSLog(@"Phase Wrapper: Warning: PHASE API misuse, cannot set class %@ with value of type string.", - [soundEvent.metaParameters[parameterName] class]); - return NO; - } -} - -- (void)destroyMetaParameterWithId:(int64_t)parameterId -{ - [mSoundEventMetaParameterDefinitions removeObjectForKey:[NSNumber numberWithLongLong:parameterId]]; -} - -- (BOOL)setMixerGainParameterOnMixerWithId:(int64_t)parameterId mixerId:(int64_t)mixerId -{ - PHASENumberMetaParameterDefinition* gainMetaParameter = - [mSoundEventMetaParameterDefinitions objectForKey:[NSNumber numberWithLongLong:parameterId]]; - - if (gainMetaParameter == nil) - { - NSLog(@"Phase Wrapper: Error: Failed to retrieve parameter with id %@, unable to set the parameter on the mixer with id %@.", - [NSNumber numberWithLongLong:parameterId], [NSNumber numberWithLongLong:mixerId]); - return NO; - } - - // Find the mixer - PHASEMixerDefinition* mixer = [mSoundEventMixerDefinitions objectForKey:[NSNumber numberWithLongLong:mixerId]]; - if (mixer == nil) - { - NSLog(@"Phase Wrapper: Error: Failed to retrieve mixer with id %@, unable to set parameter with id %@ on the mixer.", - [NSNumber numberWithLongLong:mixerId], [NSNumber numberWithLongLong:parameterId]); - return NO; - } - - mixer.gainMetaParameterDefinition = gainMetaParameter; - return YES; -} - -- (int64_t)createMappedMetaParameterWithParameterId:(int64_t)parameterId envelopeParameters:(EnvelopeParameters)envelopeParameters -{ - // Create Envelope - NSMutableArray* envelopeSegments = [NSMutableArray new]; - for (int i = 0; i < envelopeParameters.segmentCount; i++) - { - enum PHASECurveType type; - switch (envelopeParameters.envelopeSegments[i].curveType) - { - case EnvelopeCurveTypeLinear: - type = PHASECurveTypeLinear; - break; - case EnvelopeCurveTypeSquared: - type = PHASECurveTypeSquared; - break; - case EnvelopeCurveTypeInverseSquared: - type = PHASECurveTypeInverseSquared; - break; - case EnvelopeCurveTypeCubed: - type = PHASECurveTypeCubed; - break; - case EnvelopeCurveTypeInverseCubed: - type = PHASECurveTypeInverseCubed; - break; - case EnvelopeCurveTypeSine: - type = PHASECurveTypeSine; - break; - case EnvelopeCurveTypeInverseSine: - type = PHASECurveTypeInverseSine; - break; - case EnvelopeCurveTypeSigmoid: - type = PHASECurveTypeSigmoid; - break; - case EnvelopeCurveTypeInverseSigmoid: - type = PHASECurveTypeInverseSigmoid; - break; - } - PHASEEnvelopeSegment* segment = [[PHASEEnvelopeSegment alloc] - initWithEndPoint:simd_make_double2(envelopeParameters.envelopeSegments[i].x, envelopeParameters.envelopeSegments[i].y) - curveType:type]; - [envelopeSegments addObject:segment]; - } - PHASEEnvelope* envelope = [[PHASEEnvelope alloc] initWithStartPoint:simd_make_double2(envelopeParameters.x, envelopeParameters.y) - segments:envelopeSegments]; - - PHASENumberMetaParameterDefinition* metaParameter = - [mSoundEventMetaParameterDefinitions objectForKey:[NSNumber numberWithLongLong:parameterId]]; - PHASEMappedMetaParameterDefinition* mappedMetaParameter = - [[PHASEMappedMetaParameterDefinition alloc] initWithInputMetaParameterDefinition:metaParameter envelope:envelope]; - - const int64_t mappedMetaParamId = reinterpret_cast(mappedMetaParameter); - [mSoundEventMetaParameterDefinitions setObject:mappedMetaParameter forKey:[NSNumber numberWithLongLong:mappedMetaParamId]]; - return mappedMetaParamId; -} - -- (void)destoryMappedMetaParameterWithId:(int64_t)parameterId -{ - [mSoundEventMetaParameterDefinitions removeObjectForKey:[NSNumber numberWithLongLong:parameterId]]; -} - -- (int64_t)createSoundEventSamplerNodeWithAsset:(NSString*)assetName - mixerId:(int64_t)mixerId - rateParameterId:(int64_t)rateParameterId - looping:(BOOL)looping - calibrationMode:(CalibrationMode)calibrationMode - level:(double)level -{ - // Find the mixer - PHASEMixerDefinition* mixer = [mSoundEventMixerDefinitions objectForKey:[NSNumber numberWithLongLong:mixerId]]; - if (mixer == nil) - { - [NSException raise:@"Mixer invalid" format:@"Failed to create sampler node."]; - } - - // Create sampler - PHASESamplerNodeDefinition* sampler = [[PHASESamplerNodeDefinition alloc] initWithSoundAssetIdentifier:assetName - mixerDefinition:mixer]; - sampler.rate = 1; - sampler.cullOption = PHASECullOptionSleepWakeAtRealtimeOffset; - sampler.playbackMode = looping ? PHASEPlaybackModeLooping : PHASEPlaybackModeOneShot; - - PHASECalibrationMode outCalibrationMode; - switch (calibrationMode) - { - case CalibrationModeNone: - outCalibrationMode = PHASECalibrationModeNone; - break; - case CalibrationModeAbsoluteSpl: - outCalibrationMode = PHASECalibrationModeAbsoluteSpl; - break; - case CalibrationModeRelativeSpl: - outCalibrationMode = PHASECalibrationModeRelativeSpl; - break; - } - [sampler setCalibrationMode:outCalibrationMode level:level]; - - const int64_t samplerId = reinterpret_cast(sampler); - if (rateParameterId != PHASEInvalidInstanceHandle) - { - PHASENumberMetaParameterDefinition* rateMetaParameter = - [mSoundEventMetaParameterDefinitions objectForKey:[NSNumber numberWithLongLong:rateParameterId]]; - if (rateMetaParameter == nil) - { - NSLog(@"Phase Wrapper: Error: Failed to retrieve rate parameter with id %@, unable to set the parameter on the sampler with id %@.", - [NSNumber numberWithLongLong:rateParameterId], [NSNumber numberWithLongLong: samplerId]); - } - else - { - sampler.rate = [rateMetaParameter.value floatValue]; - sampler.rateMetaParameterDefinition = rateMetaParameter; - } - } - - [mSoundEventNodeDefinitions setObject:sampler forKey:[NSNumber numberWithLongLong:samplerId]]; - return samplerId; -} - -- (int64_t)createSoundEventPullStreamNodeWithAsset:(NSString*)assetName - mixerId:(int64_t)mixerId - format:(AVAudioFormat*)format - calibrationMode:(CalibrationMode)calibrationMode - level:(double)level -{ - if (@available(macOS 15.0, iOS 18.0, tvOS 18.0, visionOS 2.0, *)) { - // Find the mixer - PHASEMixerDefinition* mixer = [mSoundEventMixerDefinitions objectForKey:[NSNumber numberWithLongLong:mixerId]]; - if (mixer == nil) - { - [NSException raise:@"Mixer invalid" format:@"Failed to create pull stream node."]; - } - - // Create the pull stream - PHASEPullStreamNodeDefinition* pullStream = [[PHASEPullStreamNodeDefinition alloc] initWithMixerDefinition:mixer format:format identifier:assetName]; - pullStream.rate = 1; - - PHASECalibrationMode outCalibrationMode; - switch (calibrationMode) - { - case CalibrationModeNone: - outCalibrationMode = PHASECalibrationModeNone; - break; - case CalibrationModeAbsoluteSpl: - outCalibrationMode = PHASECalibrationModeAbsoluteSpl; - break; - case CalibrationModeRelativeSpl: - outCalibrationMode = PHASECalibrationModeRelativeSpl; - break; - } - [pullStream setCalibrationMode:outCalibrationMode level:level]; - - const int64_t pullStreamId = reinterpret_cast(pullStream); - [mSoundEventNodeDefinitions setObject:pullStream forKey:[NSNumber numberWithLongLong:pullStreamId]]; - return pullStreamId; - } - else - { - [NSException raise:@"Pull stream unavailable" format:@"Pull stream is only available macOS 15.0, iOS 18.0, tvOS 18.0 and visionOS 2.0 and higher."]; - } - return PHASEInvalidInstanceHandle; -} - -- (int64_t)createSoundEventSwitchNodeWithParameter:(int64_t)parameterId switchEntries:(NSDictionary*)switchEntries -{ - PHASEStringMetaParameterDefinition* param = - [mSoundEventMetaParameterDefinitions objectForKey:[NSNumber numberWithLongLong:parameterId]]; - if (param == nil) - { - [NSException raise:@"Parameter invalid" format:@"Failed to find switch parameter."]; - } - - PHASESwitchNodeDefinition* switchNode = [[PHASESwitchNodeDefinition alloc] initWithSwitchMetaParameterDefinition:param]; - if (switchNode == nil) - { - [NSException raise:@"Switch create failed" format:@"Failed to create switch node."]; - } - - for (id entry in switchEntries) - { - PHASESoundEventNodeDefinition* node = [mSoundEventNodeDefinitions objectForKey:[NSNumber numberWithLongLong:[entry longLongValue]]]; - if (node == nil) - { - [NSException raise:@"Switch create failed" format:@"Failed to create switch node."]; - } - [switchNode addSubtree:node switchValue:[switchEntries objectForKey:entry]]; - } - - const int64_t switchId = reinterpret_cast(switchNode); - [mSoundEventNodeDefinitions setObject:switchNode forKey:[NSNumber numberWithLongLong:switchId]]; - return switchId; -} - -- (int64_t)createSoundEventRandomNodeWithEntries:(NSDictionary*)randomEntries uniqueSelectionQueueLength:(int64_t)uniqueSelectionQueueLength -{ - PHASERandomNodeDefinition* randomNode = [[PHASERandomNodeDefinition alloc] init]; - if (randomNode == nil) - { - [NSException raise:@"Random create failed" format:@"Failed to create random node."]; - } - - for (id entry in randomEntries) - { - PHASERandomNodeDefinition* node = [mSoundEventNodeDefinitions objectForKey:[NSNumber numberWithLongLong:[entry longLongValue]]]; - if (node == nil) - { - [NSException raise:@"Random create failed" format:@"Failed to create random node."]; - } - NSNumber* weight = [randomEntries objectForKey:entry]; - [randomNode addSubtree:node weight:weight]; - } - - randomNode.uniqueSelectionQueueLength = uniqueSelectionQueueLength; - - const int64_t randomId = reinterpret_cast(randomNode); - [mSoundEventNodeDefinitions setObject:randomNode forKey:[NSNumber numberWithLongLong:randomId]]; - return randomId; -} - -- (int64_t)createSoundEventBlendNodeWithParameter:(int64_t)parameterId - blendRanges:(BlendNodeEntry*)blendRanges - numRanges:(uint32_t)numRanges - useAutoDistanceBlend:(bool)useAutoDistanceBlend -{ - PHASEBlendNodeDefinition* blendNode = nil; - if (useAutoDistanceBlend) - { - PHASESpatialMixerDefinition* mixer = [mSoundEventMixerDefinitions objectForKey:[NSNumber numberWithLongLong:parameterId]]; - - if (mixer == nil) - { - [NSException raise:@"Mixer invalid" format:@"Failed to find mixer for auto distance blending."]; - } - - blendNode = [[PHASEBlendNodeDefinition alloc] initDistanceBlendWithSpatialMixerDefinition:mixer]; - if (blendNode == nil) - { - [NSException raise:@"Blend create failed" format:@"Failed to create blend node."]; - } - } - else - { - PHASENumberMetaParameterDefinition* param = - [mSoundEventMetaParameterDefinitions objectForKey:[NSNumber numberWithLongLong:parameterId]]; - if (param == nil) - { - [NSException raise:@"Parameter invalid" format:@"Failed to find blend parameter."]; - } - - blendNode = [[PHASEBlendNodeDefinition alloc] initWithBlendMetaParameterDefinition:param]; - if (blendNode == nil) - { - [NSException raise:@"Blend create failed" format:@"Failed to create blend node."]; - } - } - - for (int rangeIdx = 0; rangeIdx < numRanges; ++rangeIdx) - { - const bool isLeftRange = (rangeIdx == 0); - const bool isRightRange = (rangeIdx == (numRanges - 1)); - - NSNumber* rangeNodeId = [NSNumber numberWithLongLong:blendRanges[rangeIdx].nodeId]; - PHASESoundEventNodeDefinition* rangeNode = [mSoundEventNodeDefinitions objectForKey:rangeNodeId]; - if (rangeNode == nil) - { - [NSException raise:@"Blend range create failed" format:@"Failed to create blend range node."]; - } - - if (isLeftRange) - { - [blendNode addRangeForInputValuesBelow:blendRanges[rangeIdx].highValue - fullGainAtValue:blendRanges[rangeIdx].fullGainAtHigh - fadeCurveType:PHASECurveTypeLinear - subtree:rangeNode]; - } - else if (isRightRange) - { - [blendNode addRangeForInputValuesAbove:blendRanges[rangeIdx].lowValue - fullGainAtValue:blendRanges[rangeIdx].fullGainAtLow - fadeCurveType:PHASECurveTypeLinear - subtree:rangeNode]; - } - else - { - [blendNode addRangeForInputValuesBetween:blendRanges[rangeIdx].lowValue - highValue:blendRanges[rangeIdx].fullGainAtHigh - fullGainAtLowValue:blendRanges[rangeIdx].fullGainAtLow - fullGainAtHighValue:blendRanges[rangeIdx].highValue - lowFadeCurveType:PHASECurveTypeLinear - highFadeCurveType:PHASECurveTypeLinear - subtree:rangeNode]; - } - } - - const int64_t blendId = reinterpret_cast(blendNode); - [mSoundEventNodeDefinitions setObject:blendNode forKey:[NSNumber numberWithLongLong:blendId]]; - return blendId; -} - -- (int64_t)createSoundEventContainerNodeWithChild:(int64_t*)childIds numChildren:(uint32_t)numChildren -{ - if (childIds == nil) - { - [NSException raise:@"child invalid" format:@"Failed to create Container Node with nil childIds."]; - } - if (numChildren <= 0) - { - [NSException raise:@"number of children invalid" format:@"Failed to create Container Node with invalid numChildren."]; - } - PHASEContainerNodeDefinition* containerNode = [[PHASEContainerNodeDefinition alloc] init]; - for (int i = 0; i < numChildren; i++) - { - NSNumber* nodeId = [NSNumber numberWithLongLong:childIds[i]]; - PHASESoundEventNodeDefinition* child = [mSoundEventNodeDefinitions objectForKey:nodeId]; - [containerNode addSubtree:child]; - } - const int64_t containerId = reinterpret_cast(containerNode); - [mSoundEventNodeDefinitions setObject:containerNode forKey:[NSNumber numberWithLongLong:containerId]]; - return containerId; -} - -- (void)destroySoundEventNodeWithId:(int64_t)nodeId -{ - [mSoundEventNodeDefinitions removeObjectForKey:[NSNumber numberWithLongLong:nodeId]]; -} - -- (BOOL)registerSoundEventWithName:(NSString*)name rootNodeId:(int64_t)rootNodeId -{ - // Create a sound event definition with the sampler node - PHASESoundEventNodeDefinition* rootNode = [mSoundEventNodeDefinitions objectForKey:[NSNumber numberWithLongLong:rootNodeId]]; - if (rootNode == nil) - { - NSLog(@"Phase Wrapper: Root node not found."); - return NO; - } - - // Register sound event - NSError* error = nil; - [mEngine.assetRegistry registerSoundEventAssetWithRootNode:rootNode identifier:name error:&error]; - if (error) - { - NSLog(@"Phase Wrapper: Failed to register sound event with error %@.", error); - return NO; - } - - return YES; -} - -- (void)unregisterSoundEventWithName:(NSString*)name -{ - [mEngine.assetRegistry unregisterAssetWithIdentifier:name - completion:^(bool success) { - if (!success) - { - NSLog(@"Phase Wrapper: Failed to unregister SoundEvent with name: %@", name); - } - }]; -} - -- (int64_t)playSoundEventWithName:(NSString*)name - sourceId:(int64_t)sourceId - mixerIds:(int64_t*)mixerIds - numMixers:(int64_t)numMixers - streamName:(nullable NSString*)streamName - renderBlock:(nullable PHASEPullStreamRenderBlock)renderBlock - completionHandlerBlock:(void (^_Nullable)(PHASESoundEventStartHandlerReason reason, int64_t sourceId, int64_t soundEventId))completionHandlerBlock -{ - PHASESource* source = [mSources objectForKey:[NSNumber numberWithLongLong:sourceId]]; - if (source == nil) - { - [NSException raise:@"Source invalid" format:@"Failed to find PHASE Source to play sound event on."]; - } - - PHASEMixerParameters* outMixerParameters = [[PHASEMixerParameters alloc] init]; - for (int i = 0; i < numMixers; i++) - { - PHASEMixerDefinition* mixer = [mSoundEventMixerDefinitions objectForKey:[NSNumber numberWithLongLong:mixerIds[i]]]; - if ([mixer isKindOfClass:[PHASESpatialMixerDefinition class]]) - { - [outMixerParameters addSpatialMixerParametersWithIdentifier:mixer.identifier - source:[mSources objectForKey:[NSNumber numberWithLongLong:sourceId]] - listener:mListener]; - } - else if ([mixer isKindOfClass:[PHASEAmbientMixerDefinition class]]) - { - [outMixerParameters addAmbientMixerParametersWithIdentifier:mixer.identifier listener:mListener]; - } - } - - PHASESoundEvent* soundEvent = nil; - NSError* error = nil; - if (numMixers == 0) - { - soundEvent = [[PHASESoundEvent alloc] initWithEngine:mEngine assetIdentifier:name error:&error]; - } - else - { - soundEvent = [[PHASESoundEvent alloc] initWithEngine:mEngine assetIdentifier:name mixerParameters:outMixerParameters error:&error]; - } - if (error != nil) - { - NSLog(@"Phase Wrapper: Error creating sound event: %@", name); - NSLog(@"%@", error); - } - if (soundEvent == nil) - { - [NSException raise:@"Sound event invalid." format:@"Failed to create sound event from sound event."]; - } - const int64_t soundEventId = reinterpret_cast(soundEvent); - - if (nil != streamName && nil != renderBlock) - { - if (@available(macOS 15.0, iOS 18.0, tvOS 18.0, visionOS 2.0, *)) { - soundEvent.pullStreamNodes[streamName].renderBlock = renderBlock; - } else { - NSLog(@"Phase Wrapper: Pull Stream is only available on macOS 15.0, iOS 18.0, tvOS 18.0 and visionOS 2.0 and higher."); - return PHASEInvalidInstanceHandle; - } - } - - [soundEvent startWithCompletion:^(PHASESoundEventStartHandlerReason reason) { - @synchronized(self->mSoundEvents) - { - if (completionHandlerBlock != nil) - { - completionHandlerBlock(reason, sourceId, soundEventId); - } - [self->mSoundEvents removeObjectForKey:[NSNumber numberWithLongLong:soundEventId]]; - - // Decrement the number of events referencing the sound event asset - self->mActiveSoundEventAssets[name] = [NSNumber numberWithInt:self->mActiveSoundEventAssets[name].intValue - 1]; - } - }]; - @synchronized(mSoundEvents) - { - [mSoundEvents setObject:soundEvent forKey:[NSNumber numberWithLongLong:soundEventId]]; - - // Increment the number of events referencing the sound event asset - mActiveSoundEventAssets[name] = [NSNumber numberWithInt:mActiveSoundEventAssets[name].intValue + 1]; - } - - return soundEventId; -} - -- (BOOL)stopSoundEventWithId:(int64_t)instanceId -{ - PHASESoundEvent* soundEvent = mSoundEvents[[NSNumber numberWithLongLong:instanceId]]; - if (soundEvent == nil) - { - return NO; - } - - [soundEvent stopAndInvalidate]; - return YES; -} - -- (BOOL)start -{ - // Start the engine - NSError* startErrorRef = [NSError alloc]; - BOOL startErrorRet = [mEngine startAndReturnError:&startErrorRef]; - if (!startErrorRet) - { - NSLog(@"Phase Wrapper: Failed to start PHASEEngine with error %@.", startErrorRef); - } - - return startErrorRet; -} - -- (void)pause -{ - [mEngine pause]; -} - -- (void)stop -{ - [mEngine stop]; -} - -- (void)update -{ - [mEngine update]; -} - -NS_HEADER_AUDIT_END(nullability) - -@end +// +// PHASEWrapper.mm +// AudioPluginPHASE +// +// Copyright © 2021, 2026 Apple Inc. +// + +#import +#import + +#include "PHASEWrapper.h" +#include + +// For UI application background notifications +#if !TARGET_OS_OSX +#include +#endif //!TARGET_OS_OSX + +NS_HEADER_AUDIT_BEGIN(nullability) + +@interface PHASEEngineWrapper () { + PHASEEngine* mEngine; + PHASEListener* mListener; + NSMutableDictionary* mSources; + NSMutableDictionary* mOccluders; + NSMutableDictionary* mSoundEvents; + NSMutableDictionary* mSuspendedSoundEvents; + NSMutableDictionary* mMaterials; + + // Keep track of the number of sound events playing a sound event asset + // For destruction purposes + NSMutableDictionary* mActiveSoundEventAssets; + + // For sound event programmatic creation + NSMutableDictionary* mSoundEventNodeDefinitions; + NSMutableDictionary* mSoundEventMixerDefinitions; + NSMutableDictionary* mSoundEventMetaParameterDefinitions; + NSMutableDictionary* mSoundEventMappedMetaParameterDefinitions; + +#if TARGET_OS_VISION + PHASEObject* mWorldRoot; +#endif +} + +@end + +@implementation PHASEEngineWrapper : NSObject + ++ (id)sharedInstance +{ + static PHASEEngineWrapper* wrapper = nil; + static std::once_flag onceFlag; + std::call_once(onceFlag, [&self]() { wrapper = [[self alloc] init]; }); + return wrapper; +} + +#if TARGET_OS_VISION +static BOOL sUseClientRenderingMode = NO; + ++ (void)setUseClientRenderingMode:(BOOL)enabled +{ + sUseClientRenderingMode = enabled; +} +#endif + +- (PHASEObject*)root +{ +#if TARGET_OS_VISION + return mWorldRoot; +#else + return mEngine.rootObject; +#endif +} + +- (BOOL)isInitialized +{ + return (nil != mEngine && nil != mListener && mEngine.renderingState == PHASERenderingStateStarted); +} + +#if !TARGET_OS_OSX +- (void)pauseSoundEvents +{ + NSLog(@"Phase Wrapper: Suspending sound events after application resign active notification"); + @synchronized(self->mSoundEvents) + { + // Go through all sound events and suspend / pause the ones that are playing. + for(id key in self->mSoundEvents) + { + PHASESoundEvent* soundevent = [self->mSoundEvents objectForKey:key]; + if ([soundevent renderingState] == PHASERenderingStateStarted) + { + [soundevent pause]; + self->mSuspendedSoundEvents[key] = soundevent; + } + + } + } +} + +- (void)resumeSoundEvents { + NSLog(@"Phase Wrapper: Resuming sound events after application active notification"); + @synchronized(self->mSoundEvents) + { + // Go through all sound events and resume the ones that were suspended. + for(id key in self->mSuspendedSoundEvents) + { + PHASESoundEvent* soundevent = [self->mSuspendedSoundEvents objectForKey:key]; + [soundevent resume]; + } + + // Remove all suspended sound events + [self->mSuspendedSoundEvents removeAllObjects]; + } +} + +- (void)setupAudioSession +{ + NSError* error = nil; + + // Configure the audio session + AVAudioSession *sessionInstance = [AVAudioSession sharedInstance]; + + // set the session category to ambient (implicitly sets the session to mix with others) + bool success = [sessionInstance setCategory:AVAudioSessionCategoryAmbient mode:AVAudioSessionModeDefault options:AVAudioSessionCategoryOptionMixWithOthers error:&error]; + if (!success) + { + NSLog(@"Phase Wrapper: Error setting AVAudioSession category! %@\n", [error localizedDescription]); + } + + // add AVAudioSession interruption handler + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(handleAudioSessionInterruption:) + name:AVAudioSessionInterruptionNotification + object:sessionInstance]; + + // add handler when application goes to the background + [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationWillResignActiveNotification object:nil queue:nil usingBlock:^(NSNotification *notification) + { + [self pauseSoundEvents]; + }]; + + // add handler when application returns from the background + [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification object:nil queue:nil usingBlock:^(NSNotification *notification) + { + [self resumeSoundEvents]; + }]; + + // For fully immersive scenes on visionOS the system automatically virtualizes the output from the window anchor so disable that behavior here. +#if TARGET_OS_VISION + if (!sUseClientRenderingMode) + { + [sessionInstance setIntendedSpatialExperience:AVAudioSessionSpatialExperienceBypassed options:nil error:nil]; + } +#endif + + // activate the audio session + success = [sessionInstance setActive:YES error:&error]; + if (!success) NSLog(@"Phase Wrapper: Error setting session active! %@\n", [error localizedDescription]); +} + +- (void)handleAudioSessionInterruption:(NSNotification *)notification +{ + UInt8 interruptionType = [[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] intValue]; + + NSLog(@"Phase Wrapper: Session interrupted > --- %s ---\n", interruptionType == AVAudioSessionInterruptionTypeBegan ? "Begin Interruption" : "End Interruption"); + + if (interruptionType == AVAudioSessionInterruptionTypeBegan) + { + [self pauseSoundEvents]; + } + + if (interruptionType == AVAudioSessionInterruptionTypeEnded) + { + [self resumeSoundEvents]; + } +} +#endif // !TARGET_OS_OSX + +- (id)init +{ + if (self = [super init]) + { +#if !TARGET_OS_OSX + // Setup the audio session + [self setupAudioSession]; +#endif //!TARGET_OS_OSX + + // Create engine +#if TARGET_OS_VISION + if (sUseClientRenderingMode) + { + if (@available(visionOS 26.0, *)) + { + mEngine = [[PHASEEngine alloc] initWithUpdateMode:PHASEUpdateModeManual renderingMode:PHASERenderingModeClient]; + } + } + else +#endif + { + mEngine = [[PHASEEngine alloc] initWithUpdateMode:PHASEUpdateModeManual]; + } + +#if TARGET_OS_VISION + // Single parent transform for all PHASE objects. + mWorldRoot = [[PHASEObject alloc] initWithEngine:mEngine]; + [mEngine.rootObject addChild:mWorldRoot error:nil]; +#endif + + // Create sources dictionary + mSources = [[NSMutableDictionary alloc] init]; + + // Create occluders dictionary + mOccluders = [[NSMutableDictionary alloc] init]; + + // Create sound events dictionary + mSoundEvents = [[NSMutableDictionary alloc] init]; + + // Create suspended sound events array + mSuspendedSoundEvents = [[NSMutableDictionary alloc] init]; + + // Create materials dictionary + mMaterials = [[NSMutableDictionary alloc] init]; + + // Create active sound event assets tracker dictionary + mActiveSoundEventAssets = [[NSMutableDictionary alloc] init]; + + // Create sound event nodes dictionary + mSoundEventNodeDefinitions = [[NSMutableDictionary alloc] init]; + + // Create sound event meta parameters dictionary + mSoundEventMetaParameterDefinitions = [[NSMutableDictionary alloc] init]; + + // Create mapped meta parameters dictionary + mSoundEventMappedMetaParameterDefinitions = [[NSMutableDictionary alloc] init]; + + // Create mixers dictionary + mSoundEventMixerDefinitions = [[NSMutableDictionary alloc] init]; + + // Set default preset + [mEngine setDefaultReverbPreset:PHASEReverbPresetMediumRoom]; + + [self createListener]; + + // On visionOS the default spatialization mode is channels since the system will auto virtualize the output. + // We've configured the audio session to bypass system spatialization so we can set the mode to binaural. +#if TARGET_OS_VISION + if (!sUseClientRenderingMode) + { + [mEngine setOutputSpatializationMode:PHASESpatializationModeAlwaysUseBinaural]; + } +#endif + + NSLog(@"Phase Wrapper: Engine created successfully."); + return self; + } + + return nil; +} + +#if TARGET_OS_VISION +- (BOOL)setWorldTransform:(simd_float4x4)worldTransform +{ + mWorldRoot.transform = worldTransform; + return YES; +} +#endif + +- (BOOL)createListener +{ + if (mListener != nil) + { + NSLog(@"Phase Wrapper: Listener already exists."); + return YES; + } + + // Create the listener object + mListener = [[PHASEListener alloc] initWithEngine:mEngine]; + if (mListener == nil) + { + NSLog(@"Phase Wrapper: Failed to create Listener."); + return NO; + } + + NSError* errorRef = nil; + const BOOL result = [[self root] addChild:mListener error:&errorRef]; + if (!result) + { + NSLog(@"Phase Wrapper: Failed to add listener to the scene %@.", errorRef); + return NO; + } + + NSLog(@"Phase Wrapper: Listener created successfully."); + return YES; +} + +- (BOOL)setListenerTransform:(simd_float4x4)listenerTransform +{ +#if TARGET_OS_VISION + if (!sUseClientRenderingMode) + { +#endif // TARGET_OS_VISION + if (mListener == nil) + { + NSLog(@"Phase Wrapper: Listener does not exist."); + return NO; + } + + mListener.transform = listenerTransform; +#if TARGET_OS_VISION + } +#endif // TARGET_OS_VISION + + return YES; +} + +- (BOOL)setListenerGain:(double)listenerGain +{ +#if TARGET_OS_VISION + if (!sUseClientRenderingMode) + { +#endif // TARGET_OS_VISION + if (mListener == nil) + { + NSLog(@"Phase Wrapper: Listener does not exist."); + return NO; + } + + mListener.gain = listenerGain; +#if TARGET_OS_VISION + } +#endif // TARGET_OS_VISION + + return YES; +} + +- (double)getListenerGain +{ + if (mListener == nil) + { + NSLog(@"Phase Wrapper: Listener does not exist."); + return 0.f; + } + + return mListener.gain; +} + +- (BOOL)setListenerHeadTracking:(BOOL)headTrackingEnabled +{ + if (mListener == nil) + { + NSLog(@"Phase Wrapper: Listener does not exist."); + return false; + } + +#if !TARGET_OS_VISION + if (@available(macOS 15.0, iOS 18.0, tvOS 18.0, *)) { + if (headTrackingEnabled) + { + mListener.automaticHeadTrackingFlags = PHASEAutomaticHeadTrackingFlagOrientation; + } + else + { + mListener.automaticHeadTrackingFlags = 0; + } + + return true; + } +#endif + + NSLog(@"Phase Wrapper: Listener head-tracking is only available as of MacOS 15.0, iOS 18.0, tvOS 18.0"); + return false; +} + +- (BOOL)destroyListener +{ + if (mListener == nil) + { + NSLog(@"Phase Wrapper: Listener does not exist."); + return NO; + } + + // Remove from the hierarchy + [[self root] removeChild:mListener]; + + mListener = nil; + + NSLog(@"Phase Wrapper: Listener destroyed successfully."); + return YES; +} + +- (int64_t)createSourceWithMesh:(MDLMesh*)mesh +{ + // Create the shape + PHASEShape* shape = [[PHASEShape alloc] initWithEngine:mEngine mesh:mesh]; + if (!shape) + { + [NSException raise:@"Phase Wrapper: Node invalid" format:@"Failed to create shape."]; + } + + // Create the source object + PHASESource* source = [[PHASESource alloc] initWithEngine:mEngine shapes:@[ shape ]]; + if (source == nil) + { + [NSException raise:@"Phase Wrapper: Source invalid" format:@"Failed to create source."]; + } + + NSError* errorRef = nil; + const BOOL result = [[self root] addChild:source error:&errorRef]; + if (!result) + { + [NSException raise:@"Phase Wrapper: Adding child error" format:@"Failed to add object to scene."]; + } + + const int64_t sourceId = reinterpret_cast(source); + [mSources setObject:source forKey:[NSNumber numberWithLongLong:sourceId]]; + + return sourceId; +} + +- (int64_t)createSource +{ + PHASESource* source = [[PHASESource alloc] initWithEngine:mEngine]; + if (source == nil) + { + [NSException raise:@"Phase Wrapper: Source invalid" format:@"Failed to create source."]; + } + + NSError* errorRef = nil; + const BOOL result = [[self root] addChild:source error:&errorRef]; + if (!result) + { + [NSException raise:@"Phase Wrapper: Adding child error" format:@"Failed to add object to scene."]; + } + + const int64_t sourceId = reinterpret_cast(source); + [mSources setObject:source forKey:[NSNumber numberWithLongLong:sourceId]]; + + return sourceId; +} + +- (BOOL)setSourceTransformWithId:(int64_t)sourceId transform:(simd_float4x4)transform +{ + PHASESource* source = [mSources objectForKey:[NSNumber numberWithLongLong:sourceId]]; + if (source == nil) + { + NSLog(@"Phase Wrapper: Failed to find PHASE Source to set transform on."); + return NO; + } + + source.transform = transform; + return YES; +} + +- (BOOL)setSourceGainWithId:(int64_t)sourceId sourceGain:(double)sourceGain +{ + PHASESource* source = [mSources objectForKey:[NSNumber numberWithLongLong:sourceId]]; + if (source == nil) + { + NSLog(@"Phase Wrapper: Failed to find PHASE Source to set gain on."); + return NO; + } + + source.gain = sourceGain; + return YES; +} + +- (double)getSourceGainWithId:(int64_t)sourceId +{ + PHASESource* source = [mSources objectForKey:[NSNumber numberWithLongLong:sourceId]]; + if (source == nil) + { + NSLog(@"Phase Wrapper: Failed to find PHASE Source to get gain for."); + return 0.f; + } + + return source.gain; +} + +- (void)destroySourceWithId:(int64_t)sourceId +{ + PHASESource* source = [mSources objectForKey:[NSNumber numberWithLongLong:sourceId]]; + if (source != nil) + { + // Remove from the hierarchy + [[self root] removeChild:source]; + + [mSources removeObjectForKey:[NSNumber numberWithLongLong:sourceId]]; + + source = nil; + } +} + +- (int64_t)createOccluderWithMesh:(MDLMesh*)mesh +{ + PHASEShape* shape = [[PHASEShape alloc] initWithEngine:mEngine mesh:mesh]; + if (!shape) + { + NSLog(@"Phase Wrapper: Failed to create shape for occluder."); + return PHASEInvalidInstanceHandle; + } + + PHASEOccluder* occluder = [[PHASEOccluder alloc] initWithEngine:mEngine shapes:@[ shape ]]; + if (occluder == nil) + { + NSLog(@"Phase Wrapper: Failed to create occluder."); + return PHASEInvalidInstanceHandle; + } + + NSError* errorRef = nil; + const BOOL result = [[self root] addChild:occluder error:&errorRef]; + if (!result) + { + NSLog(@"Phase Wrapper: Failed to add occluder to scene: %@", errorRef); + return PHASEInvalidInstanceHandle; + } + + const int64_t occluderId = reinterpret_cast(occluder); + [mOccluders setObject:occluder forKey:[NSNumber numberWithLongLong:occluderId]]; + + return occluderId; +} + +- (BOOL)setOccluderTransformWithId:(int64_t)occluderId transform:(simd_float4x4)transform +{ + PHASEOccluder* occluder = [mOccluders objectForKey:[NSNumber numberWithLongLong:occluderId]]; + if (occluder == nil) + { + return NO; + } + + occluder.transform = transform; + return YES; +} + +- (BOOL)setOccluderMaterialWithId:(int64_t)occluderId materialName:(NSString*)materialName +{ + PHASEOccluder* occluder = [mOccluders objectForKey:[NSNumber numberWithLongLong:occluderId]]; + if (occluder == nil) + { + return NO; + } + + PHASEMaterial* material = [mMaterials objectForKey:materialName]; + if (material == nil) + { + return NO; + } + + auto shapeElements = occluder.shapes[0].elements; + for (PHASEShapeElement* element : shapeElements) + { + element.material = material; + } + + return YES; +} + +- (void)destroyOccluderWithId:(int64_t)occluderId +{ + PHASEOccluder* occluder = [mOccluders objectForKey:[NSNumber numberWithLongLong:occluderId]]; + if (occluder != nil) + { + // Remove from the hierarchy + [[self root] removeChild:occluder]; + + [mOccluders removeObjectForKey:[NSNumber numberWithLongLong:occluderId]]; + + occluder = nil; + } +} + +- (BOOL)createMaterialWithName:(NSString*)name preset:(MaterialPreset)preset +{ + PHASEMaterialPreset phasePreset; + switch (preset) + { + case MaterialPresetCardboard: + phasePreset = PHASEMaterialPresetCardboard; + break; + case MaterialPresetGlass: + phasePreset = PHASEMaterialPresetGlass; + break; + case MaterialPresetBrick: + phasePreset = PHASEMaterialPresetBrick; + break; + case MaterialPresetConcrete: + phasePreset = PHASEMaterialPresetConcrete; + break; + case MaterialPresetDrywall: + phasePreset = PHASEMaterialPresetDrywall; + break; + case MaterialPresetWood: + phasePreset = PHASEMaterialPresetWood; + break; + } + + PHASEMaterial* material = [[PHASEMaterial alloc] initWithEngine:mEngine preset:phasePreset]; + + if (material == nil) + { + NSLog(@"Phase Wrapper: Failed to create material from preset."); + return NO; + } + [mMaterials setObject:material forKey:name]; + + return YES; +} + +- (void)destroyMaterialWithName:(NSString*)name +{ + [mMaterials removeObjectForKey:name]; +} + +- (void)setSceneReverbWithPreset:(PHASEReverbPreset)preset +{ + [mEngine setDefaultReverbPreset:preset]; +} + +- (void)setSceneReverbWithPresetIndex:(int)presetIndex +{ + PHASEReverbPreset preset; + switch (presetIndex) { + case 0: preset = PHASEReverbPresetNone; break; + case 1: preset = PHASEReverbPresetSmallRoom; break; + case 2: preset = PHASEReverbPresetMediumRoom; break; + case 3: preset = PHASEReverbPresetLargeRoom; break; + case 4: preset = PHASEReverbPresetLargeRoom2; break; + case 5: preset = PHASEReverbPresetMediumChamber; break; + case 6: preset = PHASEReverbPresetLargeChamber; break; + case 7: preset = PHASEReverbPresetMediumHall; break; + case 8: preset = PHASEReverbPresetMediumHall2; break; + case 9: preset = PHASEReverbPresetMediumHall3; break; + case 10: preset = PHASEReverbPresetLargeHall; break; + case 11: preset = PHASEReverbPresetCathedral; break; + default: + NSLog(@"Phase Wrapper: Warning: Invalid reverb preset index %d, defaulting to None", presetIndex); + preset = PHASEReverbPresetNone; + break; + } + [mEngine setDefaultReverbPreset:preset]; +} + +- (BOOL)registerAudioBufferWithData:(NSData*)data identifier:(NSString*)uid audioFormat:(AVAudioFormat*)audioFormat +{ + NSError* error = nil; + [mEngine.assetRegistry registerSoundAssetWithData:data + identifier:uid + format:audioFormat + normalizationMode:PHASENormalizationModeDynamic + error:&error]; + + // If we get PHASEAssetErrorAlreadyExists, just return YES. + if (error && error.code == PHASEAssetErrorAlreadyExists) + { + NSLog(@"Phase Wrapper: Asset %@ already registered with PHASE.", uid); + } else if (error) + { + NSLog(@"Phase Wrapper: Failed to register audio buffer with error %@.", error); + return NO; + } + + return YES; +} + +- (BOOL)registerAudioAssetWithURL:(NSURL*)url identifier:(NSString*)uid audioFormat:(AVAudioFormat*)audioFormat +{ + NSError* error = nil; + [mEngine.assetRegistry registerSoundAssetAtURL:url + identifier:uid + assetType:PHASEAssetTypeStreamed + channelLayout:audioFormat.channelLayout + normalizationMode:PHASENormalizationModeDynamic + error:&error]; + + if (error) + { + NSLog(@"Phase Wrapper: Failed to register audio asset with error %@.", error); + return NO; + } + + return YES; +} + +- (void)unregisterAudioBufferWithIdentifier:(NSString*)uid +{ + [mEngine.assetRegistry unregisterAssetWithIdentifier:uid completion:nil]; +} + +- (int64_t)createSpatialMixerWithName:(NSString*)mixerName + enableDirectPath:(BOOL)enableDirectPath + enableEarlyReflections:(BOOL)enableEarlyReflections + enableLateReverb:(BOOL)enableLateReverb + cullDistance:(double)cullDistance + rolloffFactor:(float)rolloffFactor + sourceDirectivityModelParameters:(DirectivityModelParameters)sourceDirectivityModelParameters + listenerDirectivityModelParameters:(DirectivityModelParameters)listenerDirectivityModelParameters +{ + PHASESpatialPipelineFlags spatialPipelineFlags = 0UL; + if (enableDirectPath) + { + spatialPipelineFlags |= PHASESpatialPipelineFlagDirectPathTransmission; + } + if (enableEarlyReflections) + { + spatialPipelineFlags |= PHASESpatialPipelineFlagEarlyReflections; + } + if (enableLateReverb) + { + spatialPipelineFlags |= PHASESpatialPipelineFlagLateReverb; + } + + PHASESpatialPipeline* spatialPipeline = [[PHASESpatialPipeline alloc] initWithFlags:spatialPipelineFlags]; + + if (enableDirectPath == YES) + { + PHASENumberMetaParameterDefinition* directPathSend = + [[PHASENumberMetaParameterDefinition alloc] initWithValue:1.0 identifier:[mixerName stringByAppendingString:@"DirectPathSend"]]; + spatialPipeline.entries[PHASESpatialCategoryDirectPathTransmission].sendLevel = 1.0; + spatialPipeline.entries[PHASESpatialCategoryDirectPathTransmission].sendLevelMetaParameterDefinition = directPathSend; + } + + if (enableEarlyReflections == YES) + { + PHASENumberMetaParameterDefinition* earlyReflectionsSend = + [[PHASENumberMetaParameterDefinition alloc] initWithValue:1.0 + identifier:[mixerName stringByAppendingString:@"EarlyReflectionsSend"]]; + spatialPipeline.entries[PHASESpatialCategoryEarlyReflections].sendLevelMetaParameterDefinition = earlyReflectionsSend; + } + + if (enableLateReverb == YES) + { + PHASENumberMetaParameterDefinition* lateReverbSend = + [[PHASENumberMetaParameterDefinition alloc] initWithValue:1.0 identifier:[mixerName stringByAppendingString:@"LateReverbSend"]]; + spatialPipeline.entries[PHASESpatialCategoryLateReverb].sendLevelMetaParameterDefinition = lateReverbSend; + } + + // Create geometric distance model. + PHASEGeometricSpreadingDistanceModelParameters* geometricSpreadingDistanceModelParameters = + [[PHASEGeometricSpreadingDistanceModelParameters alloc] init]; + geometricSpreadingDistanceModelParameters.rolloffFactor = rolloffFactor; + + // Create distance model fade if we have fades + if (cullDistance > 0.0f) + { + PHASEDistanceModelFadeOutParameters* distanceModelFadeOutParameters = + [[PHASEDistanceModelFadeOutParameters alloc] initWithCullDistance:cullDistance]; + + // Set fade out model on geometric distance model + geometricSpreadingDistanceModelParameters.fadeOutParameters = distanceModelFadeOutParameters; + } + + // Create spatial mixer + PHASESpatialMixerDefinition* spatialMixer = [[PHASESpatialMixerDefinition alloc] initWithSpatialPipeline:spatialPipeline + identifier:mixerName]; + // Attach distance model parameters to the mixer + spatialMixer.distanceModelParameters = geometricSpreadingDistanceModelParameters; + + // Create Source Directivity Models if they exist + switch (sourceDirectivityModelParameters.directivityType) + { + case Cardioid: { + NSMutableArray* subbands = [[NSMutableArray alloc] init]; + for (int i = 0; i < sourceDirectivityModelParameters.subbandCount; i++) + { + // Set subband parameters + PHASECardioidDirectivityModelSubbandParameters* cardioidSubbandParameters = + [[PHASECardioidDirectivityModelSubbandParameters alloc] init]; + + cardioidSubbandParameters.frequency = sourceDirectivityModelParameters.subbandParameters[i].frequency; + cardioidSubbandParameters.pattern = sourceDirectivityModelParameters.subbandParameters[i].pattern; + cardioidSubbandParameters.sharpness = sourceDirectivityModelParameters.subbandParameters[i].sharpness; + + [subbands addObject:cardioidSubbandParameters]; + } + PHASECardioidDirectivityModelParameters* cardioidDirectivityModel = + [[PHASECardioidDirectivityModelParameters alloc] initWithSubbandParameters:subbands]; + + // Attach source directivity model + spatialMixer.sourceDirectivityModelParameters = cardioidDirectivityModel; + break; + } + case Cone: { + NSMutableArray* subbands = [[NSMutableArray alloc] init]; + for (int i = 0; i < sourceDirectivityModelParameters.subbandCount; i++) + { + // Set subband parameters + PHASEConeDirectivityModelSubbandParameters* coneSubbandParameters = + [[PHASEConeDirectivityModelSubbandParameters alloc] init]; + + coneSubbandParameters.frequency = sourceDirectivityModelParameters.subbandParameters[i].frequency; + [coneSubbandParameters setInnerAngle:sourceDirectivityModelParameters.subbandParameters[i].innerAngle + outerAngle:sourceDirectivityModelParameters.subbandParameters[i].outerAngle]; + coneSubbandParameters.outerGain = sourceDirectivityModelParameters.subbandParameters[i].outerGain; + + [subbands addObject:coneSubbandParameters]; + } + PHASEConeDirectivityModelParameters* coneDirectivityModel = + [[PHASEConeDirectivityModelParameters alloc] initWithSubbandParameters:subbands]; + // Attach source directivity model + spatialMixer.sourceDirectivityModelParameters = coneDirectivityModel; + break; + } + case None: + break; + } + + // Create Listener Directivity Models if they exist + switch (listenerDirectivityModelParameters.directivityType) + { + case Cardioid: { + NSMutableArray* subbands = [[NSMutableArray alloc] init]; + for (int i = 0; i < listenerDirectivityModelParameters.subbandCount; i++) + { + // Set subband parameters + PHASECardioidDirectivityModelSubbandParameters* cardioidSubbandParameters = + [[PHASECardioidDirectivityModelSubbandParameters alloc] init]; + + cardioidSubbandParameters.frequency = listenerDirectivityModelParameters.subbandParameters[i].frequency; + cardioidSubbandParameters.pattern = listenerDirectivityModelParameters.subbandParameters[i].pattern; + cardioidSubbandParameters.sharpness = listenerDirectivityModelParameters.subbandParameters[i].sharpness; + + [subbands addObject:cardioidSubbandParameters]; + } + + PHASECardioidDirectivityModelParameters* cardioidDirectivityModel = + [[PHASECardioidDirectivityModelParameters alloc] initWithSubbandParameters:subbands]; + // Attach listener directivity model + spatialMixer.listenerDirectivityModelParameters = cardioidDirectivityModel; + break; + } + case Cone: { + + NSMutableArray* subbands = [[NSMutableArray alloc] init]; + for (int i = 0; i < listenerDirectivityModelParameters.subbandCount; i++) + { + // Set subband parameters + PHASEConeDirectivityModelSubbandParameters* coneSubbandParameters = + [[PHASEConeDirectivityModelSubbandParameters alloc] init]; + + coneSubbandParameters.frequency = listenerDirectivityModelParameters.subbandParameters[i].frequency; + [coneSubbandParameters setInnerAngle:listenerDirectivityModelParameters.subbandParameters[i].innerAngle + outerAngle:listenerDirectivityModelParameters.subbandParameters[i].outerAngle]; + coneSubbandParameters.outerGain = listenerDirectivityModelParameters.subbandParameters[i].outerGain; + + + [subbands addObject:coneSubbandParameters]; + } + + PHASEConeDirectivityModelParameters* coneDirectivityModel = + [[PHASEConeDirectivityModelParameters alloc] initWithSubbandParameters:subbands]; + // Attach listener directivity model + spatialMixer.listenerDirectivityModelParameters = coneDirectivityModel; + break; + } + case None: + break; + } + + const int64_t mixerId = reinterpret_cast(spatialMixer); + [mSoundEventMixerDefinitions setObject:spatialMixer forKey:[NSNumber numberWithLongLong:mixerId]]; + return mixerId; +} + ++ (AudioChannelLayoutTag)getChannelLayoutTag:(ChannelLayoutType)channelLayout +{ + AudioChannelLayoutTag layoutTag; + switch (channelLayout) + { + case ChannelLayoutTypeMono: + layoutTag = kAudioChannelLayoutTag_Mono; + break; + case ChannelLayoutTypeStereo: + layoutTag = kAudioChannelLayoutTag_Stereo; + break; + case ChannelLayoutTypeFiveOne: + layoutTag = kAudioChannelLayoutTag_MPEG_5_1_B; + break; + case ChannelLayoutTypeSevenOne: + layoutTag = kAudioChannelLayoutTag_MPEG_7_1_B; + break; + default: + NSLog(@"Phase Wrapper: Failed to get channel layout tag for unsuported channel layout."); + } + return layoutTag; +} + +- (int64_t)createChannelMixerWithName:(NSString*)mixerName channelLayout:(ChannelLayoutType)channelLayout +{ + AudioChannelLayoutTag layoutTag = [PHASEEngineWrapper getChannelLayoutTag:channelLayout]; + AVAudioChannelLayout* layout = [[AVAudioChannelLayout alloc] initWithLayoutTag:layoutTag]; + PHASEChannelMixerDefinition* channelMixer = [[PHASEChannelMixerDefinition alloc] initWithChannelLayout:layout]; + const int64_t mixerId = reinterpret_cast(channelMixer); + [mSoundEventMixerDefinitions setObject:channelMixer forKey:[NSNumber numberWithLongLong:mixerId]]; + return mixerId; +} + +- (int64_t)createAmbientMixerWithName:(NSString*)mixerName + channelLayout:(ChannelLayoutType)channelLayout + orientation:(Quaternion)orientation +{ + AudioChannelLayoutTag layoutTag = [PHASEEngineWrapper getChannelLayoutTag:channelLayout]; + AVAudioChannelLayout* layout = [[AVAudioChannelLayout alloc] initWithLayoutTag:layoutTag]; + simd_quatf quat = simd_quaternion(orientation.x, orientation.y, orientation.z, orientation.w); + PHASEAmbientMixerDefinition* ambientMixer = [[PHASEAmbientMixerDefinition alloc] initWithChannelLayout:layout + orientation:quat + identifier:mixerName]; + const int64_t mixerId = reinterpret_cast(ambientMixer); + [mSoundEventMixerDefinitions setObject:ambientMixer forKey:[NSNumber numberWithLongLong:mixerId]]; + return mixerId; +} + +- (void)destroyMixerWithId:(int64_t)mixerId +{ + [mSoundEventMixerDefinitions removeObjectForKey:[NSNumber numberWithLongLong:mixerId]]; +} + +- (int64_t)createMetaParameterWithName:(NSString*)name defaultIntValue:(int)defaultIntValue minimumValue:(int)minimumValue maximumValue:(int)maximumValue +{ + PHASENumberMetaParameterDefinition* param = [[PHASENumberMetaParameterDefinition alloc] initWithValue:defaultIntValue minimum:minimumValue maximum:maximumValue identifier:name]; + + if (param != nil) + { + const int64_t paramId = reinterpret_cast(param); + [mSoundEventMetaParameterDefinitions setObject:param forKey:[NSNumber numberWithLongLong:paramId]]; + return paramId; + } + + return PHASEInvalidInstanceHandle; +} + +- (int)getMetaParameterIntValueWithId:(int64_t)instanceId parameterName:(NSString*)parameterName +{ + PHASESoundEvent* soundEvent = mSoundEvents[[NSNumber numberWithLongLong:instanceId]]; + if (soundEvent == nil) + { + NSLog(@"Phase Wrapper: Error: Failed to retrieve sound event associated with instance %@. Unable to get value for parameter %@", [NSNumber numberWithLongLong: instanceId], parameterName); + return 0; + } + + if (soundEvent.metaParameters[parameterName] == nil) + { + NSLog(@"Phase Wrapper: Error: Failed to retrieve meta parameter from sound event associated with instance %@. Unable to get value for parameter %@.", [NSNumber numberWithLongLong: instanceId], parameterName); + return 0; + } + + if ([soundEvent.metaParameters[parameterName] isKindOfClass:[PHASENumberMetaParameter class]]) + { + return [soundEvent.metaParameters[parameterName].value intValue]; + } + else + { + NSLog(@"Phase Wrapper: Warning: PHASE API misuse, cannot get class %@ with value of type int.", + [soundEvent.metaParameters[parameterName] class]); + return 0; + } +} + +- (BOOL)setMetaParameterWithId:(int64_t)instanceId parameterName:(NSString*)parameterName intValue:(int)intValue +{ + PHASESoundEvent* soundEvent = mSoundEvents[[NSNumber numberWithLongLong:instanceId]]; + if (soundEvent == nil || soundEvent.metaParameters[parameterName] == nil) + { + return NO; + } + + if ([soundEvent.metaParameters[parameterName] isKindOfClass:[PHASENumberMetaParameter class]]) + { + PHASENumberMetaParameter* param = (PHASENumberMetaParameter*)soundEvent.metaParameters[parameterName]; + if (intValue < param.minimum || intValue > param.maximum) + { + NSLog(@"Phase Wrapper: Warning: Failed to set value of meta parameter %@ to %@. Value is out of its min/max range of [%@,%@] and will be clamped", parameterName, [NSNumber numberWithInt:intValue], [NSNumber numberWithInt:param.minimum], + [NSNumber numberWithInt:param.maximum]); + } + + param.value = [NSNumber numberWithInt:intValue]; + return YES; + } + else + { + NSLog(@"Phase Wrapper: Warning: PHASE API misuse, cannot set class %@ with value of type int.", + [soundEvent.metaParameters[parameterName] class]); + return NO; + } + + +} + +- (int64_t)createMetaParameterWithName:(NSString*)name defaultDblValue:(double)defaultDblValue minimumValue:(double)minimumValue maximumValue:(double)maximumValue +{ + PHASENumberMetaParameterDefinition* param = [[PHASENumberMetaParameterDefinition alloc] initWithValue:defaultDblValue minimum:minimumValue maximum:maximumValue identifier:name]; + + if (param != nil) + { + const int64_t paramId = reinterpret_cast(param); + [mSoundEventMetaParameterDefinitions setObject:param forKey:[NSNumber numberWithLongLong:paramId]]; + return paramId; + } + + return PHASEInvalidInstanceHandle; +} + +- (double)getMetaParameterDblValueWithId:(int64_t)instanceId parameterName:(NSString*)parameterName +{ + PHASESoundEvent* soundEvent = mSoundEvents[[NSNumber numberWithLongLong:instanceId]]; + if (soundEvent == nil) + { + NSLog(@"Phase Wrapper: Error: Failed to retrieve sound event associated with instance %@. Unable to get value for parameter %@", [NSNumber numberWithLongLong: instanceId], parameterName); + return 0; + } + + if (soundEvent.metaParameters[parameterName] == nil) + { + NSLog(@"Phase Wrapper: Error: Failed to retrieve meta parameter from sound event associated with instance %@. Unable to get value for parameter %@.", [NSNumber numberWithLongLong: instanceId], parameterName); + return 0; + } + + if ([soundEvent.metaParameters[parameterName] isKindOfClass:[PHASENumberMetaParameter class]]) + { + return [soundEvent.metaParameters[parameterName].value doubleValue]; + } + else + { + NSLog(@"Phase Wrapper: Warning: PHASE API misuse, cannot get class %@ with value of type int.", + [soundEvent.metaParameters[parameterName] class]); + return 0; + } +} + +- (BOOL)setMetaParameterWithId:(int64_t)instanceId parameterName:(NSString*)parameterName doubleValue:(double)doubleValue +{ + PHASESoundEvent* soundEvent = mSoundEvents[[NSNumber numberWithLongLong:instanceId]]; + if (soundEvent == nil || soundEvent.metaParameters[parameterName] == nil) + { + return NO; + } + + if ([soundEvent.metaParameters[parameterName] isKindOfClass:[PHASENumberMetaParameter class]]) + { + PHASENumberMetaParameter* param = (PHASENumberMetaParameter*)soundEvent.metaParameters[parameterName]; + if (doubleValue < param.minimum || doubleValue > param.maximum) + { + NSLog(@"Phase Wrapper: Warning: Failed to set value of meta parameter %@ to %@. Value is out of its min/max range of [%@,%@] and will be clamped.", parameterName, [NSNumber numberWithDouble:doubleValue], [NSNumber numberWithDouble: param.minimum], + [NSNumber numberWithDouble:param.maximum]); + } + + param.value = [NSNumber numberWithDouble:doubleValue]; + return YES; + } + else + { + NSLog(@"Phase Wrapper: Warning: PHASE API misuse, cannot set class %@ with value of type double.", + [soundEvent.metaParameters[parameterName] class]); + return NO; + } +} + +- (int64_t)createMetaParameterWithName:(NSString*)name defaultStrValue:(NSString*)defaultStrValue +{ + PHASEStringMetaParameterDefinition* param = [[PHASEStringMetaParameterDefinition alloc] initWithValue:defaultStrValue identifier:name]; + + if (param != nil) + { + const int64_t paramId = reinterpret_cast(param); + [mSoundEventMetaParameterDefinitions setObject:param forKey:[NSNumber numberWithLongLong:paramId]]; + return paramId; + } + + return PHASEInvalidInstanceHandle; +} + +- (NSString*)getMetaParameterStrValueWithId:(int64_t)instanceId parameterName:(NSString*)parameterName +{ + PHASESoundEvent* soundEvent = mSoundEvents[[NSNumber numberWithLongLong:instanceId]]; + if (soundEvent == nil) + { + NSLog(@"Phase Wrapper: Error: Failed to retrieve sound event associated with instance %@. Unable to get value for parameter %@", [NSNumber numberWithLongLong: instanceId], parameterName); + return nil; + } + + if (soundEvent.metaParameters[parameterName] == nil) + { + NSLog(@"Phase Wrapper: Error: Failed to retrieve meta parameter from sound event associated with instance %@. Unable to get value for parameter %@.", [NSNumber numberWithLongLong: instanceId], parameterName); + return nil; + } + + if ([soundEvent.metaParameters[parameterName] isKindOfClass:[PHASEStringMetaParameter class]]) + { + return soundEvent.metaParameters[parameterName].value; + } + else + { + NSLog(@"Phase Wrapper: Warning: PHASE API misuse, cannot get class %@ with value of type string.", + [soundEvent.metaParameters[parameterName] class]); + return nil; + } +} + +- (BOOL)setMetaParameterWithId:(int64_t)instanceId parameterName:(NSString*)parameterName stringValue:(NSString*)stringValue; +{ + PHASESoundEvent* soundEvent = mSoundEvents[[NSNumber numberWithLongLong:instanceId]]; + if (soundEvent == nil || soundEvent.metaParameters[parameterName] == nil) + { + return NO; + } + + if ([soundEvent.metaParameters[parameterName] isKindOfClass:[PHASEStringMetaParameter class]]) + { + soundEvent.metaParameters[parameterName].value = stringValue; + return YES; + } + else + { + NSLog(@"Phase Wrapper: Warning: PHASE API misuse, cannot set class %@ with value of type string.", + [soundEvent.metaParameters[parameterName] class]); + return NO; + } +} + +- (void)destroyMetaParameterWithId:(int64_t)parameterId +{ + [mSoundEventMetaParameterDefinitions removeObjectForKey:[NSNumber numberWithLongLong:parameterId]]; +} + +- (BOOL)setMixerGainParameterOnMixerWithId:(int64_t)parameterId mixerId:(int64_t)mixerId +{ + PHASENumberMetaParameterDefinition* gainMetaParameter = + [mSoundEventMetaParameterDefinitions objectForKey:[NSNumber numberWithLongLong:parameterId]]; + + if (gainMetaParameter == nil) + { + NSLog(@"Phase Wrapper: Error: Failed to retrieve parameter with id %@, unable to set the parameter on the mixer with id %@.", + [NSNumber numberWithLongLong:parameterId], [NSNumber numberWithLongLong:mixerId]); + return NO; + } + + // Find the mixer + PHASEMixerDefinition* mixer = [mSoundEventMixerDefinitions objectForKey:[NSNumber numberWithLongLong:mixerId]]; + if (mixer == nil) + { + NSLog(@"Phase Wrapper: Error: Failed to retrieve mixer with id %@, unable to set parameter with id %@ on the mixer.", + [NSNumber numberWithLongLong:mixerId], [NSNumber numberWithLongLong:parameterId]); + return NO; + } + + mixer.gainMetaParameterDefinition = gainMetaParameter; + return YES; +} + +- (int64_t)createMappedMetaParameterWithParameterId:(int64_t)parameterId envelopeParameters:(EnvelopeParameters)envelopeParameters +{ + // Create Envelope + NSMutableArray* envelopeSegments = [NSMutableArray new]; + for (int i = 0; i < envelopeParameters.segmentCount; i++) + { + enum PHASECurveType type; + switch (envelopeParameters.envelopeSegments[i].curveType) + { + case EnvelopeCurveTypeLinear: + type = PHASECurveTypeLinear; + break; + case EnvelopeCurveTypeSquared: + type = PHASECurveTypeSquared; + break; + case EnvelopeCurveTypeInverseSquared: + type = PHASECurveTypeInverseSquared; + break; + case EnvelopeCurveTypeCubed: + type = PHASECurveTypeCubed; + break; + case EnvelopeCurveTypeInverseCubed: + type = PHASECurveTypeInverseCubed; + break; + case EnvelopeCurveTypeSine: + type = PHASECurveTypeSine; + break; + case EnvelopeCurveTypeInverseSine: + type = PHASECurveTypeInverseSine; + break; + case EnvelopeCurveTypeSigmoid: + type = PHASECurveTypeSigmoid; + break; + case EnvelopeCurveTypeInverseSigmoid: + type = PHASECurveTypeInverseSigmoid; + break; + } + PHASEEnvelopeSegment* segment = [[PHASEEnvelopeSegment alloc] + initWithEndPoint:simd_make_double2(envelopeParameters.envelopeSegments[i].x, envelopeParameters.envelopeSegments[i].y) + curveType:type]; + [envelopeSegments addObject:segment]; + } + PHASEEnvelope* envelope = [[PHASEEnvelope alloc] initWithStartPoint:simd_make_double2(envelopeParameters.x, envelopeParameters.y) + segments:envelopeSegments]; + + PHASENumberMetaParameterDefinition* metaParameter = + [mSoundEventMetaParameterDefinitions objectForKey:[NSNumber numberWithLongLong:parameterId]]; + PHASEMappedMetaParameterDefinition* mappedMetaParameter = + [[PHASEMappedMetaParameterDefinition alloc] initWithInputMetaParameterDefinition:metaParameter envelope:envelope]; + + const int64_t mappedMetaParamId = reinterpret_cast(mappedMetaParameter); + [mSoundEventMetaParameterDefinitions setObject:mappedMetaParameter forKey:[NSNumber numberWithLongLong:mappedMetaParamId]]; + return mappedMetaParamId; +} + +- (void)destroyMappedMetaParameterWithId:(int64_t)parameterId +{ + [mSoundEventMetaParameterDefinitions removeObjectForKey:[NSNumber numberWithLongLong:parameterId]]; +} + +- (int64_t)createSoundEventSamplerNodeWithAsset:(NSString*)assetName + mixerId:(int64_t)mixerId + rateParameterId:(int64_t)rateParameterId + looping:(BOOL)looping + calibrationMode:(CalibrationMode)calibrationMode + level:(double)level +{ + // Find the mixer + PHASEMixerDefinition* mixer = [mSoundEventMixerDefinitions objectForKey:[NSNumber numberWithLongLong:mixerId]]; + if (mixer == nil) + { + [NSException raise:@"Mixer invalid" format:@"Failed to create sampler node."]; + } + + // Create sampler + PHASESamplerNodeDefinition* sampler = [[PHASESamplerNodeDefinition alloc] initWithSoundAssetIdentifier:assetName + mixerDefinition:mixer]; + sampler.rate = 1; + sampler.cullOption = PHASECullOptionSleepWakeAtRealtimeOffset; + sampler.playbackMode = looping ? PHASEPlaybackModeLooping : PHASEPlaybackModeOneShot; + + PHASECalibrationMode outCalibrationMode; + switch (calibrationMode) + { + case CalibrationModeNone: + outCalibrationMode = PHASECalibrationModeNone; + break; + case CalibrationModeAbsoluteSpl: + outCalibrationMode = PHASECalibrationModeAbsoluteSpl; + break; + case CalibrationModeRelativeSpl: + outCalibrationMode = PHASECalibrationModeRelativeSpl; + break; + } + [sampler setCalibrationMode:outCalibrationMode level:level]; + + const int64_t samplerId = reinterpret_cast(sampler); + if (rateParameterId != PHASEInvalidInstanceHandle) + { + PHASENumberMetaParameterDefinition* rateMetaParameter = + [mSoundEventMetaParameterDefinitions objectForKey:[NSNumber numberWithLongLong:rateParameterId]]; + if (rateMetaParameter == nil) + { + NSLog(@"Phase Wrapper: Error: Failed to retrieve rate parameter with id %@, unable to set the parameter on the sampler with id %@.", + [NSNumber numberWithLongLong:rateParameterId], [NSNumber numberWithLongLong: samplerId]); + } + else + { + sampler.rate = [rateMetaParameter.value floatValue]; + sampler.rateMetaParameterDefinition = rateMetaParameter; + } + } + + [mSoundEventNodeDefinitions setObject:sampler forKey:[NSNumber numberWithLongLong:samplerId]]; + return samplerId; +} + +- (int64_t)createSoundEventPullStreamNodeWithAsset:(NSString*)assetName + mixerId:(int64_t)mixerId + format:(AVAudioFormat*)format + calibrationMode:(CalibrationMode)calibrationMode + level:(double)level +{ + if (@available(macOS 15.0, iOS 18.0, tvOS 18.0, visionOS 2.0, *)) { + // Find the mixer + PHASEMixerDefinition* mixer = [mSoundEventMixerDefinitions objectForKey:[NSNumber numberWithLongLong:mixerId]]; + if (mixer == nil) + { + [NSException raise:@"Mixer invalid" format:@"Failed to create pull stream node."]; + } + + // Create the pull stream + PHASEPullStreamNodeDefinition* pullStream = [[PHASEPullStreamNodeDefinition alloc] initWithMixerDefinition:mixer format:format identifier:assetName]; + pullStream.rate = 1; + + PHASECalibrationMode outCalibrationMode; + switch (calibrationMode) + { + case CalibrationModeNone: + outCalibrationMode = PHASECalibrationModeNone; + break; + case CalibrationModeAbsoluteSpl: + outCalibrationMode = PHASECalibrationModeAbsoluteSpl; + break; + case CalibrationModeRelativeSpl: + outCalibrationMode = PHASECalibrationModeRelativeSpl; + break; + } + [pullStream setCalibrationMode:outCalibrationMode level:level]; + + const int64_t pullStreamId = reinterpret_cast(pullStream); + [mSoundEventNodeDefinitions setObject:pullStream forKey:[NSNumber numberWithLongLong:pullStreamId]]; + return pullStreamId; + } + else + { + [NSException raise:@"Pull stream unavailable" format:@"Pull stream is only available macOS 15.0 and higher."]; + } + return PHASEInvalidInstanceHandle; +} + +- (int64_t)createSoundEventSwitchNodeWithParameter:(int64_t)parameterId switchEntries:(NSDictionary*)switchEntries +{ + PHASEStringMetaParameterDefinition* param = + [mSoundEventMetaParameterDefinitions objectForKey:[NSNumber numberWithLongLong:parameterId]]; + if (param == nil) + { + [NSException raise:@"Parameter invalid" format:@"Failed to find switch parameter."]; + } + + PHASESwitchNodeDefinition* switchNode = [[PHASESwitchNodeDefinition alloc] initWithSwitchMetaParameterDefinition:param]; + if (switchNode == nil) + { + [NSException raise:@"Switch create failed" format:@"Failed to create switch node."]; + } + + for (id entry in switchEntries) + { + PHASESoundEventNodeDefinition* node = [mSoundEventNodeDefinitions objectForKey:[NSNumber numberWithLongLong:[entry longLongValue]]]; + if (node == nil) + { + [NSException raise:@"Switch create failed" format:@"Failed to create switch node."]; + } + [switchNode addSubtree:node switchValue:[switchEntries objectForKey:entry]]; + } + + const int64_t switchId = reinterpret_cast(switchNode); + [mSoundEventNodeDefinitions setObject:switchNode forKey:[NSNumber numberWithLongLong:switchId]]; + return switchId; +} + +- (int64_t)createSoundEventRandomNodeWithEntries:(NSDictionary*)randomEntries uniqueSelectionQueueLength:(int64_t)uniqueSelectionQueueLength +{ + PHASERandomNodeDefinition* randomNode = [[PHASERandomNodeDefinition alloc] init]; + if (randomNode == nil) + { + [NSException raise:@"Random create failed" format:@"Failed to create random node."]; + } + + for (id entry in randomEntries) + { + PHASERandomNodeDefinition* node = [mSoundEventNodeDefinitions objectForKey:[NSNumber numberWithLongLong:[entry longLongValue]]]; + if (node == nil) + { + [NSException raise:@"Random create failed" format:@"Failed to create random node."]; + } + NSNumber* weight = [randomEntries objectForKey:entry]; + [randomNode addSubtree:node weight:weight]; + } + + randomNode.uniqueSelectionQueueLength = uniqueSelectionQueueLength; + + const int64_t randomId = reinterpret_cast(randomNode); + [mSoundEventNodeDefinitions setObject:randomNode forKey:[NSNumber numberWithLongLong:randomId]]; + return randomId; +} + +- (int64_t)createSoundEventBlendNodeWithParameter:(int64_t)parameterId + blendRanges:(BlendNodeEntry*)blendRanges + numRanges:(uint32_t)numRanges + useAutoDistanceBlend:(bool)useAutoDistanceBlend +{ + PHASEBlendNodeDefinition* blendNode = nil; + if (useAutoDistanceBlend) + { + PHASESpatialMixerDefinition* mixer = [mSoundEventMixerDefinitions objectForKey:[NSNumber numberWithLongLong:parameterId]]; + + if (mixer == nil) + { + [NSException raise:@"Mixer invalid" format:@"Failed to find mixer for auto distance blending."]; + } + + blendNode = [[PHASEBlendNodeDefinition alloc] initDistanceBlendWithSpatialMixerDefinition:mixer]; + if (blendNode == nil) + { + [NSException raise:@"Blend create failed" format:@"Failed to create blend node."]; + } + } + else + { + PHASENumberMetaParameterDefinition* param = + [mSoundEventMetaParameterDefinitions objectForKey:[NSNumber numberWithLongLong:parameterId]]; + if (param == nil) + { + [NSException raise:@"Parameter invalid" format:@"Failed to find blend parameter."]; + } + + blendNode = [[PHASEBlendNodeDefinition alloc] initWithBlendMetaParameterDefinition:param]; + if (blendNode == nil) + { + [NSException raise:@"Blend create failed" format:@"Failed to create blend node."]; + } + } + + for (int rangeIdx = 0; rangeIdx < numRanges; ++rangeIdx) + { + const bool isLeftRange = (rangeIdx == 0); + const bool isRightRange = (rangeIdx == (numRanges - 1)); + + NSNumber* rangeNodeId = [NSNumber numberWithLongLong:blendRanges[rangeIdx].nodeId]; + PHASESoundEventNodeDefinition* rangeNode = [mSoundEventNodeDefinitions objectForKey:rangeNodeId]; + if (rangeNode == nil) + { + [NSException raise:@"Blend range create failed" format:@"Failed to create blend range node."]; + } + + if (isLeftRange) + { + [blendNode addRangeForInputValuesBelow:blendRanges[rangeIdx].highValue + fullGainAtValue:blendRanges[rangeIdx].fullGainAtHigh + fadeCurveType:PHASECurveTypeLinear + subtree:rangeNode]; + } + else if (isRightRange) + { + [blendNode addRangeForInputValuesAbove:blendRanges[rangeIdx].lowValue + fullGainAtValue:blendRanges[rangeIdx].fullGainAtLow + fadeCurveType:PHASECurveTypeLinear + subtree:rangeNode]; + } + else + { + [blendNode addRangeForInputValuesBetween:blendRanges[rangeIdx].lowValue + highValue:blendRanges[rangeIdx].fullGainAtHigh + fullGainAtLowValue:blendRanges[rangeIdx].fullGainAtLow + fullGainAtHighValue:blendRanges[rangeIdx].highValue + lowFadeCurveType:PHASECurveTypeLinear + highFadeCurveType:PHASECurveTypeLinear + subtree:rangeNode]; + } + } + + const int64_t blendId = reinterpret_cast(blendNode); + [mSoundEventNodeDefinitions setObject:blendNode forKey:[NSNumber numberWithLongLong:blendId]]; + return blendId; +} + +- (int64_t)createSoundEventContainerNodeWithChild:(int64_t*)childIds numChildren:(uint32_t)numChildren +{ + if (childIds == nil) + { + [NSException raise:@"child invalid" format:@"Failed to create Container Node with nil childIds."]; + } + if (numChildren <= 0) + { + [NSException raise:@"number of children invalid" format:@"Failed to create Container Node with invalid numChildren."]; + } + PHASEContainerNodeDefinition* containerNode = [[PHASEContainerNodeDefinition alloc] init]; + for (int i = 0; i < numChildren; i++) + { + NSNumber* nodeId = [NSNumber numberWithLongLong:childIds[i]]; + PHASESoundEventNodeDefinition* child = [mSoundEventNodeDefinitions objectForKey:nodeId]; + [containerNode addSubtree:child]; + } + const int64_t containerId = reinterpret_cast(containerNode); + [mSoundEventNodeDefinitions setObject:containerNode forKey:[NSNumber numberWithLongLong:containerId]]; + return containerId; +} + +- (void)destroySoundEventNodeWithId:(int64_t)nodeId +{ + [mSoundEventNodeDefinitions removeObjectForKey:[NSNumber numberWithLongLong:nodeId]]; +} + +- (BOOL)registerSoundEventWithName:(NSString*)name rootNodeId:(int64_t)rootNodeId +{ + // Create a sound event definition with the sampler node + PHASESoundEventNodeDefinition* rootNode = [mSoundEventNodeDefinitions objectForKey:[NSNumber numberWithLongLong:rootNodeId]]; + if (rootNode == nil) + { + NSLog(@"Phase Wrapper: Root node not found."); + return NO; + } + + // Register sound event + NSError* error = nil; + [mEngine.assetRegistry registerSoundEventAssetWithRootNode:rootNode identifier:name error:&error]; + if (error) + { + NSLog(@"Phase Wrapper: Failed to register sound event with error %@.", error); + return NO; + } + + return YES; +} + +- (void)unregisterSoundEventWithName:(NSString*)name +{ + [mEngine.assetRegistry unregisterAssetWithIdentifier:name + completion:^(bool success) { + if (!success) + { + NSLog(@"Phase Wrapper: Failed to unregister SoundEvent with name: %@", name); + } + }]; +} + +- (int64_t)playSoundEventWithName:(NSString*)name + sourceId:(int64_t)sourceId + mixerIds:(int64_t*)mixerIds + numMixers:(int64_t)numMixers + streamName:(nullable NSString*)streamName + renderBlock:(nullable PHASEPullStreamRenderBlock)renderBlock + completionHandlerBlock:(void (^_Nullable)(PHASESoundEventStartHandlerReason reason, int64_t sourceId, int64_t soundEventId))completionHandlerBlock +{ + PHASESource* source = [mSources objectForKey:[NSNumber numberWithLongLong:sourceId]]; + if (source == nil) + { + [NSException raise:@"Source invalid" format:@"Failed to find PHASE Source to play sound event on."]; + } + + PHASEMixerParameters* outMixerParameters = [[PHASEMixerParameters alloc] init]; + for (int i = 0; i < numMixers; i++) + { + PHASEMixerDefinition* mixer = [mSoundEventMixerDefinitions objectForKey:[NSNumber numberWithLongLong:mixerIds[i]]]; + if ([mixer isKindOfClass:[PHASESpatialMixerDefinition class]]) + { + [outMixerParameters addSpatialMixerParametersWithIdentifier:mixer.identifier + source:[mSources objectForKey:[NSNumber numberWithLongLong:sourceId]] + listener:mListener]; + } + else if ([mixer isKindOfClass:[PHASEAmbientMixerDefinition class]]) + { + [outMixerParameters addAmbientMixerParametersWithIdentifier:mixer.identifier listener:mListener]; + } + } + + PHASESoundEvent* soundEvent = nil; + NSError* error = nil; + if (numMixers == 0) + { + soundEvent = [[PHASESoundEvent alloc] initWithEngine:mEngine assetIdentifier:name error:&error]; + } + else + { + soundEvent = [[PHASESoundEvent alloc] initWithEngine:mEngine assetIdentifier:name mixerParameters:outMixerParameters error:&error]; + } + if (error != nil) + { + NSLog(@"Phase Wrapper: Error creating sound event: %@", name); + NSLog(@"Phase Wrapper: %@", error); + } + if (soundEvent == nil) + { + [NSException raise:@"Sound event invalid." format:@"Failed to create sound event from sound event."]; + } + const int64_t soundEventId = reinterpret_cast(soundEvent); + + if (nil != streamName && nil != renderBlock) + { + if (@available(macOS 15.0, iOS 18.0, tvOS 18.0, visionOS 2.0, *)) { + soundEvent.pullStreamNodes[streamName].renderBlock = renderBlock; + } else { + NSLog(@"Phase Wrapper: Pull Stream available only on macOS 15.0 and higher."); + return PHASEInvalidInstanceHandle; + } + } + + [soundEvent startWithCompletion:^(PHASESoundEventStartHandlerReason reason) { + @synchronized(self->mSoundEvents) + { + if (completionHandlerBlock != nil) + { + completionHandlerBlock(reason, sourceId, soundEventId); + } + [self->mSoundEvents removeObjectForKey:[NSNumber numberWithLongLong:soundEventId]]; + + // Decrement the number of events referencing the sound event asset + self->mActiveSoundEventAssets[name] = [NSNumber numberWithInt:self->mActiveSoundEventAssets[name].intValue - 1]; + } + }]; + @synchronized(mSoundEvents) + { + [mSoundEvents setObject:soundEvent forKey:[NSNumber numberWithLongLong:soundEventId]]; + + // Increment the number of events referencing the sound event asset + mActiveSoundEventAssets[name] = [NSNumber numberWithInt:mActiveSoundEventAssets[name].intValue + 1]; + } + + return soundEventId; +} + +- (BOOL)stopSoundEventWithId:(int64_t)instanceId +{ + PHASESoundEvent* soundEvent = mSoundEvents[[NSNumber numberWithLongLong:instanceId]]; + if (soundEvent == nil) + { + return NO; + } + + [soundEvent stopAndInvalidate]; + return YES; +} + +- (BOOL)start +{ + // Start the engine + NSError* startErrorRef = nil; + BOOL startErrorRet = [mEngine startAndReturnError:&startErrorRef]; + if (!startErrorRet) + { + NSLog(@"Phase Wrapper: Failed to start PHASEEngine with error %@.", startErrorRef); + } + + return startErrorRet; +} + +- (void)pause +{ + [mEngine pause]; +} + +- (void)stop +{ + [mEngine stop]; +} + +- (void)update +{ + [mEngine update]; +} + +NS_HEADER_AUDIT_END(nullability) + +@end diff --git a/plug-ins/Apple.PHASE/Native/PHASEWrapper/PHASEWrapperRingBuffer.h b/plug-ins/Apple.PHASE/Native/PHASEWrapper/PHASEWrapperRingBuffer.h index 6b57d6e4..1656bbce 100644 --- a/plug-ins/Apple.PHASE/Native/PHASEWrapper/PHASEWrapperRingBuffer.h +++ b/plug-ins/Apple.PHASE/Native/PHASEWrapper/PHASEWrapperRingBuffer.h @@ -2,7 +2,7 @@ // PHASEWrapperRingBuffer.h // AudioPluginPHASE // -// Copyright © 2024 Apple Inc. All rights reserved. +// Copyright © 2024, 2026 Apple Inc. // #ifndef PHASEWrapperRingBuffer_h @@ -19,6 +19,8 @@ NS_HEADER_AUDIT_BEGIN(nullability) format:(AVAudioFormat*)format; - (BOOL)read:(AudioBufferList*)output frameCount:(AVAudioFrameCount)frameCount; - (BOOL)write:(float*)input frameCount:(AVAudioFrameCount)frameCount; +- (BOOL)isEmpty; +- (uint64_t)consumeAndResetUnderrunCount; @end NS_HEADER_AUDIT_END(nullability) diff --git a/plug-ins/Apple.PHASE/Native/PHASEWrapper/PHASEWrapperRingBuffer.mm b/plug-ins/Apple.PHASE/Native/PHASEWrapper/PHASEWrapperRingBuffer.mm index 09d5c2e9..68afcf3c 100644 --- a/plug-ins/Apple.PHASE/Native/PHASEWrapper/PHASEWrapperRingBuffer.mm +++ b/plug-ins/Apple.PHASE/Native/PHASEWrapper/PHASEWrapperRingBuffer.mm @@ -2,11 +2,12 @@ // PHASEWrapperRingBuffer.mm // AudioPluginPHASE // -// Copyright © 2024 Apple Inc. All rights reserved. +// Copyright © 2024, 2026 Apple Inc. // #import "PHASEWrapperRingBuffer.h" #import +#include @implementation PHASEWrapperRingBuffer { @@ -17,6 +18,7 @@ @implementation PHASEWrapperRingBuffer AVAudioFrameCount mCurReadPosition; AVAudioFrameCount mCurWritePosition; int mBufferSize; + std::atomic mUnderrunCount; } - (nullable instancetype)initWithFrameSize:(int)frameSize @@ -51,26 +53,26 @@ - (BOOL)read:(AudioBufferList*)output frameCount:(AVAudioFrameCount)frameCount { if ([self isEmpty]) { - NSLog(@"PHASE Wrapper Ring Buffer: No data available to read from ring buffer!"); + mUnderrunCount.fetch_add(1, std::memory_order_relaxed); return NO; } AVAudioPCMBuffer* currentReadBuffer = mBuffers[mReadIdx]; AVAudioFrameCount framesAvailable = mBufferSize - mCurReadPosition; AVAudioFrameCount framesToRead = std::min(framesAvailable, frameCount - totalFramesRead); - + for (int chan = 0; chan < currentReadBuffer.format.channelCount; ++chan) { float* inputChannel = currentReadBuffer.floatChannelData[chan]; float* outputChannel = static_cast(output->mBuffers[chan].mData); - + memcpy(outputChannel + totalFramesRead, inputChannel + mCurReadPosition, sizeof(float) * framesToRead); } totalFramesRead += framesToRead; - + mCurReadPosition += framesToRead; if (mCurReadPosition >= mBufferSize) { @@ -91,8 +93,25 @@ - (BOOL)write:(float*)input frameCount:(AVAudioFrameCount)frameCount AVAudioFrameCount framesAvailable = mBufferSize - mCurWritePosition; AVAudioFrameCount framesToWrite = std::min(framesAvailable, frameCount - totalFramesWritten); - DSPSplitComplex out = { currentWriteBuffer.floatChannelData[0] + mCurWritePosition, currentWriteBuffer.floatChannelData[1] + mCurWritePosition}; - vDSP_ctoz((DSPComplex const*) input + totalFramesWritten, 2, &out, 1, frameCount); + int channelCount = currentWriteBuffer.format.channelCount; + + if (channelCount == 1) + { + float* outputChannel = currentWriteBuffer.floatChannelData[0] + mCurWritePosition; + memcpy(outputChannel, input + totalFramesWritten, sizeof(float) * framesToWrite); + } + else if (channelCount == 2) + { + DSPSplitComplex out = { + currentWriteBuffer.floatChannelData[0] + mCurWritePosition, + currentWriteBuffer.floatChannelData[1] + mCurWritePosition + }; + vDSP_ctoz((DSPComplex const*)(input + totalFramesWritten * 2), 2, &out, 1, framesToWrite); + } + else + { + return NO; + } totalFramesWritten += framesToWrite; @@ -112,4 +131,9 @@ - (BOOL)isEmpty return (mReadIdx == mWriteIdx) && (mCurReadPosition == mCurWritePosition); } +- (uint64_t)consumeAndResetUnderrunCount +{ + return mUnderrunCount.exchange(0, std::memory_order_relaxed); +} + @end diff --git a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/Apple/Editor/Editor_Accessory_Tracking.cs b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/Apple/Editor/Editor_Accessory_Tracking.cs index a7093f74..f05fbaa3 100644 --- a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/Apple/Editor/Editor_Accessory_Tracking.cs +++ b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/Apple/Editor/Editor_Accessory_Tracking.cs @@ -231,36 +231,6 @@ public void SceneSetupView() } - private void CreatePluginsFolder() - { - string pluginsFolderPath = "Assets/Plugins"; - - // Check if the folder already exists - if (AssetDatabase.IsValidFolder(pluginsFolderPath)) - { - Debug.Log("Plugins folder already exists!"); - EditorUtility.DisplayDialog("Folder Exists", "The Plugins folder already exists in the Assets directory.", "OK"); - return; - } - - // Create the folder - string guid = AssetDatabase.CreateFolder("Assets", "Plugins"); - - if (!string.IsNullOrEmpty(guid)) - { - Debug.Log("Plugins folder created successfully!"); - EditorUtility.DisplayDialog("Success", "Plugins folder has been created in the Assets directory.", "OK"); - - // Refresh the Asset Database to show the new folder immediately - AssetDatabase.Refresh(); - } - else - { - Debug.LogError("Failed to create Plugins folder!"); - EditorUtility.DisplayDialog("Error", "Failed to create the Plugins folder.", "OK"); - } - } - private UnityEngine.Vector2 APIReferenceScrollPosition = UnityEngine.Vector2.zero; public void APIReferenceView() diff --git a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/Apple/Scripts/AccessoryTrackingHelper.cs b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/Apple/Scripts/AccessoryTrackingHelper.cs index f22b486f..a3066906 100644 --- a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/Apple/Scripts/AccessoryTrackingHelper.cs +++ b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/Apple/Scripts/AccessoryTrackingHelper.cs @@ -161,7 +161,7 @@ void Update() SpatialControllerUtils.ApplyAccessoryAnchorTransform(LeftController, accessoryAnchor); } } - else if (hand == AccessoryChirality.Right) + else { var location = toLocationName(RightLocation); if (location.HasValue) @@ -183,26 +183,24 @@ void Update() /// A list of all the button presses /// - var isLeftController = state.accessory.inherentChirality; - - //float from 0 or 1 - var buttonAValue = input.buttons[ControllerInputName.ButtonA].value; - var buttonBValue = input.buttons[ControllerInputName.ButtonB].value; - var menuButton = input.buttons[ControllerInputName.ButtonMenu].value; - var gripButton = input.buttons[ControllerInputName.ButtonGrip].value; - var thumbStickButton = input.buttons[ControllerInputName.ButtonThumbstick].value; - - //trigger - float from 0 to 1 - var triggerButton = input.buttons[ControllerInputName.ButtonTrigger].value; - - // float from -1 to 1 - var thumbStickX = input.dpads[ControllerInputName.DPadThumbstick].xAxis; - var thumbStickY = input.dpads[ControllerInputName.DPadThumbstick].yAxis; - bool anyButtonPressed = false; if (SpatialControllerUtils.IsLeftController(state.accessory)) { - //this is the left controller + // Left PSVR2 controller + // digital - float from 0 or 1 + var buttonAValue = input.buttons[ControllerInputName.ButtonA].value; + var buttonBValue = input.buttons[ControllerInputName.ButtonB].value; + var menuButton = input.buttons[ControllerInputName.ButtonMenu].value; + var gripButton = input.buttons[ControllerInputName.ButtonGrip].value; + var thumbStickButton = input.buttons[ControllerInputName.ButtonThumbstick].value; + + // analog - float from 0 to 1 + var triggerButton = input.buttons[ControllerInputName.ButtonTrigger].value; + + // analog direction - float from -1 to 1 + var thumbStickX = input.dpads[ControllerInputName.DPadThumbstick].xAxis; + var thumbStickY = input.dpads[ControllerInputName.DPadThumbstick].yAxis; + string buttonsText = ""; if (buttonAValue != 0) { @@ -290,7 +288,21 @@ void Update() } else if (SpatialControllerUtils.IsRightController(state.accessory)) { - //this is the right controller + // Right PSVR2 controller + // digital - float from 0 or 1 + var buttonAValue = input.buttons[ControllerInputName.ButtonA].value; + var buttonBValue = input.buttons[ControllerInputName.ButtonB].value; + var menuButton = input.buttons[ControllerInputName.ButtonMenu].value; + var gripButton = input.buttons[ControllerInputName.ButtonGrip].value; + var thumbStickButton = input.buttons[ControllerInputName.ButtonThumbstick].value; + + // analog - float from 0 to 1 + var triggerButton = input.buttons[ControllerInputName.ButtonTrigger].value; + + // analog direction - float from -1 to 1 + var thumbStickX = input.dpads[ControllerInputName.DPadThumbstick].xAxis; + var thumbStickY = input.dpads[ControllerInputName.DPadThumbstick].yAxis; + string buttonsText = ""; if (buttonAValue != 0) { @@ -376,6 +388,61 @@ void Update() } RightControllerText.text = buttonsText; } + else if (SpatialControllerUtils.IsStylus(state.accessory)) + { + //digital - float from 0 or 1 + var primaryValue = input.buttons[ControllerInputName.ButtonStylusPrimary].value; + //analog - float from 0 to 1 + var secondaryValue = input.buttons[ControllerInputName.ButtonStylusSecondary].value; + var tipValue = input.buttons[ControllerInputName.ButtonStylusTip].value; + + //this is the right controller + string buttonsText = ""; + if (primaryValue != 0) + { + buttonsText += "S1"; + anyButtonPressed = true; + if (ShowDebugLogs) + { + Debug.Log("Stylus Primary Button Press Event: " + primaryValue); + } + } + else + { + buttonsText += " "; + } + if (secondaryValue != 0) + { + buttonsText += "S2:" + secondaryValue.ToString("F2"); + anyButtonPressed = true; + if (ShowDebugLogs) + { + Debug.Log("Stylus Secondary Button Press Event: " + secondaryValue); + } + } + else + { + buttonsText += " "; + } + if (tipValue != 0) + { + buttonsText += "S3:" + tipValue.ToString("F2"); + anyButtonPressed = true; + if (ShowDebugLogs) + { + Debug.Log("Stylus Tip Button Press Event: " + tipValue); + } + } + else + { + buttonsText += " "; + } + if (!anyButtonPressed) + { + buttonsText = "Press Any Button"; + } + RightControllerText.text = buttonsText; + } } } diff --git a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/Apple/Scripts/SpatialControllerInternal.cs b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/Apple/Scripts/SpatialControllerInternal.cs index 7f5cc91f..84994347 100644 --- a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/Apple/Scripts/SpatialControllerInternal.cs +++ b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/Apple/Scripts/SpatialControllerInternal.cs @@ -1577,6 +1577,7 @@ static Accessory[] MakeAccessoryArray(SCAccessories accessories) /// Callback for controller disconnected events. /// True if handlers were set successfully. [DllImport("__Internal")] + [return: MarshalAs(UnmanagedType.I1)] static extern bool SpatialController_SetControllerConnectionHandlers(SCControllerConnectionCallback onConnected, SCControllerConnectionCallback onDisconnected); /// @@ -1586,6 +1587,7 @@ static Accessory[] MakeAccessoryArray(SCAccessories accessories) /// Callback for accessory disconnected events. /// True if handlers were set successfully. [DllImport("__Internal")] + [return: MarshalAs(UnmanagedType.I1)] static extern bool SpatialController_SetAccessoryConnectionHandlers(SCAccessoryConnectionCallback onConnected, SCAccessoryConnectionCallback onDisconnected); /// @@ -1595,6 +1597,7 @@ static Accessory[] MakeAccessoryArray(SCAccessories accessories) /// User-defined context pointer. /// True if the operation was initiated successfully. [DllImport("__Internal")] + [return: MarshalAs(UnmanagedType.I1)] static extern bool SpatialController_GetConnectedControllers(SCControllersCallback callback, IntPtr context); /// @@ -1605,6 +1608,7 @@ static Accessory[] MakeAccessoryArray(SCAccessories accessories) /// User-defined context pointer. /// True if the operation was initiated successfully. [DllImport("__Internal")] + [return: MarshalAs(UnmanagedType.I1)] static extern bool SpatialController_GetConnectedController(string uniqueId, SCControllerCallback callback, IntPtr context); /// @@ -1614,6 +1618,7 @@ static Accessory[] MakeAccessoryArray(SCAccessories accessories) /// User-defined context pointer. /// True if the operation was initiated successfully. [DllImport("__Internal")] + [return: MarshalAs(UnmanagedType.I1)] static extern bool SpatialController_GetConnectedAccessories(SCAccessoriesCallback callback, IntPtr context); /// @@ -1624,6 +1629,7 @@ static Accessory[] MakeAccessoryArray(SCAccessories accessories) /// User-defined context pointer. /// True if the operation was initiated successfully. [DllImport("__Internal")] + [return: MarshalAs(UnmanagedType.I1)] static extern bool SpatialController_GetConnectedAccessory(string uniqueId, SCAccessoryCallback callback, IntPtr context); /// @@ -1633,6 +1639,7 @@ static Accessory[] MakeAccessoryArray(SCAccessories accessories) /// The value to configure, interpretation dependend on setting. /// True if the setting was configured successfully. [DllImport("__Internal")] + [return: MarshalAs(UnmanagedType.I1)] static extern bool SpatialController_ConfigureDefaultControllerSetting(SCControllerSetting setting, int value); /// @@ -1645,6 +1652,7 @@ static Accessory[] MakeAccessoryArray(SCAccessories accessories) /// The value to configure, interpretation dependend on setting. /// True if the controller is a valid target and the setting was configured successfully. [DllImport("__Internal")] + [return: MarshalAs(UnmanagedType.I1)] static extern bool SpatialController_ConfigureControllerSetting(string uniqueId, SCControllerSetting setting, int value); /// @@ -1656,6 +1664,7 @@ static Accessory[] MakeAccessoryArray(SCAccessories accessories) /// User-defined context pointer. /// True if the operation was initiated successfully. [DllImport("__Internal")] + [return: MarshalAs(UnmanagedType.I1)] static extern bool SpatialController_GetControllerInputInfoForInputName(string uniqueId, SCControllerInputName inputName, SCGetControllerInputInfoForInputNameCallback callback, IntPtr context); /// @@ -1669,6 +1678,7 @@ static Accessory[] MakeAccessoryArray(SCAccessories accessories) /// User-defined context pointer. /// True if the operation was initiated successfully. [DllImport("__Internal")] + [return: MarshalAs(UnmanagedType.I1)] static extern bool SpatialController_GetSymbolForInputName(string uniqueId, SCControllerInputName inputName, SCUIImageSymbolScale symbolScale, SCUIImageRenderingMode renderingMode, SCGetSymbolForInputNameCallback callback, IntPtr context); /// @@ -1680,6 +1690,7 @@ static Accessory[] MakeAccessoryArray(SCAccessories accessories) /// Blue component (0.0 to 1.0). /// True if the color was set successfully. [DllImport("__Internal")] + [return: MarshalAs(UnmanagedType.I1)] static extern bool SpatialController_SetControllerLightColor(string uniqueId, float r, float g, float b); /// @@ -1690,6 +1701,7 @@ static Accessory[] MakeAccessoryArray(SCAccessories accessories) /// User-defined context pointer. /// True if the polling was initiated successfully. [DllImport("__Internal")] + [return: MarshalAs(UnmanagedType.I1)] static extern bool SpatialController_PollController(string uniqueId, SCControllerStateCallback callback, IntPtr context); /// @@ -1715,6 +1727,7 @@ static Accessory[] MakeAccessoryArray(SCAccessories accessories) /// User-defined context pointer. /// True if the prediction was initiated successfully. [DllImport("__Internal")] + [return: MarshalAs(UnmanagedType.I1)] static extern bool SpatialController_PredictAnchor(string uniqueId, SCTimeValue time, SCAccessoryAnchorCallback callback, IntPtr context); /// @@ -1726,6 +1739,7 @@ static Accessory[] MakeAccessoryArray(SCAccessories accessories) /// Locality of haptics. Must be supported by controller. /// True if the haptics engine was started for controller uniqueId. [DllImport("__Internal")] + [return: MarshalAs(UnmanagedType.I1)] static extern bool SpatialController_CreateHapticsEngine(string uniqueId, SCHapticsLocality locality); /// @@ -1744,6 +1758,7 @@ static Accessory[] MakeAccessoryArray(SCAccessories accessories) /// User supplied opaque context pointer passed back to onCompleted callback. /// True if a haptics engine was shutdown for controller uniqueId, or false if no engine needed to be shutdown. [DllImport("__Internal")] + [return: MarshalAs(UnmanagedType.I1)] static extern bool SpatialController_StopHapticsEngine(string uniqueId, SCHapticsLocality locality, SCStopHapticEngineCompletedCallback onCompleted, IntPtr context); /// @@ -1762,6 +1777,7 @@ static Accessory[] MakeAccessoryArray(SCAccessories accessories) /// User supplied opaque context pointer passed back to onFinished callback. /// True if haptics playback was started for controller uniqueId. [DllImport("__Internal")] + [return: MarshalAs(UnmanagedType.I1)] static extern bool SpatialController_PlayHapticsData(string uniqueId, IntPtr data, int dataLength, SCHapticsLocality locality, SCHapticEngineFinishedCallback onFinished, IntPtr context); /// diff --git a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/Apple/Scripts/SpatialControllerUtils.cs b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/Apple/Scripts/SpatialControllerUtils.cs index 6cb9152c..10ff13d3 100644 --- a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/Apple/Scripts/SpatialControllerUtils.cs +++ b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/Apple/Scripts/SpatialControllerUtils.cs @@ -130,6 +130,22 @@ public static bool IsRightController(Accessory accessory) return accessory.inherentChirality == AccessoryChirality.Right; } + /// + /// Determines if the specified accessory is a spatial stylus. + /// + /// The Accessory to check + /// True if the accessory is a spatial stylus, false otherwise + public static bool IsStylus(Accessory accessory) + { + if (accessory.inherentChirality != AccessoryChirality.Unspecified) + { + return false; + } + // This is not be the safest possible assumption, but the native plugin + // does not currently expose a direct way to check if a Controller is a Stylus + // and checking productCategory or vendorName seems restrictive. + return true; + } /// /// Calculates the optimal time value for predicting accessory anchor positions. diff --git a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/CHANGELOG.md b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/CHANGELOG.md index a79e94de..025c6c5e 100644 --- a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/CHANGELOG.md +++ b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/CHANGELOG.md @@ -1,9 +1,28 @@ +1.0.6 + +- Fixed the sample path in `package.json` so it points at the demo's actual location +- Replaced the unresolvable `com.unity.textmeshpro` dependency with `com.unity.ugui`, which is + what provides TextMeshPro on this plug-in's Unity 6 floor +- Raised the minimum Editor to 6000.5.2f1 and `com.unity.xr.visionos` to 3.1.5, matching the + versions the plug-in is now built and tested against +- Now requires Apple.Core 3.3.0 + +1.0.5 + +- Spatial Stylus controllers now supported +- Fixed a native memory leak: accessory locations and the per-accessory buffers allocated on every + `PollController` call were never deallocated +- Removed the PolySpatial and Visual Scripting dependencies; the plug-in no longer requires + `com.unity.polyspatial` to be installed +- Added `[MarshalAs(UnmanagedType.I1)]` to `bool` P/Invoke declarations so `bool` results marshal + correctly +- Fixed plug-in builds when the source root path contains a space character + 1.0.4 - Controllers with Motion Sensors now supported - Cleaned up C# and Native code to make it easier to read - 1.0.3 - Added support for DualShock touchpad diff --git a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/package.json b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/package.json index 11c3dc64..8e9b2bed 100644 --- a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/package.json +++ b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Apple.SpatialController/package.json @@ -1,10 +1,10 @@ { "name": "com.apple.unityplugin.spatialcontroller", - "version": "1.0.4", + "version": "1.0.6", "displayName": "Apple.SpatialController", "description": "A Unity plugin for AccessoryTracking + GameController for spatial controllers on visionOS", - "unity": "6000.1", - "unityRelease": "14f1", + "unity": "6000.5", + "unityRelease": "2f1", "documentationUrl": "See README.md", "changelogUrl": "See Changelog in CHANGELOG.md", "licensesUrl": "See License in LICENSE.md", @@ -23,16 +23,16 @@ "url": "https://developer.apple.com" }, "dependencies": { - "com.apple.unityplugin.core": "3.1.8", - "com.unity.xr.visionos": "2.3.1", + "com.apple.unityplugin.core": "3.3.0", + "com.unity.xr.visionos": "3.1.5", "com.unity.mathematics": "1.3.2", - "com.unity.textmeshpro": "5.0.0" - }, + "com.unity.ugui": "2.0.0" + }, "samples": [ { "displayName": "Accessory Tracking Demo", "description": "Demo for Accessory Tracking", - "path": "Demos~/Apple.SpatialController.AccessoryTracking" + "path": "Apple/Demos" } ] } diff --git a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Resources/PolySpatialSettings.asset b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Resources/PolySpatialSettings.asset index 7dfae057..d8ad6483 100644 --- a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Resources/PolySpatialSettings.asset +++ b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Resources/PolySpatialSettings.asset @@ -12,7 +12,9 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 019d9e67133646548a506370e966316a, type: 3} m_Name: PolySpatialSettings m_EditorClassIdentifier: - m_PackageVersion: 2.3.1 + m_FullUnityVersion: + m_DisablePolySpatial: 0 + m_PackageVersion: 3.1.5 m_EnableStatistics: 0 m_ColliderSyncLayerMask: serializedVersion: 2 @@ -36,6 +38,11 @@ MonoBehaviour: m_EnableRuntimeValidation: 0 m_RuntimeValidationFrameCount: 10 m_BackingObjectsDestroyImmediate: 1 + m_ShowSceneViewPreviewObjects: 0 + m_ShowGameViewPreviewObjects: 1 + m_ForceRunInBackground: 1 + m_ServerPort: 9876 + m_IncrementalServerPortBindAttempts: 10 m_UtpUdpServerPort: 8777 m_UtpTcpServerPort: 8778 m_ConnectionDiscoveryPort: 9877 @@ -61,18 +68,18 @@ MonoBehaviour: bottom: -1.19175 m_MaterialSwapSets: [] m_EnablePolySpatialRaycaster: 1 - m_SelectedValidationType: 1 + m_MaximumNumOfAudioPacketsPerSend: 4 + m_EnableProgressiveTextureStreaming: 1 + m_ProgressiveTextureTransferLimitBytes: 128000 + m_ProgressiveTextureGenerateThumbnails: 0 + m_ValidationOption: 0 m_ShowWarningsForShaderGraphsInPackages: 1 m_MinifyShaderGraphNodeNames: 1 m_PreviewUseBackgroundColor: 1 m_PreviewBackgroundColor: {r: 0.192, g: 0.301, b: 0.474, a: 1} m_RuntimeMode: 0 m_EnableTransformVerification: 0 - m_EnableProgressiveMipStreaming: 0 - m_MaxMipByteSizePerCycle: 128000 m_RuntimeFlags: 0 - m_EnableInEditorPreview: 1 - m_HidePolySpatialPreviewObjectsInScene: 1 m_AlwaysLinkPolySpatialRuntime: 0 m_PolySpatialNetworkingMode: 0 m_EnableHostCameraControl: 0 @@ -82,7 +89,17 @@ MonoBehaviour: - 127.0.0.1 m_SerializedIgnoredScenePaths: [] m_MockBackend: 0 - m_EnableGenericComponentTracker: 0 + m_SendShadersForAllMaterials: 1 + m_ShaderGlobalTextureFilterMode: 0 + m_ShaderGlobalTextureFilterProperties: [] + m_LoadBytecodeForBuiltInShaders: 1 + m_PixelStreamingTransferMode: 1 + m_PixelStreamingJPGCompressionQuality: 75 + m_PixelStreamingWebRtcCodec: 2 + m_PixelStreamingWebRtcTextureScale: 1 + m_PixelStreamingWebRtcMinBitrate: 4500000 + m_PixelStreamingWebRtcMaxBitrate: 4500000 + m_PixelStreamingWebRtcMaxFramerate: 45 m_EnableTransformDeltas: 0 m_DisableTransformDeltaEpsilonComparison: 0 m_TransformDeltaPositionEpsilon: 0.0001 diff --git a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Settings/Mobile_RPAsset.asset b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Settings/Mobile_RPAsset.asset index df2bb823..0e8a1e19 100644 --- a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Settings/Mobile_RPAsset.asset +++ b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Settings/Mobile_RPAsset.asset @@ -12,8 +12,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3} m_Name: Mobile_RPAsset m_EditorClassIdentifier: - k_AssetVersion: 12 - k_AssetPreviousVersion: 12 + k_AssetVersion: 13 + k_AssetPreviousVersion: 13 m_RendererType: 1 m_RendererData: {fileID: 0} m_RendererDataList: @@ -74,7 +74,6 @@ MonoBehaviour: m_MixedLightingSupported: 1 m_SupportsLightCookies: 1 m_SupportsLightLayers: 1 - m_DebugLevel: 0 m_StoreActionsOptimization: 0 m_UseAdaptivePerformance: 1 m_ColorGradingMode: 0 @@ -128,12 +127,15 @@ MonoBehaviour: m_PrefilterSoftShadowsQualityHigh: 1 m_PrefilterSoftShadows: 0 m_PrefilterScreenCoord: 1 + m_PrefilterScreenSpaceIrradiance: 0 m_PrefilterNativeRenderPass: 1 m_PrefilterUseLegacyLightmaps: 0 m_PrefilterBicubicLightmapSampling: 1 + m_PrefilterReflectionProbeRotation: 0 m_PrefilterReflectionProbeBlending: 0 m_PrefilterReflectionProbeBoxProjection: 0 m_PrefilterReflectionProbeAtlas: 1 + m_PrefilterPointSamplingUpsampling: 0 m_ShaderVariantLogLevel: 0 m_ShadowCascades: 0 m_Textures: diff --git a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Settings/PC_RPAsset.asset b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Settings/PC_RPAsset.asset index 95631abb..220a5c11 100644 --- a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Settings/PC_RPAsset.asset +++ b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Settings/PC_RPAsset.asset @@ -12,8 +12,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3} m_Name: PC_RPAsset m_EditorClassIdentifier: - k_AssetVersion: 12 - k_AssetPreviousVersion: 12 + k_AssetVersion: 13 + k_AssetPreviousVersion: 13 m_RendererType: 1 m_RendererData: {fileID: 0} m_RendererDataList: @@ -74,7 +74,6 @@ MonoBehaviour: m_MixedLightingSupported: 1 m_SupportsLightCookies: 1 m_SupportsLightLayers: 1 - m_DebugLevel: 0 m_StoreActionsOptimization: 0 m_UseAdaptivePerformance: 1 m_ColorGradingMode: 0 @@ -128,12 +127,15 @@ MonoBehaviour: m_PrefilterSoftShadowsQualityHigh: 1 m_PrefilterSoftShadows: 0 m_PrefilterScreenCoord: 1 + m_PrefilterScreenSpaceIrradiance: 0 m_PrefilterNativeRenderPass: 1 m_PrefilterUseLegacyLightmaps: 0 m_PrefilterBicubicLightmapSampling: 1 + m_PrefilterReflectionProbeRotation: 0 m_PrefilterReflectionProbeBlending: 0 m_PrefilterReflectionProbeBoxProjection: 0 m_PrefilterReflectionProbeAtlas: 0 + m_PrefilterPointSamplingUpsampling: 0 m_ShaderVariantLogLevel: 0 m_ShadowCascades: 0 m_Textures: diff --git a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset index e38bfab9..e96fe3fe 100644 --- a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset +++ b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/Settings/UniversalRenderPipelineGlobalSettings.asset @@ -29,7 +29,6 @@ MonoBehaviour: m_StripUnusedVariants: 1 m_StripScreenCoordOverrideVariants: 1 supportRuntimeDebugDisplay: 0 - m_EnableRenderGraph: 0 m_Settings: m_SettingsList: m_List: @@ -62,23 +61,15 @@ MonoBehaviour: - rid: 2165422336102367238 - rid: 2165422336102367239 - rid: 4568216016700309698 + - rid: 3467017740829589509 + - rid: 3467017740829589510 + - rid: 3467017740829589511 + - rid: 3467017740829589512 + - rid: 3467017740829589513 + - rid: 3467017740829589514 m_RuntimeSettings: - m_List: - - rid: 6852985685364965378 - - rid: 6852985685364965379 - - rid: 6852985685364965380 - - rid: 6852985685364965381 - - rid: 6852985685364965384 - - rid: 6852985685364965385 - - rid: 6852985685364965392 - - rid: 6852985685364965394 - - rid: 8712630790384254976 - - rid: 2165422336102367233 - - rid: 2165422336102367235 - - rid: 2165422336102367236 - - rid: 2165422336102367238 - - rid: 2165422336102367239 - m_AssetVersion: 8 + m_List: [] + m_AssetVersion: 10 m_ObsoleteDefaultVolumeProfile: {fileID: 0} m_RenderingLayerNames: - Light Layer default @@ -237,10 +228,61 @@ MonoBehaviour: - {r: 0.5, g: 0, b: 0.5, a: 1} - {r: 0.5, g: 0.5, b: 0.5, a: 1} - {r: 0, g: 0, b: 1, a: 1} + - rid: 3467017740829589509 + type: {class: RayTracingRenderPipelineResources, ns: UnityEngine.Rendering.UnifiedRayTracing, asm: Unity.UnifiedRayTracing.Runtime} + data: + m_Version: 1 + m_GeometryPoolKernels: {fileID: 7200000, guid: 98e3d58cae7210c4786f67f504c9e899, type: 3} + m_CopyBuffer: {fileID: 7200000, guid: 1b95b5dcf48d1914c9e1e7405c7660e3, type: 3} + m_CopyPositions: {fileID: 7200000, guid: 1ad53a96b58d3c3488dde4f14db1aaeb, type: 3} + m_BitHistogram: {fileID: 7200000, guid: 8670f7ce4b60cef43bed36148aa1b0a2, type: 3} + m_BlockReducePart: {fileID: 7200000, guid: 4e034cc8ea2635c4e9f063e5ddc7ea7a, type: 3} + m_BlockScan: {fileID: 7200000, guid: 4d6d5de35fa45ef4a92119397a045cc9, type: 3} + m_BuildHlbvh: {fileID: 7200000, guid: 2d70cd6be91bd7843a39a54b51c15b13, type: 3} + m_RestructureBvh: {fileID: 7200000, guid: 56641cb88dcb31a4398a4997ef7a7a8c, type: 3} + m_Scatter: {fileID: 7200000, guid: a2eaeefdac4637a44b734e85b7be9186, type: 3} + - rid: 3467017740829589510 + type: {class: OnTilePostProcessResource, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_UberPostShader: {fileID: 4800000, guid: fe4f13c1004a07d4ea1e30bfd0326d9e, type: 3} + - rid: 3467017740829589511 + type: {class: URPReflectionProbeSettings, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Universal.Runtime} + data: + version: 1 + useReflectionProbeRotation: 0 + - rid: 3467017740829589512 + type: {class: UniversalRenderPipelineRuntimeTerrainShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_TerrainDetailLit: {fileID: 4800000, guid: f6783ab646d374f94b199774402a5144, type: 3} + m_TerrainDetailGrassBillboard: {fileID: 4800000, guid: 29868e73b638e48ca99a19ea58c48d90, type: 3} + m_TerrainDetailGrass: {fileID: 4800000, guid: e507fdfead5ca47e8b9a768b51c291a1, type: 3} + - rid: 3467017740829589513 + type: {class: URPTerrainShaderSetting, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} + data: + m_Version: 0 + m_IncludeTerrainShaders: 1 + - rid: 3467017740829589514 + type: {class: WorldRenderPipelineResources, ns: UnityEngine.PathTracing.Core, asm: Unity.PathTracing.Runtime} + data: + _version: 3 + _blitCubemap: {fileID: 7200000, guid: 5a992812cb320d146a66cc600200cce7, type: 3} + _blitGrayScaleCookie: {fileID: 7200000, guid: 557fa399e33bf7647bda5697c5c158df, type: 3} + _setAlphaChannelShader: {fileID: 7200000, guid: 5efaea0e81c66334aa9d062d6573e6fd, type: 3} + _environmentImportanceSamplingBuild: {fileID: 7200000, guid: 5bb2534d2411d344cbc54f880232640f, type: 3} + _skyBoxMesh: {fileID: 4300000, guid: 0529e6c5f6dea8c4a8c2835ed7de57cb, type: 2} + _sixFaceSkyBoxMesh: {fileID: 4300000, guid: a80925ceebd011741b42509226cefc74, type: 2} + _buildLightGridShader: {fileID: 7200000, guid: 16e47c1641bd0104e92b624601457bb0, type: 3} - rid: 4568216016700309698 type: {class: RenderingDebuggerRuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime} data: m_version: 0 + m_PanelSettings: {fileID: 11400000, guid: fa69697be3070b04a893666f5947f18c, type: 2} + m_StyleSheets: + - {fileID: 7433441132597879392, guid: 0ff99fd36f66f1a41bcc1d3c90e0922a, type: 3} + - {fileID: 7433441132597879392, guid: 3a8aa4d508da46d4dace18b280f064aa, type: 3} + m_VisualTreeAsset: {fileID: 9197481963319205126, guid: b647ceb1e15264943b9b439971e71110, type: 3} - rid: 6852985685364965376 type: {class: URPShaderStrippingSetting, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} data: @@ -282,9 +324,9 @@ MonoBehaviour: m_CoreBlitPS: {fileID: 4800000, guid: 93446b5c5339d4f00b85c159e1159b7c, type: 3} m_CoreBlitColorAndDepthPS: {fileID: 4800000, guid: d104b2fc1ca6445babb8e90b0758136b, type: 3} m_SamplingPS: {fileID: 4800000, guid: 04c410c9937594faa893a11dceb85f7e, type: 3} - m_TerrainDetailLit: {fileID: 4800000, guid: f6783ab646d374f94b199774402a5144, type: 3} - m_TerrainDetailGrassBillboard: {fileID: 4800000, guid: 29868e73b638e48ca99a19ea58c48d90, type: 3} - m_TerrainDetailGrass: {fileID: 4800000, guid: e507fdfead5ca47e8b9a768b51c291a1, type: 3} + m_TerrainDetailLit: {fileID: 0} + m_TerrainDetailGrassBillboard: {fileID: 0} + m_TerrainDetailGrass: {fileID: 0} - rid: 6852985685364965381 type: {class: UniversalRenderPipelineRuntimeTextures, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} data: @@ -302,15 +344,16 @@ MonoBehaviour: m_SpriteUnshadowShader: {fileID: 4800000, guid: de02b375720b5c445afe83cd483bedf3, type: 3} m_GeometryShadowShader: {fileID: 4800000, guid: 19349a0f9a7ed4c48a27445bcf92e5e1, type: 3} m_GeometryUnshadowShader: {fileID: 4800000, guid: 77774d9009bb81447b048c907d4c6273, type: 3} - m_FallOffLookup: {fileID: 2800000, guid: 5688ab254e4c0634f8d6c8e0792331ca, type: 3} m_CopyDepthPS: {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3} m_DefaultLitMaterial: {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2} m_DefaultUnlitMaterial: {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, type: 2} m_DefaultMaskMaterial: {fileID: 2100000, guid: 15d0c3709176029428a0da2f8cecf0b5, type: 2} + m_DefaultMesh2DLitMaterial: {fileID: 2100000, guid: 9452ae1262a74094f8a68013fbcd1834, type: 2} - rid: 6852985685364965383 type: {class: UniversalRenderPipelineEditorMaterials, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} data: m_DefaultMaterial: {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_SimpleLitMaterial: {fileID: 2100000, guid: 6a1143ee683302f4aa628c052723efc1, type: 2} m_DefaultParticleMaterial: {fileID: 2100000, guid: e823cd5b5d27c0f4b8256e7c12ee3e6d, type: 2} m_DefaultLineMaterial: {fileID: 2100000, guid: e823cd5b5d27c0f4b8256e7c12ee3e6d, type: 2} m_DefaultTerrainMaterial: {fileID: 2100000, guid: 594ea882c5a793440b60ff72d896021e, type: 2} @@ -325,7 +368,6 @@ MonoBehaviour: type: {class: RenderGraphSettings, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime} data: m_Version: 0 - m_EnableRenderCompatibilityMode: 0 - rid: 6852985685364965386 type: {class: GPUResidentDrawerResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.GPUDriven.Runtime} data: diff --git a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/XR/Resources/XRSimulationRuntimeSettings.asset b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/XR/Resources/XRSimulationRuntimeSettings.asset new file mode 100644 index 00000000..165c581b --- /dev/null +++ b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/XR/Resources/XRSimulationRuntimeSettings.asset @@ -0,0 +1,69 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e2b12afd4d27418a9cfb2823fe2b9ff3, type: 3} + m_Name: XRSimulationRuntimeSettings + m_EditorClassIdentifier: Unity.XR.Simulation::UnityEngine.XR.Simulation.XRSimulationRuntimeSettings + m_EnvironmentLayer: 30 + m_EnvironmentScanParams: + m_MinimumRescanTime: 0.1 + m_DeltaCameraDistanceToRescan: 0.025 + m_DeltaCameraAngleToRescan: 4 + m_RaysPerCast: 10 + m_MaximumHitDistance: 12 + m_MinimumHitDistance: 0.05 + m_PlaneFindingParams: + m_MinimumPlaneUpdateTime: 0.13 + m_MinPointsPerSqMeter: 30 + m_MinSideLength: 0.11 + m_InLayerMergeDistance: 0.2 + m_CrossLayerMergeDistance: 0.05 + m_CheckEmptyArea: 0 + m_AllowedEmptyAreaCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_PointUpdateDropoutRate: 0.4 + m_NormalToleranceAngle: 15 + m_VoxelSize: 0.1 + m_TrackedImageDiscoveryParams: + m_TrackingUpdateInterval: 0.09 + m_EnvironmentProbeDiscoveryParams: + m_MinUpdateTime: 0.2 + m_MaxDiscoveryDistance: 3 + m_DiscoveryDelayTime: 1 + m_CubemapFaceSize: 16 + m_AnchorDiscoveryParams: + m_MinTimeUntilUpdate: 0.2 + m_BoundingBoxDiscoveryParams: + m_TrackingUpdateInterval: 0.09 + m_UseXRay: 1 + m_FlipXRayDirection: 0 diff --git a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/XR/Resources/XRSimulationRuntimeSettings.asset.meta b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/XR/Resources/XRSimulationRuntimeSettings.asset.meta new file mode 100644 index 00000000..0cba17dd --- /dev/null +++ b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/XR/Resources/XRSimulationRuntimeSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 92be47b21a6cd4747bd6cd4d65a1d160 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/XR/UserSimulationSettings/Resources/XRSimulationPreferences.asset b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/XR/UserSimulationSettings/Resources/XRSimulationPreferences.asset new file mode 100644 index 00000000..c32e3734 --- /dev/null +++ b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/XR/UserSimulationSettings/Resources/XRSimulationPreferences.asset @@ -0,0 +1,24 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b2f528b98f844ed8b6b2d5fdf90b40e6, type: 3} + m_Name: XRSimulationPreferences + m_EditorClassIdentifier: Unity.XR.Simulation::UnityEngine.XR.Simulation.XRSimulationPreferences + m_HasInputActionUpgrade: 1 + m_EnvironmentPrefab: {fileID: 0} + m_FallbackEnvironmentPrefab: {fileID: 7576867131100388943, guid: c7b92c392902f4043a03a64032c02fe1, type: 3} + m_UnlockInputActionReference: {fileID: -6503468053843192148, guid: 1dd796eaee8744b4aa41b3f8bf5df64f, type: 3} + m_MoveInputActionReference: {fileID: -8435123576461090514, guid: 1dd796eaee8744b4aa41b3f8bf5df64f, type: 3} + m_LookInputActionReference: {fileID: -2447619311606779944, guid: 1dd796eaee8744b4aa41b3f8bf5df64f, type: 3} + m_SprintInputActionReference: {fileID: -5750007214975788477, guid: 1dd796eaee8744b4aa41b3f8bf5df64f, type: 3} + m_LookSpeed: 1 + m_MoveSpeed: 1 + m_MoveSpeedModifier: 3 diff --git a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/XR/UserSimulationSettings/Resources/XRSimulationPreferences.asset.meta b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/XR/UserSimulationSettings/Resources/XRSimulationPreferences.asset.meta new file mode 100644 index 00000000..f2fb591d --- /dev/null +++ b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Assets/XR/UserSimulationSettings/Resources/XRSimulationPreferences.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 76220b7eea5bd469f822ba5ccc37714d +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Packages/manifest.json b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Packages/manifest.json index 80bebc1f..03dba5f4 100644 --- a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Packages/manifest.json +++ b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Packages/manifest.json @@ -1,20 +1,21 @@ { "dependencies": { "com.apple.unityplugin.core": "file:../../../Apple.Core/Apple.Core_Unity/Assets/Apple.Core", - "com.unity.ai.navigation": "2.0.9", - "com.unity.collab-proxy": "2.9.3", + "com.unity.ai.navigation": "2.0.13", + "com.unity.collab-proxy": "2.12.4", "com.unity.ide.rider": "3.0.38", - "com.unity.ide.visualstudio": "2.0.23", - "com.unity.inputsystem": "1.14.2", - "com.unity.multiplayer.center": "1.0.0", - "com.unity.polyspatial.visionos": "2.3.1", - "com.unity.render-pipelines.universal": "17.2.0", - "com.unity.test-framework": "1.6.0", - "com.unity.timeline": "1.8.9", - "com.unity.ugui": "2.0.0", - "com.unity.visualscripting": "1.9.7", - "com.unity.xr.visionos": "2.3.1", + "com.unity.ide.visualstudio": "2.0.26", + "com.unity.inputsystem": "1.19.0", + "com.unity.multiplayer.center": "1.0.1", + "com.unity.polyspatial.visionos": "3.1.5", + "com.unity.render-pipelines.universal": "17.5.0", + "com.unity.test-framework": "1.7.0", + "com.unity.timeline": "1.8.12", + "com.unity.ugui": "2.5.0", + "com.unity.visualscripting": "1.9.11", + "com.unity.xr.visionos": "3.1.5", "com.unity.modules.accessibility": "1.0.0", + "com.unity.modules.adaptiveperformance": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", "com.unity.modules.animation": "1.0.0", @@ -28,6 +29,7 @@ "com.unity.modules.particlesystem": "1.0.0", "com.unity.modules.physics": "1.0.0", "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.physicscore2d": "1.0.0", "com.unity.modules.screencapture": "1.0.0", "com.unity.modules.terrain": "1.0.0", "com.unity.modules.terrainphysics": "1.0.0", @@ -41,9 +43,9 @@ "com.unity.modules.unitywebrequestaudio": "1.0.0", "com.unity.modules.unitywebrequesttexture": "1.0.0", "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vectorgraphics": "1.0.0", "com.unity.modules.vehicles": "1.0.0", "com.unity.modules.video": "1.0.0", - "com.unity.modules.vr": "1.0.0", "com.unity.modules.wind": "1.0.0", "com.unity.modules.xr": "1.0.0" } diff --git a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Packages/packages-lock.json b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Packages/packages-lock.json index a5ce84f2..e3708980 100644 --- a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Packages/packages-lock.json +++ b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/Packages/packages-lock.json @@ -7,7 +7,7 @@ "dependencies": {} }, "com.unity.ai.navigation": { - "version": "2.0.9", + "version": "2.0.13", "depth": 0, "source": "registry", "dependencies": { @@ -16,7 +16,7 @@ "url": "https://packages.unity.com" }, "com.unity.burst": { - "version": "1.8.24", + "version": "1.8.29", "depth": 2, "source": "registry", "dependencies": { @@ -26,41 +26,39 @@ "url": "https://packages.unity.com" }, "com.unity.collab-proxy": { - "version": "2.9.3", + "version": "2.12.4", "depth": 0, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, "com.unity.collections": { - "version": "2.5.7", + "version": "6.5.0", "depth": 2, - "source": "registry", + "source": "builtin", "dependencies": { - "com.unity.burst": "1.8.19", - "com.unity.mathematics": "1.3.2", + "com.unity.burst": "1.8.25", + "com.unity.nuget.mono-cecil": "1.11.6", "com.unity.test-framework": "1.4.6", - "com.unity.nuget.mono-cecil": "1.11.5", - "com.unity.test-framework.performance": "3.0.3" - }, - "url": "https://packages.unity.com" + "com.unity.test-framework.performance": "3.2.0" + } }, "com.unity.editorcoroutines": { - "version": "1.0.0", + "version": "1.1.0", "depth": 2, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, "com.unity.ext.flatsharp": { - "version": "1.1.1", + "version": "1.1.4", "depth": 2, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, "com.unity.ext.nunit": { - "version": "2.0.5", + "version": "2.1.0", "depth": 1, "source": "builtin", "dependencies": {} @@ -75,16 +73,16 @@ "url": "https://packages.unity.com" }, "com.unity.ide.visualstudio": { - "version": "2.0.23", + "version": "2.0.26", "depth": 0, "source": "registry", "dependencies": { - "com.unity.test-framework": "1.1.9" + "com.unity.test-framework": "1.1.33" }, "url": "https://packages.unity.com" }, "com.unity.inputsystem": { - "version": "1.14.2", + "version": "1.19.0", "depth": 0, "source": "registry", "dependencies": { @@ -93,14 +91,13 @@ "url": "https://packages.unity.com" }, "com.unity.mathematics": { - "version": "1.3.2", + "version": "1.4.0", "depth": 2, - "source": "registry", - "dependencies": {}, - "url": "https://packages.unity.com" + "source": "builtin", + "dependencies": {} }, "com.unity.multiplayer.center": { - "version": "1.0.0", + "version": "1.0.1", "depth": 0, "source": "builtin", "dependencies": { @@ -108,21 +105,21 @@ } }, "com.unity.nuget.mono-cecil": { - "version": "1.11.5", + "version": "1.11.6", "depth": 3, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, "com.unity.nuget.newtonsoft-json": { - "version": "3.2.1", + "version": "3.2.2", "depth": 2, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, "com.unity.polyspatial": { - "version": "2.3.1", + "version": "3.1.5", "depth": 1, "source": "registry", "dependencies": { @@ -130,114 +127,102 @@ "com.unity.transport": "2.4.0", "com.unity.collections": "2.4.3", "com.unity.inputsystem": "1.10.0", - "com.unity.shadergraph": "17.0.3", - "com.unity.textmeshpro": "3.0.7", + "com.unity.shadergraph": "17.3.0", + "com.unity.modules.wind": "1.0.0", "com.unity.ext.flatsharp": "1.1.1", "com.unity.modules.video": "1.0.0", "com.unity.xr.core-utils": "2.3.0", + "com.unity.modules.terrain": "1.0.0", + "com.unity.modules.screencapture": "1.0.0", "com.unity.nuget.newtonsoft-json": "3.2.1", "com.unity.modules.particlesystem": "1.0.0" }, "url": "https://packages.unity.com" }, "com.unity.polyspatial.visionos": { - "version": "2.3.1", + "version": "3.1.5", "depth": 0, "source": "registry", "dependencies": { - "com.unity.polyspatial": "2.3.1", - "com.unity.xr.visionos": "2.3.1", + "com.unity.polyspatial": "3.1.5", + "com.unity.xr.visionos": "3.1.5", "com.unity.xr.management": "4.5.0", - "com.unity.polyspatial.xr": "2.3.1" + "com.unity.polyspatial.xr": "3.1.5" }, "url": "https://packages.unity.com" }, "com.unity.polyspatial.xr": { - "version": "2.3.1", + "version": "3.1.5", "depth": 1, "source": "registry", "dependencies": { + "com.unity.ugui": "2.0.0", "com.unity.xr.hands": "1.4.1", "com.unity.inputsystem": "1.10.0", - "com.unity.polyspatial": "2.3.1", - "com.unity.textmeshpro": "3.0.7", + "com.unity.polyspatial": "3.1.5", "com.unity.xr.core-utils": "2.3.0", - "com.unity.xr.arfoundation": "6.0.3", + "com.unity.xr.arfoundation": "6.3.4", "com.unity.nuget.newtonsoft-json": "3.2.1" }, "url": "https://packages.unity.com" }, "com.unity.render-pipelines.core": { - "version": "17.2.0", + "version": "17.5.0", "depth": 1, "source": "builtin", "dependencies": { "com.unity.burst": "1.8.14", - "com.unity.mathematics": "1.3.2", - "com.unity.ugui": "2.0.0", "com.unity.collections": "2.4.3", - "com.unity.modules.physics": "1.0.0", "com.unity.modules.terrain": "1.0.0", - "com.unity.modules.jsonserialize": "1.0.0", - "com.unity.rendering.light-transport": "1.0.1" + "com.unity.modules.jsonserialize": "1.0.0" } }, "com.unity.render-pipelines.universal": { - "version": "17.2.0", + "version": "17.5.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.render-pipelines.core": "17.2.0", - "com.unity.shadergraph": "17.2.0", - "com.unity.render-pipelines.universal-config": "17.0.3" + "com.unity.render-pipelines.core": "17.5.0", + "com.unity.shadergraph": "17.5.0", + "com.unity.render-pipelines.universal-config": "17.5.0" } }, "com.unity.render-pipelines.universal-config": { - "version": "17.0.3", + "version": "17.5.0", "depth": 1, "source": "builtin", "dependencies": { - "com.unity.render-pipelines.core": "17.0.3" - } - }, - "com.unity.rendering.light-transport": { - "version": "1.0.1", - "depth": 2, - "source": "builtin", - "dependencies": { - "com.unity.collections": "2.2.0", - "com.unity.mathematics": "1.2.4", - "com.unity.modules.terrain": "1.0.0" + "com.unity.render-pipelines.core": "17.5.0" } }, "com.unity.searcher": { - "version": "4.9.3", + "version": "4.9.4", "depth": 2, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, "com.unity.shadergraph": { - "version": "17.2.0", + "version": "17.5.0", "depth": 1, "source": "builtin", "dependencies": { - "com.unity.render-pipelines.core": "17.2.0", + "com.unity.render-pipelines.core": "17.5.0", "com.unity.searcher": "4.9.3" } }, "com.unity.test-framework": { - "version": "1.6.0", + "version": "1.7.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.ext.nunit": "2.0.3", + "com.unity.ext.nunit": "2.1.0", "com.unity.modules.imgui": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0" } }, "com.unity.test-framework.performance": { - "version": "3.1.0", + "version": "3.5.0", "depth": 3, "source": "registry", "dependencies": { @@ -246,16 +231,8 @@ }, "url": "https://packages.unity.com" }, - "com.unity.textmeshpro": { - "version": "5.0.0", - "depth": 2, - "source": "builtin", - "dependencies": { - "com.unity.ugui": "2.0.0" - } - }, "com.unity.timeline": { - "version": "1.8.9", + "version": "1.8.12", "depth": 0, "source": "registry", "dependencies": { @@ -267,27 +244,29 @@ "url": "https://packages.unity.com" }, "com.unity.transport": { - "version": "2.5.3", + "version": "6.5.0", "depth": 2, - "source": "registry", + "source": "builtin", "dependencies": { - "com.unity.burst": "1.8.12", - "com.unity.collections": "2.2.1", - "com.unity.mathematics": "1.3.1" - }, - "url": "https://packages.unity.com" + "com.unity.collections": "6.5.0", + "com.unity.burst": "1.8.24", + "com.unity.mathematics": "1.4.0" + } }, "com.unity.ugui": { - "version": "2.0.0", + "version": "2.5.0", "depth": 0, "source": "builtin", "dependencies": { "com.unity.modules.ui": "1.0.0", - "com.unity.modules.imgui": "1.0.0" + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.physics": "1.0.0" } }, "com.unity.visualscripting": { - "version": "1.9.7", + "version": "1.9.11", "depth": 0, "source": "registry", "dependencies": { @@ -297,7 +276,7 @@ "url": "https://packages.unity.com" }, "com.unity.xr.arfoundation": { - "version": "6.2.0", + "version": "6.5.0", "depth": 1, "source": "registry", "dependencies": { @@ -315,7 +294,7 @@ "url": "https://packages.unity.com" }, "com.unity.xr.core-utils": { - "version": "2.5.3", + "version": "2.6.0", "depth": 1, "source": "registry", "dependencies": { @@ -324,7 +303,7 @@ "url": "https://packages.unity.com" }, "com.unity.xr.hands": { - "version": "1.5.0", + "version": "1.8.0", "depth": 2, "source": "registry", "dependencies": { @@ -337,21 +316,19 @@ "url": "https://packages.unity.com" }, "com.unity.xr.legacyinputhelpers": { - "version": "2.1.12", + "version": "3.0.1", "depth": 2, "source": "registry", "dependencies": { - "com.unity.modules.vr": "1.0.0", "com.unity.modules.xr": "1.0.0" }, "url": "https://packages.unity.com" }, "com.unity.xr.management": { - "version": "4.5.1", + "version": "4.5.4", "depth": 1, "source": "registry", "dependencies": { - "com.unity.modules.vr": "1.0.0", "com.unity.modules.xr": "1.0.0", "com.unity.xr.core-utils": "2.2.1", "com.unity.modules.subsystems": "1.0.0", @@ -360,13 +337,13 @@ "url": "https://packages.unity.com" }, "com.unity.xr.visionos": { - "version": "2.3.1", + "version": "3.1.5", "depth": 0, "source": "registry", "dependencies": { "com.unity.xr.core-utils": "2.3.0", "com.unity.xr.management": "4.5.0", - "com.unity.xr.arfoundation": "6.0.3" + "com.unity.xr.arfoundation": "6.3.4" }, "url": "https://packages.unity.com" }, @@ -376,6 +353,14 @@ "source": "builtin", "dependencies": {} }, + "com.unity.modules.adaptiveperformance": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.subsystems": "1.0.0" + } + }, "com.unity.modules.ai": { "version": "1.0.0", "depth": 0, @@ -386,7 +371,9 @@ "version": "1.0.0", "depth": 0, "source": "builtin", - "dependencies": {} + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0" + } }, "com.unity.modules.animation": { "version": "1.0.0", @@ -460,6 +447,14 @@ "dependencies": {} }, "com.unity.modules.physics2d": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physicscore2d": "1.0.0" + } + }, + "com.unity.modules.physicscore2d": { "version": "1.0.0", "depth": 0, "source": "builtin", @@ -519,7 +514,8 @@ "com.unity.modules.imgui": "1.0.0", "com.unity.modules.jsonserialize": "1.0.0", "com.unity.modules.hierarchycore": "1.0.0", - "com.unity.modules.physics": "1.0.0" + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.animation": "1.0.0" } }, "com.unity.modules.umbra": { @@ -583,32 +579,32 @@ "com.unity.modules.imageconversion": "1.0.0" } }, - "com.unity.modules.vehicles": { + "com.unity.modules.vectorgraphics": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.physics": "1.0.0" + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0" } }, - "com.unity.modules.video": { + "com.unity.modules.vehicles": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.audio": "1.0.0", - "com.unity.modules.ui": "1.0.0", - "com.unity.modules.unitywebrequest": "1.0.0" + "com.unity.modules.physics": "1.0.0" } }, - "com.unity.modules.vr": { + "com.unity.modules.video": { "version": "1.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.modules.jsonserialize": "1.0.0", - "com.unity.modules.physics": "1.0.0", - "com.unity.modules.xr": "1.0.0" + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" } }, "com.unity.modules.wind": { diff --git a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/ProjectSettings/EditorBuildSettings.asset b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/ProjectSettings/EditorBuildSettings.asset index 2e4d9636..93ef9ffc 100644 --- a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/ProjectSettings/EditorBuildSettings.asset +++ b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/ProjectSettings/EditorBuildSettings.asset @@ -14,4 +14,3 @@ EditorBuildSettings: com.unity.polyspatial.xr.xr_settings: {fileID: 11400000, guid: 03baaf648951648adbfdbbab0ddd0fb6, type: 2} com.unity.xr.arfoundation.simulation_settings: {fileID: 11400000, guid: 17032cdfb5c484332a4a61273b059b68, type: 2} com.unity.xr.management.loader_settings: {fileID: 11400000, guid: 6fa879ba305fc48c9a9663ba39d57902, type: 2} - m_UseUCBPForAssetBundles: 0 diff --git a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/ProjectSettings/GraphicsSettings.asset b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/ProjectSettings/GraphicsSettings.asset index a148e490..634b7e57 100644 --- a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/ProjectSettings/GraphicsSettings.asset +++ b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/ProjectSettings/GraphicsSettings.asset @@ -36,6 +36,15 @@ GraphicsSettings: - {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0} m_PreloadedShaders: [] m_PreloadShadersBatchTimeLimit: -1 + m_GraphicsStateCollection: {fileID: 0} + m_CollectionStartupAction: 0 + m_TraceSavePath: TracedCollection + m_TraceSendToEditor: 1 + m_AdditionalWarmupCollections: [] + m_WarmupAsync: 1 + m_EnableCacheMissTracing: 0 + m_WarmupProgressivelyLimit: -1 + m_CacheMissCollectionPath: CacheMissCollection m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} m_CustomRenderPipeline: {fileID: 11400000, guid: 4b83569d67af61e458304325a23e5dfd, type: 2} m_TransparencySortMode: 0 @@ -59,6 +68,10 @@ GraphicsSettings: m_AlbedoSwatchInfos: [] m_RenderPipelineGlobalSettingsMap: UnityEngine.Rendering.Universal.UniversalRenderPipeline: {fileID: 11400000, guid: 18dc0cd2c080841dea60987a38ce93fa, type: 2} + m_ShaderBuildSettings: + keywordDeclarationOverrides: [] + numInternalDefines: 0 + defines: [] m_LightsUseLinearIntensity: 1 m_LightsUseColorTemperature: 1 m_LogWhenShaderIsCompiled: 0 diff --git a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/ProjectSettings/PackageManagerSettings.asset b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/ProjectSettings/PackageManagerSettings.asset index be4a7974..d8f7921a 100644 --- a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/ProjectSettings/PackageManagerSettings.asset +++ b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/ProjectSettings/PackageManagerSettings.asset @@ -12,32 +12,33 @@ MonoBehaviour: m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} m_Name: m_EditorClassIdentifier: - m_EnablePreviewPackages: 0 - m_EnablePackageDependencies: 0 + m_EnablePreReleasePackages: 0 m_AdvancedSettingsExpanded: 1 m_ScopedRegistriesSettingsExpanded: 1 + m_SeeAllPackageVersions: 0 + m_DismissPreviewPackagesInUse: 0 oneTimeWarningShown: 0 - m_Registries: - - m_Id: main + oneTimePackageErrorsPopUpShown: 0 + m_MainRegistry: + m_Id: main m_Name: m_Url: https://packages.unity.com m_Scopes: [] m_IsDefault: 1 + m_IsUnityRegistry: 1 m_Capabilities: 7 + m_ConfigSource: 0 + m_Compliance: + m_Status: 0 + m_Violations: [] + m_ScopedRegistries: [] m_UserSelectedRegistryName: m_UserAddingNewScopedRegistry: 0 m_RegistryInfoDraft: - m_ErrorMessage: - m_Original: - m_Id: - m_Name: - m_Url: - m_Scopes: [] - m_IsDefault: 0 - m_Capabilities: 0 m_Modified: 0 - m_Name: - m_Url: - m_Scopes: - - - m_SelectedScopeIndex: 0 + m_ErrorMessage: + m_UserModificationsEntityId: + m_rawData: 568105589213756492 + m_OriginalEntityId: + m_rawData: 568105589213756490 + m_LoadAssets: 0 diff --git a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/ProjectSettings/PhysicsCoreProjectSettings2D.asset b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/ProjectSettings/PhysicsCoreProjectSettings2D.asset new file mode 100644 index 00000000..049c7454 --- /dev/null +++ b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/ProjectSettings/PhysicsCoreProjectSettings2D.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!176606843 &1 +PhysicsCoreProjectSettings2D: + m_ObjectHideFlags: 0 + m_PhysicsCoreSettings: {fileID: 0} diff --git a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/ProjectSettings/ProjectVersion.txt b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/ProjectSettings/ProjectVersion.txt index b5c96e15..c1608124 100644 --- a/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/ProjectSettings/ProjectVersion.txt +++ b/plug-ins/Apple.SpatialController/Apple.SpatialController_Unity/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 6000.2.6f2 -m_EditorVersionWithRevision: 6000.2.6f2 (4a4dcaec6541) +m_EditorVersion: 6000.5.2f1 +m_EditorVersionWithRevision: 6000.5.2f1 (eb73d3b415a1) diff --git a/plug-ins/Apple.SpatialController/Native/SpatialController.xcconfig b/plug-ins/Apple.SpatialController/Native/SpatialController.xcconfig index 3ec17790..b7576d68 100644 --- a/plug-ins/Apple.SpatialController/Native/SpatialController.xcconfig +++ b/plug-ins/Apple.SpatialController/Native/SpatialController.xcconfig @@ -25,7 +25,7 @@ NATIVE_LIBRARY_ROOT_FOLDER_NAME=Apple.SpatialController // ------------------ GENERATE_INFOPLIST_FILE = YES -CURRENT_PROJECT_VERSION = 1.0.4 +CURRENT_PROJECT_VERSION = 1.0.6 MARKETING_VERSION = $CURRENT_PROJECT_VERSION VERSIONING_SYSTEM = apple-generic INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2021 - 2025 Apple, Inc. All rights reserved." diff --git a/plug-ins/Apple.SpatialController/Native/SpatialController.xcodeproj/xcshareddata/xcschemes/visionOS - Debug.xcscheme b/plug-ins/Apple.SpatialController/Native/SpatialController.xcodeproj/xcshareddata/xcschemes/visionOS - Debug.xcscheme index 0037b3bb..7b51160c 100644 --- a/plug-ins/Apple.SpatialController/Native/SpatialController.xcodeproj/xcshareddata/xcschemes/visionOS - Debug.xcscheme +++ b/plug-ins/Apple.SpatialController/Native/SpatialController.xcodeproj/xcshareddata/xcschemes/visionOS - Debug.xcscheme @@ -11,7 +11,7 @@ ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction"> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> + scriptText = ""$AUP_SHELL_SCRIPT_PATH"/copy_native_libraries.sh "> CHHapticEngine? +public func createHapticsEngine(for uuid: String, haptics: GCDeviceHaptics, withLocality locality: GCHapticsLocality) -> CHHapticEngine? { guard let spatialController = _spatialController else { return nil } - guard let haptics = controller.haptics else { - return nil - } guard let engine = haptics.createEngine(withLocality: locality) else { return nil } diff --git a/plug-ins/Apple.SpatialController/Native/SpatialController/Extensions.swift b/plug-ins/Apple.SpatialController/Native/SpatialController/Extensions.swift index 55547c2c..b7018bb1 100644 --- a/plug-ins/Apple.SpatialController/Native/SpatialController/Extensions.swift +++ b/plug-ins/Apple.SpatialController/Native/SpatialController/Extensions.swift @@ -133,13 +133,17 @@ public extension UnsafeMutablePointer { // MARK: - Dictionary Extensions /// Support bidirectional dictionary look-ups. -extension Dictionary where Value: Equatable { +extension Dictionary where Value: GCDevice { /// Finds a key for a given value in the dictionary. /// /// - Parameter val: The value to search for. /// - Returns: The first key that maps to the given value, or nil if not found. - func someKey(forValue val: Value) -> Key? { - return first(where: { $1 == val })?.key + func someKey(forValue val: GCController) -> Key? { + return first(where: { ($1 as? GCController) == val })?.key + } + + func someKey(forValue val: GCStylus) -> Key? { + return first(where: { ($1 as? GCStylus) == val })?.key } } @@ -154,9 +158,59 @@ extension Bool { } } -// MARK: - GCController Extensions +// MARK: - GCDevice Extensions + +extension GCDevice { + var isSpatial : Bool { + guard #available(visionOS 26.0, *) else { + return false + } + return productCategory == GCProductCategorySpatialController || productCategory == GCProductCategorySpatialStylus + } + + var battery : GCDeviceBattery? { + guard #available(macOS 10.16, tvOS 14, iOS 14, *) else { + return nil + } + if let controller = self as? GCController { + return controller.battery + } + return nil + } + + var motion : GCMotion? { + guard #available(macOS 10.16, tvOS 14, iOS 14, *) else { + return nil + } + if let controller = self as? GCController { + return controller.motion + } + return nil + } + + var light : GCDeviceLight? { + guard #available(macOS 10.16, tvOS 14, iOS 14, *) else { + return nil + } + if let controller = self as? GCController { + return controller.light + } + return nil + } + + var haptics : GCDeviceHaptics? { + guard #available(macOS 10.16, tvOS 14, iOS 14, *) else { + return nil + } + if let controller = self as? GCController { + return controller.haptics + } + if let stylus = self as? GCStylus { + return stylus.haptics + } + return nil + } -extension GCController { /// Converts a GCController to an SCController structure. /// /// - Parameter uid: The unique identifier for the controller. @@ -166,18 +220,28 @@ extension GCController { var hasMotion = false var hasLight = false var hasHaptics = false + var isAttachedToDevice = false var scMotion = SCControllerMotionCapabilities(hasAttitude: SCFalse, hasRotationRate: SCFalse, hasGravityAndUserAcceleration: SCFalse, sensorsRequireManualActivation: SCFalse) var scHaptics = SCDeviceHaptics(supportedLocalities: 0) - if #available(visionOS 1.0, macOS 10.16, iOS 14.0, tvOS 14.0, *) { - hasBattery = self.battery != nil - hasMotion = self.motion != nil - hasLight = self.light != nil - hasHaptics = self.haptics != nil - if let motion { - scMotion = motion.toSCControllerMotionCapabilities() + if #available(visionOS 1.0, macOS 10.16, tvOS 14.0, iOS 14.0, *) { + if let controller = self as? GCController { + isAttachedToDevice = controller.isAttachedToDevice + hasBattery = controller.battery != nil + hasMotion = controller.motion != nil + hasLight = controller.light != nil + hasHaptics = controller.haptics != nil + if let motion = controller.motion { + scMotion = motion.toSCControllerMotionCapabilities() + } + if let haptics = controller.haptics { + scHaptics = haptics.toSCDeviceHaptics() + } } - if let haptics { - scHaptics = haptics.toSCDeviceHaptics() + else if let stylus = self as? GCStylus { + hasHaptics = stylus.haptics != nil + if let haptics = stylus.haptics { + scHaptics = haptics.toSCDeviceHaptics() + } } } let vendorName: String = self.vendorName ?? "" @@ -185,7 +249,7 @@ extension GCController { uniqueId: uid.toCharPCopy(), productCategory: self.productCategory.toCharPCopy(), vendorName: vendorName.toCharPCopy(), - isAttachedToDevice: self.isAttachedToDevice ? SCTrue : SCFalse, + isAttachedToDevice: isAttachedToDevice ? SCTrue : SCFalse, hasBattery: hasBattery ? SCTrue : SCFalse, hasMotion: hasMotion ? SCTrue : SCFalse, hasLight: hasLight ? SCTrue : SCFalse, @@ -194,13 +258,6 @@ extension GCController { haptics: scHaptics ) } - - var isSpatialController : Bool { - guard #available(visionOS 26.0, *) else { - return false - } - return productCategory == GCProductCategorySpatialController || productCategory == GCProductCategorySpatialStylus - } } extension GCDeviceHaptics { @@ -443,10 +500,10 @@ extension Accessory { /// The GCController associated with this accessory, if available. /// /// - Returns: The GCController if the source is a device that conforms to GCController, nil otherwise. - var controller: GCController? { + var device: GCDevice? { switch (source) { case let .device(device): - return device as? GCController + return device default: return nil } @@ -465,7 +522,7 @@ extension Accessory { description: self.description.toCharPCopy(), inherentChirality: self.inherentChirality.toSCAccessoryChirality(), locations: self.locations.toSCAccessoryLocations(), - source: self.controller!.toSCController(uid: uid) + source: self.device!.toSCController(uid: uid) ) } } diff --git a/plug-ins/Apple.SpatialController/Native/SpatialController/SpatialController.swift b/plug-ins/Apple.SpatialController/Native/SpatialController/SpatialController.swift index 710fee8a..d1dba33c 100644 --- a/plug-ins/Apple.SpatialController/Native/SpatialController/SpatialController.swift +++ b/plug-ins/Apple.SpatialController/Native/SpatialController/SpatialController.swift @@ -44,7 +44,7 @@ enum AccessoryState { } class AccessoryTracker { - let controller: GCController + let device: GCDevice let uuid: String var accessory: Accessory? @@ -52,9 +52,12 @@ class AccessoryTracker { var acquireTask: Task<(AccessoryState), Never>? var onCompletion: ((AccessoryState, Accessory?) -> Void)? - init(controller: GCController, uuid: String) + //var controller: GCController? { device as? GCController } + //var stylus: GCStylus? { device as? GCStylus } + + init(device: GCDevice, uuid: String) { - self.controller = controller + self.device = device self.uuid = uuid state = .acquiring } @@ -69,7 +72,7 @@ class AccessoryTracker { let uuid = uuid do { Logger.controller.log("SpatialController \(uuid): acquiring accessory...") - accessory = try await Accessory(device: controller) + accessory = try await Accessory(device: device) if let accessory { Logger.controller.log("SpatialController \(uuid): acquired accessory \(accessory.description)") state = .acquired @@ -250,14 +253,14 @@ class SpatialController { } } - func startAccessoryTracking(uuid: String, controller: GCController, onCompletion: @escaping (AccessoryState, Accessory?) -> Void) + func startAccessoryTracking(uuid: String, device: GCDevice, onCompletion: @escaping (AccessoryState, Accessory?) -> Void) { guard arTrackingAuthorizationState != .notSupported else { Logger.controller.error("SpatialController \(uuid): Accessory tracking is not supported!") onCompletion(.acquireAccessoryFailed, nil) return } - let accessoryTracker = AccessoryTracker(controller: controller, uuid: uuid) + let accessoryTracker = AccessoryTracker(device: device, uuid: uuid) accessoryTracker.onCompletion = onCompletion accessoryTrackers.updateValue(accessoryTracker, forKey: uuid) @@ -407,7 +410,7 @@ public func SpatialController_SetControllerConnectionHandlers if !spatialController.controllerMapping.elements.isEmpty { Logger.controller.log("SpatialController: Notifying connection to already connected controllers...") for (uuid, controller) in spatialController.controllerMapping.elements { - guard controller.isSpatialController else { + guard controller.isSpatial else { Logger.controller.log("SpatialController: Non-spatial controller connected (category: \(controller.productCategory))") continue } @@ -440,8 +443,8 @@ public func SpatialController_SetAccessoryConnectionHandlers continue; } let accessory = accessoryTracker.accessory! - let controller = accessory.controller! - Logger.controller.log("SpatialController: Accessory for spatial controller \(uuid) connected (category: \(controller.productCategory))") + let device = accessory.device! + Logger.controller.log("SpatialController: Accessory for spatial controller \(uuid) connected (category: \(device.productCategory))") spatialController.onAccessoryConnectedCallback?(accessory.toSCAccessory(uid: uuid)) } } @@ -693,14 +696,11 @@ public func SpatialController_GetControllerInputInfoForInputName Logger.controller.error("SpatialController: GetControllerInputInfoForInputName(uid:\(uniqueId.toString())): Not initialized!") return false } - guard let controller = spatialController.controllerMapping.elements[uniqueId.toString()] else { + guard let device = spatialController.controllerMapping.elements[uniqueId.toString()] else { Logger.controller.error("SpatialController: GetControllerInputInfoForInputName(uid:\(uniqueId.toString())): No such controller!") return false } - // GCPhysicalDeviceInputState... - let input = controller.input - let symbolName = _getSymbolNameForInput(inputName: inputName, profile: input, extendedGamepad: controller.extendedGamepad) - let localizedName = _getLocalizedNameForInput(inputName: inputName, profile: input, extendedGamepad: controller.extendedGamepad) + let (symbolName, localizedName) = _getSymbolNameAndLocalizedNameForInput(inputName: inputName, profile: device) guard symbolName != nil || localizedName != nil else { Logger.controller.error("SpatialController: GetControllerInputInfoForInputName(uid:\(uniqueId.toString()), inputName:\(inputName.rawValue)): Controller does not have name or symbol for inputName!") return false @@ -733,13 +733,12 @@ public func SpatialController_GetSymbolForInputName Logger.controller.error("SpatialController: GetSymbolForInputName(uid:\(uniqueId.toString())): Not initialized!") return false } - guard let controller = spatialController.controllerMapping.elements[uniqueId.toString()] else { + guard let device = spatialController.controllerMapping.elements[uniqueId.toString()] else { Logger.controller.error("SpatialController: GetSymbolForInputName(uid:\(uniqueId.toString())): No such controller!") return false } // GCPhysicalDeviceInputState... - let input = controller.input - guard let symbolName = _getSymbolNameForInput(inputName: inputName, profile: input, extendedGamepad: controller.extendedGamepad) else { + guard let symbolName = _getSymbolNameForInput(inputName: inputName, profile: device) else { Logger.controller.error("SpatialController: GetSymbolForInputName(uid:\(uniqueId.toString()), inputName:\(inputName.rawValue)): Controller does not have symbol for inputName!") return false } @@ -887,6 +886,37 @@ fileprivate func _getLocalizedNameForInput(inputName : SCControllerInputName, pr return _getLocalizedNameForInput(inputName: inputName, profile: profile) ?? _getLocalizedNameForInput(inputName: inputName, extendedGamepad: extendedGamepad) } +@available(macOS 13.0, iOS 16.0, tvOS 16.0, visionOS 1.0, *) +fileprivate func _getSymbolNameForInput(inputName : SCControllerInputName, profile : GCDevice) -> String? { + if let controller = profile as? GCController { + return _getSymbolNameForInput(inputName: inputName, profile: controller.input, extendedGamepad: controller.extendedGamepad) + } + else if let stylus = profile as? GCStylus { + guard let input = stylus.input else { + return nil + } + return _getSymbolNameForInput(inputName: inputName, profile: input) + } + return nil +} + +@available(macOS 13.0, iOS 16.0, tvOS 16.0, visionOS 1.0, *) +fileprivate func _getSymbolNameAndLocalizedNameForInput(inputName : SCControllerInputName, profile : GCDevice) -> (symbolName: String?, localizedName: String?) { + if let controller = profile as? GCController { + return (_getSymbolNameForInput(inputName: inputName, profile: controller.input, extendedGamepad: controller.extendedGamepad), + _getLocalizedNameForInput(inputName: inputName, profile: controller.input, extendedGamepad: controller.extendedGamepad)) + } + else if let stylus = profile as? GCStylus { + guard let input = stylus.input else { + return (nil, nil) + } + return (_getSymbolNameForInput(inputName: inputName, profile: input), + _getLocalizedNameForInput(inputName: inputName, profile: input)) + } + return (nil, nil) +} + + @_cdecl("SpatialController_PollController") public func SpatialController_PollController ( @@ -902,17 +932,24 @@ public func SpatialController_PollController Logger.controller.error("SpatialController: PollController(uid:\(uuid)): Not initialized!") return false } - guard let controller = spatialController.controllerMapping.elements[uuid] else { + guard let device = spatialController.controllerMapping.elements[uuid] else { // REPORT ERROR: no such controller? Logger.controller.error("SpatialController: PollController(uid:\(uuid)): No such controller!") return false } - let touchpadState = controller.extendedGamepad is GCDualShockGamepad || controller.extendedGamepad is GCDualSenseGamepad ? spatialController.touchpadStates[uuid] : nil - _pollDeviceInputState(controller: controller, profile: controller.input, touchpadState: touchpadState, input: &state.input) - _pollControllerBattery(controller: controller, profile: controller.battery, battery: &state.battery) - _pollControllerMotion(controller: controller, profile: controller.motion, motion: &state.motion) - _pollControllerLight(controller: controller, profile: controller.light, light: &state.light) + if let controller = device as? GCController { + let touchpadState = controller.extendedGamepad is GCDualShockGamepad || controller.extendedGamepad is GCDualSenseGamepad ? spatialController.touchpadStates[uuid] : nil + _pollDeviceInputState(profile: controller.input, controller: controller, touchpadState: touchpadState, input: &state.input) + _pollControllerBattery(controller: controller, profile: controller.battery, battery: &state.battery) + _pollControllerMotion(controller: controller, profile: controller.motion, motion: &state.motion) + _pollControllerLight(controller: controller, profile: controller.light, light: &state.light) + } + else if let stylus = device as? GCStylus { + if let input = stylus.input { + _pollDeviceInputState(profile: input, input: &state.input) + } + } let accessory = spatialController.accessoryTrackers[uuid]?.accessory _pollSpatialController(accessory: accessory, accessoryAnchors: &state.anchors) @@ -931,9 +968,9 @@ public func SpatialController_PollController } fileprivate func _pollDeviceInputState( - controller : GCController, profile : GCDevicePhysicalInputState, - touchpadState : TouchpadControllerState?, + controller : GCController? = nil, + touchpadState : TouchpadControllerState? = nil, input : inout SCControllerInputState) { // Buttons... @@ -987,11 +1024,11 @@ fileprivate func _pollDeviceInputState( } } } - if let gamepad = controller.extendedGamepad as? GCDualShockGamepad { + if let gamepad = controller?.extendedGamepad as? GCDualShockGamepad { buttonStates.append(SCInputButtonState(name: SCControllerInputNameButtonTouchpad, state: gamepad.touchpadButton.toSCButtonState(touchpadState?.touchpadButton))) dpadStates.append(SCInputDPadState(name: SCControllerInputNameDPadTouchpadPrimary, state: gamepad.touchpadPrimary.toSCDPadState())) dpadStates.append(SCInputDPadState(name: SCControllerInputNameDPadTouchpadSecondary, state: gamepad.touchpadSecondary.toSCDPadState())) - } else if let gamepad = controller.extendedGamepad as? GCDualSenseGamepad { + } else if let gamepad = controller?.extendedGamepad as? GCDualSenseGamepad { buttonStates.append(SCInputButtonState(name: SCControllerInputNameButtonTouchpad, state: gamepad.touchpadButton.toSCButtonState(touchpadState?.touchpadButton))) dpadStates.append(SCInputDPadState(name: SCControllerInputNameDPadTouchpadPrimary, state: gamepad.touchpadPrimary.toSCDPadState())) dpadStates.append(SCInputDPadState(name: SCControllerInputNameDPadTouchpadSecondary, state: gamepad.touchpadSecondary.toSCDPadState())) @@ -1194,6 +1231,13 @@ class SCNotificationHandler : NSObject { name: NSNotification.Name.GCControllerDidConnect, object: .none ) + // Add GCStylusDidConnect.... + NotificationCenter.default.addObserver( + self, + selector: #selector(onStylusConnected(notification:)), + name: NSNotification.Name.GCStylusDidConnect, + object: .none + ) // Add GCControllerDidDisconnect... NotificationCenter.default.addObserver( @@ -1202,6 +1246,13 @@ class SCNotificationHandler : NSObject { name: NSNotification.Name.GCControllerDidDisconnect, object: .none ) + // Add GCStylusDidDisconnect... + NotificationCenter.default.addObserver( + self, + selector: #selector(onStylusDisconnected(notification:)), + name: NSNotification.Name.GCStylusDidDisconnect, + object: .none + ) } public func removeHandlers() { @@ -1219,7 +1270,7 @@ class SCNotificationHandler : NSObject { } let uuid = spatialController.controllerMapping.elements.someKey(forValue: controller) ?? UUID().uuidString spatialController.controllerMapping.updateValue(controller, forKey: uuid) - if controller.isSpatialController { + if controller.isSpatial { Logger.controller.log("SpatialController: Spatial controller \(uuid) connected (category: \(controller.productCategory))") } else if let dualshockGamepad = controller.extendedGamepad as? GCDualShockGamepad { spatialController.touchpadStates.updateValue(.init(dualshockGamepad), forKey: uuid) @@ -1237,10 +1288,10 @@ class SCNotificationHandler : NSObject { controller.motion?.sensorsActive = true } - guard controller.isSpatialController else { + guard controller.isSpatial else { return } - spatialController.startAccessoryTracking(uuid: uuid, controller: controller) { state, accessory in + spatialController.startAccessoryTracking(uuid: uuid, device: controller) { state, accessory in if state == .acquired { Logger.controller.log("SpatialController: Accessory for spatial controller \(uuid) connected (category: \(controller.productCategory))") spatialController.onAccessoryConnectedCallback?(accessory!.toSCAccessory(uid: uuid)) @@ -1248,6 +1299,35 @@ class SCNotificationHandler : NSObject { } } + @objc + public func onStylusConnected(notification : NSNotification) { + let stylus = notification.object as! GCStylus + Logger.controller.log("SpatialController: GCStylusDidConnect category: \(stylus.productCategory)") + + guard let spatialController = _spatialController else { + Logger.controller.error("SpatialController: INTERNAL ERROR: onStylusConnected while uninitialized!") + return + } + let uuid = spatialController.controllerMapping.elements.someKey(forValue: stylus) ?? UUID().uuidString + spatialController.controllerMapping.updateValue(stylus, forKey: uuid) + if stylus.isSpatial { + Logger.controller.log("SpatialController: Spatial stylus \(uuid) connected (category: \(stylus.productCategory))") + } else { + Logger.controller.log("SpatialController: Non-spatial stylus \(uuid) connected (category: \(stylus.productCategory))") + } + spatialController.onControllerConnectedCallback?(stylus.toSCController(uid: uuid)) + + guard stylus.isSpatial else { + return + } + spatialController.startAccessoryTracking(uuid: uuid, device: stylus) { state, accessory in + if state == .acquired { + Logger.controller.log("SpatialController: Accessory for spatial stylus \(uuid) connected (category: \(stylus.productCategory))") + spatialController.onAccessoryConnectedCallback?(accessory!.toSCAccessory(uid: uuid)) + } + } + } + @objc public func onControllerDisconnected(notification : NSNotification) { let controller = notification.object as! GCController @@ -1265,7 +1345,7 @@ class SCNotificationHandler : NSObject { Logger.controller.log("SpatialController: Accessory for spatial controller \(uuid) disconnected (category: \(controller.productCategory))") spatialController.onAccessoryDisconnectedCallback?(accessory.toSCAccessory(uid: uuid)) } - if controller.isSpatialController { + if controller.isSpatial { Logger.controller.log("SpatialController: Spatial controller \(uuid) disconnected (category: \(controller.productCategory))") } else if controller.extendedGamepad is GCDualShockGamepad { Logger.controller.log("SpatialController: Non-spatial DualShock controller \(uuid) disconnected (category: \(controller.productCategory))") @@ -1285,4 +1365,36 @@ class SCNotificationHandler : NSObject { } spatialController.stopAccessoryTracking(uuid: uuid) } + + @objc + public func onStylusDisconnected(notification : NSNotification) { + let stylus = notification.object as! GCStylus + Logger.controller.log("SpatialController: GCStylusDidDisconnect category: \(stylus.productCategory)") + + guard let spatialController = _spatialController else { + Logger.controller.error("SpatialController: INTERNAL ERROR: onStylusDisconnected while uninitialized!") + return + } + guard let uuid = spatialController.controllerMapping.elements.someKey(forValue: stylus) else { + Logger.controller.log("SpatialController: Unknown stylus disconnected (category: \(stylus.productCategory))") + return + } + if let accessory = spatialController.accessoryTrackers[uuid]?.accessory { + Logger.controller.log("SpatialController: Accessory for spatial controller \(uuid) disconnected (category: \(stylus.productCategory))") + spatialController.onAccessoryDisconnectedCallback?(accessory.toSCAccessory(uid: uuid)) + } + if stylus.isSpatial { + Logger.controller.log("SpatialController: Spatial stylus \(uuid) disconnected (category: \(stylus.productCategory))") + } else { + Logger.controller.log("SpatialController: Non-spatial stylus \(uuid) disconnected (category: \(stylus.productCategory))") + } + spatialController.controllerMapping.removeValue(forKey: uuid) + spatialController.onControllerDisconnectedCallback?(stylus.toSCController(uid: uuid)) + + // Remove any haptic engines for controller... + if #available(iOS 14, tvOS 14.0, macOS 10.16, *) { + shutdownExistingHapticsEnginesForController(uuid: uuid) + } + spatialController.stopAccessoryTracking(uuid: uuid) + } } diff --git a/plug-ins/Apple.StoreKit/.gitignore b/plug-ins/Apple.StoreKit/.gitignore new file mode 100644 index 00000000..084e968b --- /dev/null +++ b/plug-ins/Apple.StoreKit/.gitignore @@ -0,0 +1,41 @@ +Library +Temp +obj +Logs +*.sln +*.csproj +.idea +.vs +UserSettings +*.DS_Store + +# Xcode - User settings +**xcuserdata/ + +# Xcode - compatibility with Xcode 8 and earlier +*.xcscmblueprint +*.xccheckout + +# Xcode - compatibility with Xcode 3 and earlier +build/ +DerivedData/ +*.moved-aside +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 + +# Xcode workspace files (generated during development, not checked in) +*.xcworkspace + +# Obj-C/Swift specific +*.hmap + +# App packaging +*.ipa +*.dSYM.zip +*.dSYM diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/.gitignore b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/.gitignore new file mode 100644 index 00000000..bffb817d --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/.gitignore @@ -0,0 +1,2 @@ +html + diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit.meta new file mode 100644 index 00000000..d56337e2 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0a49dea3968ad4ff09bfa508edc64b76 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/CHANGELOG.md b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/CHANGELOG.md new file mode 100644 index 00000000..4f5a4cda --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/CHANGELOG.md @@ -0,0 +1,12 @@ +# CHANGELOG +All notable changes to this project will be documented in this file. + +## [1.0.0] - 2026-09-16 +- Initial release. Exposes Apple's StoreKit 2 framework to Unity developers with a C# async/await + API on iOS, macOS, tvOS, and visionOS, covering: + - Products and purchases, including promotional offers, purchase options, and advanced commerce + products. + - Subscriptions, subscription status and renewal info, and payment method binding. + - Transactions, transaction verification, and refund requests. + - App transactions, App Store messages, promoted product purchase intents, and `SKOverlay`. + - Storefront lookup, plus events for observing storefront and subscription status changes. diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/CHANGELOG.md.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/CHANGELOG.md.meta new file mode 100644 index 00000000..4815730b --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 29d0e60d387d472d91c9c63e557fffca +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos.meta new file mode 100644 index 00000000..3a912736 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bd87226601e034e18bfe24a6f5c1b3f5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample.meta new file mode 100644 index 00000000..af40f980 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 91ee2d8ca8d954315973754c30415447 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Apple.StoreKit.Sample.asmdef b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Apple.StoreKit.Sample.asmdef new file mode 100644 index 00000000..0c1ee62d --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Apple.StoreKit.Sample.asmdef @@ -0,0 +1,17 @@ +{ + "name": "Apple.StoreKit.Sample", + "rootNamespace": "", + "references": [ + "Apple.StoreKit", + "Apple.Core" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Apple.StoreKit.Sample.asmdef.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Apple.StoreKit.Sample.asmdef.meta new file mode 100644 index 00000000..2fca3453 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Apple.StoreKit.Sample.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8864b527e451b45b4863738d6acb7222 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Prefabs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Prefabs.meta new file mode 100644 index 00000000..9c7935dc --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Prefabs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b2b2e13e78be8468d974027929559a1f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Prefabs/Product.prefab b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Prefabs/Product.prefab new file mode 100644 index 00000000..91dc65ab --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Prefabs/Product.prefab @@ -0,0 +1,457 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &410064971679918773 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4635442402772921960} + - component: {fileID: 4691807767725504154} + - component: {fileID: 1600757488298694580} + m_Layer: 5 + m_Name: PurchaseButtonText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4635442402772921960 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 410064971679918773} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5592562467643827448} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4691807767725504154 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 410064971679918773} + m_CullTransparentMesh: 1 +--- !u!114 &1600757488298694580 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 410064971679918773} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Purchase +--- !u!1 &3905614534246111379 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5592562467643827448} + - component: {fileID: 3329256940319765465} + - component: {fileID: 7411645375759662196} + - component: {fileID: 7997457905458042410} + - component: {fileID: 8817098930040572821} + m_Layer: 5 + m_Name: PurchaseButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5592562467643827448 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3905614534246111379} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4635442402772921960} + m_Father: {fileID: 1099782050714591865} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 1627.7031, y: -50} + m_SizeDelta: {x: 340.5939, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3329256940319765465 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3905614534246111379} + m_CullTransparentMesh: 1 +--- !u!114 &7411645375759662196 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3905614534246111379} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 0.2, g: 0.6, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &7997457905458042410 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3905614534246111379} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 7411645375759662196} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &8817098930040572821 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3905614534246111379} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement + m_IgnoreLayout: 0 + m_MinWidth: 200 + m_MinHeight: -1 + m_PreferredWidth: 200 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &7850422237001276569 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2363787600054380953} + - component: {fileID: 2256657439763463067} + - component: {fileID: 8842376902650542623} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2363787600054380953 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7850422237001276569} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1099782050714591865} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 728.7, y: -50} + m_SizeDelta: {x: 1457.4, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2256657439763463067 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7850422237001276569} + m_CullTransparentMesh: 1 +--- !u!114 &8842376902650542623 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7850422237001276569} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 48 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Product +--- !u!1 &7899778183271182060 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6923785936260562087} + - component: {fileID: 2966030149325699320} + m_Layer: 5 + m_Name: Product + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6923785936260562087 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7899778183271182060} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1099782050714591865} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2966030149325699320 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7899778183271182060} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f81d19013bed84ff894ce9f1cffa0489, type: 3} + m_Name: + m_EditorClassIdentifier: Apple.StoreKit.Sample::ProductScript + text: {fileID: 8842376902650542623} + status: {fileID: 0} + purchaseButton: {fileID: 7997457905458042410} +--- !u!1 &8058612824434399154 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1099782050714591865} + - component: {fileID: 9162939118338275460} + - component: {fileID: 4138566375641672463} + - component: {fileID: 4505793259273082132} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1099782050714591865 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8058612824434399154} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2363787600054380953} + - {fileID: 5592562467643827448} + m_Father: {fileID: 6923785936260562087} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!223 &9162939118338275460 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8058612824434399154} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!114 &4138566375641672463 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8058612824434399154} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.CanvasScaler + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!114 &4505793259273082132 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8058612824434399154} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.GraphicRaycaster + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Prefabs/Product.prefab.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Prefabs/Product.prefab.meta new file mode 100644 index 00000000..9e489ee0 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Prefabs/Product.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 23333e114a4904ff3aeddfafca11b365 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Prefabs/TransactionItem.prefab b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Prefabs/TransactionItem.prefab new file mode 100644 index 00000000..2d93a149 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Prefabs/TransactionItem.prefab @@ -0,0 +1,260 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &397847383352212628 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7070676748458690442} + - component: {fileID: 5176130704887998785} + - component: {fileID: 4984819541506928398} + m_Layer: 5 + m_Name: TransactionText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7070676748458690442 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 397847383352212628} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5058133970266008367} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 80} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5176130704887998785 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 397847383352212628} + m_CullTransparentMesh: 1 +--- !u!114 &4984819541506928398 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 397847383352212628} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 48 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 48 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: New Text +--- !u!1 &3580226443362781605 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5058133970266008367} + - component: {fileID: 3589193021006889972} + - component: {fileID: 1286317900510226839} + - component: {fileID: 8225430760823785185} + - component: {fileID: 2080348475905430457} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5058133970266008367 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3580226443362781605} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7070676748458690442} + m_Father: {fileID: 6648914940300574593} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!223 &3589193021006889972 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3580226443362781605} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!114 &1286317900510226839 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3580226443362781605} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.CanvasScaler + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!114 &8225430760823785185 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3580226443362781605} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.GraphicRaycaster + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &2080348475905430457 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3580226443362781605} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.HorizontalLayoutGroup + m_Padding: + m_Left: 10 + m_Right: 10 + m_Top: 10 + m_Bottom: 10 + m_ChildAlignment: 4 + m_Spacing: 20 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &3665256913799688040 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6648914940300574593} + - component: {fileID: 4216374536991811776} + m_Layer: 5 + m_Name: TransactionItem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6648914940300574593 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3665256913799688040} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 5058133970266008367} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &4216374536991811776 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3665256913799688040} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7f83ab2c3308044a8aa90edbc9f19b32, type: 3} + m_Name: + m_EditorClassIdentifier: Apple.StoreKit.Sample::TransactionItem + transactionText: {fileID: 4984819541506928398} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Prefabs/TransactionItem.prefab.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Prefabs/TransactionItem.prefab.meta new file mode 100644 index 00000000..4e012568 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Prefabs/TransactionItem.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 947881bb71bc140578ff9182e14fc517 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Sample.storekit b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Sample.storekit new file mode 100644 index 00000000..da7119b6 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Sample.storekit @@ -0,0 +1,83 @@ +{ + "appPolicies" : { + "eula" : "", + "policies" : [ + { + "locale" : "en_US", + "policyText" : "", + "policyURL" : "" + } + ] + }, + "identifier" : "1F99CA41", + "nonRenewingSubscriptions" : [ + { + "displayPrice" : "0.99", + "familyShareable" : false, + "internalID" : "B106A740", + "localizations" : [ + { + "description" : "A test subscription", + "displayName" : "Subscription", + "locale" : "en_US" + } + ], + "productID" : "Unity.StoreKit.Subscription", + "referenceName" : "Subscription", + "type" : "NonRenewingSubscription" + } + ], + "products" : [ + { + "displayPrice" : "0.99", + "familyShareable" : false, + "internalID" : "5C31AC89", + "localizations" : [ + { + "description" : "100 Coins for in game purchasing", + "displayName" : "100 Coins", + "locale" : "en_US" + } + ], + "productID" : "Unity.StoreKit.Consumable", + "referenceName" : "Consumable", + "type" : "Consumable" + }, + { + "displayPrice" : "1.99", + "familyShareable" : false, + "internalID" : "6B8ECA0E", + "localizations" : [ + { + "description" : "A test non consumable product", + "displayName" : "Test NonConsumable", + "locale" : "en_US" + } + ], + "productID" : "Unity.StoreKit.NonConsumable", + "referenceName" : "NonConsumable", + "type" : "NonConsumable" + } + ], + "settings" : { + "_askToBuyEnabled" : false, + "_billingGracePeriodEnabled" : false, + "_billingIssuesEnabled" : false, + "_disableDialogs" : false, + "_failTransactionsEnabled" : false, + "_locale" : "en_US", + "_renewalBillingIssuesEnabled" : false, + "_storefront" : "USA", + "_storeKitErrors" : [ + + ], + "_timeRate" : 0 + }, + "subscriptionGroups" : [ + + ], + "version" : { + "major" : 4, + "minor" : 0 + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Sample.storekit.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Sample.storekit.meta new file mode 100644 index 00000000..56fb1e3b --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Sample.storekit.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 19d7b9658ca7b4af481f31d740591009 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scenes.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scenes.meta new file mode 100644 index 00000000..a1db75b9 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2550fb815cf704422a058f2d153888f2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scenes/Apple.StoreKit.Sample.Scene.unity b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scenes/Apple.StoreKit.Sample.Scene.unity new file mode 100644 index 00000000..21aa7259 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scenes/Apple.StoreKit.Sample.Scene.unity @@ -0,0 +1,11088 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 10 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &2422182 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2422183} + - component: {fileID: 2422185} + - component: {fileID: 2422184} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2422183 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2422182} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 310541030} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2422184 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2422182} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 40 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &2422185 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2422182} + m_CullTransparentMesh: 1 +--- !u!1 &6738433 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6738434} + - component: {fileID: 6738436} + - component: {fileID: 6738435} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6738434 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6738433} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1886488540} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &6738435 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6738433} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Load +--- !u!222 &6738436 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6738433} + m_CullTransparentMesh: 1 +--- !u!1 &35243042 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 35243043} + - component: {fileID: 35243045} + - component: {fileID: 35243044} + m_Layer: 5 + m_Name: Item Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &35243043 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 35243042} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 594028415} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &35243044 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 35243042} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &35243045 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 35243042} + m_CullTransparentMesh: 1 +--- !u!1 &56253728 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 56253729} + - component: {fileID: 56253732} + - component: {fileID: 56253731} + - component: {fileID: 56253730} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &56253729 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 56253728} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 348682153} + m_Father: {fileID: 389010370} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -17, y: -17} + m_Pivot: {x: 0, y: 1} +--- !u!114 &56253730 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 56253728} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Mask + m_ShowMaskGraphic: 0 +--- !u!114 &56253731 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 56253728} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &56253732 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 56253728} + m_CullTransparentMesh: 1 +--- !u!1 &96479431 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 96479432} + - component: {fileID: 96479434} + - component: {fileID: 96479433} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &96479432 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 96479431} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 802436587} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &96479433 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 96479431} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Sync +--- !u!222 &96479434 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 96479431} + m_CullTransparentMesh: 1 +--- !u!1 &175213596 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 175213600} + - component: {fileID: 175213599} + - component: {fileID: 175213598} + - component: {fileID: 175213597} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &175213597 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 175213596} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.GraphicRaycaster + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &175213598 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 175213596} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.CanvasScaler + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &175213599 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 175213596} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &175213600 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 175213596} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1135554524} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &180064282 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 180064283} + - component: {fileID: 180064285} + - component: {fileID: 180064284} + - component: {fileID: 180064287} + - component: {fileID: 180064286} + m_Layer: 5 + m_Name: AdvancedCommerce + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &180064283 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 180064282} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1848731698} + - {fileID: 275515691} + m_Father: {fileID: 718606670} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &180064284 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 180064282} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &180064285 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 180064282} + m_CullTransparentMesh: 1 +--- !u!114 &180064286 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 180064282} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.VerticalLayoutGroup + m_Padding: + m_Left: 20 + m_Right: 20 + m_Top: 20 + m_Bottom: 20 + m_ChildAlignment: 0 + m_Spacing: 20 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &180064287 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 180064282} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0c6f2052423074c8c90ee8ae8393ecfe, type: 3} + m_Name: + m_EditorClassIdentifier: Apple.StoreKit.Sample::AdvancedCommerceProductPanelComponent + statusText: {fileID: 1037905840} + productIdInput: {fileID: 310541031} + loadButton: {fileID: 1886488541} + loadedProductIdText: {fileID: 1328377331} + compactJWSInput: {fileID: 311000014} + purchaseButton: {fileID: 311000044} +--- !u!1 &200787416 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 200787417} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &200787417 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 200787416} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1321971010} + m_Father: {fileID: 1453503359} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &208135591 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 208135592} + - component: {fileID: 208135594} + - component: {fileID: 208135593} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &208135592 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 208135591} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2144398108} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &208135593 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 208135591} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Show Manage Subs +--- !u!222 &208135594 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 208135591} + m_CullTransparentMesh: 1 +--- !u!1 &222643595 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 222643596} + - component: {fileID: 222643599} + - component: {fileID: 222643598} + - component: {fileID: 222643597} + - component: {fileID: 222643600} + m_Layer: 5 + m_Name: Products + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &222643596 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 222643595} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1462851384} + - {fileID: 687163165} + - {fileID: 1400572219} + m_Father: {fileID: 718606670} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &222643597 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 222643595} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.VerticalLayoutGroup + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &222643598 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 222643595} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &222643599 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 222643595} + m_CullTransparentMesh: 1 +--- !u!114 &222643600 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 222643595} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 63f17224be73f4d2092fb2eec8b862ae, type: 3} + m_Name: + m_EditorClassIdentifier: Apple.StoreKit.Sample::ProductsPanelComponent + statusText: {fileID: 1037905840} + retrieveButton: {fileID: 687163166} + productItemPrefab: {fileID: 7899778183271182060, guid: 23333e114a4904ff3aeddfafca11b365, type: 3} + productListParent: {fileID: 1072661590} + addTestProductButton: {fileID: 1400572220} +--- !u!1 &248482009 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 248482010} + - component: {fileID: 248482012} + - component: {fileID: 248482011} + m_Layer: 5 + m_Name: Arrow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &248482010 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 248482009} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1118291426} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -15, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &248482011 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 248482009} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10915, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &248482012 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 248482009} + m_CullTransparentMesh: 1 +--- !u!1 &266310523 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 266310524} + - component: {fileID: 266310526} + - component: {fileID: 266310525} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &266310524 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 266310523} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2130843033} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &266310525 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 266310523} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 40 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 1 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &266310526 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 266310523} + m_CullTransparentMesh: 1 +--- !u!1 &275515690 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 275515691} + - component: {fileID: 275515693} + - component: {fileID: 275515692} + - component: {fileID: 311000070} + - component: {fileID: 311000071} + m_Layer: 5 + m_Name: PurchaseSection + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &275515691 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 275515690} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 311000002} + - {fileID: 311000011} + - {fileID: 311000041} + m_Father: {fileID: 180064283} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 453, y: -825} + m_SizeDelta: {x: 866, y: 580} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &275515692 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 275515690} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &275515693 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 275515690} + m_CullTransparentMesh: 1 +--- !u!1 &309055627 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 309055628} + - component: {fileID: 309055630} + - component: {fileID: 309055629} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &309055628 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 309055627} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2099952012} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &309055629 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 309055627} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Present Offer Code +--- !u!222 &309055630 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 309055627} + m_CullTransparentMesh: 1 +--- !u!1 &310541029 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 310541030} + - component: {fileID: 310541033} + - component: {fileID: 310541032} + - component: {fileID: 310541031} + m_Layer: 5 + m_Name: ProductIdInput + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &310541030 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 310541029} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 608326327} + - {fileID: 2422183} + m_Father: {fileID: 1848731698} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 433, y: -165} + m_SizeDelta: {x: 826, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &310541031 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 310541029} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.InputField + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 310541032} + m_TextComponent: {fileID: 2422184} + m_Placeholder: {fileID: 608326328} + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_CharacterValidation: 0 + m_CharacterLimit: 0 + m_OnSubmit: + m_PersistentCalls: + m_Calls: [] + m_OnDidEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_ShouldActivateOnSelect: 1 +--- !u!114 &310541032 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 310541029} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &310541033 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 310541029} + m_CullTransparentMesh: 1 +--- !u!1 &311000001 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 311000002} + - component: {fileID: 311000004} + - component: {fileID: 311000003} + m_Layer: 5 + m_Name: PurchaseHeader + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &311000002 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311000001} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 275515691} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 433, y: -60} + m_SizeDelta: {x: 826, y: 80} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &311000003 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311000001} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Purchase +--- !u!222 &311000004 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311000001} + m_CullTransparentMesh: 1 +--- !u!1 &311000010 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 311000011} + - component: {fileID: 311000012} + - component: {fileID: 311000013} + - component: {fileID: 311000014} + m_Layer: 5 + m_Name: CompactJWSInput + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &311000011 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311000010} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 311000021} + - {fileID: 311000031} + m_Father: {fileID: 275515691} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 433, y: -255} + m_SizeDelta: {x: 826, y: 280} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &311000012 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311000010} + m_CullTransparentMesh: 1 +--- !u!114 &311000013 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311000010} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &311000014 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311000010} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.InputField + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 311000013} + m_TextComponent: {fileID: 311000033} + m_Placeholder: {fileID: 311000023} + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 2 + m_HideMobileInput: 0 + m_CharacterValidation: 0 + m_CharacterLimit: 0 + m_OnSubmit: + m_PersistentCalls: + m_Calls: [] + m_OnDidEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_ShouldActivateOnSelect: 1 +--- !u!1 &311000020 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 311000021} + - component: {fileID: 311000022} + - component: {fileID: 311000023} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &311000021 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311000020} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 311000011} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &311000022 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311000020} + m_CullTransparentMesh: 1 +--- !u!114 &311000023 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311000020} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 40 + m_FontStyle: 2 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Paste compact JWS token... +--- !u!1 &311000030 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 311000031} + - component: {fileID: 311000032} + - component: {fileID: 311000033} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &311000031 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311000030} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 311000011} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &311000032 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311000030} + m_CullTransparentMesh: 1 +--- !u!114 &311000033 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311000030} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 40 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: +--- !u!1 &311000040 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 311000041} + - component: {fileID: 311000042} + - component: {fileID: 311000043} + - component: {fileID: 311000044} + m_Layer: 5 + m_Name: Purchase + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &311000041 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311000040} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 311000051} + m_Father: {fileID: 275515691} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 433, y: -485} + m_SizeDelta: {x: 826, y: 150} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &311000042 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311000040} + m_CullTransparentMesh: 1 +--- !u!114 &311000043 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311000040} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &311000044 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311000040} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 311000043} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &311000050 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 311000051} + - component: {fileID: 311000052} + - component: {fileID: 311000053} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &311000051 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311000050} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 311000041} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &311000052 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311000050} + m_CullTransparentMesh: 1 +--- !u!114 &311000053 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311000050} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Purchase +--- !u!114 &311000060 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1848731697} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.VerticalLayoutGroup + m_Padding: + m_Left: 20 + m_Right: 20 + m_Top: 20 + m_Bottom: 20 + m_ChildAlignment: 0 + m_Spacing: 15 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &311000061 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1848731697} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.ContentSizeFitter + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!114 &311000070 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 275515690} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.VerticalLayoutGroup + m_Padding: + m_Left: 20 + m_Right: 20 + m_Top: 20 + m_Bottom: 20 + m_ChildAlignment: 0 + m_Spacing: 15 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &311000071 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 275515690} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.ContentSizeFitter + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!1 &337237740 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 337237741} + - component: {fileID: 337237744} + - component: {fileID: 337237743} + - component: {fileID: 337237742} + m_Layer: 5 + m_Name: Scrollbar Horizontal + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &337237741 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 337237740} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1261469271} + m_Father: {fileID: 1462851384} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -17, y: 20} + m_Pivot: {x: 0, y: 0} +--- !u!114 &337237742 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 337237740} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Scrollbar + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1385062238} + m_HandleRect: {fileID: 1385062237} + m_Direction: 0 + m_Value: 0 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &337237743 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 337237740} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &337237744 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 337237740} + m_CullTransparentMesh: 1 +--- !u!1 &337444438 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 337444439} + - component: {fileID: 337444441} + - component: {fileID: 337444440} + m_Layer: 5 + m_Name: StoreFront Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &337444439 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 337444438} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 583042994} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 1243, y: -1330} + m_SizeDelta: {x: 2446, y: 80} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &337444440 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 337444438} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 40 + m_FontStyle: 2 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: +--- !u!222 &337444441 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 337444438} + m_CullTransparentMesh: 1 +--- !u!1 &348682152 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 348682153} + - component: {fileID: 348682154} + - component: {fileID: 348682155} + m_Layer: 5 + m_Name: Transactions Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &348682153 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 348682152} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 56253729} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0.00005684793, y: 0.00048120276} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &348682154 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 348682152} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.VerticalLayoutGroup + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &348682155 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 348682152} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.ContentSizeFitter + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!1 &389010369 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 389010370} + - component: {fileID: 389010373} + - component: {fileID: 389010372} + - component: {fileID: 389010371} + m_Layer: 5 + m_Name: Scroll View + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &389010370 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 389010369} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 56253729} + - {fileID: 1471285092} + - {fileID: 1453503359} + m_Father: {fileID: 1348552537} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 1545, y: -1152.3386} + m_SizeDelta: {x: 3090, y: 2027.6792} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &389010371 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 389010369} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.ScrollRect + m_Content: {fileID: 348682153} + m_Horizontal: 1 + m_Vertical: 1 + m_MovementType: 1 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 56253729} + m_HorizontalScrollbar: {fileID: 1471285093} + m_VerticalScrollbar: {fileID: 1453503360} + m_HorizontalScrollbarVisibility: 2 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: -3 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &389010372 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 389010369} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &389010373 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 389010369} + m_CullTransparentMesh: 1 +--- !u!1 &401668252 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 401668253} + - component: {fileID: 401668255} + - component: {fileID: 401668254} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &401668253 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 401668252} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1662375285} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &401668254 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 401668252} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: App Store +--- !u!222 &401668255 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 401668252} + m_CullTransparentMesh: 1 +--- !u!1 &412000001 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 412000002} + - component: {fileID: 412000005} + - component: {fileID: 412000004} + - component: {fileID: 412000003} + m_Layer: 5 + m_Name: Events + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &412000002 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 412000001} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 412000007} + m_Father: {fileID: 1146800140} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 148.6772} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &412000003 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 412000001} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 412000004} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &412000004 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 412000001} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &412000005 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 412000001} + m_CullTransparentMesh: 1 +--- !u!1 &412000006 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 412000007} + - component: {fileID: 412000009} + - component: {fileID: 412000008} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &412000007 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 412000006} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 412000002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &412000008 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 412000006} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Events +--- !u!222 &412000009 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 412000006} + m_CullTransparentMesh: 1 +--- !u!1 &420000001 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 420000002} + - component: {fileID: 420000004} + - component: {fileID: 420000003} + - component: {fileID: 420000006} + - component: {fileID: 420000005} + m_Layer: 5 + m_Name: Events + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &420000002 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 420000001} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 421000002} + - {fileID: 422000002} + m_Father: {fileID: 718606670} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &420000003 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 420000001} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &420000004 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 420000001} + m_CullTransparentMesh: 1 +--- !u!114 &420000005 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 420000001} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.VerticalLayoutGroup + m_Padding: + m_Left: 20 + m_Right: 20 + m_Top: 20 + m_Bottom: 20 + m_ChildAlignment: 0 + m_Spacing: 20 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &420000006 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 420000001} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d1b50fe13048a4211a12a084252807d5, type: 3} + m_Name: + m_EditorClassIdentifier: Apple.StoreKit.Sample::EventsPanelComponent + messagesStatusText: {fileID: 421000023} + startMessagesButton: {fileID: 421000032} + stopMessagesButton: {fileID: 421000042} + messageListParent: {fileID: 421000050} + messageItemPrefab: {fileID: 0} + intentsStatusText: {fileID: 422000023} + startIntentsButton: {fileID: 422000032} + stopIntentsButton: {fileID: 422000042} + intentListParent: {fileID: 422000050} + intentItemPrefab: {fileID: 0} +--- !u!1 &421000001 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 421000002} + - component: {fileID: 421000003} + - component: {fileID: 421000004} + m_Layer: 5 + m_Name: MessagesSection + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &421000002 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000001} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 421000011} + - {fileID: 421000021} + - {fileID: 421000031} + - {fileID: 421000041} + - {fileID: 421000051} + m_Father: {fileID: 420000002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &421000003 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000001} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.VerticalLayoutGroup + m_Padding: + m_Left: 20 + m_Right: 20 + m_Top: 20 + m_Bottom: 20 + m_ChildAlignment: 0 + m_Spacing: 15 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &421000004 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000001} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.ContentSizeFitter + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!1 &421000010 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 421000011} + - component: {fileID: 421000012} + - component: {fileID: 421000013} + m_Layer: 5 + m_Name: MessagesHeader + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &421000011 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000010} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 421000002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 80} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &421000012 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000010} + m_CullTransparentMesh: 1 +--- !u!114 &421000013 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000010} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Messages +--- !u!1 &421000020 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 421000021} + - component: {fileID: 421000022} + - component: {fileID: 421000023} + m_Layer: 5 + m_Name: MessagesStatus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &421000021 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000020} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 421000002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 80} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &421000022 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000020} + m_CullTransparentMesh: 1 +--- !u!114 &421000023 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000020} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 40 + m_FontStyle: 2 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: +--- !u!1 &421000030 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 421000031} + - component: {fileID: 421000034} + - component: {fileID: 421000033} + - component: {fileID: 421000032} + m_Layer: 5 + m_Name: StartMessages + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &421000031 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000030} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 421000036} + m_Father: {fileID: 421000002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 150} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &421000032 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000030} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 421000033} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &421000033 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000030} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &421000034 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000030} + m_CullTransparentMesh: 1 +--- !u!1 &421000035 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 421000036} + - component: {fileID: 421000038} + - component: {fileID: 421000037} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &421000036 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000035} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 421000031} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &421000037 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000035} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Start +--- !u!222 &421000038 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000035} + m_CullTransparentMesh: 1 +--- !u!1 &421000040 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 421000041} + - component: {fileID: 421000044} + - component: {fileID: 421000043} + - component: {fileID: 421000042} + m_Layer: 5 + m_Name: StopMessages + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &421000041 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000040} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 421000046} + m_Father: {fileID: 421000002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 150} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &421000042 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000040} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 421000043} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &421000043 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000040} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &421000044 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000040} + m_CullTransparentMesh: 1 +--- !u!1 &421000045 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 421000046} + - component: {fileID: 421000048} + - component: {fileID: 421000047} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &421000046 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000045} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 421000041} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &421000047 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000045} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Stop +--- !u!222 &421000048 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000045} + m_CullTransparentMesh: 1 +--- !u!1 &421000050 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 421000051} + - component: {fileID: 421000052} + m_Layer: 5 + m_Name: MessageList + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &421000051 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000050} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 421000002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &421000052 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 421000050} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.VerticalLayoutGroup + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 10 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &422000001 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 422000002} + - component: {fileID: 422000003} + - component: {fileID: 422000004} + m_Layer: 5 + m_Name: IntentsSection + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &422000002 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000001} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 422000011} + - {fileID: 422000021} + - {fileID: 422000031} + - {fileID: 422000041} + - {fileID: 422000051} + m_Father: {fileID: 420000002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &422000003 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000001} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.VerticalLayoutGroup + m_Padding: + m_Left: 20 + m_Right: 20 + m_Top: 20 + m_Bottom: 20 + m_ChildAlignment: 0 + m_Spacing: 15 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &422000004 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000001} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.ContentSizeFitter + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!1 &422000010 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 422000011} + - component: {fileID: 422000012} + - component: {fileID: 422000013} + m_Layer: 5 + m_Name: IntentsHeader + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &422000011 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000010} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 422000002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 80} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &422000012 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000010} + m_CullTransparentMesh: 1 +--- !u!114 &422000013 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000010} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Purchase Intents +--- !u!1 &422000020 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 422000021} + - component: {fileID: 422000022} + - component: {fileID: 422000023} + m_Layer: 5 + m_Name: IntentsStatus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &422000021 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000020} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 422000002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 80} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &422000022 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000020} + m_CullTransparentMesh: 1 +--- !u!114 &422000023 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000020} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 40 + m_FontStyle: 2 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 1 + m_LineSpacing: 1 + m_Text: +--- !u!1 &422000030 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 422000031} + - component: {fileID: 422000034} + - component: {fileID: 422000033} + - component: {fileID: 422000032} + m_Layer: 5 + m_Name: StartIntents + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &422000031 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000030} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 422000036} + m_Father: {fileID: 422000002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 150} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &422000032 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000030} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 422000033} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &422000033 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000030} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &422000034 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000030} + m_CullTransparentMesh: 1 +--- !u!1 &422000035 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 422000036} + - component: {fileID: 422000038} + - component: {fileID: 422000037} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &422000036 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000035} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 422000031} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &422000037 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000035} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Start +--- !u!222 &422000038 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000035} + m_CullTransparentMesh: 1 +--- !u!1 &422000040 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 422000041} + - component: {fileID: 422000044} + - component: {fileID: 422000043} + - component: {fileID: 422000042} + m_Layer: 5 + m_Name: StopIntents + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &422000041 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000040} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 422000046} + m_Father: {fileID: 422000002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 150} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &422000042 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000040} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 422000043} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &422000043 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000040} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &422000044 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000040} + m_CullTransparentMesh: 1 +--- !u!1 &422000045 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 422000046} + - component: {fileID: 422000048} + - component: {fileID: 422000047} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &422000046 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000045} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 422000041} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &422000047 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000045} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Stop +--- !u!222 &422000048 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000045} + m_CullTransparentMesh: 1 +--- !u!1 &422000050 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 422000051} + - component: {fileID: 422000052} + m_Layer: 5 + m_Name: IntentList + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &422000051 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000050} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 422000002} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &422000052 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 422000050} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.VerticalLayoutGroup + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 10 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &429825414 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 429825415} + - component: {fileID: 429825417} + - component: {fileID: 429825416} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &429825415 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 429825414} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1476494072} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &429825416 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 429825414} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Reload +--- !u!222 &429825417 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 429825414} + m_CullTransparentMesh: 1 +--- !u!1 &523978824 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 523978825} + - component: {fileID: 523978828} + - component: {fileID: 523978827} + - component: {fileID: 523978826} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &523978825 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 523978824} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1072661591} + m_Father: {fileID: 1462851384} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -17, y: -17} + m_Pivot: {x: 0, y: 1} +--- !u!114 &523978826 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 523978824} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Mask + m_ShowMaskGraphic: 0 +--- !u!114 &523978827 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 523978824} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &523978828 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 523978824} + m_CullTransparentMesh: 1 +--- !u!1 &545978648 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 545978649} + - component: {fileID: 545978652} + - component: {fileID: 545978651} + - component: {fileID: 545978650} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &545978649 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 545978648} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1075801894} + m_Father: {fileID: 1820197376} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -18, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &545978650 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 545978648} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Mask + m_ShowMaskGraphic: 0 +--- !u!114 &545978651 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 545978648} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &545978652 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 545978648} + m_CullTransparentMesh: 1 +--- !u!1 &583042993 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 583042994} + - component: {fileID: 583042996} + - component: {fileID: 583042995} + - component: {fileID: 583042998} + - component: {fileID: 583042997} + m_Layer: 5 + m_Name: AppStore + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &583042994 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 583042993} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 802436587} + - {fileID: 1380903516} + - {fileID: 916689847} + - {fileID: 2099952012} + - {fileID: 2144398108} + - {fileID: 2130843033} + - {fileID: 2005134758} + - {fileID: 702237095} + - {fileID: 337444439} + m_Father: {fileID: 718606670} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &583042995 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 583042993} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &583042996 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 583042993} + m_CullTransparentMesh: 1 +--- !u!114 &583042997 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 583042993} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a1b2c3d4e5f607890a1b2c3d4e5f6071, type: 3} + m_Name: + m_EditorClassIdentifier: Apple.StoreKit.Sample::AppStorePanelComponent + statusText: {fileID: 1037905840} + syncButton: {fileID: 802436588} + requestReviewButton: {fileID: 1380903517} + canMakePaymentsButton: {fileID: 916689848} + presentOfferCodeButton: {fileID: 2099952013} + showManageSubsButton: {fileID: 2144398109} + showManageSubsGroupButton: {fileID: 2005134759} + subscriptionGroupIdInput: {fileID: 2130843034} + storefrontButton: {fileID: 702237096} + storefrontText: {fileID: 337444440} +--- !u!114 &583042998 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 583042993} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.VerticalLayoutGroup + m_Padding: + m_Left: 20 + m_Right: 20 + m_Top: 20 + m_Bottom: 20 + m_ChildAlignment: 0 + m_Spacing: 15 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &588369642 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 588369643} + - component: {fileID: 588369646} + - component: {fileID: 588369645} + - component: {fileID: 588369644} + m_Layer: 5 + m_Name: Overlay + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &588369643 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 588369642} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 988517921} + m_Father: {fileID: 1146800140} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 162.7576} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &588369644 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 588369642} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 588369645} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &588369645 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 588369642} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &588369646 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 588369642} + m_CullTransparentMesh: 1 +--- !u!1 &594028414 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 594028415} + - component: {fileID: 594028416} + m_Layer: 5 + m_Name: Item + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &594028415 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 594028414} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 35243043} + - {fileID: 980108246} + - {fileID: 2052274431} + m_Father: {fileID: 1075801894} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &594028416 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 594028414} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Toggle + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 35243044} + toggleTransition: 1 + graphic: {fileID: 980108247} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 +--- !u!1 &608326326 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 608326327} + - component: {fileID: 608326329} + - component: {fileID: 608326328} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &608326327 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 608326326} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 310541030} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &608326328 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 608326326} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 40 + m_FontStyle: 2 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: com.example.productId +--- !u!222 &608326329 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 608326326} + m_CullTransparentMesh: 1 +--- !u!1 &647486853 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 647486854} + - component: {fileID: 647486856} + - component: {fileID: 647486855} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &647486854 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 647486853} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 687163165} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -22.1365} + m_SizeDelta: {x: 0, y: -44.273} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &647486855 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 647486853} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Refresh +--- !u!222 &647486856 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 647486853} + m_CullTransparentMesh: 1 +--- !u!1 &687163164 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 687163165} + - component: {fileID: 687163168} + - component: {fileID: 687163167} + - component: {fileID: 687163166} + m_Layer: 5 + m_Name: Refresh Products + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &687163165 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 687163164} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 647486854} + m_Father: {fileID: 222643596} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 898.5, y: -1242.8859} + m_SizeDelta: {x: 1797, y: 140.3371} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &687163166 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 687163164} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 687163167} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &687163167 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 687163164} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &687163168 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 687163164} + m_CullTransparentMesh: 1 +--- !u!1 &702237094 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 702237095} + - component: {fileID: 702237098} + - component: {fileID: 702237097} + - component: {fileID: 702237096} + m_Layer: 5 + m_Name: StoreFront + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &702237095 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 702237094} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1146680164} + m_Father: {fileID: 583042994} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 1243, y: -1200} + m_SizeDelta: {x: 2446, y: 150} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &702237096 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 702237094} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 702237097} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &702237097 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 702237094} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &702237098 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 702237094} + m_CullTransparentMesh: 1 +--- !u!1 &716189108 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 716189109} + - component: {fileID: 716189112} + - component: {fileID: 716189111} + - component: {fileID: 716189110} + m_Layer: 5 + m_Name: Scrollbar Vertical + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &716189109 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 716189108} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 722374412} + m_Father: {fileID: 1462851384} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: -17} + m_Pivot: {x: 1, y: 1} +--- !u!114 &716189110 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 716189108} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Scrollbar + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 805643337} + m_HandleRect: {fileID: 805643336} + m_Direction: 2 + m_Value: 0 + m_Size: 0.840725 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &716189111 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 716189108} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &716189112 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 716189108} + m_CullTransparentMesh: 1 +--- !u!1 &718606669 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 718606670} + - component: {fileID: 718606673} + - component: {fileID: 718606672} + - component: {fileID: 718606671} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &718606670 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 718606669} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1146800140} + - {fileID: 1348552537} + - {fileID: 222643596} + - {fileID: 180064283} + - {fileID: 420000002} + - {fileID: 583042994} + m_Father: {fileID: 1135554524} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &718606671 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 718606669} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.GraphicRaycaster + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &718606672 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 718606669} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.CanvasScaler + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &718606673 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 718606669} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!1 &722374411 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 722374412} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &722374412 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 722374411} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 805643336} + m_Father: {fileID: 716189109} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &802436586 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 802436587} + - component: {fileID: 802436590} + - component: {fileID: 802436589} + - component: {fileID: 802436588} + m_Layer: 5 + m_Name: Sync + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &802436587 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 802436586} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 96479432} + m_Father: {fileID: 583042994} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 1243, y: -95} + m_SizeDelta: {x: 2446, y: 150} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &802436588 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 802436586} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 802436589} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &802436589 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 802436586} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &802436590 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 802436586} + m_CullTransparentMesh: 1 +--- !u!1 &805643335 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 805643336} + - component: {fileID: 805643338} + - component: {fileID: 805643337} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &805643336 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 805643335} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 722374412} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0.840725} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &805643337 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 805643335} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &805643338 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 805643335} + m_CullTransparentMesh: 1 +--- !u!1 &844299413 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 844299414} + - component: {fileID: 844299416} + - component: {fileID: 844299415} + m_Layer: 5 + m_Name: LoadHeader + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &844299414 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 844299413} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1848731698} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 433, y: -60} + m_SizeDelta: {x: 826, y: 80} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &844299415 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 844299413} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Load Product +--- !u!222 &844299416 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 844299413} + m_CullTransparentMesh: 1 +--- !u!1 &890419298 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 890419299} + - component: {fileID: 890419301} + - component: {fileID: 890419300} + m_Layer: 5 + m_Name: TransactionSourceLabel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &890419299 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 890419298} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1118291426} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -7.5, y: -0.5} + m_SizeDelta: {x: -35, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &890419300 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 890419298} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 64 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: All +--- !u!222 &890419301 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 890419298} + m_CullTransparentMesh: 1 +--- !u!1 &916689846 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 916689847} + - component: {fileID: 916689850} + - component: {fileID: 916689849} + - component: {fileID: 916689848} + m_Layer: 5 + m_Name: Can Make Payments + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &916689847 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 916689846} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1314070869} + m_Father: {fileID: 583042994} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 1243, y: -425} + m_SizeDelta: {x: 2446, y: 150} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &916689848 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 916689846} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 916689849} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &916689849 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 916689846} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &916689850 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 916689846} + m_CullTransparentMesh: 1 +--- !u!1 &980108245 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 980108246} + - component: {fileID: 980108248} + - component: {fileID: 980108247} + m_Layer: 5 + m_Name: Item Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &980108246 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 980108245} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 594028415} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &980108247 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 980108245} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &980108248 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 980108245} + m_CullTransparentMesh: 1 +--- !u!1 &988517920 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 988517921} + - component: {fileID: 988517923} + - component: {fileID: 988517922} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &988517921 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 988517920} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 588369643} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &988517922 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 988517920} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'Overlay + +' +--- !u!222 &988517923 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 988517920} + m_CullTransparentMesh: 1 +--- !u!1 &1032585941 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1032585942} + - component: {fileID: 1032585944} + - component: {fileID: 1032585943} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1032585942 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1032585941} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1400572219} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1032585943 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1032585941} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Add +--- !u!222 &1032585944 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1032585941} + m_CullTransparentMesh: 1 +--- !u!1 &1037905838 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1037905839} + - component: {fileID: 1037905841} + - component: {fileID: 1037905840} + m_Layer: 5 + m_Name: SubHeaderStatus + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1037905839 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1037905838} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1686377552} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1053.1584, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1037905840 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1037905838} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 5 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &1037905841 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1037905838} + m_CullTransparentMesh: 1 +--- !u!1 &1037968274 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1037968275} + - component: {fileID: 1037968277} + - component: {fileID: 1037968276} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1037968275 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1037968274} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1764416473} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1037968276 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1037968274} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: '< + +' +--- !u!222 &1037968277 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1037968274} + m_CullTransparentMesh: 1 +--- !u!1 &1071637741 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1071637742} + - component: {fileID: 1071637744} + - component: {fileID: 1071637743} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1071637742 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1071637741} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1377655521} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0.2} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1071637743 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1071637741} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1071637744 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1071637741} + m_CullTransparentMesh: 1 +--- !u!1 &1072661590 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1072661591} + - component: {fileID: 1072661592} + m_Layer: 5 + m_Name: Products Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1072661591 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1072661590} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 523978825} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0.00021241796} + m_SizeDelta: {x: 0, y: 300} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1072661592 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1072661590} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.VerticalLayoutGroup + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 10 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &1075801893 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1075801894} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1075801894 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1075801893} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 594028415} + m_Father: {fileID: 545978649} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 300} + m_Pivot: {x: 0.5, y: 1} +--- !u!1 &1106059394 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1106059396} + - component: {fileID: 1106059395} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1106059395 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1106059394} + m_Enabled: 1 + serializedVersion: 11 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ForceVisible: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 +--- !u!4 &1106059396 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1106059394} + serializedVersion: 2 + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &1118291425 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1118291426} + - component: {fileID: 1118291429} + - component: {fileID: 1118291428} + - component: {fileID: 1118291427} + m_Layer: 5 + m_Name: TransactionSource + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1118291426 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1118291425} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 890419299} + - {fileID: 248482010} + - {fileID: 1820197376} + m_Father: {fileID: 1348552537} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 1545, y: -69.2495} + m_SizeDelta: {x: 3090, y: 138.499} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1118291427 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1118291425} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0d0b652f32a2cc243917e4028fa0f046, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Dropdown + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1118291428} + m_Template: {fileID: 1820197376} + m_CaptionText: {fileID: 890419300} + m_CaptionImage: {fileID: 0} + m_ItemText: {fileID: 2052274432} + m_ItemImage: {fileID: 0} + m_Value: 0 + m_Options: + m_Options: + - m_Text: All + m_Image: {fileID: 0} + - m_Text: CurrentEntitlements + m_Image: {fileID: 0} + - m_Text: Unfinished + m_Image: {fileID: 0} + - m_Text: Updates + m_Image: {fileID: 0} + m_OnValueChanged: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1348552541} + m_TargetAssemblyTypeName: TransactionsPanelComponent, Apple.StoreKit.Sample + m_MethodName: OnSourceChange + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + m_AlphaFadeSpeed: 0.15 +--- !u!114 &1118291428 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1118291425} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1118291429 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1118291425} + m_CullTransparentMesh: 1 +--- !u!1 &1135554523 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1135554524} + - component: {fileID: 1135554527} + - component: {fileID: 1135554526} + - component: {fileID: 1135554525} + - component: {fileID: 1135554529} + - component: {fileID: 1135554528} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1135554524 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1135554523} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1836111836} + - {fileID: 1686377552} + - {fileID: 718606670} + m_Father: {fileID: 175213600} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1135554525 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1135554523} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.VerticalLayoutGroup + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &1135554526 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1135554523} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1135554527 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1135554523} + m_CullTransparentMesh: 1 +--- !u!114 &1135554528 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1135554523} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7ac85e1ab6f904f908ded606501360f6, type: 3} + m_Name: + m_EditorClassIdentifier: Apple.StoreKit.Sample::MenuComponent + transactionsButton: {fileID: 1768690216} + transactionsPanel: {fileID: 1348552536} + productsButton: {fileID: 1902934315} + productsPanel: {fileID: 222643595} + overlayButton: {fileID: 588369644} + menuPanel: {fileID: 1146800139} + appStoreButton: {fileID: 1662375286} + appStorePanel: {fileID: 583042993} + promotionInfoButton: {fileID: 0} + promotionInfoPanel: {fileID: 0} + subscriptionStatusButton: {fileID: 0} + subscriptionStatusPanel: {fileID: 0} + eventsButton: {fileID: 412000003} + eventsPanel: {fileID: 420000001} + advancedCommerceButton: {fileID: 2119560396} + advancedCommercePanel: {fileID: 180064282} + navigationComponent: {fileID: 1135554529} +--- !u!114 &1135554529 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1135554523} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0099b0b99ea064a12a5355f0a7761495, type: 3} + m_Name: + m_EditorClassIdentifier: '::' + backButton: {fileID: 1764416474} + mainMenu: {fileID: 1146800139} +--- !u!1 &1146459749 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1146459750} + - component: {fileID: 1146459752} + - component: {fileID: 1146459751} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1146459750 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1146459749} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1902934314} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1146459751 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1146459749} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'Products + +' +--- !u!222 &1146459752 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1146459749} + m_CullTransparentMesh: 1 +--- !u!1 &1146680163 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1146680164} + - component: {fileID: 1146680166} + - component: {fileID: 1146680165} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1146680164 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1146680163} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 702237095} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1146680165 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1146680163} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Storefront +--- !u!222 &1146680166 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1146680163} + m_CullTransparentMesh: 1 +--- !u!1 &1146800139 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1146800140} + - component: {fileID: 1146800142} + - component: {fileID: 1146800141} + - component: {fileID: 1146800143} + m_Layer: 5 + m_Name: MainMenu + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1146800140 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1146800139} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1768690215} + - {fileID: 1902934314} + - {fileID: 1662375285} + - {fileID: 588369643} + - {fileID: 2119560395} + - {fileID: 412000002} + - {fileID: 1700103189} + m_Father: {fileID: 718606670} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1146800141 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1146800139} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1146800142 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1146800139} + m_CullTransparentMesh: 1 +--- !u!114 &1146800143 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1146800139} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.VerticalLayoutGroup + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 15 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 20 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &1261469270 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1261469271} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1261469271 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1261469270} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1385062237} + m_Father: {fileID: 337237741} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1314070868 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1314070869} + - component: {fileID: 1314070871} + - component: {fileID: 1314070870} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1314070869 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1314070868} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 916689847} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1314070870 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1314070868} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Can Make Payments +--- !u!222 &1314070871 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1314070868} + m_CullTransparentMesh: 1 +--- !u!1 &1321971009 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1321971010} + - component: {fileID: 1321971012} + - component: {fileID: 1321971011} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1321971010 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1321971009} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 200787417} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1321971011 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1321971009} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1321971012 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1321971009} + m_CullTransparentMesh: 1 +--- !u!1 &1328377329 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1328377330} + - component: {fileID: 1328377332} + - component: {fileID: 1328377331} + m_Layer: 5 + m_Name: LoadedProductText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1328377330 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1328377329} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1848731698} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 433, y: -435} + m_SizeDelta: {x: 826, y: 80} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1328377331 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1328377329} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 40 + m_FontStyle: 2 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &1328377332 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1328377329} + m_CullTransparentMesh: 1 +--- !u!1 &1348552536 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1348552537} + - component: {fileID: 1348552540} + - component: {fileID: 1348552539} + - component: {fileID: 1348552538} + - component: {fileID: 1348552541} + m_Layer: 5 + m_Name: Transactions + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1348552537 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1348552536} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1118291426} + - {fileID: 389010370} + - {fileID: 1476494072} + m_Father: {fileID: 718606670} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1348552538 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1348552536} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.VerticalLayoutGroup + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 1 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &1348552539 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1348552536} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1348552540 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1348552536} + m_CullTransparentMesh: 1 +--- !u!114 &1348552541 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1348552536} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 226c141e0fa0f4355843ece55847fae3, type: 3} + m_Name: + m_EditorClassIdentifier: Apple.StoreKit.Sample::RetrieveTransactionsComponent + transactionListParent: {fileID: 348682152} + transactionItemPrefab: {fileID: 3665256913799688040, guid: 947881bb71bc140578ff9182e14fc517, type: 3} + statusText: {fileID: 1037905840} + addTestTransactionButton: {fileID: 0} +--- !u!1 &1353619324 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1353619325} + - component: {fileID: 1353619327} + - component: {fileID: 1353619326} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1353619325 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1353619324} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2119560395} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1353619326 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1353619324} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Advanced Commerce +--- !u!222 &1353619327 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1353619324} + m_CullTransparentMesh: 1 +--- !u!1 &1377655520 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1377655521} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1377655521 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1377655520} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1071637742} + m_Father: {fileID: 1799967533} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1379588491 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1379588492} + - component: {fileID: 1379588494} + - component: {fileID: 1379588493} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1379588492 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1379588491} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2005134758} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1379588493 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1379588491} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Manage Subs Group +--- !u!222 &1379588494 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1379588491} + m_CullTransparentMesh: 1 +--- !u!1 &1380903515 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1380903516} + - component: {fileID: 1380903519} + - component: {fileID: 1380903518} + - component: {fileID: 1380903517} + m_Layer: 5 + m_Name: Request Review + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1380903516 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1380903515} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2055271010} + m_Father: {fileID: 583042994} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 1243, y: -260} + m_SizeDelta: {x: 2446, y: 150} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1380903517 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1380903515} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1380903518} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1380903518 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1380903515} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1380903519 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1380903515} + m_CullTransparentMesh: 1 +--- !u!1 &1385062236 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1385062237} + - component: {fileID: 1385062239} + - component: {fileID: 1385062238} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1385062237 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1385062236} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1261469271} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1385062238 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1385062236} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1385062239 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1385062236} + m_CullTransparentMesh: 1 +--- !u!1 &1400572218 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1400572219} + - component: {fileID: 1400572222} + - component: {fileID: 1400572221} + - component: {fileID: 1400572220} + m_Layer: 5 + m_Name: Add Product + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1400572219 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1400572218} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1032585942} + m_Father: {fileID: 222643596} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 898.5, y: -1379.706} + m_SizeDelta: {x: 1797, y: 133.3032} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1400572220 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1400572218} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1400572221} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1400572221 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1400572218} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1400572222 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1400572218} + m_CullTransparentMesh: 1 +--- !u!1 &1453503358 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1453503359} + - component: {fileID: 1453503362} + - component: {fileID: 1453503361} + - component: {fileID: 1453503360} + m_Layer: 5 + m_Name: Scrollbar Vertical + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1453503359 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1453503358} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 200787417} + m_Father: {fileID: 389010370} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: -17} + m_Pivot: {x: 1, y: 1} +--- !u!114 &1453503360 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1453503358} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Scrollbar + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1321971011} + m_HandleRect: {fileID: 1321971010} + m_Direction: 2 + m_Value: 0 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1453503361 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1453503358} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1453503362 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1453503358} + m_CullTransparentMesh: 1 +--- !u!1 &1462851383 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1462851384} + - component: {fileID: 1462851387} + - component: {fileID: 1462851386} + - component: {fileID: 1462851385} + m_Layer: 5 + m_Name: Scroll View + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1462851384 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1462851383} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 523978825} + - {fileID: 337237741} + - {fileID: 716189109} + m_Father: {fileID: 222643596} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 899, y: -723.2} + m_SizeDelta: {x: 1798, y: 1446.4} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1462851385 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1462851383} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.ScrollRect + m_Content: {fileID: 1072661591} + m_Horizontal: 1 + m_Vertical: 1 + m_MovementType: 1 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 523978825} + m_HorizontalScrollbar: {fileID: 337237742} + m_VerticalScrollbar: {fileID: 716189110} + m_HorizontalScrollbarVisibility: 2 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: -3 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1462851386 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1462851383} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1462851387 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1462851383} + m_CullTransparentMesh: 1 +--- !u!1 &1471285091 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1471285092} + - component: {fileID: 1471285095} + - component: {fileID: 1471285094} + - component: {fileID: 1471285093} + m_Layer: 5 + m_Name: Scrollbar Horizontal + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1471285092 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1471285091} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1650382838} + m_Father: {fileID: 389010370} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -17, y: 20} + m_Pivot: {x: 0, y: 0} +--- !u!114 &1471285093 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1471285091} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Scrollbar + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1902955838} + m_HandleRect: {fileID: 1902955837} + m_Direction: 0 + m_Value: 0 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1471285094 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1471285091} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1471285095 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1471285091} + m_CullTransparentMesh: 1 +--- !u!1 &1476494071 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1476494072} + - component: {fileID: 1476494075} + - component: {fileID: 1476494074} + - component: {fileID: 1476494073} + m_Layer: 5 + m_Name: Reload + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1476494072 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1476494071} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 429825415} + m_Father: {fileID: 1348552537} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 1545, y: -2267.117} + m_SizeDelta: {x: 3090, y: 201.8774} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1476494073 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1476494071} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1476494074} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1476494074 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1476494071} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1476494075 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1476494071} + m_CullTransparentMesh: 1 +--- !u!1 &1650382837 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1650382838} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1650382838 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1650382837} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1902955837} + m_Father: {fileID: 1471285092} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1662375284 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1662375285} + - component: {fileID: 1662375288} + - component: {fileID: 1662375287} + - component: {fileID: 1662375286} + m_Layer: 5 + m_Name: App Store + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1662375285 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1662375284} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 401668253} + m_Father: {fileID: 1146800140} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 148.6772} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1662375286 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1662375284} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1662375287} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1662375287 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1662375284} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1662375288 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1662375284} + m_CullTransparentMesh: 1 +--- !u!1 &1671804759 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1671804760} + - component: {fileID: 1671804762} + - component: {fileID: 1671804761} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1671804760 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1671804759} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1768690215} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1671804761 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1671804759} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Transactions +--- !u!222 &1671804762 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1671804759} + m_CullTransparentMesh: 1 +--- !u!1 &1686377551 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1686377552} + - component: {fileID: 1686377553} + m_Layer: 5 + m_Name: SubHeader + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1686377552 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1686377551} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1764416473} + - {fileID: 1037905839} + m_Father: {fileID: 1135554524} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 83.932} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1686377553 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1686377551} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.HorizontalLayoutGroup + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 10 + m_ChildAlignment: 0 + m_Spacing: 5 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &1700103188 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1700103189} + - component: {fileID: 1700103192} + - component: {fileID: 1700103191} + - component: {fileID: 1700103190} + m_Layer: 5 + m_Name: AppTransaction + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1700103189 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1700103188} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1146800140} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 950.4277} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1700103190 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1700103188} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ae5ab04f21a984f998c7c09a452c3def, type: 3} + m_Name: + m_EditorClassIdentifier: '::' + text: {fileID: 1700103191} +--- !u!114 &1700103191 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1700103188} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 24 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &1700103192 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1700103188} + m_CullTransparentMesh: 1 +--- !u!1 &1764416472 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1764416473} + - component: {fileID: 1764416476} + - component: {fileID: 1764416475} + - component: {fileID: 1764416474} + - component: {fileID: 1764416477} + m_Layer: 5 + m_Name: Back + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1764416473 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1764416472} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1037968275} + m_Father: {fileID: 1686377552} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 375.2006, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1764416474 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1764416472} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1764416475} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1764416475 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1764416472} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1764416476 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1764416472} + m_CullTransparentMesh: 1 +--- !u!114 &1764416477 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1764416472} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement + m_IgnoreLayout: 0 + m_MinWidth: 40 + m_MinHeight: -1 + m_PreferredWidth: 40 + m_PreferredHeight: -1 + m_FlexibleWidth: 1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &1768690214 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1768690215} + - component: {fileID: 1768690218} + - component: {fileID: 1768690217} + - component: {fileID: 1768690216} + m_Layer: 5 + m_Name: Transactions + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1768690215 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768690214} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1671804760} + m_Father: {fileID: 1146800140} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 148.6772} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1768690216 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768690214} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1768690217} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1768690217 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768690214} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1768690218 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768690214} + m_CullTransparentMesh: 1 +--- !u!1 &1787943989 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1787943992} + - component: {fileID: 1787943991} + - component: {fileID: 1787943990} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1787943990 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1787943989} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.EventSystems.StandaloneInputModule + m_SendPointerHoverToParent: 1 + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1787943991 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1787943989} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.EventSystems.EventSystem + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &1787943992 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1787943989} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1799967532 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1799967533} + - component: {fileID: 1799967536} + - component: {fileID: 1799967535} + - component: {fileID: 1799967534} + m_Layer: 5 + m_Name: Scrollbar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1799967533 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1799967532} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1377655521} + m_Father: {fileID: 1820197376} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 0} + m_Pivot: {x: 1, y: 1} +--- !u!114 &1799967534 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1799967532} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Scrollbar + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1071637743} + m_HandleRect: {fileID: 1071637742} + m_Direction: 2 + m_Value: 0 + m_Size: 0.2 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1799967535 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1799967532} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1799967536 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1799967532} + m_CullTransparentMesh: 1 +--- !u!1 &1820197375 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1820197376} + - component: {fileID: 1820197379} + - component: {fileID: 1820197378} + - component: {fileID: 1820197377} + m_Layer: 5 + m_Name: Template + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1820197376 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1820197375} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 545978649} + - {fileID: 1799967533} + m_Father: {fileID: 1118291426} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 2} + m_SizeDelta: {x: 0, y: 600} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &1820197377 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1820197375} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.ScrollRect + m_Content: {fileID: 1075801894} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 2 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 545978649} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 1799967534} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1348552536} + m_TargetAssemblyTypeName: + m_MethodName: + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 1 +--- !u!114 &1820197378 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1820197375} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1820197379 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1820197375} + m_CullTransparentMesh: 1 +--- !u!1 &1836111835 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1836111836} + - component: {fileID: 1836111838} + - component: {fileID: 1836111837} + m_Layer: 5 + m_Name: Header + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1836111836 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1836111835} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1135554524} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 104.9512} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1836111837 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1836111835} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 1 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: StoreKit Example +--- !u!222 &1836111838 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1836111835} + m_CullTransparentMesh: 1 +--- !u!1 &1848731697 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1848731698} + - component: {fileID: 1848731700} + - component: {fileID: 1848731699} + - component: {fileID: 311000060} + - component: {fileID: 311000061} + m_Layer: 5 + m_Name: LoadSection + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1848731698 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1848731697} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 844299414} + - {fileID: 310541030} + - {fileID: 1886488540} + - {fileID: 1328377330} + m_Father: {fileID: 180064283} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 453, y: -267.5} + m_SizeDelta: {x: 866, y: 495} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1848731699 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1848731697} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1848731700 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1848731697} + m_CullTransparentMesh: 1 +--- !u!1 &1886488539 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1886488540} + - component: {fileID: 1886488543} + - component: {fileID: 1886488542} + - component: {fileID: 1886488541} + m_Layer: 5 + m_Name: Load + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1886488540 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1886488539} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6738434} + m_Father: {fileID: 1848731698} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 433, y: -305} + m_SizeDelta: {x: 826, y: 150} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1886488541 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1886488539} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1886488542} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1886488542 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1886488539} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1886488543 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1886488539} + m_CullTransparentMesh: 1 +--- !u!1 &1902934313 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1902934314} + - component: {fileID: 1902934317} + - component: {fileID: 1902934316} + - component: {fileID: 1902934315} + m_Layer: 5 + m_Name: Products + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1902934314 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1902934313} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1146459750} + m_Father: {fileID: 1146800140} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 162.7576} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1902934315 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1902934313} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1902934316} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1902934316 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1902934313} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1902934317 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1902934313} + m_CullTransparentMesh: 1 +--- !u!1 &1902955836 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1902955837} + - component: {fileID: 1902955839} + - component: {fileID: 1902955838} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1902955837 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1902955836} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1650382838} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1902955838 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1902955836} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1902955839 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1902955836} + m_CullTransparentMesh: 1 +--- !u!1 &2005134757 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2005134758} + - component: {fileID: 2005134761} + - component: {fileID: 2005134760} + - component: {fileID: 2005134759} + m_Layer: 5 + m_Name: Show Manage Subs Group + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2005134758 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2005134757} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1379588492} + m_Father: {fileID: 583042994} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 1243, y: -1035} + m_SizeDelta: {x: 2446, y: 150} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2005134759 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2005134757} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 2005134760} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &2005134760 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2005134757} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2005134761 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2005134757} + m_CullTransparentMesh: 1 +--- !u!1 &2052274430 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2052274431} + - component: {fileID: 2052274433} + - component: {fileID: 2052274432} + m_Layer: 5 + m_Name: Item Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2052274431 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2052274430} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 594028415} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 5, y: -0.5} + m_SizeDelta: {x: -30, y: -3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2052274432 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2052274430} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 32 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 3 + m_MaxSize: 64 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Option A +--- !u!222 &2052274433 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2052274430} + m_CullTransparentMesh: 1 +--- !u!1 &2055271009 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2055271010} + - component: {fileID: 2055271012} + - component: {fileID: 2055271011} + m_Layer: 5 + m_Name: Text (Legacy) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2055271010 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2055271009} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1380903516} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2055271011 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2055271009} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 64 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 6 + m_MaxSize: 64 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Request Review +--- !u!222 &2055271012 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2055271009} + m_CullTransparentMesh: 1 +--- !u!1 &2057969930 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2057969933} + - component: {fileID: 2057969932} + - component: {fileID: 2057969931} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &2057969931 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2057969930} + m_Enabled: 1 +--- !u!20 &2057969932 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2057969930} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &2057969933 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2057969930} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2084713112 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2084713113} + - component: {fileID: 2084713115} + - component: {fileID: 2084713114} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2084713113 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2084713112} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2130843033} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2084713114 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2084713112} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Text + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 40 + m_FontStyle: 2 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Subscription Group ID +--- !u!222 &2084713115 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2084713112} + m_CullTransparentMesh: 1 +--- !u!1 &2099952011 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2099952012} + - component: {fileID: 2099952015} + - component: {fileID: 2099952014} + - component: {fileID: 2099952013} + m_Layer: 5 + m_Name: Present Offer Code + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2099952012 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2099952011} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 309055628} + m_Father: {fileID: 583042994} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 1243, y: -590} + m_SizeDelta: {x: 2446, y: 150} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2099952013 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2099952011} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 2099952014} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &2099952014 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2099952011} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2099952015 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2099952011} + m_CullTransparentMesh: 1 +--- !u!1 &2119560394 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2119560395} + - component: {fileID: 2119560398} + - component: {fileID: 2119560397} + - component: {fileID: 2119560396} + m_Layer: 5 + m_Name: Advanced Commerce + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2119560395 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2119560394} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1353619325} + m_Father: {fileID: 1146800140} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 148.6772} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2119560396 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2119560394} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 2119560397} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &2119560397 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2119560394} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2119560398 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2119560394} + m_CullTransparentMesh: 1 +--- !u!1 &2130843032 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2130843033} + - component: {fileID: 2130843036} + - component: {fileID: 2130843035} + - component: {fileID: 2130843034} + m_Layer: 5 + m_Name: Subscription Group Id + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2130843033 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2130843032} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2084713113} + - {fileID: 266310524} + m_Father: {fileID: 583042994} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 1243, y: -895} + m_SizeDelta: {x: 2446, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2130843034 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2130843032} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d199490a83bb2b844b9695cbf13b01ef, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.InputField + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 2130843035} + m_TextComponent: {fileID: 266310525} + m_Placeholder: {fileID: 2084713114} + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_CharacterValidation: 0 + m_CharacterLimit: 0 + m_OnSubmit: + m_PersistentCalls: + m_Calls: [] + m_OnDidEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_ShouldActivateOnSelect: 1 +--- !u!114 &2130843035 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2130843032} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2130843036 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2130843032} + m_CullTransparentMesh: 1 +--- !u!1 &2144398107 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2144398108} + - component: {fileID: 2144398111} + - component: {fileID: 2144398110} + - component: {fileID: 2144398109} + m_Layer: 5 + m_Name: Show Manage Subs + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2144398108 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2144398107} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 208135592} + m_Father: {fileID: 583042994} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 1243, y: -755} + m_SizeDelta: {x: 2446, y: 150} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2144398109 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2144398107} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 2144398110} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &2144398110 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2144398107} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2144398111 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2144398107} + m_CullTransparentMesh: 1 +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 2057969933} + - {fileID: 1106059396} + - {fileID: 175213600} + - {fileID: 1787943992} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scenes/Apple.StoreKit.Sample.Scene.unity.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scenes/Apple.StoreKit.Sample.Scene.unity.meta new file mode 100644 index 00000000..d3dffaf3 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scenes/Apple.StoreKit.Sample.Scene.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4ab47d7235f6c4fd98e5fbf3c915e336 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts.meta new file mode 100644 index 00000000..04a57815 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d2d080bdc6fb94bab949ef652351be68 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AdvancedCommerceProductPanelComponent.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AdvancedCommerceProductPanelComponent.cs new file mode 100644 index 00000000..f62fbf50 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AdvancedCommerceProductPanelComponent.cs @@ -0,0 +1,134 @@ +using System; +using Apple.StoreKit; +using UnityEngine; +using UnityEngine.UI; + +public class AdvancedCommerceProductPanelComponent : MonoBehaviour +{ + [Header("UI References")] + public Text statusText; + public InputField productIdInput; + public Button loadButton; + public Text loadedProductIdText; + public InputField compactJWSInput; + public Button purchaseButton; + +#if !UNITY_EDITOR && (UNITY_IOS || UNITY_TVOS || UNITY_VISIONOS) + private AdvancedCommerceProduct _loadedProduct; +#endif + + void Start() + { + loadButton?.onClick.AddListener(OnLoadClick); + purchaseButton?.onClick.AddListener(OnPurchaseClick); + + if (purchaseButton != null) purchaseButton.interactable = false; + +#if UNITY_EDITOR || UNITY_STANDALONE_OSX + if (loadButton != null) loadButton.interactable = false; + SetStatus("AdvancedCommerceProduct: iOS 18.4+ / tvOS 18.4+ / visionOS 2.4+ only"); +#else + SetStatus("Enter a product ID and tap Load."); +#endif + } + +#if !UNITY_EDITOR && (UNITY_IOS || UNITY_TVOS || UNITY_VISIONOS) + private async void OnLoadClick() + { + string productId = productIdInput != null ? productIdInput.text.Trim() : string.Empty; + if (string.IsNullOrEmpty(productId)) + { + SetStatus("Enter a product ID first."); + return; + } + + SetStatus($"Loading '{productId}'..."); + if (purchaseButton != null) purchaseButton.interactable = false; + if (loadedProductIdText != null) loadedProductIdText.text = string.Empty; + + try + { + _loadedProduct?.Dispose(); + _loadedProduct = await AdvancedCommerceProduct.Load(productId); + + if (_loadedProduct == null) + { + SetStatus("Product not found."); + } + else + { + if (loadedProductIdText != null) loadedProductIdText.text = _loadedProduct.Id; + if (purchaseButton != null) purchaseButton.interactable = true; + SetStatus($"Loaded: {_loadedProduct.Id}"); + } + } + catch (Exception ex) + { + SetStatus($"Load error: {ex.Message}"); + Debug.LogError($"AdvancedCommerceProductPanelComponent: Load failed: {ex}"); + } + } + + private async void OnPurchaseClick() + { + if (_loadedProduct == null) + { + SetStatus("Load a product first."); + return; + } + + string jws = compactJWSInput != null ? compactJWSInput.text.Trim() : string.Empty; + if (string.IsNullOrEmpty(jws)) + { + SetStatus("Enter a compact JWS token first."); + return; + } + + SetStatus($"Purchasing {_loadedProduct.Id}..."); + if (purchaseButton != null) purchaseButton.interactable = false; + + try + { + var result = await _loadedProduct.Purchase(jws); + bool verified = result.Result == PurchaseResult.ResultEnum.Success && result.TransactionVerification.IsVerified; + Debug.Log($"AdvancedCommerceProductPanelComponent: Purchase result={result.Result} verified={verified}"); + + if (result.Result == PurchaseResult.ResultEnum.Success && verified) + { + using var transaction = result.TransactionVerification.SafePayload; + transaction.Finish(); + SetStatus($"Purchased. Transaction {transaction.Id} finished."); + } + else + { + SetStatus($"Result: {result.Result}, Verified: {result.TransactionVerification.IsVerified}"); + } + } + catch (Exception ex) + { + SetStatus($"Purchase error: {ex.Message}"); + Debug.LogError($"AdvancedCommerceProductPanelComponent: Purchase failed: {ex}"); + } + finally + { + if (purchaseButton != null) purchaseButton.interactable = true; + } + } + + void OnDisable() + { + _loadedProduct?.Dispose(); + _loadedProduct = null; + } +#else + private void OnLoadClick() { } + private void OnPurchaseClick() { } +#endif + + private void SetStatus(string msg) + { + Debug.Log($"AdvancedCommerceProductPanelComponent: {msg}"); + if (statusText != null) + statusText.text = msg; + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AdvancedCommerceProductPanelComponent.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AdvancedCommerceProductPanelComponent.cs.meta new file mode 100644 index 00000000..dc6126b6 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AdvancedCommerceProductPanelComponent.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0c6f2052423074c8c90ee8ae8393ecfe \ No newline at end of file diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AppStorePanelComponent.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AppStorePanelComponent.cs new file mode 100644 index 00000000..f11eb1a2 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AppStorePanelComponent.cs @@ -0,0 +1,153 @@ +using System; +using Apple.StoreKit; +using UnityEngine; +using UnityEngine.UI; + +public class AppStorePanelComponent : MonoBehaviour +{ + [Header("UI References")] + public Text statusText; + public Button syncButton; + public Button requestReviewButton; + public Button canMakePaymentsButton; + public Button presentOfferCodeButton; + public Button showManageSubsButton; + public Button showManageSubsGroupButton; + public InputField subscriptionGroupIdInput; + public Button storefrontButton; + public Text storefrontText; + + void Start() + { + syncButton?.onClick.AddListener(OnSyncClick); + requestReviewButton?.onClick.AddListener(OnRequestReviewClick); + canMakePaymentsButton?.onClick.AddListener(OnCanMakePaymentsClick); + presentOfferCodeButton?.onClick.AddListener(OnPresentOfferCodeClick); + showManageSubsButton?.onClick.AddListener(OnShowManageSubsClick); + showManageSubsGroupButton?.onClick.AddListener(OnShowManageSubsGroupClick); + storefrontButton?.onClick.AddListener(OnStorefrontClick); + +#if UNITY_EDITOR + if (presentOfferCodeButton != null) presentOfferCodeButton.interactable = false; + if (showManageSubsButton != null) showManageSubsButton.interactable = false; + if (showManageSubsGroupButton != null) showManageSubsGroupButton.interactable = false; +#endif + } + + private async void OnSyncClick() + { + SetStatus("Syncing..."); + try + { + await AppStore.Sync(); + SetStatus("Sync complete"); + } + catch (Exception ex) + { + SetStatus($"Sync error: {ex.Message}"); + } + } + + private void OnRequestReviewClick() + { +#if !UNITY_EDITOR + AppStore.RequestReview(); + SetStatus("Review requested"); +#else + SetStatus("RequestReview not available in editor"); +#endif + } + + private void OnCanMakePaymentsClick() + { + bool can = AppStore.CanMakePayments; + SetStatus($"CanMakePayments: {can}"); + } + + private async void OnPresentOfferCodeClick() + { + SetStatus("Presenting offer code sheet..."); + try + { + await AppStore.PresentOfferCodeRedeemSheet(); + SetStatus("Offer code sheet dismissed"); + } + catch (Exception ex) + { + SetStatus($"Error: {ex.Message}"); + } + } + + private async void OnShowManageSubsClick() + { + SetStatus("Opening manage subscriptions..."); + try + { + await AppStore.ShowManageSubscriptions(); + SetStatus("Manage subscriptions dismissed"); + } + catch (Exception ex) + { + SetStatus($"Error: {ex.Message}"); + } + } + + private async void OnShowManageSubsGroupClick() + { + string groupId = subscriptionGroupIdInput != null ? subscriptionGroupIdInput.text : string.Empty; + if (string.IsNullOrEmpty(groupId)) + { + SetStatus("Enter a subscription group ID first"); + return; + } + SetStatus($"Opening manage subscriptions for group {groupId}..."); + try + { + await AppStore.ShowManageSubscriptions(groupId); + SetStatus("Manage subscriptions dismissed"); + } + catch (Exception ex) + { + SetStatus($"Error: {ex.Message}"); + } + } + +#if UNITY_EDITOR + private void OnStorefrontClick() + { + SetStatus("Storefront not available in editor"); + } +#else + private async void OnStorefrontClick() + { + SetStatus("Fetching storefront..."); + try + { + using var storefront = await Storefront.GetCurrent(); + if (storefront == null) + { + SetStatus("Storefront: unavailable"); + if (storefrontText != null) storefrontText.text = string.Empty; + } + else + { + var text = $"ID: {storefront.Id} Country: {storefront.CountryCode}"; + SetStatus("Storefront fetched"); + if (storefrontText != null) storefrontText.text = text; + else SetStatus(text); + } + } + catch (Exception ex) + { + SetStatus($"Storefront error: {ex.Message}"); + } + } + #endif + + private void SetStatus(string msg) + { + Debug.Log($"AppStorePanelComponent: {msg}"); + if (statusText != null) + statusText.text = msg; + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AppStorePanelComponent.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AppStorePanelComponent.cs.meta new file mode 100644 index 00000000..0b7f5d2f --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AppStorePanelComponent.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a1b2c3d4e5f607890a1b2c3d4e5f6071 \ No newline at end of file diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AppTransactionScript.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AppTransactionScript.cs new file mode 100644 index 00000000..ec59abaf --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AppTransactionScript.cs @@ -0,0 +1,73 @@ +using System.Threading.Tasks; +using Apple.StoreKit; +using UnityEngine; +using UnityEngine.UI; + +public class AppTransactionScript : MonoBehaviour +{ + public Text text; + + // Start is called once before the first execution of Update after the MonoBehaviour is created + void Start() + { + + } + + // Update is called once per frame + void Update() + { + + } + +#if !UNITY_EDITOR + public async void OnEnable() + { + Debug.Log("AppTransaction OnEnable"); + try + { + var verificationResult = await AppTransaction.GetShared(); + + if (verificationResult.IsVerified) + { + var appTransaction = verificationResult.SafePayload; + Debug.Log($"AppTransaction BundleId: {appTransaction.BundleId}"); + text.text = $@" +Verification Status: Verified ✓ +App Transaction ID: {appTransaction.AppTransactionID} +Bundle ID: {appTransaction.BundleId} +Environment: {appTransaction.Environment} +Original Platform: {appTransaction.OriginalPlatform} +Original App Version: {appTransaction.OriginalAppVersion} +Purchase Date: {appTransaction.OriginalPurchaseDate} +Device Verification Nonce: {appTransaction.DeviceVerificationNonce} +JWS Available: Yes + "; + } + else + { + var appTransaction = verificationResult.UnsafePayload; + var error = verificationResult.VerificationError; + Debug.LogWarning($"AppTransaction verification failed: {error?.LocalizedDescription}"); + text.text = $@" +Verification Status: Unverified ⚠️ +Error: {error?.LocalizedDescription ?? "Unknown"} +Bundle ID: {appTransaction.BundleId} +Environment: {appTransaction.Environment} +Original Platform: {appTransaction.OriginalPlatform} + "; + } + } + catch (System.Exception ex) + { + Debug.LogError($"AppTransaction Error: {ex}"); + text.text = $"Error: {ex.Message}"; + } + } +#else + public void OnEnable() + { + Debug.Log("AppTransaction OnEnable - Editor - skipping"); + text.text = "AppTransaction not available in Editor"; + } +#endif +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AppTransactionScript.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AppTransactionScript.cs.meta new file mode 100644 index 00000000..06f56acd --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AppTransactionScript.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ae5ab04f21a984f998c7c09a452c3def \ No newline at end of file diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/EventsPanelComponent.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/EventsPanelComponent.cs new file mode 100644 index 00000000..1eab6766 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/EventsPanelComponent.cs @@ -0,0 +1,159 @@ +using Apple.StoreKit; +using UnityEngine; +using UnityEngine.UI; +using System.Collections.Generic; + +public class EventsPanelComponent : MonoBehaviour +{ + [Header("Messages (iOS 16+ / visionOS 2.2+)")] + public Text messagesStatusText; + public Button startMessagesButton; + public Button stopMessagesButton; + public GameObject messageListParent; + public GameObject messageItemPrefab; + + [Header("Purchase Intents (iOS 16.4+)")] + public Text intentsStatusText; + public Button startIntentsButton; + public Button stopIntentsButton; + public GameObject intentListParent; + public GameObject intentItemPrefab; + + private bool _listeningMessages = false; + private bool _listeningIntents = false; + private readonly List _messageItems = new List(); + private readonly List _intentItems = new List(); + + void Start() + { + startMessagesButton?.onClick.AddListener(OnStartMessagesClick); + stopMessagesButton?.onClick.AddListener(OnStopMessagesClick); + if (stopMessagesButton != null) stopMessagesButton.interactable = false; + + startIntentsButton?.onClick.AddListener(OnStartIntentsClick); + stopIntentsButton?.onClick.AddListener(OnStopIntentsClick); + if (stopIntentsButton != null) stopIntentsButton.interactable = false; + +#if UNITY_EDITOR || (!UNITY_IOS && !UNITY_VISIONOS) + if (startMessagesButton != null) startMessagesButton.interactable = false; + SetMessagesStatus("Messages: iOS 16.0+ / visionOS 2.2+ only"); +#else + SetMessagesStatus("Not listening. Tap Start to receive App Store messages."); +#endif + +#if UNITY_EDITOR || !UNITY_IOS + if (startIntentsButton != null) startIntentsButton.interactable = false; + SetIntentsStatus("Purchase Intents: iOS 16.4+ only"); +#else + SetIntentsStatus("Not listening. Tap Start to receive promoted IAP intents."); +#endif + } + + void OnDisable() + { + if (_listeningMessages) StopMessages(); + if (_listeningIntents) StopIntents(); + } + + // --- Messages --- + + private void OnStartMessagesClick() + { +#if !UNITY_EDITOR && (UNITY_IOS || UNITY_VISIONOS) + Message.MessageReceived += OnMessageReceived; + _listeningMessages = true; + if (startMessagesButton != null) startMessagesButton.interactable = false; + if (stopMessagesButton != null) stopMessagesButton.interactable = true; + SetMessagesStatus("Listening for App Store messages..."); +#endif + } + + private void OnStopMessagesClick() => StopMessages(); + + private void StopMessages() + { +#if !UNITY_EDITOR && (UNITY_IOS || UNITY_VISIONOS) + Message.MessageReceived -= OnMessageReceived; +#endif + _listeningMessages = false; + if (startMessagesButton != null) startMessagesButton.interactable = true; + if (stopMessagesButton != null) stopMessagesButton.interactable = false; + SetMessagesStatus("Stopped listening."); + } + +#if !UNITY_EDITOR && (UNITY_IOS || UNITY_VISIONOS) + private async void OnMessageReceived(object sender, Message message) + { + Debug.Log($"EventsPanelComponent: Message reason={message.Reason}"); + SetMessagesStatus($"Message received: {message.Reason}"); + AddItemToList(messageListParent, messageItemPrefab, _messageItems, $"Reason: {message.Reason}"); + try + { + await message.Display(); + } + catch (System.Exception ex) + { + Debug.LogError($"EventsPanelComponent: Message.Display error: {ex.Message}"); + } + } +#endif + + // --- Purchase Intents --- + + private void OnStartIntentsClick() + { +#if !UNITY_EDITOR && UNITY_IOS + PurchaseIntent.Intents += OnPurchaseIntent; + _listeningIntents = true; + if (startIntentsButton != null) startIntentsButton.interactable = false; + if (stopIntentsButton != null) stopIntentsButton.interactable = true; + SetIntentsStatus("Listening for purchase intents..."); +#endif + } + + private void OnStopIntentsClick() => StopIntents(); + + private void StopIntents() + { +#if !UNITY_EDITOR && UNITY_IOS + PurchaseIntent.Intents -= OnPurchaseIntent; +#endif + _listeningIntents = false; + if (startIntentsButton != null) startIntentsButton.interactable = true; + if (stopIntentsButton != null) stopIntentsButton.interactable = false; + SetIntentsStatus("Stopped listening."); + } + +#if !UNITY_EDITOR && UNITY_IOS + private void OnPurchaseIntent(object sender, PurchaseIntent intent) + { + Debug.Log($"EventsPanelComponent: Intent id={intent.Id}, product={intent.Product?.Id}"); + SetIntentsStatus($"Intent received: {intent.Product?.Id ?? intent.Id}"); + string label = $"Intent: {intent.Id}\nProduct: {intent.Product?.DisplayName ?? intent.Product?.Id ?? "unknown"}"; + AddItemToList(intentListParent, intentItemPrefab, _intentItems, label); + } +#endif + + // --- Helpers --- + + private void AddItemToList(GameObject parent, GameObject prefab, List list, string label) + { + if (parent == null || prefab == null) return; + var obj = Instantiate(prefab, parent.transform); + list.Add(obj); + var txt = obj.GetComponentInChildren(); + if (txt != null) txt.text = label; + } + + private void SetMessagesStatus(string msg) + { + Debug.Log($"EventsPanelComponent (messages): {msg}"); + if (messagesStatusText != null) messagesStatusText.text = msg; + } + + private void SetIntentsStatus(string msg) + { + Debug.Log($"EventsPanelComponent (intents): {msg}"); + if (intentsStatusText != null) intentsStatusText.text = msg; + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/EventsPanelComponent.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/EventsPanelComponent.cs.meta new file mode 100644 index 00000000..e1c660a8 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/EventsPanelComponent.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d1b50fe13048a4211a12a084252807d5 \ No newline at end of file diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/MenuComponent.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/MenuComponent.cs new file mode 100644 index 00000000..fd785390 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/MenuComponent.cs @@ -0,0 +1,56 @@ +using Apple.StoreKit; +using UnityEngine; +using UnityEngine.UI; + +public class MenuComponent : MonoBehaviour +{ + public Button transactionsButton; + public GameObject transactionsPanel; + public Button productsButton; + public GameObject productsPanel; + public Button overlayButton; + public GameObject menuPanel; + + public Button appStoreButton; + public GameObject appStorePanel; + public Button promotionInfoButton; + public GameObject promotionInfoPanel; + public Button subscriptionStatusButton; + public GameObject subscriptionStatusPanel; + public Button eventsButton; + public GameObject eventsPanel; + public Button advancedCommerceButton; + public GameObject advancedCommercePanel; + + public NavigationComponent navigationComponent; + + void Start() + { + transactionsButton?.onClick.AddListener(OnTransactionsClick); + productsButton?.onClick.AddListener(OnProductsClick); + appStoreButton?.onClick.AddListener(() => navigationComponent.NavigateTo(appStorePanel)); + promotionInfoButton?.onClick.AddListener(() => navigationComponent.NavigateTo(promotionInfoPanel)); + subscriptionStatusButton?.onClick.AddListener(() => navigationComponent.NavigateTo(subscriptionStatusPanel)); + eventsButton?.onClick.AddListener(() => navigationComponent.NavigateTo(eventsPanel)); + advancedCommerceButton?.onClick.AddListener(() => navigationComponent.NavigateTo(advancedCommercePanel)); + + if (overlayButton != null) + { +#if UNITY_IOS || UNITY_VISIONOS + overlayButton.onClick.AddListener(OnOverlayClick); +#else + overlayButton.interactable = false; +#endif + } + } + + private void OnProductsClick() => navigationComponent.NavigateTo(productsPanel); + private void OnTransactionsClick() => navigationComponent.NavigateTo(transactionsPanel); + +#if UNITY_IOS || UNITY_VISIONOS + private void OnOverlayClick() + { + SKOverlay.Present("897118787"); + } +#endif +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/MenuComponent.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/MenuComponent.cs.meta new file mode 100644 index 00000000..277f4bf1 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/MenuComponent.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7ac85e1ab6f904f908ded606501360f6 \ No newline at end of file diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/NavigationComponent.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/NavigationComponent.cs new file mode 100644 index 00000000..dc54f96a --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/NavigationComponent.cs @@ -0,0 +1,58 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using UnityEngine.PlayerLoop; +using UnityEngine.UI; + +public class NavigationComponent : MonoBehaviour +{ + private Stack navigationStack = new(); + public Button backButton; + public GameObject mainMenu; + + void Start() + { + backButton?.onClick.AddListener(NavigateBack); + backButton.interactable = false; + } + + public void NavigateTo(GameObject to) + { + if (!navigationStack.TryPeek(out var from)) + { + from = mainMenu; + navigationStack.Push(from); + } + + Debug.Log($"Navigating to {to.name} from {from.name}"); + from.SetActive(false); + to.SetActive(true); + navigationStack.Push(to); + UpdateBackButton(); + } + + public void NavigateBack() + { + if (navigationStack.TryPop(out var from)) + { + Debug.Log($"Navigating back from {from.name}"); + from.SetActive(false); + } + + if (navigationStack.TryPeek(out var to)) + { + Debug.Log($"Navigating back to {to.name}"); + to.SetActive(true); + } + + UpdateBackButton(); + } + + private void UpdateBackButton() + { + Debug.Log($"Navigation stack count: {navigationStack.Count}"); + backButton.interactable = navigationStack.Count > 1; + } + +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/NavigationComponent.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/NavigationComponent.cs.meta new file mode 100644 index 00000000..ac1984fa --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/NavigationComponent.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0099b0b99ea064a12a5355f0a7761495 \ No newline at end of file diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductPromotionInfoPanelComponent.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductPromotionInfoPanelComponent.cs new file mode 100644 index 00000000..fb9f11c1 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductPromotionInfoPanelComponent.cs @@ -0,0 +1,143 @@ +using System; +using System.Linq; +using Apple.StoreKit; +using UnityEngine; +using UnityEngine.UI; + +public class ProductPromotionInfoPanelComponent : MonoBehaviour +{ + [Header("UI References")] + public Text statusText; + public Text orderText; + public Button getOrderButton; + public Button resetOrderButton; + public Button hideFirstButton; + public Button showFirstButton; + public Button updateAllButton; + + // Comma-separated product IDs to use for ordering/updating + public InputField productIdsInput; + + void Start() + { + getOrderButton?.onClick.AddListener(OnGetOrderClick); + resetOrderButton?.onClick.AddListener(OnResetOrderClick); + hideFirstButton?.onClick.AddListener(OnHideFirstClick); + showFirstButton?.onClick.AddListener(OnShowFirstClick); + updateAllButton?.onClick.AddListener(OnUpdateAllClick); + +#if UNITY_EDITOR || !UNITY_IOS + if (getOrderButton != null) getOrderButton.interactable = false; + if (resetOrderButton != null) resetOrderButton.interactable = false; + if (hideFirstButton != null) hideFirstButton.interactable = false; + if (showFirstButton != null) showFirstButton.interactable = false; + if (updateAllButton != null) updateAllButton.interactable = false; + SetStatus("ProductPromotionInfo: iOS 16.4+ only"); +#endif + } + + private string[] GetProductIds() + { + if (productIdsInput == null || string.IsNullOrWhiteSpace(productIdsInput.text)) + return new[] { "Unity.StoreKit.Consumable", "Unity.StoreKit.NonConsumable", "Unity.StoreKit.Subscription" }; + return productIdsInput.text.Split(',').Select(s => s.Trim()).Where(s => !string.IsNullOrEmpty(s)).ToArray(); + } + + private async void OnGetOrderClick() + { + SetStatus("Getting current order..."); + try + { + var order = await ProductPromotionInfo.GetCurrentOrder(); + if (order.Length == 0) + { + SetStatus("No custom order set (using App Store Connect default)"); + if (orderText != null) orderText.text = "(default)"; + } + else + { + string orderStr = string.Join(", ", order); + SetStatus($"Current order ({order.Length} items)"); + if (orderText != null) orderText.text = orderStr; + } + } + catch (Exception ex) + { + SetStatus($"Error: {ex.Message}"); + } + } + + private async void OnResetOrderClick() + { + SetStatus("Resetting to App Store Connect order..."); + try + { + await ProductPromotionInfo.UpdateProductOrder(Array.Empty()); + SetStatus("Order reset to App Store Connect default"); + if (orderText != null) orderText.text = "(default)"; + } + catch (Exception ex) + { + SetStatus($"Error: {ex.Message}"); + } + } + + private async void OnHideFirstClick() + { + var ids = GetProductIds(); + if (ids.Length == 0) { SetStatus("Enter product IDs first"); return; } + SetStatus($"Hiding {ids[0]}..."); + try + { + await ProductPromotionInfo.UpdateProductVisibility(ids[0], ProductPromotionInfo.Visibility.Hidden); + SetStatus($"Hidden: {ids[0]}"); + } + catch (Exception ex) + { + SetStatus($"Error: {ex.Message}"); + } + } + + private async void OnShowFirstClick() + { + var ids = GetProductIds(); + if (ids.Length == 0) { SetStatus("Enter product IDs first"); return; } + SetStatus($"Showing {ids[0]}..."); + try + { + await ProductPromotionInfo.UpdateProductVisibility(ids[0], ProductPromotionInfo.Visibility.Visible); + SetStatus($"Visible: {ids[0]}"); + } + catch (Exception ex) + { + SetStatus($"Error: {ex.Message}"); + } + } + + private async void OnUpdateAllClick() + { + var ids = GetProductIds(); + if (ids.Length == 0) { SetStatus("Enter product IDs first"); return; } + var visibilities = new ProductPromotionInfo.Visibility[ids.Length]; + visibilities[0] = ProductPromotionInfo.Visibility.Visible; + for (int i = 1; i < visibilities.Length; i++) + visibilities[i] = ProductPromotionInfo.Visibility.AppStoreConnectDefault; + SetStatus("Calling UpdateAll..."); + try + { + await ProductPromotionInfo.UpdateAll(ids, visibilities); + SetStatus($"UpdateAll complete: {ids[0]}=Visible, others=Default"); + } + catch (Exception ex) + { + SetStatus($"Error: {ex.Message}"); + } + } + + private void SetStatus(string msg) + { + Debug.Log($"ProductPromotionInfoPanelComponent: {msg}"); + if (statusText != null) + statusText.text = msg; + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductPromotionInfoPanelComponent.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductPromotionInfoPanelComponent.cs.meta new file mode 100644 index 00000000..aa8ba968 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductPromotionInfoPanelComponent.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b2c3d4e5f6a708901b2c3d4e5f6a7082 \ No newline at end of file diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductScript.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductScript.cs new file mode 100644 index 00000000..94c905a9 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductScript.cs @@ -0,0 +1,136 @@ +#pragma warning disable CS1998 +using System; +using System.Collections.Generic; +using Apple.StoreKit; +using UnityEngine; +using UnityEngine.UI; + +public class ProductScript : MonoBehaviour +{ + public Text text; + public Text status; + public Button purchaseButton; + public Button getLatestButton; + public InputField quantityInput; + public Toggle simulateAskToBuyToggle; + + private Product _product; + + void Start() + { + getLatestButton?.onClick.AddListener(OnGetLatestClick); + } + + void Update() + { + } + + public void SetProductInfo(string name, string desc, string prc) + { + if (text != null) + text.text = $"{name}:{desc}, {prc}"; + + if (purchaseButton != null) + { + purchaseButton.interactable = false; + purchaseButton.onClick.RemoveAllListeners(); + } + + if (getLatestButton != null) getLatestButton.interactable = false; + } + + public void SetProductInfo(Product product) + { + _product = product; + SetProductInfo(product.DisplayName, product.Type.LocalizedDescription, product.DisplayPrice); + if (purchaseButton != null) + { + purchaseButton.interactable = true; + purchaseButton.onClick.RemoveAllListeners(); + purchaseButton.onClick.AddListener(async () => + { + try + { + if (status != null) + status.text = $"Purchasing {product.Id}..."; + + Debug.Log($"ProductScript: Purchase {product.Id}"); + + var options = BuildPurchaseOptions(); + var result = await product.Purchase(options); + var isVerified = result.Result == PurchaseResult.ResultEnum.Success && result.TransactionVerification.IsVerified; + Debug.Log($"ProductScript: Purchase completed for {product.Id}. Result: {Enum.GetName(typeof(PurchaseResult.ResultEnum), result.Result)}. Verified: {isVerified}"); + + if (result.Result == PurchaseResult.ResultEnum.Success && isVerified) + { + using var transaction = result.TransactionVerification.SafePayload; + transaction.Finish(); + Debug.Log($"ProductScript: Transaction {transaction.Id} finished."); + } + + if (status != null) + status.text = $"{product.Id} purchased. Result: {Enum.GetName(typeof(PurchaseResult.ResultEnum), result.Result)}. Verified: {result.TransactionVerification.IsVerified}"; + } + catch (Exception ex) + { + Debug.LogError($"ProductScript: Purchase failed for {product.Id} with error: {ex.Message}"); + if (status != null) status.text = $"Error: {ex.Message}"; + } + }); + } + + if (getLatestButton != null) getLatestButton.interactable = true; + } + + public void SetTestProduct(string id, string displayName, string description, decimal price) + { + Debug.Log($"ProductScript: SetTestProduct {id}, {displayName}, ${price}"); + SetProductInfo(displayName, description, $"${price:F2}"); + } + + private PurchaseOption[] BuildPurchaseOptions() + { + var opts = new List(); + + if (quantityInput != null && int.TryParse(quantityInput.text, out int qty) && qty > 1) + opts.Add(PurchaseOption.Quantity(qty)); + + if (simulateAskToBuyToggle != null && simulateAskToBuyToggle.isOn) + opts.Add(PurchaseOption.SimulatesAskToBuyInSandbox(true)); + + return opts.ToArray(); + } + + private async void OnGetLatestClick() + { + if (_product == null) return; + try + { + if (status != null) status.text = "Fetching latest transaction..."; +#if !UNITY_EDITOR && (UNITY_IOS || UNITY_TVOS || UNITY_VISIONOS || UNITY_STANDALONE_OSX) + var vr = await _product.GetLatestTransaction(); + if (vr == null) + { + if (status != null) status.text = "No transaction found"; + } + else if (!vr.IsVerified) + { + if (status != null) status.text = "Latest transaction: unverified"; + } + else + { + using var transaction = vr.SafePayload; + if (status != null) status.text = $"Latest: ID={transaction.Id} {transaction.ProductId}"; + Debug.Log($"ProductScript: Latest transaction {transaction.Id}"); + } +#else + if (status != null) status.text = "GetLatestTransaction not available in editor"; +#endif + } + catch (Exception ex) + { + Debug.LogError($"ProductScript: GetLatestTransaction error: {ex.Message}"); + if (status != null) status.text = $"Error: {ex.Message}"; + } + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductScript.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductScript.cs.meta new file mode 100644 index 00000000..58d36d88 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductScript.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f81d19013bed84ff894ce9f1cffa0489 \ No newline at end of file diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductsPanelComponent.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductsPanelComponent.cs new file mode 100644 index 00000000..aff797c5 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductsPanelComponent.cs @@ -0,0 +1,147 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Apple.StoreKit; +using UnityEngine; +using UnityEngine.UI; + +public class ProductsPanelComponent : MonoBehaviour +{ + public Text statusText; + public Button retrieveButton; + public GameObject productItemPrefab; + public GameObject productListParent; + + [Header("Editor Testing")] + public Button addTestProductButton; + + private List productItems = new List(); + private int testProductCounter = 0; + + private static readonly string[] productIds = new string[] + { + "Unity.StoreKit.Consumable", + "Unity.StoreKit.NonConsumable", + "Unity.StoreKit.Subscription" + }; + + // Start is called once before the first execution of Update after the MonoBehaviour is created + void Start() + { + if (addTestProductButton != null) + addTestProductButton.onClick.AddListener(OnAddTestProductClick); + + if (retrieveButton != null) + retrieveButton.onClick.AddListener(async () => + { + Debug.Log("ProductsPanelComponent: OnRetrieveClick"); + await RefreshList(); + }); + } + + // Update is called once per frame + void Update() + { + + } + + async void OnEnable() + { + await RefreshList(); + } + + private async Task RefreshList() + { + ClearList(); + Debug.Log("ProductsPanelComponent: RefreshList"); + statusText.text = "Loading..."; + + var products = await Product.FetchProducts(productIds); + Debug.Log("Products loaded: " + products.Count); + foreach (var product in products) + { + Debug.Log($"Product: {product.Id}, Description: {product.Description}, Price: {product.Price}"); + AddProductToList(product); + } + + statusText.text = $"Loaded {products.Count} products"; + } + + private void ClearList() + { + foreach (var item in productItems) + { + Destroy(item); + } + productItems.Clear(); + } + + private void AddProductToList(Product product) + { + var itemObj = Instantiate(productItemPrefab, productListParent.transform); + var productScript = itemObj.GetComponent(); + if (productScript != null) + { + productScript.SetProductInfo(product); + productScript.status = statusText; + } + productItems.Add(itemObj); + } + + + void OnDisable() + { + Debug.Log("ProductsPanelComponent: OnDisable"); + } + + public void OnAddTestProductClick() + { + Debug.Log("Adding test product"); + AddTestProduct(); + } + + private void AddTestProduct() + { + if (productListParent == null || productItemPrefab == null) + { + Debug.LogWarning("ProductsPanelComponent: Missing UI references. Cannot display product in list."); + return; + } + + // Instantiate product item + var itemObj = Instantiate(productItemPrefab, productListParent.transform, worldPositionStays: false); + productItems.Add(itemObj); + + // Force the height to 100 pixels + RectTransform rectTransform = itemObj.GetComponent(); + if (rectTransform != null) + { + rectTransform.sizeDelta = new UnityEngine.Vector2(rectTransform.sizeDelta.x, 100); + } + + // Configure the product item with test data + var productScript = itemObj.GetComponent(); + if (productScript != null) + { + testProductCounter++; + string[] testProductIds = { "Unity.StoreKit.Consumable", "Unity.StoreKit.NonConsumable", "Unity.StoreKit.Subscription" }; + string[] testDescriptions = { "Test Consumable Product", "Test Non-Consumable Product", "Test Subscription Product" }; + decimal[] testPrices = { 0.99m, 4.99m, 9.99m }; + + int index = testProductCounter % testProductIds.Length; + + productScript.SetTestProduct( + id: testProductIds[index], + displayName: $"Test Product {testProductCounter}", + description: testDescriptions[index], + price: testPrices[index] + ); + + if (statusText != null) + statusText.text = $"Added test product #{testProductCounter}"; + } + else + { + Debug.LogWarning("ProductsPanelComponent: ProductScript component not found on prefab."); + } + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductsPanelComponent.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductsPanelComponent.cs.meta new file mode 100644 index 00000000..53442677 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductsPanelComponent.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 63f17224be73f4d2092fb2eec8b862ae \ No newline at end of file diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/SKOverlayComponent.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/SKOverlayComponent.cs new file mode 100644 index 00000000..834d170a --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/SKOverlayComponent.cs @@ -0,0 +1,45 @@ +using Apple.StoreKit; +using UnityEngine; +using UnityEngine.UI; + +public class SKOverlayComponent : MonoBehaviour +{ + public Text statusText; + public Button presentButton; + public Button dismissButton; + + private const string ShazamAppId = "897118787"; + +#if UNITY_IOS || UNITY_VISIONOS + void Start() + { + presentButton?.onClick.AddListener(OnPresentClick); + dismissButton?.onClick.AddListener(OnDismissClick); + + SKOverlay.WillStartPresentation += () => UpdateStatus("Overlay will start presenting..."); + SKOverlay.DidFinishPresentation += () => UpdateStatus("Overlay presented."); + SKOverlay.WillStartDismissal += () => UpdateStatus("Overlay will start dismissing..."); + SKOverlay.DidFinishDismissal += () => UpdateStatus("Overlay dismissed."); + SKOverlay.DidFailToLoad += (error) => UpdateStatus($"Overlay failed to load: {error.Message}"); + } + + private void OnPresentClick() + { + UpdateStatus("Presenting SKOverlay for Shazam..."); + SKOverlay.Present(ShazamAppId, SKOverlayPosition.Bottom); + } + + private void OnDismissClick() + { + UpdateStatus("Dismissing SKOverlay..."); + SKOverlay.Dismiss(); + } + + private void UpdateStatus(string message) + { + Debug.Log($"SKOverlay: {message}"); + if (statusText != null) + statusText.text = message; + } +#endif +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/SKOverlayComponent.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/SKOverlayComponent.cs.meta new file mode 100644 index 00000000..c078f42c --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/SKOverlayComponent.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 635f2b390c0a640c782d5d6f79744ab6 \ No newline at end of file diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/SubscriptionStatusPanelComponent.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/SubscriptionStatusPanelComponent.cs new file mode 100644 index 00000000..e3851fe8 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/SubscriptionStatusPanelComponent.cs @@ -0,0 +1,127 @@ +using System; +using System.Text; +using Apple.StoreKit; +using UnityEngine; +using UnityEngine.UI; + +public class SubscriptionStatusPanelComponent : MonoBehaviour +{ + [Header("UI References")] + public Text statusText; + public Text renewalInfoText; + public Button fetchButton; + + // Comma-separated product IDs for subscriptions to check + public InputField productIdsInput; + + void Start() + { + fetchButton?.onClick.AddListener(OnFetchClick); + SetStatus("Enter subscription product IDs and tap Fetch"); + } + +#if UNITY_EDITOR + private void OnFetchClick() + { + SetStatus("Subscription status not available in editor"); + } +#else + private async void OnFetchClick() + { + string input = productIdsInput != null ? productIdsInput.text : string.Empty; + string[] ids = string.IsNullOrWhiteSpace(input) + ? new[] { "Unity.StoreKit.Subscription" } + : input.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + + SetStatus("Fetching subscription status..."); + if (renewalInfoText != null) renewalInfoText.text = string.Empty; + + try + { + var products = await Product.FetchProducts(ids); + if (products.Count == 0) + { + SetStatus("No products found for given IDs"); + return; + } + + var sb = new StringBuilder(); + foreach (var product in products) + { + var subInfo = product.Subscription; + if (subInfo == null) + { + sb.AppendLine($"{product.Id}: not a subscription"); + continue; + } + + bool eligible = await subInfo.IsEligibleForIntroOffer(); + sb.AppendLine($"[{product.Id}] EligibleForIntroOffer: {eligible}"); + + var winBackOffers = subInfo.WinBackOffers; + if (winBackOffers.Length > 0) + { + sb.AppendLine($" WinBackOffers ({winBackOffers.Length}):"); + foreach (var wo in winBackOffers) + sb.AppendLine($" Id={wo.Id ?? "null"} {wo.PaymentMode} {wo.PeriodValue}{wo.PeriodUnit} x{wo.PeriodCount} {wo.DisplayPrice}"); + } + + SubscriptionStatus[] statuses; + try { statuses = await subInfo.GetStatus(); } + catch (Exception ex) + { + sb.AppendLine($"{product.Id}: error - {ex.Message}"); + continue; + } + + if (statuses.Length == 0) + { + sb.AppendLine($"{product.Id}: no status entries"); + continue; + } + + foreach (var s in statuses) + { + sb.AppendLine($" State: {s.State}"); + + var vrRenewal = s.RenewalInfo; + if (!vrRenewal.IsVerified) + { + sb.AppendLine(" RenewalInfo: unverified"); + continue; + } + + var ri = vrRenewal.SafePayload; + sb.AppendLine($" CurrentProductId: {ri.CurrentProductId}"); + sb.AppendLine($" WillAutoRenew: {ri.WillAutoRenew}"); + sb.AppendLine($" IsInBillingRetry: {ri.IsInBillingRetry}"); + + if (ri.ExpirationReason.HasValue) + sb.AppendLine($" ExpirationReason: {ri.ExpirationReason}"); + if (!string.IsNullOrEmpty(ri.OfferId)) + sb.AppendLine($" OfferId: {ri.OfferId}"); + if (ri.OfferType.HasValue) + sb.AppendLine($" OfferType: {ri.OfferType}"); + if (ri.GracePeriodExpirationDate.HasValue) + sb.AppendLine($" GracePeriodExpires: {ri.GracePeriodExpirationDate:yyyy-MM-dd HH:mm}"); + } + } + + if (renewalInfoText != null) renewalInfoText.text = sb.ToString(); + SetStatus("Done"); + } + catch (Exception ex) + { + SetStatus($"Error: {ex.Message}"); + Debug.LogError($"SubscriptionStatusPanelComponent: {ex}"); + } + } + #endif + + private void SetStatus(string msg) + { + Debug.Log($"SubscriptionStatusPanelComponent: {msg}"); + if (statusText != null) + statusText.text = msg; + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/SubscriptionStatusPanelComponent.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/SubscriptionStatusPanelComponent.cs.meta new file mode 100644 index 00000000..17d2ef1c --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/SubscriptionStatusPanelComponent.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d4e5f6a7b8c920123d4e5f6a7b8c9014 \ No newline at end of file diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/TransactionItem.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/TransactionItem.cs new file mode 100644 index 00000000..b51775c3 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/TransactionItem.cs @@ -0,0 +1,51 @@ +using System; +using UnityEngine; +using UnityEngine.UI; +using Apple.StoreKit; + +public class TransactionItem : MonoBehaviour +{ + public Text transactionText; + public Button refundButton; + + private ulong _transactionId; + + void Start() + { +#if UNITY_TVOS || UNITY_EDITOR + if (refundButton != null) refundButton.interactable = false; +#else + refundButton?.onClick.AddListener(OnRefundClick); +#endif + } + + public void SetTransaction(Transaction transaction) + { + Debug.Log($"TransactionItem: {transaction}"); + transactionText.text = transaction.ToString(); + _transactionId = transaction.Id; + } + + public void SetTestTransaction(ulong id, string productId, System.DateTime purchaseDate, string status) + { + Debug.Log($"TransactionItem: SetTestTransaction {id}, {productId}, {purchaseDate}"); + transactionText.text = $"ID: {id} Product: {productId} Date: {purchaseDate:yyyy-MM-dd HH:mm} Status: {status}"; + _transactionId = id; + } + +#if !UNITY_TVOS && !UNITY_EDITOR + private async void OnRefundClick() + { + try + { + Debug.Log($"TransactionItem: BeginRefundRequest for {_transactionId}"); + var status = await Transaction.BeginRefundRequest(_transactionId); + Debug.Log($"TransactionItem: RefundRequest status={status}"); + } + catch (Exception ex) + { + Debug.LogError($"TransactionItem: RefundRequest error: {ex.Message}"); + } + } +#endif +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/TransactionItem.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/TransactionItem.cs.meta new file mode 100644 index 00000000..ee272a08 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/TransactionItem.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7f83ab2c3308044a8aa90edbc9f19b32 \ No newline at end of file diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/TransactionsPanelComponent.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/TransactionsPanelComponent.cs new file mode 100644 index 00000000..cafc3546 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/TransactionsPanelComponent.cs @@ -0,0 +1,256 @@ +using UnityEngine; +using UnityEngine.UI; +using Apple.StoreKit; +using System.Threading.Tasks; +using System.Collections.Generic; +using System.Threading; + +public class TransactionsPanelComponent : MonoBehaviour +{ + [Header("UI References")] + public GameObject transactionListParent; + public GameObject transactionItemPrefab; + public Text statusText; + + [Header("Editor Testing")] + public Button addTestTransactionButton; + + private List transactionItems = new List(); + private int testTransactionCounter = 0; + + private Task RetrieveTransactionsTask = null; + private CancellationTokenSource retrieveCancellationTokenSource = new CancellationTokenSource(); + private bool updateIsHooked = false; + private TransactionSource currentSource = TransactionSource.All; + + public enum TransactionSource + { + All, + Unfinished, + CurrentEntitlements, + Updates + } + + + private TaskScheduler unityScheduler; + + void Awake() + { + unityScheduler = TaskScheduler.FromCurrentSynchronizationContext(); + } + + void Start() + { + // Clear status on start + if (statusText != null) + statusText.text = "Ready to retrieve transactions"; + + if (addTestTransactionButton != null) + addTestTransactionButton.onClick.AddListener(OnAddTestTransactionClick); + } + + void OnEnable() + { + OnSourceChange((int)currentSource); + } + + public void OnSourceChange(int intSource) + { + Debug.Log($"RetrieveTransactionsComponent: OnSourceChange: {intSource}"); + var source = (TransactionSource)intSource; + + retrieveCancellationTokenSource.Cancel(); + retrieveCancellationTokenSource = new CancellationTokenSource(); + currentSource = source; + + switch (source) + { + case TransactionSource.All: + case TransactionSource.Unfinished: + case TransactionSource.CurrentEntitlements: + if (updateIsHooked) + { + Transaction.Updates -= OnUpdate; + updateIsHooked = false; + } + + RetrieveTransactionsTask = LoadTransactionsAsync(source); + break; + case TransactionSource.Updates: + if (!updateIsHooked) + { + if (statusText != null) + statusText.text = "Waiting on updates..."; + + ClearTransactionList(); + Transaction.Updates += OnUpdate; + updateIsHooked = true; + } + break; + default: + Debug.LogWarning("RetrieveTransactionsComponent: Unknown transaction source selected"); + break; + } + } + + public void OnUpdate(object _, VerificationResult result) + { + Debug.Log($"RetrieveTransactionsComponent: OnUpdate: Received transaction update IsVerified: {result.IsVerified}"); + if (!result.IsVerified) + return; + + Task.Factory.StartNew( + () => AddTransactionToList(result.SafePayload), + CancellationToken.None, + TaskCreationOptions.None, + unityScheduler); + } + + + private async Task LoadTransactionsAsync(TransactionSource source) + { + if (statusText != null) + statusText.text = "Retrieving transactions..."; + + // Clear previous results + ClearTransactionList(); + + var errored = false; + + try + { + int transactionCount = 0; + var enumerable = source switch + { + TransactionSource.All => Transaction.GetAll(), + TransactionSource.Unfinished => Transaction.GetUnfinished(), + TransactionSource.CurrentEntitlements => Transaction.GetCurrentEntitlements(), + _ => Transaction.GetAll(), + }; + + await foreach (var result in enumerable.WithCancellation(retrieveCancellationTokenSource.Token)) + { + if (!result.IsVerified) + { + Debug.LogWarning("RetrieveTransactionsComponent: Skipping unverified transaction"); + continue; + } + + var transaction = result.SafePayload; + + transactionCount++; + Debug.Log(transaction.ToString()); + + // Add transaction to UI list + AddTransactionToList(transaction); + } + + Debug.Log("RetrieveTransactionsComponent: All transactions retrieved successfully"); + + if (statusText != null) + { + if (transactionCount == 0) + statusText.text = "No transactions found"; + else + statusText.text = $"Retrieved {transactionCount} transaction(s)"; + } + } + catch (System.Exception ex) + { + Debug.LogError($"RetrieveTransactionsComponent: Error retrieving transactions: {ex.Message}"); + + if (statusText != null) + statusText.text = $"Error: {ex.Message}"; + + errored = true; + } + finally + { + if (!errored && statusText != null) + statusText.text += " (Completed)"; + } + } + + private void ClearTransactionList() + { + foreach (var item in transactionItems) + { + if (item != null) + DestroyImmediate(item); + } + transactionItems.Clear(); + } + + private void AddTransactionToList(Transaction transaction) + { + if (transactionListParent == null || transactionItemPrefab == null) + { + Debug.LogWarning("RetrieveTransactionsComponent: Missing UI references. Cannot display transaction in list."); + return; + } + + // Instantiate transaction item + GameObject itemObj = Instantiate(transactionItemPrefab, transactionListParent.transform, worldPositionStays: false); + transactionItems.Add(itemObj); + + // Configure the transaction item + TransactionItem itemComponent = itemObj.GetComponent(); + if (itemComponent != null) + { + itemComponent.SetTransaction(transaction); + } + else + { + Debug.LogWarning("RetrieveTransactionsComponent: TransactionItem component not found on prefab."); + } + } + + public void OnAddTestTransactionClick() + { + Debug.Log("Adding test transaction"); + AddTestTransaction(); + } + + private void AddTestTransaction() + { + if (transactionListParent == null || transactionItemPrefab == null) + { + Debug.LogWarning("RetrieveTransactionsComponent: Missing UI references. Cannot display transaction in list."); + return; + } + + // Instantiate transaction item + GameObject itemObj = Instantiate(transactionItemPrefab, transactionListParent.transform, worldPositionStays: false); + transactionItems.Add(itemObj); + + // Force the height to 100 pixels + RectTransform rectTransform = itemObj.GetComponent(); + if (rectTransform != null) + { + rectTransform.sizeDelta = new UnityEngine.Vector2(rectTransform.sizeDelta.x, 100); + } + + // Configure the transaction item with test data + TransactionItem itemComponent = itemObj.GetComponent(); + if (itemComponent != null) + { + testTransactionCounter++; + string[] testProducts = { "Unity.StoreKit.Consumable", "Unity.StoreKit.NonConsumable", "Unity.StoreKit.Subscription" }; + string[] testStatuses = { "Active", "Upgraded", "Revoked" }; + + itemComponent.SetTestTransaction( + id: (ulong)testTransactionCounter, + productId: testProducts[testTransactionCounter % testProducts.Length], + purchaseDate: System.DateTime.Now.AddDays(-testTransactionCounter), + status: testStatuses[testTransactionCounter % testStatuses.Length] + ); + + if (statusText != null) + statusText.text = $"Added test transaction #{testTransactionCounter}"; + } + else + { + Debug.LogWarning("RetrieveTransactionsComponent: TransactionItem component not found on prefab."); + } + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/TransactionsPanelComponent.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/TransactionsPanelComponent.cs.meta new file mode 100644 index 00000000..de514a9a --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/TransactionsPanelComponent.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 226c141e0fa0f4355843ece55847fae3 \ No newline at end of file diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Documentation~/Apple.StoreKit.md b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Documentation~/Apple.StoreKit.md new file mode 100644 index 00000000..2edfbf9e --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Documentation~/Apple.StoreKit.md @@ -0,0 +1,225 @@ +# Apple - StoreKit + +## Overview +The Apple.StoreKit Unity Plug-In exposes Apple's StoreKit 2 framework to Unity developers, providing a modern C# API for implementing in-app purchases, subscriptions, and transaction management in your iOS, macOS, tvOS, and visionOS apps. + +## Installation Instructions + +### 1. Install Dependencies +* Apple.Core + +### 2. Install the Package +Run `python3 build.py` from the repository root and import the generated `.tgz` package from the `Build/` directory into your Unity project. + +## Requirements +- **Unity**: 2022.3 or later +- **Apple.Core**: 3.1.8 or later (dependency) +- **Platform Support**: + - iOS 15.0+ + - macOS 12.0+ + - tvOS 15.0+ + - visionOS 1.0+ + +## Features +- **Product Management**: Fetch and display product information from the App Store +- **In-App Purchases**: Support for consumable, non-consumable, auto-renewable, and non-renewable subscriptions +- **Transaction Handling**: Retrieve, verify, and manage purchase transactions +- **Async/Await Support**: Modern async programming model with `Task` and `IAsyncEnumerable` +- **Transaction Verification**: Built-in support for verifying transaction authenticity +- **App Transactions**: Retrieve and validate app installation transactions + +## Usage + +Since most calls are asynchronous, public methods are `Task` or `Task<>` based. + +### Fetching Products +```csharp +using Apple.StoreKit; +using System.Collections.Generic; + +// Define your product IDs +string[] productIds = new string[] +{ + "com.yourcompany.consumable", + "com.yourcompany.nonconsumable", + "com.yourcompany.subscription" +}; + +// Fetch products from the App Store +var products = await Product.FetchProducts(productIds); + +foreach (var product in products) +{ + Debug.Log($"Product: {product.DisplayName}"); + Debug.Log($"Price: {product.DisplayPrice}"); + Debug.Log($"Description: {product.Description}"); +} +``` + +### Making a Purchase +```csharp +// Purchase a product +var result = await product.Purchase(); + +if (result.Result == PurchaseResult.ResultEnum.Success) +{ + var transaction = result.TransactionVerification.SafePayload; + Debug.Log($"Purchase successful! Transaction ID: {transaction.Id}"); + + // Finish the transaction + transaction.Finish(); +} +else if (result.Result == PurchaseResult.ResultEnum.UserCancelled) +{ + Debug.Log("User cancelled the purchase"); +} +``` + +### Purchase Options +You can provide additional options when making a purchase: + +```csharp +// Purchase with options +var options = new PurchaseOption[] +{ + PurchaseOption.AppAccountToken("user-uuid-string"), + PurchaseOption.Quantity(2) +}; + +var result = await product.Purchase(options); +``` + +### Retrieving Transactions +```csharp +// Get all transactions for the current user +await foreach (var verificationResult in Transaction.GetAll()) +{ + if (!verificationResult.IsVerified) + continue; + + var transaction = verificationResult.SafePayload; + Debug.Log($"Transaction ID: {transaction.Id}"); + Debug.Log($"Product ID: {transaction.ProductId}"); + Debug.Log($"Purchase Date: {transaction.PurchaseDate}"); + + // Process the transaction + // ... +} +``` + +### Listening for Transaction Updates +```csharp +// Listen for new transactions (purchases from other devices, renewals, etc.) +Transaction.Updates += (sender, verificationResult) => +{ + if (!verificationResult.IsVerified) + return; + + var transaction = verificationResult.SafePayload; + Debug.Log($"New transaction: {transaction.ProductId}"); + + // Deliver content to user + // ... + + // Finish the transaction + transaction.Finish(); +}; +``` + +## Best Practices + +### Transaction Verification +Always verify transactions before delivering content: +```csharp +var result = await product.Purchase(); +if (result.Result == PurchaseResult.ResultEnum.Success && result.TransactionVerification.IsVerified) +{ + // Transaction is authentic, deliver content + var transaction = result.TransactionVerification.SafePayload; + DeliverContent(transaction.ProductId); + transaction.Finish(); +} +``` + +### Finishing Transactions +Always finish transactions after processing: +```csharp +transaction.Finish(); +``` +Unfinished transactions will be re-delivered on app launch. + +### Handling Updates +Set up transaction update listeners early in your app lifecycle: +```csharp +void Start() +{ + Transaction.Updates += (sender, result) => + { + if (result.IsVerified) + ProcessTransaction(result.SafePayload); + }; +} +``` + +### Exceptions +If there is any error from StoreKit, it throws `StoreKitException`. + +Wrap StoreKit calls in try-catch blocks: +```csharp +try +{ + var products = await Product.FetchProducts(productIds); +} +catch (StoreKitException ex) +{ + Debug.LogError($"StoreKit error: {ex.Message}"); +} +``` + +## Testing + +### Running in the iOS Simulator +1. Build the plug-in's native libraries **with the simulator slice** — a device-only build won't link in the Simulator: + ```sh + python3 build.py -p Core StoreKit -m macOS iOS iPhoneSimulator + ``` +2. In Unity, open **Project Settings → Player → iOS → Other Settings** and set: + - **Target SDK** = Simulator SDK + - **Simulator Architecture** = ARM64 + - **Target minimum iOS Version** = 15.0 + + (Field locations vary across Unity 2022.3 through 6.x; see Unity's "iOS Player settings" manual page.) +3. **File → Build and Run**. + +### Testing Purchases with a StoreKit Configuration File +Local testing runs purchases against a `.storekit` file instead of the live App Store. + +1. Use the bundled `Demos/Apple.StoreKit.Sample/Sample.storekit`, or create your own: in Xcode, choose **File → New → File → StoreKit Configuration File**, then add your products using the **same product IDs** your app requests. +2. Attach it to your scheme: **Product → Scheme → Edit Scheme… → Run → Options → StoreKit Configuration → [your file]**. +3. Run the app. Without this step, StoreKit calls fail with `StoreKit.StoreKitError Code=2` "Unable to Complete Request" (underlying `SKInternalErrorDomain Code=12`). +4. Use **Debug → StoreKit → Manage Transactions** in Xcode to test refunds, renewals, and revocations (e.g. refunding a transaction fires `Transaction.Updates`). + +Purchases will be processed against the local configuration file rather than the live App Store. + +### Unity Editor Testing +The sample project includes test buttons that allow you to: +- Add mock products to the product list +- Add mock transactions to the transaction history +- Test your UI layout and flow without building to device + +## Sample Project +The plug-in includes a sample scene demonstrating: +- Product list display with the "Refresh Products" button +- Transaction history with the "Reload" button +- Test functionality for development without building to Xcode +- Proper async/await patterns + +To explore the sample: +1. Open `Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scenes/Apple.StoreKit.Sample.Scene.unity` +2. Enter Play mode to test product and transaction UI +3. Use the "Add" buttons to test with mock data in the Unity Editor + +## Additional Resources +- [StoreKit 2 Documentation](https://developer.apple.com/documentation/storekit) +- [In-App Purchase Best Practices](https://developer.apple.com/app-store/in-app-purchase/) +- [Testing In-App Purchases](https://developer.apple.com/documentation/storekit/in-app_purchase/testing_in-app_purchases) diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Editor.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Editor.meta new file mode 100644 index 00000000..b3e80fc9 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cc2953ae96f3041d887308e8b38b4e16 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Editor/AppleStoreKitBuildStep.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Editor/AppleStoreKitBuildStep.cs new file mode 100644 index 00000000..f9c357d5 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Editor/AppleStoreKitBuildStep.cs @@ -0,0 +1,43 @@ +using Apple.Core; +using System; +using UnityEditor; +using UnityEngine; + +#if (UNITY_EDITOR_OSX && (UNITY_IOS || UNITY_TVOS || UNITY_STANDALONE_OSX || UNITY_VISIONOS)) +using UnityEditor.iOS.Xcode; +#endif + +namespace Apple.StoreKit.Editor +{ + public class AppleStoreKitBuildStep : AppleBuildStep + { + public override string DisplayName => "Apple.StoreKit"; + public override BuildTarget[] SupportedTargets => new BuildTarget[] {BuildTarget.iOS, BuildTarget.tvOS, BuildTarget.StandaloneOSX, BuildTarget.VisionOS}; + +#if (UNITY_EDITOR_OSX && (UNITY_IOS || UNITY_TVOS || UNITY_STANDALONE_OSX || UNITY_VISIONOS)) + public override void OnProcessEntitlements(AppleBuildProfile _, BuildTarget buildTarget, string _1, PlistDocument entitlements) + { + // StoreKit doesn't require specific entitlements by default + // Add any required entitlements here if needed + } + + public override void OnProcessInfoPlist(AppleBuildProfile appleBuildProfile, BuildTarget buildTarget, string pathToBuiltTarget, PlistDocument infoPlist) + { + // Add any required Info.plist entries here if needed + } + + public override void OnProcessFrameworks(AppleBuildProfile _, BuildTarget buildTarget, string generatedProjectPath, PBXProject pbxProject) + { + if (Array.IndexOf(SupportedTargets, buildTarget) > -1) + { + AppleNativeLibraryUtility.ProcessWrapperLibrary(DisplayName, buildTarget, generatedProjectPath, pbxProject); + AppleNativeLibraryUtility.AddPlatformFrameworkDependency("StoreKit.framework", false, buildTarget, pbxProject); + } + else + { + Debug.LogWarning($"[{DisplayName}] No native library defined for Unity build target {buildTarget.ToString()}. Skipping."); + } + } +#endif + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Editor/AppleStoreKitBuildStep.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Editor/AppleStoreKitBuildStep.cs.meta new file mode 100644 index 00000000..d064cbea --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Editor/AppleStoreKitBuildStep.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8354fc480ee3b4056941ecfb80dfcb02 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source.meta new file mode 100644 index 00000000..629fa6ca --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8e30f14de791049abaeef6faa44b2083 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AdvancedCommerceProduct.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AdvancedCommerceProduct.cs new file mode 100644 index 00000000..13204e55 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AdvancedCommerceProduct.cs @@ -0,0 +1,90 @@ +using System; +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using AOT; +using Apple.Core; +using Apple.Core.Runtime; + +namespace Apple.StoreKit +{ + [Introduced(iOS: "18.4", macOS: "15.4", tvOS: "18.4", visionOS: "2.4")] + public class AdvancedCommerceProduct : InteropReference + { + internal AdvancedCommerceProduct(IntPtr pointer) : base(pointer) { } + + protected override void OnDispose(bool isDisposing) + { + if (Pointer != IntPtr.Zero) + { + Interop.AdvancedCommerceProduct_Free(Pointer); + Pointer = IntPtr.Zero; + } + } + + public string Id => Interop.AdvancedCommerceProduct_GetId(Pointer); + + [MonoPInvokeCallback(typeof(SuccessTaskCallback))] + private static void OnLoadSuccess(long taskId, IntPtr ptr) + { + InteropTasks.TrySetResultAndRemove(taskId, ptr != IntPtr.Zero ? new AdvancedCommerceProduct(ptr) : null); + } + + [MonoPInvokeCallback(typeof(NSErrorTaskCallback))] + private static void OnLoadError(long taskId, IntPtr errorPointer) + { + InteropTasks.TrySetExceptionAndRemove(taskId, new StoreKitException(errorPointer)); + } + + [Unavailable(RuntimeOperatingSystem.macOS)] + public static Task Load(string productId) + { + var tcs = InteropTasks.Create(out var taskId); + Interop.AdvancedCommerceProduct_Load(productId, taskId, OnLoadSuccess, OnLoadError); + return tcs.Task; + } + + [MonoPInvokeCallback(typeof(SuccessTaskCallback))] + private static void OnPurchaseSuccess(long taskId, IntPtr ptr) + { + InteropTasks.TrySetResultAndRemove(taskId, ptr != IntPtr.Zero ? new PurchaseResult(ptr) : PurchaseResult.UserCancelled); + } + + [MonoPInvokeCallback(typeof(NSErrorTaskCallback))] + private static void OnPurchaseError(long taskId, IntPtr errorPointer) + { + InteropTasks.TrySetExceptionAndRemove(taskId, new StoreKitException(errorPointer)); + } + + [Unavailable(RuntimeOperatingSystem.macOS)] + public Task Purchase(string compactJWS) + { + var tcs = InteropTasks.Create(out var taskId); + Interop.AdvancedCommerceProduct_Purchase(Pointer, compactJWS, taskId, OnPurchaseSuccess, OnPurchaseError); + return tcs.Task; + } + + private static class Interop + { + [DllImport(InteropUtility.DLLName)] + public static extern void AdvancedCommerceProduct_Free(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string AdvancedCommerceProduct_GetId(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern void AdvancedCommerceProduct_Load( + string productId, + long taskId, + SuccessTaskCallback onSuccess, + NSErrorTaskCallback onError); + + [DllImport(InteropUtility.DLLName)] + public static extern void AdvancedCommerceProduct_Purchase( + IntPtr pointer, + string compactJWS, + long taskId, + SuccessTaskCallback onSuccess, + NSErrorTaskCallback onError); + } + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AdvancedCommerceProduct.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AdvancedCommerceProduct.cs.meta new file mode 100644 index 00000000..38b7ee28 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AdvancedCommerceProduct.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 73078d8ded7d34a4d944a9bc49249e3c \ No newline at end of file diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AppStore.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AppStore.cs new file mode 100644 index 00000000..2f4f93ef --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AppStore.cs @@ -0,0 +1,246 @@ +using System; +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using AOT; +using Apple.Core; +using Apple.Core.Runtime; + +namespace Apple.StoreKit +{ + public static class AppStore + { + #region Static Methods + [MonoPInvokeCallback(typeof(SuccessTaskCallback))] + private static void OnPresentOfferCodeRedeemSheetSuccess(long taskId) + { + InteropTasks.TrySetResultAndRemove(taskId, true); + } + + [MonoPInvokeCallback(typeof(NSErrorTaskCallback))] + private static void OnPresentOfferCodeRedeemSheetError(long taskId, IntPtr errorPointer) + { + InteropTasks.TrySetExceptionAndRemove(taskId, new StoreKitException(errorPointer)); + } + + /// + /// Presents a sheet for the user to redeem offer codes. + /// + /// Task that completes when the sheet is dismissed + [Introduced(iOS: "16.0", macOS: "15.0", visionOS: "2.2")] + [Unavailable(RuntimeOperatingSystem.tvOS)] + public static Task PresentOfferCodeRedeemSheet() + { +#if UNITY_EDITOR + return Task.FromException(new System.NotSupportedException("PresentOfferCodeRedeemSheet is not supported in the Unity Editor.")); +#else + var tcs = InteropTasks.Create(out var taskId); + Interop.AppStore_PresentOfferCodeRedeemSheet(taskId, OnPresentOfferCodeRedeemSheetSuccess, OnPresentOfferCodeRedeemSheetError); + return tcs.Task; +#endif + } + + [MonoPInvokeCallback(typeof(SuccessTaskCallback))] + private static void OnShowManageSubscriptionsSuccess(long taskId) + { + InteropTasks.TrySetResultAndRemove(taskId, true); + } + + [MonoPInvokeCallback(typeof(NSErrorTaskCallback))] + private static void OnShowManageSubscriptionsError(long taskId, IntPtr errorPointer) + { + InteropTasks.TrySetExceptionAndRemove(taskId, new StoreKitException(errorPointer)); + } + + /// + /// Presents the manage subscriptions page in the App Store. + /// + /// + [Introduced(iOS: "17.0", visionOS: "2.2")] + [Unavailable(RuntimeOperatingSystem.tvOS, RuntimeOperatingSystem.macOS)] + public static Task ShowManageSubscriptions() + { +#if UNITY_EDITOR + return Task.FromException(new System.NotSupportedException("ShowManageSubscriptions is not supported in the Unity Editor.")); +#else + var tcs = InteropTasks.Create(out var taskId); + Interop.AppStore_ShowManageSubscriptions(taskId, OnShowManageSubscriptionsSuccess, OnShowManageSubscriptionsError); + return tcs.Task; +#endif + } + + [MonoPInvokeCallback(typeof(SuccessTaskCallback))] + private static void OnShowManageSubscriptionsForGroupSuccess(long taskId) + { + InteropTasks.TrySetResultAndRemove(taskId, true); + } + + [MonoPInvokeCallback(typeof(NSErrorTaskCallback))] + private static void OnShowManageSubscriptionsForGroupError(long taskId, IntPtr errorPointer) + { + InteropTasks.TrySetExceptionAndRemove(taskId, new StoreKitException(errorPointer)); + } + + /// + /// Presents the manage subscriptions page for a specific subscription group. + /// + [Introduced(iOS: "17.0", visionOS: "2.2")] + [Unavailable(RuntimeOperatingSystem.tvOS, RuntimeOperatingSystem.macOS)] + public static Task ShowManageSubscriptions(string subscriptionGroupId) + { +#if UNITY_EDITOR + return Task.FromException(new System.NotSupportedException("ShowManageSubscriptions is not supported in the Unity Editor.")); +#else + var tcs = InteropTasks.Create(out var taskId); + Interop.AppStore_ShowManageSubscriptionsForGroup(subscriptionGroupId, taskId, OnShowManageSubscriptionsForGroupSuccess, OnShowManageSubscriptionsForGroupError); + return tcs.Task; +#endif + } + + [MonoPInvokeCallback(typeof(SuccessTaskCallback))] + private static void OnSyncSuccess(long taskId) + { + InteropTasks.TrySetResultAndRemove(taskId, true); + } + + [MonoPInvokeCallback(typeof(NSErrorTaskCallback))] + private static void OnSyncError(long taskId, IntPtr errorPointer) + { + InteropTasks.TrySetExceptionAndRemove(taskId, new StoreKitException(errorPointer)); + } + + /// + /// Initiates a sync with the App Store to restore missing transactions. + /// + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public static Task Sync() + { +#if UNITY_EDITOR + return Task.FromException(new System.NotSupportedException("AppStore.Sync is not supported in the Unity Editor.")); +#else + var tcs = InteropTasks.Create(out var taskId); + Interop.AppStore_Sync(taskId, OnSyncSuccess, OnSyncError); + return tcs.Task; +#endif + } + + /// + /// Asks StoreKit to request an App Store review. + /// Not available on tvOS. + /// + [Introduced(iOS: "16.0", macOS: "13.0", visionOS: "2.2")] + [Unavailable(RuntimeOperatingSystem.tvOS)] + public static void RequestReview() + { +#if !UNITY_EDITOR + Interop.AppStore_RequestReview(); +#endif + } + + /// + /// Indicates whether the user is allowed to make payments. + /// + /// True if the user can make payments, otherwises false + [Introduced(iOS: "16.0", macOS: "15.0", tvOS: "15.0", visionOS: "2.2")] + public static bool CanMakePayments + { + get + { +#if UNITY_EDITOR + return false; +#else + return Interop.AppStore_CanMakePayments(); +#endif + } + } + + /// + /// A UUID that uniquely identifies this device for StoreKit verification purposes. + /// + [Introduced(iOS: "16.4", macOS: "13.3", tvOS: "16.4", visionOS: "1.0")] + public static string DeviceVerificationID + { + get + { +#if UNITY_EDITOR + return null; +#else + return Interop.AppStore_GetDeviceVerificationID(); +#endif + } + } + + [MonoPInvokeCallback(typeof(SuccessTaskCallback))] + private static void OnGetAgeRatingCodeSuccess(long taskId, int code) + { + InteropTasks.TrySetResultAndRemove(taskId, code); + } + + [MonoPInvokeCallback(typeof(NSErrorTaskCallback))] + private static void OnGetAgeRatingCodeError(long taskId, IntPtr errorPointer) + { + InteropTasks.TrySetExceptionAndRemove(taskId, new StoreKitException(errorPointer)); + } + + /// + /// Fetches the app's age rating code. Returns -1 when nil/unavailable. iOS 26.2+. + /// + [Introduced(iOS: "26.2", macOS: "26.2", tvOS: "26.2", visionOS: "26.2")] + public static Task GetAgeRatingCode() + { +#if UNITY_EDITOR + return Task.FromResult(-1); +#else + var tcs = InteropTasks.Create(out var taskId); + Interop.AppStore_GetAgeRatingCode(taskId, OnGetAgeRatingCodeSuccess, OnGetAgeRatingCodeError); + return tcs.Task; +#endif + } + #endregion + + #region Interop + private static class Interop + { + [DllImport(InteropUtility.DLLName)] + public static extern void AppStore_PresentOfferCodeRedeemSheet( + long taskId, + SuccessTaskCallback onSuccess, + NSErrorTaskCallback onError); + + [DllImport(InteropUtility.DLLName)] + public static extern void AppStore_GetAgeRatingCode( + long taskId, + SuccessTaskCallback onSuccess, + NSErrorTaskCallback onError); + + [DllImport(InteropUtility.DLLName)] + public static extern void AppStore_ShowManageSubscriptions( + long taskId, + SuccessTaskCallback onSuccess, + NSErrorTaskCallback onError); + + [DllImport(InteropUtility.DLLName)] + public static extern void AppStore_ShowManageSubscriptionsForGroup( + string subscriptionGroupId, + long taskId, + SuccessTaskCallback onSuccess, + NSErrorTaskCallback onError); + + [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] + public static extern bool AppStore_CanMakePayments(); + + [DllImport(InteropUtility.DLLName)] + public static extern string AppStore_GetDeviceVerificationID(); + + [DllImport(InteropUtility.DLLName)] + public static extern void AppStore_Sync( + long taskId, + SuccessTaskCallback onSuccess, + NSErrorTaskCallback onError); + + [DllImport(InteropUtility.DLLName)] + public static extern void AppStore_RequestReview(); + } + #endregion + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AppStore.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AppStore.cs.meta new file mode 100644 index 00000000..c97f9e0d --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AppStore.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 699d89d6d753c4509a6224fe6d6cf6a0 \ No newline at end of file diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AppTransaction.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AppTransaction.cs new file mode 100644 index 00000000..7ae5ed16 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AppTransaction.cs @@ -0,0 +1,258 @@ +using System; +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using AOT; +using Apple.Core; +using Apple.Core.Runtime; + +namespace Apple.StoreKit +{ + /// + /// Information about the app's transaction, proving it was legitimately purchased/downloaded from the App Store. + /// Available on iOS 16.0+, macOS 13.0+, tvOS 16.0+ + /// + [Introduced(iOS: "16.0", macOS: "13.0", tvOS: "16.0", visionOS: "2.2")] + public class AppTransaction : NSObject + { + internal AppTransaction(IntPtr pointer) : base(pointer) { } + + #region Properties + /// + /// The version of the app that the user originally purchased. + /// + public string OriginalAppVersion => Interop.AppTransaction_GetOriginalAppVersion(Pointer); + + /// + /// The date when the user first downloaded the app. + /// + public DateTime OriginalPurchaseDate => DateTimeOffset.FromUnixTimeSeconds(Interop.AppTransaction_GetOriginalPurchaseDate(Pointer)).DateTime; + + /// + /// The date the App Store signed the app transaction. + /// + public DateTime SignedDate => DateTimeOffset.FromUnixTimeSeconds(Interop.AppTransaction_GetSignedDate(Pointer)).DateTime; + + /// + /// The current version of the app. + /// + public string AppVersion => Interop.AppTransaction_GetAppVersion(Pointer); + + /// + /// The number that the App Store uses to uniquely identify the version of the app. + /// Returns null in sandbox and Xcode environments. + /// + public ulong? AppVersionId + { + get + { + ulong value = Interop.AppTransaction_GetAppVersionId(Pointer); + return value > 0 ? value : null; + } + } + + /// + /// The date when the user preordered the app. Returns null if the app wasn't preordered. + /// Available on iOS 17.4+, macOS 14.4+, tvOS 17.4+ + /// + [Introduced(iOS: "17.4", macOS: "14.4", tvOS: "17.4", visionOS: "2.2")] + public DateTime? PreorderDate + { + get + { + long timestamp = Interop.AppTransaction_GetPreorderDate(Pointer); + return timestamp > 0 ? DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime : null; + } + } + + /// + /// The app's bundle identifier. + /// + public string BundleId => Interop.AppTransaction_GetBundleId(Pointer); + + /// + /// The unique identifier the App Store uses to identify the app (Apple ID in App Store Connect). + /// Returns null in sandbox and Xcode environments. + /// + public ulong? AppId + { + get + { + ulong value = Interop.AppTransaction_GetAppId(Pointer); + return value > 0 ? value : null; + } + } + + /// + /// The server environment where the app transaction was processed. + /// + public StoreEnvironment Environment => (StoreEnvironment)Interop.AppTransaction_GetEnvironment(Pointer); + + /// + /// The JSON representation of the app transaction (signed JWS). + /// + public NSData JsonRepresentation + { + get + { + var data = Interop.AppTransaction_GetJsonRepresentation(Pointer); + return new NSData(data.Pointer); + } + } + + /// + /// Device verification data that proves the app transaction came from a specific device. + /// Available on iOS 16.4+, macOS 13.3+, tvOS 16.4+ + /// + [Introduced(iOS: "16.4", macOS: "13.3", tvOS: "16.4", visionOS: "2.2")] + public NSData DeviceVerification + { + get + { + var data = Interop.AppTransaction_GetDeviceVerification(Pointer); + return new NSData(data.Pointer); + } + } + + /// + /// A unique identifier for the app download transaction. + /// Available on iOS 16.0+, macOS 13.0+, tvOS 16.0+ + /// + public string AppTransactionID => Interop.AppTransaction_GetAppTransactionID(Pointer); + + /// + /// The platform on which the user originally purchased the app. + /// Available on iOS 18.4+, macOS 15.4+, tvOS 18.4+, visionOS 2.4+ + /// + [Introduced(iOS: "18.4", macOS: "15.4", tvOS: "18.4", visionOS: "2.4")] + public AppStorePlatform OriginalPlatform => (AppStorePlatform)Interop.AppTransaction_GetOriginalPlatform(Pointer); + + /// + /// A nonce used to verify the integrity of the device's information. + /// Available on iOS 16.4+, macOS 13.3+, tvOS 16.4+ + /// + [Introduced(iOS: "16.4", macOS: "13.3", tvOS: "16.4", visionOS: "2.2")] + public string DeviceVerificationNonce => Interop.AppTransaction_GetDeviceVerificationNonce(Pointer); + #endregion + + #region Disposal + protected override void OnDispose(bool isDisposing) + { + if (Pointer != IntPtr.Zero) + { + Interop.AppTransaction_Free(Pointer); + Pointer = IntPtr.Zero; + } + } + #endregion + + #region Static Methods + [MonoPInvokeCallback(typeof(SuccessTaskCallback))] + private static void OnGetSharedSuccess(long taskId, IntPtr ptr) + { + InteropTasks.TrySetResultAndRemove(taskId, new VerificationResult(ptr)); + } + + [MonoPInvokeCallback(typeof(NSErrorTaskCallback))] + private static void OnGetSharedError(long taskId, IntPtr errorPointer) + { + InteropTasks.TrySetExceptionAndRemove>(taskId, new StoreKitException(errorPointer)); + } + + /// + /// Gets the current app transaction, proving the app was legitimately purchased/downloaded. + /// Returns a VerificationResult that can be checked for verification status and contains JWS properties. + /// + public static Task> GetShared() + { + var tcs = InteropTasks.Create>(out var taskId); + Interop.AppTransaction_GetShared(taskId, OnGetSharedSuccess, OnGetSharedError); + return tcs.Task; + } + + [MonoPInvokeCallback(typeof(SuccessTaskCallback))] + private static void OnRefreshSuccess(long taskId, IntPtr verificationResultPointer) + { + InteropTasks.TrySetResultAndRemove(taskId, new VerificationResult(verificationResultPointer)); + } + + [MonoPInvokeCallback(typeof(NSErrorTaskCallback))] + private static void OnRefreshError(long taskId, IntPtr errorPointer) + { + InteropTasks.TrySetExceptionAndRemove>(taskId, new StoreKitException(errorPointer)); + } + + /// + /// Refreshes the app transaction to get the latest information. + /// Returns a VerificationResult that can be checked for verification status and contains JWS properties. + /// + public static Task> Refresh() + { + var tcs = InteropTasks.Create>(out var taskId); + Interop.AppTransaction_Refresh(taskId, OnRefreshSuccess, OnRefreshError); + return tcs.Task; + } + #endregion + + #region Interop + private static class Interop + { + [DllImport(InteropUtility.DLLName)] + public static extern void AppTransaction_Free(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string AppTransaction_GetOriginalAppVersion(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern long AppTransaction_GetOriginalPurchaseDate(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern long AppTransaction_GetSignedDate(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string AppTransaction_GetAppVersion(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern ulong AppTransaction_GetAppVersionId(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern long AppTransaction_GetPreorderDate(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string AppTransaction_GetBundleId(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern ulong AppTransaction_GetAppId(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int AppTransaction_GetEnvironment(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern NSData AppTransaction_GetJsonRepresentation(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern NSData AppTransaction_GetDeviceVerification(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string AppTransaction_GetDeviceVerificationNonce(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string AppTransaction_GetAppTransactionID(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int AppTransaction_GetOriginalPlatform(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern void AppTransaction_GetShared( + long taskId, + SuccessTaskCallback onSuccess, + NSErrorTaskCallback onError); + + [DllImport(InteropUtility.DLLName)] + public static extern void AppTransaction_Refresh( + long taskId, + SuccessTaskCallback onSuccess, + NSErrorTaskCallback onError); + } + #endregion + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AppTransaction.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AppTransaction.cs.meta new file mode 100644 index 00000000..4adb2777 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AppTransaction.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6a58fabfa2b2541ad9b5ee787decbadd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Apple.StoreKit.asmdef b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Apple.StoreKit.asmdef new file mode 100644 index 00000000..fb1fa9f5 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Apple.StoreKit.asmdef @@ -0,0 +1,22 @@ +{ + "name": "Apple.StoreKit", + "rootNamespace": "Apple.StoreKit", + "references": [ + "Apple.Core" + ], + "includePlatforms": [ + "Editor", + "iOS", + "macOSStandalone", + "tvOS", + "VisionOS" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Apple.StoreKit.asmdef.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Apple.StoreKit.asmdef.meta new file mode 100644 index 00000000..eb645737 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Apple.StoreKit.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a7a2bdd73a59b4bb6848ba71366d65d2 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/InteropUtility.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/InteropUtility.cs new file mode 100644 index 00000000..f9ce74e5 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/InteropUtility.cs @@ -0,0 +1,16 @@ +using UnityEngine.Scripting; + +[assembly: Preserve] + +namespace Apple.StoreKit +{ + + internal static class InteropUtility + { +#if (UNITY_IOS || UNITY_TVOS || UNITY_VISIONOS) && !UNITY_EDITOR + public const string DLLName = "__Internal"; +#else + public const string DLLName = "StoreKitWrapper"; +#endif + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/InteropUtility.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/InteropUtility.cs.meta new file mode 100644 index 00000000..c742c095 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/InteropUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f43a5c3571848427d882f20711424c9c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Message.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Message.cs new file mode 100644 index 00000000..635e34c8 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Message.cs @@ -0,0 +1,159 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using AOT; +using Apple.Core; +using Apple.Core.Runtime; +using UnityEngine; + +namespace Apple.StoreKit +{ + /// + /// Message reason enumeration matching StoreKit 2 Message.Reason + /// + [Introduced(iOS: "16.0", visionOS: "2.2")] + [Unavailable(RuntimeOperatingSystem.macOS, RuntimeOperatingSystem.tvOS)] + public enum MessageReason + { + Generic = 0, + + [Introduced(iOS: "16.4", visionOS: "2.2")] + BillingIssue = 1, + + PriceIncreaseConsent = 2, + + [Introduced(iOS: "18.0", visionOS: "2.2")] + WinBackOffer = 3, + + Unknown = -1 + } + + /// + /// In-app messages from the App Store. + /// Available on iOS 16.0+, visionOS 2.2+ + /// + [Introduced(iOS: "16.0", visionOS: "2.2")] + [Unavailable(RuntimeOperatingSystem.macOS, RuntimeOperatingSystem.tvOS)] + public class Message : InteropReference + { + internal Message(IntPtr pointer) : base(pointer) { } + + #region Properties + /// + /// The reason for the message. + /// + public MessageReason Reason => (MessageReason)Interop.Message_Reason(Pointer); + + private static EventHandler _updatesEventHandler; + private static long _currentTaskId; + public static event EventHandler MessageReceived + { + add + { + if (_updatesEventHandler == null) + { + StartMessageUpdates(); + } + _updatesEventHandler += value; + } + remove + { + _updatesEventHandler -= value; + if (_updatesEventHandler == null) + { + Debug.Log("Message: No more update handlers, stopping updates is not currently supported."); + if (!InteropTasks.TrySetResultAndRemove(_currentTaskId, IntPtr.Zero)) + { + Debug.LogWarning("Message: Failed to stop message updates task."); + } + } + } + } + + private static void StartMessageUpdates() + { + Debug.Log("Message: Starting message updates"); + InteropTasks.Create(out _currentTaskId); + Interop.Message_Updates(_currentTaskId, OnMessageUpdate); + } + + [MonoPInvokeCallback(typeof(SuccessTaskBoolReturningCallback))] + [return:MarshalAs(UnmanagedType.I1)] + private static bool OnMessageUpdate(long taskId, IntPtr ptr) + { + if (!InteropTasks.TryGet(taskId, out var task) + || task.Task.IsCompleted) + { + Debug.Log("Message: Received update for completed task, ignoring"); + return false; + } + + Debug.Log("Update received for message"); + var message = new Message(ptr); + _updatesEventHandler?.Invoke(null, message); + return true; + } + #endregion + + #region Disposal + protected override void OnDispose(bool isDisposing) + { + if (Pointer != IntPtr.Zero) + { + Interop.Message_Free(Pointer); + Pointer = IntPtr.Zero; + } + } + #endregion + + #region Methods + [MonoPInvokeCallback(typeof(SuccessTaskCallback))] + private static void OnDisplaySuccess(long taskId) + { + InteropTasks.TrySetResultAndRemove(taskId, true); + } + + [MonoPInvokeCallback(typeof(NSErrorTaskCallback))] + private static void OnDisplayError(long taskId, IntPtr errorPointer) + { + InteropTasks.TrySetExceptionAndRemove(taskId, new StoreKitException(errorPointer)); + } + + /// + /// Displays the message in the current window scene. + /// + /// Task that completes when the message is displayed + public Task Display() + { + var tcs = InteropTasks.Create(out var taskId); + Interop.Message_Display(Pointer, taskId, OnDisplaySuccess, OnDisplayError); + return tcs.Task; + } + #endregion + + #region Interop + private static class Interop + { + [DllImport(InteropUtility.DLLName)] + public static extern void Message_Free(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int Message_Reason(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern void Message_Display( + IntPtr pointer, + long taskId, + SuccessTaskCallback onSuccess, + NSErrorTaskCallback onError); + + [DllImport(InteropUtility.DLLName)] + public static extern void Message_Updates( + long taskId, + SuccessTaskBoolReturningCallback onUpdate + ); + } + #endregion + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Message.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Message.cs.meta new file mode 100644 index 00000000..835b179a --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Message.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 18bfe03880f2740aabdb0e8a8c58e496 \ No newline at end of file diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/PaymentMethodBinding.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/PaymentMethodBinding.cs new file mode 100644 index 00000000..40b43bb0 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/PaymentMethodBinding.cs @@ -0,0 +1,51 @@ +using System; +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using AOT; +using Apple.Core; +using Apple.Core.Runtime; + +namespace Apple.StoreKit +{ + /// + /// Binds a payment method via an in-app pinning id (PaymentMethodBinding). iOS only. + /// + [Introduced(iOS: "16.4")] + [Unavailable(RuntimeOperatingSystem.macOS, RuntimeOperatingSystem.tvOS, RuntimeOperatingSystem.visionOS)] + public static class PaymentMethodBinding + { + [MonoPInvokeCallback(typeof(SuccessTaskCallback))] + private static void OnBindSuccess(long taskId) + => InteropTasks.TrySetResultAndRemove(taskId, true); + + [MonoPInvokeCallback(typeof(NSErrorTaskCallback))] + private static void OnBindError(long taskId, IntPtr errorPointer) + => InteropTasks.TrySetExceptionAndRemove(taskId, new StoreKitException(errorPointer)); + + /// Creates a PaymentMethodBinding for the given in-app pinning id and binds it. + public static Task Bind(string inAppPinningId) + { +#if UNITY_EDITOR + return Task.FromException(new NotSupportedException("PaymentMethodBinding is not supported in the Unity Editor.")); +#elif UNITY_IOS + var tcs = InteropTasks.Create(out var taskId); + Interop.PaymentMethodBinding_Bind(inAppPinningId, taskId, OnBindSuccess, OnBindError); + return tcs.Task; +#else + return Task.FromException(new NotSupportedException("PaymentMethodBinding is available on iOS only.")); +#endif + } + + private static class Interop + { +#if UNITY_IOS && !UNITY_EDITOR + [DllImport(InteropUtility.DLLName)] + public static extern void PaymentMethodBinding_Bind( + string inAppPinningId, + long taskId, + SuccessTaskCallback onSuccess, + NSErrorTaskCallback onError); +#endif + } + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/PaymentMethodBinding.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/PaymentMethodBinding.cs.meta new file mode 100644 index 00000000..bd65c015 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/PaymentMethodBinding.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e0ce590d44cc41a48207ba68cbe4c2d0 diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Product.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Product.cs new file mode 100644 index 00000000..5f722085 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Product.cs @@ -0,0 +1,801 @@ +using System; +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using AOT; +using Apple.Core; +using Apple.Core.Runtime; +using UnityEngine; + +namespace Apple.StoreKit +{ + /// + /// Product type class matching StoreKit 2 Product.ProductType + /// + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public class ProductType : InteropReference + { + internal ProductType(IntPtr pointer) : base(pointer) { } + + protected override void OnDispose(bool isDisposing) + { + if (Pointer != IntPtr.Zero) + { + Interop.ProductType_Free(Pointer); + Pointer = IntPtr.Zero; + } + } + + public enum ProductTypeEnum + { + Consumable = 0, + NonConsumable = 1, + AutoRenewable = 2, + NonRenewable = 3 + } + + /// + /// The raw product type value + /// + public ProductTypeEnum Type => (ProductTypeEnum)Interop.ProductType_GetRawValue(Pointer); + + /// + /// The localized description of the product type + /// + [Introduced(iOS: "15.4", macOS: "12.3", tvOS: "15.4", visionOS: "2.2")] + public string LocalizedDescription => Interop.ProductType_GetLocalizedDescription(Pointer); + + private static class Interop + { + [DllImport(InteropUtility.DLLName)] + public static extern void ProductType_Free(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int ProductType_GetRawValue(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string ProductType_GetLocalizedDescription(IntPtr pointer); + } + } + + /// + /// Subscription period unit matching StoreKit 2 Product.SubscriptionPeriod.Unit + /// + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public enum SubscriptionPeriodUnit + { + Day = 0, + Week = 1, + Month = 2, + Year = 3 + } + + /// + /// Purchase result enumeration matching StoreKit 2 Product.PurchaseResult + /// + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public class PurchaseResult : InteropReference + { + internal static readonly PurchaseResult UserCancelled = new PurchaseResult(IntPtr.Zero); + internal static readonly PurchaseResult Pending = new PurchaseResult(IntPtr.Zero); + internal PurchaseResult(IntPtr pointer) : base(pointer) { } + + protected override void OnDispose(bool isDisposing) + { + // Don't free the static sentinel values + if (!ReferenceEquals(this, UserCancelled) && !ReferenceEquals(this, Pending) && Pointer != IntPtr.Zero) + { + Interop.PurchaseResult_Free(Pointer); + Pointer = IntPtr.Zero; + } + } + + public enum ResultEnum + { + Success, + UserCancelled, + Pending + } + + public ResultEnum Result + { + get + { + if (ReferenceEquals(this, UserCancelled)) + return ResultEnum.UserCancelled; + if (ReferenceEquals(this, Pending)) + return ResultEnum.Pending; + + // For actual PurchaseResult pointers, check the native type + if (Pointer != IntPtr.Zero) + { + int resultType = Interop.PurchaseResult_GetResultType(Pointer); + return resultType switch + { + 0 => ResultEnum.Success, + 1 => ResultEnum.UserCancelled, + 2 => ResultEnum.Pending, + _ => ResultEnum.Success + }; + } + + return ResultEnum.Success; + } + } + + public VerificationResult TransactionVerification + { + get + { + if (Result != ResultEnum.Success) + throw new InvalidOperationException("Transaction verification is only available for successful purchases."); + + IntPtr verificationPointer = Interop.PurchaseResult_GetVerificationResult(Pointer); + if (verificationPointer == IntPtr.Zero) + throw new InvalidOperationException("Failed to get verification result from purchase result."); + + return new VerificationResult(verificationPointer); + } + } + + private static class Interop + { + [DllImport(InteropUtility.DLLName)] + public static extern void PurchaseResult_Free(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int PurchaseResult_GetResultType(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr PurchaseResult_GetVerificationResult(IntPtr pointer); + } + } + + + /// + /// Purchase option for product purchases + /// + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public class PurchaseOption : InteropReference + { + internal PurchaseOption(IntPtr pointer) : base(pointer) { } + + protected override void OnDispose(bool isDisposing) + { + if (Pointer != IntPtr.Zero) + { + Interop.PurchaseOption_Free(Pointer); + Pointer = IntPtr.Zero; + } + } + + /// + /// Create a purchase option with an app account token + /// + /// UUID string for the app account token + /// Purchase option or null if invalid UUID + public static PurchaseOption AppAccountToken(string uuid) + { + IntPtr pointer = Interop.PurchaseOption_AppAccountToken(uuid); + return pointer != IntPtr.Zero ? new PurchaseOption(pointer) : null; + } + + /// + /// Create a purchase option with quantity + /// + /// Number of consumable items to purchase + /// Purchase option + public static PurchaseOption Quantity(int quantity) + { + IntPtr pointer = Interop.PurchaseOption_Quantity(quantity); + return new PurchaseOption(pointer); + } + + /// Billing plan type purchase option (iOS 26.4+). + [Introduced(iOS: "26.4", macOS: "26.4", tvOS: "26.4", visionOS: "26.4")] + public static PurchaseOption BillingPlanType(string rawValue) + { + IntPtr pointer = Interop.PurchaseOption_BillingPlanType(rawValue); + return new PurchaseOption(pointer); + } + + public static PurchaseOption SimulatesAskToBuyInSandbox(bool value) + { + IntPtr pointer = Interop.PurchaseOption_SimulatesAskToBuyInSandbox(value); + return new PurchaseOption(pointer); + } + + /// + /// Returns a pair of purchase options encoding the promotional offer ID and its compact JWS signature. + /// Both options must be passed together when purchasing. + /// + public static PurchaseOption[] PromotionalOffer(string offerID, string compactJWS) + { + return new[] + { + CustomString("adHocOfferId", offerID), + CustomString("adHocSignature", System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(compactJWS))) + }; + } + + [Introduced(iOS: "18.0", macOS: "15.0", tvOS: "18.0", visionOS: "2.0")] + public static PurchaseOption WinBackOffer(SubscriptionOffer offer) + { + IntPtr pointer = Interop.PurchaseOption_WinBackOffer(offer.Pointer); + return new PurchaseOption(pointer); + } + + public static PurchaseOption IntroductoryOfferEligibility(string compactJWS) + { + return CustomString("introOfferEligibilityParam", compactJWS); + } + + public static PurchaseOption CustomString(string key, string value) + { + IntPtr pointer = Interop.PurchaseOption_CustomString(key, value); + return new PurchaseOption(pointer); + } + + public static PurchaseOption CustomDouble(string key, double value) + { + IntPtr pointer = Interop.PurchaseOption_CustomDouble(key, value); + return new PurchaseOption(pointer); + } + + public static PurchaseOption CustomBool(string key, bool value) + { + IntPtr pointer = Interop.PurchaseOption_CustomBool(key, value); + return new PurchaseOption(pointer); + } + + private static class Interop + { + [DllImport(InteropUtility.DLLName)] + public static extern void PurchaseOption_Free(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr PurchaseOption_AppAccountToken(string uuidString); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr PurchaseOption_Quantity(int quantity); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr PurchaseOption_BillingPlanType(string rawValue); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr PurchaseOption_SimulatesAskToBuyInSandbox([MarshalAs(UnmanagedType.I1)] bool value); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr PurchaseOption_WinBackOffer(IntPtr offerPointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr PurchaseOption_CustomString(string key, string value); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr PurchaseOption_CustomDouble(string key, double value); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr PurchaseOption_CustomBool(string key, [MarshalAs(UnmanagedType.I1)] bool value); + } + } + + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public enum SubscriptionOfferPaymentMode + { + FreeTrial = 0, + PayAsYouGo = 1, + PayUpFront = 2 + } + + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public class SubscriptionOffer : InteropReference + { + internal SubscriptionOffer(IntPtr pointer) : base(pointer) { } + + protected override void OnDispose(bool isDisposing) + { + if (Pointer != IntPtr.Zero) + { + Interop.SubscriptionOffer_Free(Pointer); + Pointer = IntPtr.Zero; + } + } + + public string Id => Interop.SubscriptionOffer_GetId(Pointer); + + public string DisplayPrice => Interop.SubscriptionOffer_GetDisplayPrice(Pointer); + public SubscriptionPeriodUnit PeriodUnit => (SubscriptionPeriodUnit)Interop.SubscriptionOffer_GetPeriodUnit(Pointer); + public int PeriodValue => Interop.SubscriptionOffer_GetPeriodValue(Pointer); + public int PeriodCount => Interop.SubscriptionOffer_GetPeriodCount(Pointer); + public SubscriptionOfferPaymentMode PaymentMode => (SubscriptionOfferPaymentMode)Interop.SubscriptionOffer_GetPaymentMode(Pointer); + + private static class Interop + { + [DllImport(InteropUtility.DLLName)] + public static extern void SubscriptionOffer_Free(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string SubscriptionOffer_GetId(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string SubscriptionOffer_GetDisplayPrice(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int SubscriptionOffer_GetPeriodUnit(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int SubscriptionOffer_GetPeriodValue(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int SubscriptionOffer_GetPeriodCount(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int SubscriptionOffer_GetPaymentMode(IntPtr pointer); + } + } + + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public class SubscriptionInfo : InteropReference + { + internal SubscriptionInfo(IntPtr pointer) : base(pointer) { } + + protected override void OnDispose(bool isDisposing) + { + if (Pointer != IntPtr.Zero) + { + Interop.SubscriptionInfo_Free(Pointer); + Pointer = IntPtr.Zero; + } + } + + public string SubscriptionGroupId => Interop.SubscriptionInfo_GetSubscriptionGroupId(Pointer); + + [MonoPInvokeCallback(typeof(SuccessTaskCallback))] + private static void OnIsEligibleForIntroOfferSuccess(long taskId, bool result) + { + InteropTasks.TrySetResultAndRemove(taskId, result); + } + + [MonoPInvokeCallback(typeof(NSErrorTaskCallback))] + private static void OnIsEligibleForIntroOfferError(long taskId, IntPtr errorPointer) + { + InteropTasks.TrySetExceptionAndRemove(taskId, new StoreKitException(errorPointer)); + } + + public Task IsEligibleForIntroOffer() + { +#if UNITY_EDITOR + return Task.FromResult(false); +#else + var tcs = InteropTasks.Create(out var taskId); + Interop.SubscriptionInfo_GetIsEligibleForIntroOffer(Pointer, taskId, OnIsEligibleForIntroOfferSuccess, OnIsEligibleForIntroOfferError); + return tcs.Task; +#endif + } + + public SubscriptionPeriodUnit PeriodUnit => (SubscriptionPeriodUnit)Interop.SubscriptionInfo_GetPeriodUnit(Pointer); + public int PeriodValue => Interop.SubscriptionInfo_GetPeriodValue(Pointer); + + public SubscriptionOffer IntroductoryOffer + { + get + { + IntPtr ptr = Interop.SubscriptionInfo_GetIntroductoryOffer(Pointer); + return ptr != IntPtr.Zero ? new SubscriptionOffer(ptr) : null; + } + } + + [Introduced(iOS: "18.0", macOS: "15.0", tvOS: "18.0", visionOS: "2.4")] + public SubscriptionOffer[] WinBackOffers + { + get + { + int count = Interop.SubscriptionInfo_GetWinBackOffersCount(Pointer); + if (count <= 0) return Array.Empty(); + var offers = new SubscriptionOffer[count]; + for (int i = 0; i < count; i++) + { + IntPtr ptr = Interop.SubscriptionInfo_GetWinBackOfferAt(Pointer, i); + offers[i] = ptr != IntPtr.Zero ? new SubscriptionOffer(ptr) : null; + } + return offers; + } + } + + [MonoPInvokeCallback(typeof(SuccessTaskArrayCallback))] + private static void OnGetStatusSuccess(long taskId, IntPtr ptr, int count) + { + var statuses = new SubscriptionStatus[count]; + for (int i = 0; i < count; i++) + { + var itemPtr = Marshal.ReadIntPtr(ptr, i * IntPtr.Size); + statuses[i] = new SubscriptionStatus(itemPtr); + } + InteropTasks.TrySetResultAndRemove(taskId, statuses); + } + + [MonoPInvokeCallback(typeof(NSErrorTaskCallback))] + private static void OnGetStatusError(long taskId, IntPtr errorPointer) + { + InteropTasks.TrySetExceptionAndRemove(taskId, new StoreKitException(errorPointer)); + } + + /// Billing plan type raw values from the subscription's pricing terms (iOS 26.4+). + [Introduced(iOS: "26.4", macOS: "26.4", tvOS: "26.4", visionOS: "26.4")] + public string[] BillingPlanTypes + { + get + { + string raw = Interop.SubscriptionInfo_GetBillingPlanTypes(Pointer); + return string.IsNullOrEmpty(raw) ? Array.Empty() : raw.Split(','); + } + } + + /// Human-readable summary of the subscription's pricing terms (iOS 26.4+). + [Introduced(iOS: "26.4", macOS: "26.4", tvOS: "26.4", visionOS: "26.4")] + public string PricingTermsSummary => Interop.SubscriptionInfo_GetPricingTermsSummary(Pointer); + + public Task GetStatus() + { +#if UNITY_EDITOR + return Task.FromResult(Array.Empty()); +#else + var tcs = InteropTasks.Create(out var taskId); + Interop.SubscriptionInfo_GetStatus(Pointer, taskId, OnGetStatusSuccess, OnGetStatusError); + return tcs.Task; +#endif + } + + private static class Interop + { + [DllImport(InteropUtility.DLLName)] + public static extern void SubscriptionInfo_Free(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string SubscriptionInfo_GetSubscriptionGroupId(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern void SubscriptionInfo_GetIsEligibleForIntroOffer(IntPtr pointer, long taskId, SuccessTaskCallback onSuccess, NSErrorTaskCallback onError); + + [DllImport(InteropUtility.DLLName)] + public static extern int SubscriptionInfo_GetPeriodUnit(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int SubscriptionInfo_GetPeriodValue(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr SubscriptionInfo_GetIntroductoryOffer(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int SubscriptionInfo_GetWinBackOffersCount(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr SubscriptionInfo_GetWinBackOfferAt(IntPtr pointer, int index); + + [DllImport(InteropUtility.DLLName)] + public static extern void SubscriptionInfo_GetStatus(IntPtr pointer, long taskId, SuccessTaskArrayCallback onSuccess, NSErrorTaskCallback onError); + + [DllImport(InteropUtility.DLLName)] + public static extern string SubscriptionInfo_GetBillingPlanTypes(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string SubscriptionInfo_GetPricingTermsSummary(IntPtr pointer); + } + } + + /// + /// Information about a product registered in App Store Connect (StoreKit 2). + /// Available on iOS 15.0+, macOS 12.0+, tvOS 15.0+ + /// + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public class Product : InteropReference + { + internal Product(IntPtr pointer) : base(pointer) { } + + protected override void OnDispose(bool isDisposing) + { + if (Pointer != IntPtr.Zero) + { + Interop.Product_Free(Pointer); + Pointer = IntPtr.Zero; + } + } + + #region Properties + /// + /// The unique product identifier. + /// + public string Id => Interop.Product_GetId(Pointer); + + /// + /// The localized display name of the product. + /// + public string DisplayName => Interop.Product_GetDisplayName(Pointer); + + /// + /// The localized description of the product. + /// + public string Description => Interop.Product_GetDescription(Pointer); + + /// + /// The price of the product in the local currency. + /// + public double Price => Interop.Product_GetPrice(Pointer); + + /// + /// The localized string representation of the product price. + /// + public string DisplayPrice => Interop.Product_GetDisplayPrice(Pointer); + + /// + /// The type of the product (consumable, non-consumable, auto-renewable, non-renewable). + /// + public ProductType Type + { + get + { + IntPtr typePointer = Interop.Product_GetType(Pointer); + return typePointer != IntPtr.Zero ? new ProductType(typePointer) : null; + } + } + + /// + /// A Boolean value that indicates whether the product is available for family sharing. + /// + public bool IsFamilyShareable => Interop.Product_GetIsFamilyShareable(Pointer); + + /// + /// The JSON representation of the product. + /// + public string JsonRepresentation => Interop.Product_GetJsonRepresentation(Pointer); + #endregion + + #region Subscription Properties + /// + /// A Boolean value that indicates whether the product has subscription information. + /// + public bool HasSubscription => Interop.Product_GetHasSubscription(Pointer); + + /// + /// The subscription group identifier, if this product is a subscription. + /// Returns null if the product is not a subscription. + /// + public string SubscriptionGroupId => Interop.Product_GetSubscriptionGroupId(Pointer); + + /// + /// The unit of the subscription period (day, week, month, year). + /// Returns -1 if the product is not a subscription. + /// + public SubscriptionPeriodUnit SubscriptionPeriodUnit => (SubscriptionPeriodUnit)Interop.Product_GetSubscriptionPeriodUnit(Pointer); + + /// + /// The value of the subscription period (e.g., 1 for monthly, 3 for quarterly). + /// Returns 0 if the product is not a subscription. + /// + public int SubscriptionPeriodValue => Interop.Product_GetSubscriptionPeriodValue(Pointer); + + /// + /// Full subscription information object. Returns null for non-subscription products. + /// + public SubscriptionInfo Subscription + { + get + { + IntPtr ptr = Interop.Product_GetSubscriptionInfo(Pointer); + return ptr != IntPtr.Zero ? new SubscriptionInfo(ptr) : null; + } + } + #endregion + + #region Instance Methods + [MonoPInvokeCallback(typeof(SuccessTaskCallback))] + private static void OnPurchaseSuccess(long taskId, IntPtr purchaseResultPointer) + { + if (purchaseResultPointer == IntPtr.Zero) + { + // Null pointer could indicate user cancellation or other edge case + InteropTasks.TrySetResultAndRemove(taskId, PurchaseResult.UserCancelled); + return; + } + + var purchaseResult = new PurchaseResult(purchaseResultPointer); + InteropTasks.TrySetResultAndRemove(taskId, purchaseResult); + } + + [MonoPInvokeCallback(typeof(NSErrorTaskCallback))] + private static void OnPurchaseError(long taskId, IntPtr errorPointer) + { + InteropTasks.TrySetExceptionAndRemove(taskId, new StoreKitException(errorPointer)); + } + + /// + /// Purchase the product with optional purchase options + /// + /// Array of purchase options (optional) + /// Task that resolves to a PurchaseResult + public Task Purchase(PurchaseOption[] options = null) + { + IntPtr optionsPointer = IntPtr.Zero; + GCHandle optionsHandle = default; + Action cleanup = null; + + if (options != null && options.Length > 0) + { + IntPtr[] optionPointers = new IntPtr[options.Length]; + for (int i = 0; i < options.Length; i++) + { + optionPointers[i] = options[i].Pointer; + } + + optionsHandle = GCHandle.Alloc(optionPointers, GCHandleType.Pinned); + optionsPointer = optionsHandle.AddrOfPinnedObject(); + + cleanup = () => optionsHandle.Free(); + } + + var tcs = InteropTasks.Create(cleanup, out var taskId); + Interop.Product_Purchase(Pointer, optionsPointer, options?.Length ?? 0, taskId, OnPurchaseSuccess, OnPurchaseError); + return tcs.Task; + } + + [MonoPInvokeCallback(typeof(SuccessTaskCallback))] + private static void OnGetLatestTransactionSuccess(long taskId, IntPtr ptr) + { + if (ptr == IntPtr.Zero) + InteropTasks.TrySetResultAndRemove>(taskId, null); + else + InteropTasks.TrySetResultAndRemove(taskId, new VerificationResult(ptr)); + } + + [MonoPInvokeCallback(typeof(NSErrorTaskCallback))] + private static void OnGetLatestTransactionError(long taskId, IntPtr errorPointer) + { + InteropTasks.TrySetExceptionAndRemove>(taskId, new StoreKitException(errorPointer)); + } + + /// + /// Gets the most recent transaction for this product. + /// Returns null if the product has never been purchased. + /// + public Task> GetLatestTransaction() + { + var tcs = InteropTasks.Create>(out var taskId); + Interop.Product_GetLatestTransaction(Pointer, taskId, OnGetLatestTransactionSuccess, OnGetLatestTransactionError); + return tcs.Task; + } + #endregion + + #region Static Methods + [MonoPInvokeCallback(typeof(SuccessTaskArrayCallback))] + private static void OnFetchProductsSuccess(long taskId, IntPtr productsPointer, int count) + { + Debug.Log($"OnFetchProductsSuccess called with pointer: {productsPointer}, count: {count}"); + InteropTasks.TrySetResultAndRemove(taskId, new SwiftArray(productsPointer, count)); + } + + [MonoPInvokeCallback(typeof(NSErrorTaskCallback))] + private static void OnFetchProductsError(long taskId, IntPtr errorPointer) + { + Debug.Log("OnFetchProductsError called with error pointer: " + errorPointer); + InteropTasks.TrySetExceptionAndRemove>(taskId, new StoreKitException(errorPointer)); + } + + /// + /// Fetches information about products from the App Store. + /// + /// Array of product IDs to fetch + /// A task that completes when products are fetched + public static Task> FetchProducts(string[] productIds) + { + // Marshal each string to a char* pointer + IntPtr[] stringPointers = new IntPtr[productIds.Length]; + for (int i = 0; i < productIds.Length; i++) + { + stringPointers[i] = Marshal.StringToHGlobalAnsi(productIds[i]); + } + + // Pin the array of pointers + GCHandle handle = GCHandle.Alloc(stringPointers, GCHandleType.Pinned); + IntPtr arrayPtr = handle.AddrOfPinnedObject(); + + Action cleanup = () => + { + // Free marshalled strings + for (int i = 0; i < stringPointers.Length; i++) + { + Marshal.FreeHGlobal(stringPointers[i]); + } + handle.Free(); + }; + + var tcs = InteropTasks.Create>(cleanup, out var taskId); + Interop.Product_FetchProducts( + arrayPtr, + productIds.Length, + taskId, + OnFetchProductsSuccess, + OnFetchProductsError); + + return tcs.Task; + } + #endregion + + #region Interop + private static class Interop + { + [DllImport(InteropUtility.DLLName)] + public static extern void Product_Free(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string Product_GetId(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string Product_GetDisplayName(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string Product_GetDescription(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern double Product_GetPrice(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string Product_GetDisplayPrice(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr Product_GetType(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] + public static extern bool Product_GetIsFamilyShareable(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string Product_GetJsonRepresentation(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] + public static extern bool Product_GetHasSubscription(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string Product_GetSubscriptionGroupId(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int Product_GetSubscriptionPeriodUnit(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int Product_GetSubscriptionPeriodValue(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr Product_GetSubscriptionInfo(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern void Product_FetchProducts( + IntPtr productIds, + int productIdsCount, + long taskId, + SuccessTaskArrayCallback onSuccess, + NSErrorTaskCallback onError); + + [DllImport(InteropUtility.DLLName)] + public static extern void Product_Purchase( + IntPtr productPointer, + IntPtr optionsPointer, + int optionsCount, + long taskId, + SuccessTaskCallback onSuccess, + NSErrorTaskCallback onError); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr PurchaseOption_AppAccountToken(string uuidString); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr PurchaseOption_Quantity(int quantity); + + [DllImport(InteropUtility.DLLName)] + public static extern void Product_GetLatestTransaction( + IntPtr productPointer, + long taskId, + SuccessTaskCallback onSuccess, + NSErrorTaskCallback onError); + } + #endregion + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Product.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Product.cs.meta new file mode 100644 index 00000000..d2c12c7f --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Product.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ff8d7323d47e54482bb34fea8a24111d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/ProductPromotionInfo.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/ProductPromotionInfo.cs new file mode 100644 index 00000000..29946805 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/ProductPromotionInfo.cs @@ -0,0 +1,229 @@ +using System; +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using AOT; +using Apple.Core; +using Apple.Core.Runtime; + +namespace Apple.StoreKit +{ + /// + /// Controls the per-device promoted IAP order and visibility. + /// Available on iOS 16.4+ + /// + [Introduced(iOS: "16.4")] + [Unavailable(RuntimeOperatingSystem.tvOS, RuntimeOperatingSystem.macOS, RuntimeOperatingSystem.visionOS)] + public static class ProductPromotionInfo + { + /// + /// Visibility of a promoted IAP on this device. + /// + public enum Visibility + { + /// Uses the default visibility configured in App Store Connect. + AppStoreConnectDefault = 0, + /// Always show this product in the promoted list on this device. + Visible = 1, + /// Hide this product from the promoted list on this device. + Hidden = 2 + } + + #region GetCurrentOrder + + [MonoPInvokeCallback(typeof(SuccessTaskArrayCallback))] + private static void OnGetCurrentOrderSuccess(long taskId, IntPtr ptr, int count) + { + var result = new string[count]; + for (int i = 0; i < count; i++) + { + var strPtr = Marshal.ReadIntPtr(ptr, i * IntPtr.Size); + result[i] = Marshal.PtrToStringAnsi(strPtr) ?? string.Empty; + } + InteropTasks.TrySetResultAndRemove(taskId, result); + } + + [MonoPInvokeCallback(typeof(NSErrorTaskCallback))] + private static void OnGetCurrentOrderError(long taskId, IntPtr errorPointer) + { + InteropTasks.TrySetExceptionAndRemove(taskId, new StoreKitException(errorPointer)); + } + + /// + /// Returns the current per-device promoted product order as an array of product IDs. + /// + public static Task GetCurrentOrder() + { +#if UNITY_EDITOR + return Task.FromException(new System.NotSupportedException("ProductPromotionInfo is not supported in the Unity Editor.")); +#else + var tcs = InteropTasks.Create(out var taskId); + Interop.ProductPromotionInfo_GetCurrentOrder(taskId, OnGetCurrentOrderSuccess, OnGetCurrentOrderError); + return tcs.Task; +#endif + } + + #endregion + + #region UpdateProductOrder + + [MonoPInvokeCallback(typeof(SuccessTaskCallback))] + private static void OnUpdateProductOrderSuccess(long taskId) + { + InteropTasks.TrySetResultAndRemove(taskId, true); + } + + [MonoPInvokeCallback(typeof(NSErrorTaskCallback))] + private static void OnUpdateProductOrderError(long taskId, IntPtr errorPointer) + { + InteropTasks.TrySetExceptionAndRemove(taskId, new StoreKitException(errorPointer)); + } + + /// + /// Sets a custom per-device promoted product order. + /// + public static Task UpdateProductOrder(string[] productIds) + { +#if UNITY_EDITOR + return Task.FromException(new System.NotSupportedException("ProductPromotionInfo is not supported in the Unity Editor.")); +#else + IntPtr[] ptrs = new IntPtr[productIds.Length]; + for (int i = 0; i < productIds.Length; i++) + ptrs[i] = Marshal.StringToHGlobalAnsi(productIds[i]); + + var handle = GCHandle.Alloc(ptrs, GCHandleType.Pinned); + var arrayPtr = handle.AddrOfPinnedObject(); + + Action cleanup = () => + { + for (int i = 0; i < ptrs.Length; i++) + Marshal.FreeHGlobal(ptrs[i]); + handle.Free(); + }; + + var tcs = InteropTasks.Create(cleanup, out var taskId); + Interop.ProductPromotionInfo_UpdateProductOrder(arrayPtr, productIds.Length, taskId, OnUpdateProductOrderSuccess, OnUpdateProductOrderError); + return tcs.Task; +#endif + } + + #endregion + + #region UpdateAll + + [MonoPInvokeCallback(typeof(SuccessTaskCallback))] + private static void OnUpdateAllSuccess(long taskId) + { + InteropTasks.TrySetResultAndRemove(taskId, true); + } + + [MonoPInvokeCallback(typeof(NSErrorTaskCallback))] + private static void OnUpdateAllError(long taskId, IntPtr errorPointer) + { + InteropTasks.TrySetExceptionAndRemove(taskId, new StoreKitException(errorPointer)); + } + + /// + /// Sets the promoted IAP order and visibility for all products at once on this device. + /// + [Introduced(iOS: "16.4")] + [Unavailable(RuntimeOperatingSystem.tvOS, RuntimeOperatingSystem.macOS, RuntimeOperatingSystem.visionOS)] + public static Task UpdateAll(string[] productIds, Visibility[] visibilities) + { +#if UNITY_EDITOR + return Task.FromException(new System.NotSupportedException("ProductPromotionInfo is not supported in the Unity Editor.")); +#else + IntPtr[] ptrs = new IntPtr[productIds.Length]; + for (int i = 0; i < productIds.Length; i++) + ptrs[i] = Marshal.StringToHGlobalAnsi(productIds[i]); + + var handle = GCHandle.Alloc(ptrs, GCHandleType.Pinned); + var arrayPtr = handle.AddrOfPinnedObject(); + + int[] visInts = new int[visibilities.Length]; + for (int i = 0; i < visibilities.Length; i++) + visInts[i] = (int)visibilities[i]; + + var visHandle = GCHandle.Alloc(visInts, GCHandleType.Pinned); + var visArrayPtr = visHandle.AddrOfPinnedObject(); + + Action cleanup = () => + { + for (int i = 0; i < ptrs.Length; i++) + Marshal.FreeHGlobal(ptrs[i]); + handle.Free(); + visHandle.Free(); + }; + + var tcs = InteropTasks.Create(cleanup, out var taskId); + Interop.ProductPromotionInfo_UpdateAll(arrayPtr, visArrayPtr, productIds.Length, taskId, OnUpdateAllSuccess, OnUpdateAllError); + return tcs.Task; +#endif + } + + #endregion + + #region UpdateProductVisibility + + [MonoPInvokeCallback(typeof(SuccessTaskCallback))] + private static void OnUpdateProductVisibilitySuccess(long taskId) + { + InteropTasks.TrySetResultAndRemove(taskId, true); + } + + [MonoPInvokeCallback(typeof(NSErrorTaskCallback))] + private static void OnUpdateProductVisibilityError(long taskId, IntPtr errorPointer) + { + InteropTasks.TrySetExceptionAndRemove(taskId, new StoreKitException(errorPointer)); + } + + /// + /// Sets the visibility of a specific product in the promoted list on this device. + /// + public static Task UpdateProductVisibility(string productId, Visibility visibility) + { +#if UNITY_EDITOR + return Task.FromException(new System.NotSupportedException("ProductPromotionInfo is not supported in the Unity Editor.")); +#else + var tcs = InteropTasks.Create(out var taskId); + Interop.ProductPromotionInfo_UpdateProductVisibility(productId, (int)visibility, taskId, OnUpdateProductVisibilitySuccess, OnUpdateProductVisibilityError); + return tcs.Task; +#endif + } + + #endregion + + private static class Interop + { + [DllImport(InteropUtility.DLLName)] + public static extern void ProductPromotionInfo_GetCurrentOrder( + long taskId, + SuccessTaskArrayCallback onSuccess, + NSErrorTaskCallback onError); + + [DllImport(InteropUtility.DLLName)] + public static extern void ProductPromotionInfo_UpdateProductOrder( + IntPtr productIds, + int count, + long taskId, + SuccessTaskCallback onSuccess, + NSErrorTaskCallback onError); + + [DllImport(InteropUtility.DLLName)] + public static extern void ProductPromotionInfo_UpdateAll( + IntPtr productIds, + IntPtr visibilities, + int count, + long taskId, + SuccessTaskCallback onSuccess, + NSErrorTaskCallback onError); + + [DllImport(InteropUtility.DLLName)] + public static extern void ProductPromotionInfo_UpdateProductVisibility( + string productId, + int visibility, + long taskId, + SuccessTaskCallback onSuccess, + NSErrorTaskCallback onError); + } + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/ProductPromotionInfo.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/ProductPromotionInfo.cs.meta new file mode 100644 index 00000000..76c5d552 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/ProductPromotionInfo.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ccc0fb56920954b02885c312591858bd \ No newline at end of file diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/PurchaseIntent.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/PurchaseIntent.cs new file mode 100644 index 00000000..7c27693c --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/PurchaseIntent.cs @@ -0,0 +1,113 @@ +using System; +using System.Runtime.InteropServices; +using AOT; +using Apple.Core; +using Apple.Core.Runtime; + +namespace Apple.StoreKit +{ + [Introduced(iOS: "16.4", macOS: "14.4")] + [Unavailable(RuntimeOperatingSystem.tvOS, RuntimeOperatingSystem.visionOS)] + public class PurchaseIntent : InteropReference + { + internal PurchaseIntent(IntPtr pointer) : base(pointer) { } + + protected override void OnDispose(bool isDisposing) + { + if (Pointer != IntPtr.Zero) + { +#if !UNITY_EDITOR + Interop.PurchaseIntent_Free(Pointer); +#endif + Pointer = IntPtr.Zero; + } + } + + public string Id + { + get + { +#if UNITY_EDITOR + return string.Empty; +#else + return Interop.PurchaseIntent_GetId(Pointer); +#endif + } + } + + public Product Product + { + get + { +#if UNITY_EDITOR + return null; +#else + IntPtr ptr = Interop.PurchaseIntent_GetProduct(Pointer); + return ptr != IntPtr.Zero ? new Product(ptr) : null; +#endif + } + } + + // --- Static stream --- + + private static EventHandler _intentsHandler; + private static long _currentTaskId; + + /// + /// Subscribe to this event to receive purchase intents when a user taps + /// "Buy" on a promoted IAP in the App Store. + /// + public static event EventHandler Intents + { + add + { + if (_intentsHandler == null) + StartListening(); + _intentsHandler += value; + } + remove + { + _intentsHandler -= value; + if (_intentsHandler == null) + InteropTasks.TrySetResultAndRemove(_currentTaskId, IntPtr.Zero); + } + } + + private static void StartListening() + { +#if !UNITY_EDITOR + InteropTasks.Create(out _currentTaskId); + Interop.PurchaseIntent_Listen(_currentTaskId, OnIntent); +#endif + } + + [MonoPInvokeCallback(typeof(SuccessTaskBoolReturningCallback))] + [return: MarshalAs(UnmanagedType.I1)] + private static bool OnIntent(long taskId, IntPtr ptr) + { + if (!InteropTasks.TryGet(taskId, out var task) || task.Task.IsCompleted) + return false; + + var intent = new PurchaseIntent(ptr); + _intentsHandler?.Invoke(null, intent); + return true; + } + + private static class Interop + { + [DllImport(InteropUtility.DLLName)] + public static extern void PurchaseIntent_Listen( + long taskId, + SuccessTaskBoolReturningCallback onIntent); + + [DllImport(InteropUtility.DLLName)] + public static extern void PurchaseIntent_Free(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string PurchaseIntent_GetId(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr PurchaseIntent_GetProduct(IntPtr pointer); + } + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/PurchaseIntent.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/PurchaseIntent.cs.meta new file mode 100644 index 00000000..499c7046 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/PurchaseIntent.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a3f8c21d74e6b450983dc76e5a012f84 diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/RenewalInfo.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/RenewalInfo.cs new file mode 100644 index 00000000..7b08fc58 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/RenewalInfo.cs @@ -0,0 +1,112 @@ +using System; +using System.Runtime.InteropServices; +using Apple.Core; +using Apple.Core.Runtime; + +namespace Apple.StoreKit +{ + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public enum RenewalState + { + Subscribed = 0, + Expired = 1, + InBillingRetryPeriod = 2, + InGracePeriod = 3, + Revoked = 4 + } + + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public enum ExpirationReason + { + AutoRenewDisabled = 0, + BillingError = 1, + DidNotConsentToPriceIncrease = 2, + ProductUnavailable = 3 + } + + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public class RenewalInfo : InteropReference + { + internal RenewalInfo(IntPtr pointer) : base(pointer) { } + + protected override void OnDispose(bool isDisposing) + { + if (Pointer != IntPtr.Zero) + { + Interop.RenewalInfo_Free(Pointer); + Pointer = IntPtr.Zero; + } + } + + public string CurrentProductId => Interop.RenewalInfo_GetCurrentProductID(Pointer); + + public bool WillAutoRenew => Interop.RenewalInfo_GetWillAutoRenew(Pointer); + + public string OfferId => Interop.RenewalInfo_GetOfferId(Pointer); + + public OfferType? OfferType + { + get + { + int v = Interop.RenewalInfo_GetOfferType(Pointer); + return v >= 0 ? (OfferType?)v : null; + } + } + + public ExpirationReason? ExpirationReason + { + get + { + int v = Interop.RenewalInfo_GetExpirationReason(Pointer); + return v >= 0 ? (ExpirationReason?)v : null; + } + } + + public bool IsInBillingRetry => Interop.RenewalInfo_GetIsInBillingRetry(Pointer); + + public DateTime? GracePeriodExpirationDate + { + get + { + long t = Interop.RenewalInfo_GetGracePeriodExpirationDate(Pointer); + return t > 0 ? DateTimeOffset.FromUnixTimeSeconds(t).UtcDateTime : (DateTime?)null; + } + } + + /// Advanced Commerce / Partner Billing info summary for the renewal, or empty. iOS 18.4+. + [Introduced(iOS: "18.4", macOS: "15.4", tvOS: "18.4", visionOS: "2.4")] + public string AdvancedCommerceInfoSummary => Interop.RenewalInfo_GetAdvancedCommerceInfoSummary(Pointer); + + private static class Interop + { + [DllImport(InteropUtility.DLLName)] + public static extern void RenewalInfo_Free(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string RenewalInfo_GetCurrentProductID(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] + public static extern bool RenewalInfo_GetWillAutoRenew(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string RenewalInfo_GetOfferId(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int RenewalInfo_GetOfferType(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int RenewalInfo_GetExpirationReason(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] + public static extern bool RenewalInfo_GetIsInBillingRetry(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern long RenewalInfo_GetGracePeriodExpirationDate(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string RenewalInfo_GetAdvancedCommerceInfoSummary(IntPtr pointer); + } + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/RenewalInfo.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/RenewalInfo.cs.meta new file mode 100644 index 00000000..514351c2 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/RenewalInfo.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b7e3f92a15d84c610a72e85f4b903c27 diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/SKOverlay.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/SKOverlay.cs new file mode 100644 index 00000000..9f7ee1ac --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/SKOverlay.cs @@ -0,0 +1,130 @@ +using System; +using System.Runtime.InteropServices; +using AOT; +using Apple.Core; +using Apple.Core.Runtime; + +namespace Apple.StoreKit +{ +#if UNITY_IOS || UNITY_VISIONOS + public enum SKOverlayPosition : int + { + Bottom = 0, + BottomRaised = 1 + } + + [Introduced(iOS: "14.0", visionOS: "2.2")] + [Unavailable(RuntimeOperatingSystem.tvOS, RuntimeOperatingSystem.macOS)] + public static class SKOverlay + { + #region Delegates + private delegate void OverlayCallback(); + private delegate void OverlayErrorCallback(IntPtr errorPointer); + #endregion + + #region Events + /// + /// Raised when the overlay is about to start presenting. + /// + public static event Action WillStartPresentation; + + /// + /// Raised when the overlay has finished presenting. + /// + public static event Action DidFinishPresentation; + + /// + /// Raised when the overlay is about to start dismissing. + /// + public static event Action WillStartDismissal; + + /// + /// Raised when the overlay has finished dismissing. + /// + public static event Action DidFinishDismissal; + + /// + /// Raised when the overlay fails to load. + /// + public static event Action DidFailToLoad; + #endregion + + #region Static Methods + /// + /// Presents an App Store overlay recommending the app with the given identifier. + /// + /// The iTunes item identifier of the app to recommend. + /// The position of the overlay on screen. + public static void Present(string appIdentifier, SKOverlayPosition position = SKOverlayPosition.Bottom) + { + Interop.SKOverlay_Present( + appIdentifier, + (int)position, + OnWillStartPresentation, + OnDidFinishPresentation, + OnWillStartDismissal, + OnDidFinishDismissal, + OnDidFailToLoad); + } + + /// + /// Dismisses the currently presented App Store overlay. + /// + public static void Dismiss() + { + Interop.SKOverlay_Dismiss(); + } + #endregion + + #region Callback Handlers + [MonoPInvokeCallback(typeof(OverlayCallback))] + private static void OnWillStartPresentation() + { + WillStartPresentation?.Invoke(); + } + + [MonoPInvokeCallback(typeof(OverlayCallback))] + private static void OnDidFinishPresentation() + { + DidFinishPresentation?.Invoke(); + } + + [MonoPInvokeCallback(typeof(OverlayCallback))] + private static void OnWillStartDismissal() + { + WillStartDismissal?.Invoke(); + } + + [MonoPInvokeCallback(typeof(OverlayCallback))] + private static void OnDidFinishDismissal() + { + DidFinishDismissal?.Invoke(); + } + + [MonoPInvokeCallback(typeof(OverlayErrorCallback))] + private static void OnDidFailToLoad(IntPtr errorPointer) + { + DidFailToLoad?.Invoke(new StoreKitException(errorPointer)); + } + #endregion + + #region Interop + private static class Interop + { + [DllImport(InteropUtility.DLLName)] + public static extern void SKOverlay_Present( + string appIdentifier, + int position, + OverlayCallback onWillStartPresentation, + OverlayCallback onDidFinishPresentation, + OverlayCallback onWillStartDismissal, + OverlayCallback onDidFinishDismissal, + OverlayErrorCallback onDidFailToLoad); + + [DllImport(InteropUtility.DLLName)] + public static extern void SKOverlay_Dismiss(); + } + #endregion + } +#endif +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/SKOverlay.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/SKOverlay.cs.meta new file mode 100644 index 00000000..c7fbc719 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/SKOverlay.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 06fcf77f26bb842fca51a8b88d066768 \ No newline at end of file diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/StoreKitException.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/StoreKitException.cs new file mode 100644 index 00000000..ea60d1ac --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/StoreKitException.cs @@ -0,0 +1,27 @@ +using System; +using Apple.Core.Runtime; + +namespace Apple.StoreKit +{ + public class StoreKitException : Exception + { + public NSError NSError { get; set; } + + public StoreKitException(IntPtr nsErrorPtr) + { + NSError = new NSError(nsErrorPtr); + } + + public StoreKitException(NSError nsError) + { + NSError = nsError; + } + + public override string Message => $"Code={Code} Domain={Domain} Description={LocalizedDescription}"; + + public long Code => NSError?.Code ?? default; + public string Domain => NSError?.Domain ?? default; + public string LocalizedDescription => NSError?.LocalizedDescription ?? default; + public NSDictionary UserInfo => NSError?.UserInfo ?? default; + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/StoreKitException.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/StoreKitException.cs.meta new file mode 100644 index 00000000..00c26788 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/StoreKitException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fc512007f6f50489e81d7afe2c4dee44 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Storefront.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Storefront.cs new file mode 100644 index 00000000..3159d271 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Storefront.cs @@ -0,0 +1,128 @@ +using System; +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using AOT; +using Apple.Core; +using Apple.Core.Runtime; + +namespace Apple.StoreKit +{ + /// + /// The App Store storefront for the device. + /// Available on iOS 15.0+, macOS 12.0+, tvOS 15.0+ + /// + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public class Storefront : InteropReference + { + internal Storefront(IntPtr pointer) : base(pointer) { } + + protected override void OnDispose(bool isDisposing) + { + if (Pointer != IntPtr.Zero) + { + Interop.Storefront_Free(Pointer); + Pointer = IntPtr.Zero; + } + } + + /// + /// The App Store storefront identifier. + /// + public string Id => Interop.Storefront_GetId(Pointer); + + /// + /// The three-letter country code for the storefront. + /// + public string CountryCode => Interop.Storefront_GetCountryCode(Pointer); + + [MonoPInvokeCallback(typeof(SuccessTaskCallback))] + private static void OnGetCurrentSuccess(long taskId, IntPtr ptr) + { + if (ptr == IntPtr.Zero) + InteropTasks.TrySetResultAndRemove(taskId, null); + else + InteropTasks.TrySetResultAndRemove(taskId, new Storefront(ptr)); + } + + [MonoPInvokeCallback(typeof(NSErrorTaskCallback))] + private static void OnGetCurrentError(long taskId, IntPtr errorPointer) + { + InteropTasks.TrySetExceptionAndRemove(taskId, new StoreKitException(errorPointer)); + } + + /// + /// Gets the current App Store storefront. + /// Returns null if not available. + /// + public static Task GetCurrent() + { +#if UNITY_EDITOR + return Task.FromResult(null); +#else + var tcs = InteropTasks.Create(out var taskId); + Interop.Storefront_GetCurrent(taskId, OnGetCurrentSuccess, OnGetCurrentError); + return tcs.Task; +#endif + } + + private static EventHandler _updatesEventHandler; + private static long _currentTaskId; + + /// Fires when the device's App Store storefront changes (Storefront.updates). + public static event EventHandler Updates + { + add + { + if (_updatesEventHandler == null) StartUpdates(); + _updatesEventHandler += value; + } + remove + { + _updatesEventHandler -= value; + if (_updatesEventHandler == null) + InteropTasks.TrySetResultAndRemove(_currentTaskId, IntPtr.Zero); + } + } + + private static void StartUpdates() + { +#if !UNITY_EDITOR + InteropTasks.Create(out _currentTaskId); + Interop.Storefront_Updates(_currentTaskId, OnStorefrontUpdate); +#endif + } + + [MonoPInvokeCallback(typeof(SuccessTaskBoolReturningCallback))] + [return: MarshalAs(UnmanagedType.I1)] + private static bool OnStorefrontUpdate(long taskId, IntPtr ptr) + { + if (!InteropTasks.TryGet(taskId, out var task) || task.Task.IsCompleted) + return false; + _updatesEventHandler?.Invoke(null, new Storefront(ptr)); + return true; + } + + private static class Interop + { + [DllImport(InteropUtility.DLLName)] + public static extern void Storefront_Free(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern void Storefront_GetCurrent( + long taskId, + SuccessTaskCallback onSuccess, + NSErrorTaskCallback onError); + + [DllImport(InteropUtility.DLLName)] + public static extern void Storefront_Updates( + long taskId, + SuccessTaskBoolReturningCallback onUpdate); + + [DllImport(InteropUtility.DLLName)] + public static extern string Storefront_GetId(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string Storefront_GetCountryCode(IntPtr pointer); + } + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Storefront.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Storefront.cs.meta new file mode 100644 index 00000000..75ba63b9 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Storefront.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6bc8c30f863c54c2b9fa24686148715a \ No newline at end of file diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/SubscriptionStatus.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/SubscriptionStatus.cs new file mode 100644 index 00000000..514bc91f --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/SubscriptionStatus.cs @@ -0,0 +1,100 @@ +using System; +using System.Runtime.InteropServices; +using AOT; +using Apple.Core; +using Apple.Core.Runtime; + +namespace Apple.StoreKit +{ + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public class SubscriptionStatus : InteropReference + { + internal SubscriptionStatus(IntPtr pointer) : base(pointer) { } + + protected override void OnDispose(bool isDisposing) + { + if (Pointer != IntPtr.Zero) + { + Interop.SubscriptionStatus_Free(Pointer); + Pointer = IntPtr.Zero; + } + } + + public RenewalState State => (RenewalState)Interop.SubscriptionStatus_GetState(Pointer); + + public VerificationResult RenewalInfo + { + get + { + IntPtr ptr = Interop.SubscriptionStatus_GetRenewalInfo(Pointer); + return new VerificationResult(ptr); + } + } + + public VerificationResult Transaction + { + get + { + IntPtr ptr = Interop.SubscriptionStatus_GetTransaction(Pointer); + return new VerificationResult(ptr); + } + } + + private static EventHandler _updatesEventHandler; + private static long _currentTaskId; + + /// Fires on subscription status changes (Product.SubscriptionInfo.Status.updates). + public static event EventHandler Updates + { + add + { + if (_updatesEventHandler == null) StartUpdates(); + _updatesEventHandler += value; + } + remove + { + _updatesEventHandler -= value; + if (_updatesEventHandler == null) + InteropTasks.TrySetResultAndRemove(_currentTaskId, IntPtr.Zero); + } + } + + private static void StartUpdates() + { +#if !UNITY_EDITOR + InteropTasks.Create(out _currentTaskId); + Interop.SubscriptionStatus_Updates(_currentTaskId, OnStatusUpdate); +#endif + } + + [MonoPInvokeCallback(typeof(SuccessTaskBoolReturningCallback))] + [return: MarshalAs(UnmanagedType.I1)] + private static bool OnStatusUpdate(long taskId, IntPtr ptr) + { + if (!InteropTasks.TryGet(taskId, out var task) || task.Task.IsCompleted) + return false; + _updatesEventHandler?.Invoke(null, new SubscriptionStatus(ptr)); + return true; + } + + private static class Interop + { + [DllImport(InteropUtility.DLLName)] + public static extern void SubscriptionStatus_Free(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int SubscriptionStatus_GetState(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr SubscriptionStatus_GetRenewalInfo(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr SubscriptionStatus_GetTransaction(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern void SubscriptionStatus_Updates( + long taskId, + SuccessTaskBoolReturningCallback onUpdate); + } + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/SubscriptionStatus.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/SubscriptionStatus.cs.meta new file mode 100644 index 00000000..8c1a9aeb --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/SubscriptionStatus.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c4d9a06e28f15b730e83f96d5a712e48 diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Transaction.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Transaction.cs new file mode 100644 index 00000000..3a60f1ba --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Transaction.cs @@ -0,0 +1,758 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using AOT; +using Apple.Core; +using Apple.Core.Runtime; +using UnityEngine; + +namespace Apple.StoreKit +{ + /// + /// Offer type enumeration matching StoreKit 2 Transaction.OfferType + /// + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public enum OfferType + { + Introductory = 0, + Promotional = 1, + + [Introduced(iOS: "16.0", macOS: "13.0", tvOS: "16.0", visionOS: "2.2")] + Code = 2, + + [Introduced(iOS: "17.4", macOS: "14.4", tvOS: "17.4", visionOS: "2.4")] + WinBackOffer = 3 + } + + /// + /// Environment enumeration matching StoreKit 2 AppStore.Environment + /// + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public enum StoreEnvironment + { + Production = 0, + Sandbox = 1, + Xcode = 2 + } + + /// + /// Ownership type enumeration matching StoreKit 2 Transaction.OwnershipType + /// + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public enum OwnershipType + { + Purchased = 0, + FamilyShared = 1 + } + + /// + /// Platform enumeration matching StoreKit 2 AppStore.Platform + /// + [Introduced(iOS: "18.4", macOS: "15.4", tvOS: "18.4", visionOS: "2.4")] + public enum AppStorePlatform + { + iOS = 0, + macOS = 1, + tvOS = 2, + visionOS = 4, + Unknown = 5 + } + + [Introduced(iOS: "26.4", macOS: "26.4", tvOS: "26.4", visionOS: "26.4")] + public enum RevocationType + { + FamilyRevocation = 0, + FullRefund = 1, + ProratedRefund = 2 + } + + /// + /// Refund request status enumeration matching StoreKit 2 RefundRequestStatus + /// + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public enum RefundRequestStatus + { + Success = 0, + UserCancelled = 1 + } + + /// + /// Revocation reason class matching StoreKit 2 Transaction.RevocationReason + /// + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public class RevocationReason : InteropReference + { + internal RevocationReason(IntPtr pointer) : base(pointer) { } + + public enum RevocationReasonEnum + { + DeveloperIssue = 0, + Other = 1 + } + + /// + /// The raw revocation reason value + /// + public RevocationReasonEnum Reason => (RevocationReasonEnum)Interop.RevocationReason_GetRawValue(Pointer); + + /// + /// The localized description of the revocation reason + /// + public string LocalizedDescription => Interop.RevocationReason_GetLocalizedDescription(Pointer); + + protected override void OnDispose(bool isDisposing) + { + if (Pointer != IntPtr.Zero) + { + Interop.RevocationReason_Free(Pointer); + Pointer = IntPtr.Zero; + } + } + + private static class Interop + { + [DllImport(InteropUtility.DLLName)] + public static extern void RevocationReason_Free(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int RevocationReason_GetRawValue(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string RevocationReason_GetLocalizedDescription(IntPtr pointer); + } + } + + /// + /// The reason a transaction occurred. + /// Available on iOS 17.0+, macOS 14.0+, tvOS 17.0+ + /// + [Introduced(iOS: "17.0", macOS: "14.0", tvOS: "17.0", visionOS: "2.2")] + public enum TransactionReason + { + Purchase = 0, + Renewal = 1 + } + + /// + /// Structured offer information for a transaction. + /// Available on iOS 17.2+, macOS 14.2+, tvOS 17.2+ + /// + [Introduced(iOS: "17.2", macOS: "14.2", tvOS: "17.2", visionOS: "2.2")] + public class TransactionOffer : InteropReference + { + internal TransactionOffer(IntPtr pointer) : base(pointer) { } + + /// + /// The offer identifier, or null if not set. + /// + public string Id => Interop.TransactionOffer_GetId(Pointer); + + /// + /// The offer type (introductory, promotional, code, or win-back). + /// + public OfferType Type => (OfferType)Interop.TransactionOffer_GetType(Pointer); + + protected override void OnDispose(bool isDisposing) + { + if (Pointer != IntPtr.Zero) + { + Interop.TransactionOffer_Free(Pointer); + Pointer = IntPtr.Zero; + } + } + + private static class Interop + { + [DllImport(InteropUtility.DLLName)] + public static extern void TransactionOffer_Free(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string TransactionOffer_GetId(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int TransactionOffer_GetType(IntPtr pointer); + } + } + + /// + /// Information about a transaction that was completed through the App Store. + /// Available on iOS 15.0+, macOS 12.0+, tvOS 15.0+ + /// + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public class Transaction : InteropReference + { + internal Transaction(IntPtr pointer) : base(pointer) { } + + #region Properties + /// + /// The unique identifier for the transaction. + /// + public ulong Id => Interop.Transaction_GetId(Pointer); + + /// + /// The identifier of the original transaction for auto-renewable subscriptions. + /// + public ulong OriginalId => Interop.Transaction_GetOriginalId(Pointer); + + /// + /// The product identifier for the transaction. + /// + public string ProductId => Interop.Transaction_GetProductId(Pointer); + + /// + /// The date the App Store charged the customer's account for a purchase. + /// + public DateTime PurchaseDate => DateTimeOffset.FromUnixTimeSeconds(Interop.Transaction_GetPurchaseDate(Pointer)).DateTime; + + /// + /// The date of the original purchase, before a subscription renewal or restore. + /// + public DateTime OriginalPurchaseDate => DateTimeOffset.FromUnixTimeSeconds(Interop.Transaction_GetOriginalPurchaseDate(Pointer)).DateTime; + + /// + /// The date that the App Store signed the transaction. + /// + public DateTime SignedDate => DateTimeOffset.FromUnixTimeSeconds(Interop.Transaction_GetSignedDate(Pointer)).DateTime; + + /// + /// The expiration date for auto-renewable subscriptions. Returns null for non-subscription products. + /// + public DateTime? ExpirationDate + { + get + { + long timestamp = Interop.Transaction_GetExpirationDate(Pointer); + return timestamp > 0 ? DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime : null; + } + } + + /// + /// The date that the App Store refunded the transaction or revoked it from family sharing. Returns null if not revoked. + /// + public DateTime? RevocationDate + { + get + { + long timestamp = Interop.Transaction_GetRevocationDate(Pointer); + return timestamp > 0 ? DateTimeOffset.FromUnixTimeSeconds(timestamp).DateTime : null; + } + } + + /// + /// The reason for the revocation of the transaction. Returns null if not revoked. + /// + public RevocationReason RevocationReason + { + get + { + IntPtr reasonPointer = Interop.Transaction_GetRevocationReason(Pointer); + return reasonPointer != IntPtr.Zero ? new RevocationReason(reasonPointer) : null; + } + } + + /// + /// A Boolean value that indicates whether the auto-renewable subscription is subject to an upgrade. + /// + public bool IsUpgraded => Interop.Transaction_GetIsUpgraded(Pointer); + + /// + /// The promotional offer identifier, if the customer redeemed a promotional offer. + /// + public string OfferId => Interop.Transaction_GetOfferId(Pointer); + + /// + /// The type of promotional offer, if the customer redeemed one. + /// + public OfferType? OfferType + { + get + { + int value = Interop.Transaction_GetOfferType(Pointer); + return value >= 0 ? (OfferType?)value : null; + } + } + + /// + /// The server environment where the transaction was processed. + /// + public StoreEnvironment Environment => (StoreEnvironment)Interop.Transaction_GetEnvironment(Pointer); + + /// + /// The ownership type of the transaction. + /// + public OwnershipType OwnershipType => (OwnershipType)Interop.Transaction_GetOwnershipType(Pointer); + + /// + /// The UUID that associates the transaction with a user on your own service. + /// + public string AppAccountToken => Interop.Transaction_GetAppAccountToken(Pointer); + + /// + /// The JSON representation of the transaction. + /// + public string JsonRepresentation => Interop.Transaction_GetJsonRepresentation(Pointer); + + /// + /// The number of consumable products purchased. + /// + public int PurchasedQuantity => Interop.Transaction_GetPurchasedQuantity(Pointer); + + /// + /// The product type for the transaction (consumable, non-consumable, auto-renewable, non-renewing). + /// + public ProductType.ProductTypeEnum ProductType => (ProductType.ProductTypeEnum)Interop.Transaction_GetProductType(Pointer); + + /// + /// The bundle ID of the app that created the transaction. + /// + public string AppBundleId => Interop.Transaction_GetAppBundleId(Pointer); + + /// + /// The subscription group identifier for auto-renewable subscriptions. Null for non-subscription products. + /// + public string SubscriptionGroupId => Interop.Transaction_GetSubscriptionGroupId(Pointer); + + /// + /// A unique identifier used for server-side receipt reconciliation. May be null for some product types. + /// + public string WebOrderLineItemId => Interop.Transaction_GetWebOrderLineItemId(Pointer); + + /// + /// The App Store storefront country code where the transaction occurred. + /// + [Unavailable(RuntimeOperatingSystem.visionOS)] + public string StorefrontCountryCode => Interop.Transaction_GetStorefrontCountryCode(Pointer); + + /// + /// The reason the transaction occurred: a purchase or an auto-renewal. Available on iOS 17.0+. + /// Returns null on older OS versions. + /// + [Introduced(iOS: "17.0", macOS: "14.0", tvOS: "17.0", visionOS: "2.2")] + public TransactionReason? Reason + { + get + { + int value = Interop.Transaction_GetReason(Pointer); + return value >= 0 ? (TransactionReason?)value : null; + } + } + + /// + /// The actual price the customer paid. Null for free products. Available on iOS 17.0+. + /// + [Introduced(iOS: "17.0", macOS: "14.0", tvOS: "17.0", visionOS: "2.2")] + public double? Price + { + get + { + double value = Interop.Transaction_GetPrice(Pointer); + return value >= 0 ? value : null; + } + } + + [Introduced(iOS: "16.0", macOS: "13.0", tvOS: "16.0", visionOS: "1.0")] + public Currency Currency + { + get + { + IntPtr ptr = Interop.Transaction_GetCurrency(Pointer); + return ptr != IntPtr.Zero ? new Currency(ptr) : null; + } + } + + /// + /// Structured offer information if the customer redeemed an offer. Available on iOS 17.2+. + /// + [Introduced(iOS: "17.2", macOS: "14.2", tvOS: "17.2", visionOS: "2.2")] + public TransactionOffer Offer + { + get + { + IntPtr ptr = Interop.Transaction_GetOffer(Pointer); + return ptr != IntPtr.Zero ? new TransactionOffer(ptr) : null; + } + } + + /// + /// The nonce used when computing the device verification hash. Available on iOS 16.4+. + /// + [Introduced(iOS: "16.4", macOS: "13.3", tvOS: "16.4", visionOS: "2.2")] + public string DeviceVerificationNonce => Interop.Transaction_GetDeviceVerificationId(Pointer); + + [Introduced(iOS: "16.0", macOS: "13.0", tvOS: "16.0", visionOS: "1.0")] + public string AppTransactionID => Interop.Transaction_GetAppTransactionID(Pointer); + + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public double? RevocationPercentage + { + get + { + double value = Interop.Transaction_GetRevocationPercentage(Pointer); + return value >= 0 ? value : null; + } + } + + [Introduced(iOS: "26.4", macOS: "26.4", tvOS: "26.4", visionOS: "26.4")] + public RevocationType? RevocationType + { + get + { + int value = Interop.Transaction_GetRevocationType(Pointer); + return value >= 0 ? (RevocationType?)value : null; + } + } + + /// + /// Advanced Commerce / Partner Billing info summary for the transaction, or empty if the + /// transaction has no advanced-commerce info. iOS 18.4+. + /// + [Introduced(iOS: "18.4", macOS: "15.4", tvOS: "18.4", visionOS: "2.4")] + public string AdvancedCommerceInfoSummary => Interop.Transaction_GetAdvancedCommerceInfoSummary(Pointer); + + private static EventHandler> _updatesEventHandler; + private static long _currentTaskId; + public static event EventHandler> Updates + { + add + { + if (_updatesEventHandler == null) + { + StartTransactionUpdates(); + } + _updatesEventHandler += value; + } + remove + { + _updatesEventHandler -= value; + if (_updatesEventHandler == null) + { + Debug.Log("Transaction: No more update handlers, stopping updates is not currently supported."); + if (!InteropTasks.TrySetResultAndRemove(_currentTaskId, IntPtr.Zero)) + { + Debug.LogWarning("Transaction: Failed to stop transaction updates task."); + } + } + } + } + + private static void StartTransactionUpdates() + { + Debug.Log("Transaction: Starting transaction updates"); + InteropTasks.Create(out _currentTaskId); + Interop.Transaction_Updates(_currentTaskId, OnTransactionUpdate); + } + + [MonoPInvokeCallback(typeof(SuccessTaskBoolReturningCallback))] + [return:MarshalAs(UnmanagedType.I1)] + private static bool OnTransactionUpdate(long taskId, IntPtr ptr) + { + if (!InteropTasks.TryGet(taskId, out var task) + || task.Task.IsCompleted) + { + Debug.Log("Transaction: Received update for completed task, ignoring"); + return false; + } + + Debug.Log("Update received for transaction"); + var result = new VerificationResult(ptr); + _updatesEventHandler?.Invoke(null, result); + return true; + } + + #endregion + + #region Disposal + protected override void OnDispose(bool isDisposing) + { + if (Pointer != IntPtr.Zero) + { + Interop.Transaction_Free(Pointer); + Pointer = IntPtr.Zero; + } + } + #endregion + + #region Methods + public override string ToString() + { + var sb = new System.Text.StringBuilder(); + sb.Append($"Transaction(Id={Id}, OriginalId={OriginalId}, ProductId={ProductId}, ProductType={ProductType}"); + sb.Append($", PurchasedQuantity={PurchasedQuantity}, PurchaseDate={PurchaseDate:yyyy-MM-dd HH:mm}"); + sb.Append($", AppBundleId={AppBundleId}"); +#if !UNITY_VISIONOS + sb.Append($", StorefrontCountryCode={StorefrontCountryCode}"); +#endif + if (SubscriptionGroupId != null) sb.Append($", SubscriptionGroupId={SubscriptionGroupId}"); + if (WebOrderLineItemId != null) sb.Append($", WebOrderLineItemId={WebOrderLineItemId}"); + if (ExpirationDate.HasValue) sb.Append($", ExpirationDate={ExpirationDate:yyyy-MM-dd HH:mm}"); + if (RevocationDate.HasValue) sb.Append($", RevocationDate={RevocationDate:yyyy-MM-dd HH:mm}"); + sb.Append($", IsUpgraded={IsUpgraded}, OwnershipType={OwnershipType}, Environment={Environment}"); + if (Reason.HasValue) sb.Append($", Reason={Reason}"); + if (Price.HasValue) sb.Append($", Price={Price} {Currency}"); + using var offer = Offer; + if (offer != null) sb.Append($", Offer(Type={offer.Type}, Id={offer.Id ?? "null"})"); + sb.Append(")"); + return sb.ToString(); + } + + /// + /// Marks the transaction as finished after the app delivers the purchased content. + /// + public void Finish() + { + Interop.Transaction_Finish(Pointer); + } + #endregion + + #region AsyncSequence Methods + + /// + /// Gets the current entitlements (active purchases and subscriptions) for the user. + /// + public static IAsyncEnumerable> GetCurrentEntitlements() + { + var enumerable = AsyncStreamInterop.Create(static ptr => new VerificationResult(ptr)); + Interop.Transaction_GetCurrentEntitlements(enumerable.Id, AsyncStreamInterop.AddValue, AsyncStreamInterop.Completed); + return enumerable; + } + + /// + /// Gets all transactions for the user, including past purchases. + /// + public static IAsyncEnumerable> GetAll() + { + var enumerable = AsyncStreamInterop.Create(static ptr => new VerificationResult(ptr)); + Interop.Transaction_GetAll(enumerable.Id, AsyncStreamInterop.AddValue, AsyncStreamInterop.Completed); + return enumerable; + } + + public static IAsyncEnumerable> GetUnfinished() + { + var enumerable = AsyncStreamInterop.Create(static ptr => new VerificationResult(ptr)); + Interop.Transaction_GetUnfinished(enumerable.Id, AsyncStreamInterop.AddValue, AsyncStreamInterop.Completed); + return enumerable; + } + #endregion + + #region Async Methods + [MonoPInvokeCallback(typeof(SuccessTaskCallback))] + private static void OnGetLatestSuccess(long taskId, IntPtr ptr) + { + InteropTasks.TrySetResultAndRemove(taskId, new VerificationResult(ptr)); + } + + [MonoPInvokeCallback(typeof(NSErrorTaskCallback))] + private static void OnGetLatestError(long taskId, IntPtr errorPointer) + { + InteropTasks.TrySetExceptionAndRemove>(taskId, new StoreKitException(errorPointer)); + } + + /// + /// Gets the most recent transaction for a specific product. + /// + public static Task> GetLatest(string productId) + { + var tcs = InteropTasks.Create>(out var taskId); + Interop.Transaction_GetLatest(productId, taskId, OnGetLatestSuccess, OnGetLatestError); + return tcs.Task; + } + + [MonoPInvokeCallback(typeof(SuccessTaskCallback))] + private static void OnBeginRefundRequestSuccess(long taskId, IntPtr statusPointer) + { + if (statusPointer == IntPtr.Zero) + { + InteropTasks.TrySetExceptionAndRemove(taskId, + new InvalidOperationException("BeginRefundRequest succeeded but returned a null status pointer.")); + return; + } + + // The native side hands back a heap-allocated Transaction.RefundRequestStatus. + // Read its value through the accessor, then free the allocation to avoid leaking it. + int rawValue = Interop.RefundRequestStatus_GetRawValue(statusPointer); + Interop.RefundRequestStatus_Free(statusPointer); + InteropTasks.TrySetResultAndRemove(taskId, (RefundRequestStatus)rawValue); + } + + [MonoPInvokeCallback(typeof(NSErrorTaskCallback))] + private static void OnBeginRefundRequestError(long taskId, IntPtr errorPointer) + { + InteropTasks.TrySetExceptionAndRemove(taskId, new StoreKitException(errorPointer)); + } + + [Unavailable(RuntimeOperatingSystem.tvOS)] + public static Task BeginRefundRequest(ulong transactionId) + { + var tcs = InteropTasks.Create(out var taskId); + Interop.Transaction_BeginRefundWithId(transactionId, taskId, OnBeginRefundRequestSuccess, OnBeginRefundRequestError); + return tcs.Task; + } + + [Unavailable(RuntimeOperatingSystem.tvOS)] + public Task BeginRefundRequest() + { + var tcs = InteropTasks.Create(out var taskId); + Interop.Transaction_BeginRefund(Pointer, taskId, OnBeginRefundRequestSuccess, OnBeginRefundRequestError); + return tcs.Task; + } + #endregion + + #region Interop + private static class Interop + { + [DllImport(InteropUtility.DLLName)] + public static extern void Transaction_Free(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string Transaction_GetAdvancedCommerceInfoSummary(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern ulong Transaction_GetId(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern ulong Transaction_GetOriginalId(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string Transaction_GetProductId(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern long Transaction_GetPurchaseDate(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern long Transaction_GetOriginalPurchaseDate(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern long Transaction_GetSignedDate(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern long Transaction_GetExpirationDate(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern long Transaction_GetRevocationDate(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr Transaction_GetRevocationReason(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] + public static extern bool Transaction_GetIsUpgraded(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string Transaction_GetOfferId(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int Transaction_GetOfferType(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int Transaction_GetEnvironment(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int Transaction_GetOwnershipType(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string Transaction_GetAppAccountToken(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string Transaction_GetJsonRepresentation(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int Transaction_GetPurchasedQuantity(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int Transaction_GetProductType(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string Transaction_GetAppBundleId(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string Transaction_GetSubscriptionGroupId(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string Transaction_GetWebOrderLineItemId(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string Transaction_GetStorefrontCountryCode(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int Transaction_GetReason(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern double Transaction_GetPrice(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr Transaction_GetCurrency(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr Transaction_GetOffer(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string Transaction_GetDeviceVerificationId(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string Transaction_GetAppTransactionID(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern double Transaction_GetRevocationPercentage(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int Transaction_GetRevocationType(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern void Transaction_Finish(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern int RefundRequestStatus_GetRawValue(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern void RefundRequestStatus_Free(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern void Transaction_BeginRefund( + IntPtr transactionPointer, + long taskId, + SuccessTaskCallback onSuccess, + NSErrorTaskCallback onError); + + [DllImport(InteropUtility.DLLName)] + public static extern void Transaction_GetCurrentEntitlements( + long sequenceId, + SuccessTaskCallback addItem, + SuccessTaskCallback onComplete); + + [DllImport(InteropUtility.DLLName)] + public static extern void Transaction_GetAll( + long sequenceId, + SuccessTaskCallback addItem, + SuccessTaskCallback onComplete); + + [DllImport(InteropUtility.DLLName)] + public static extern void Transaction_GetUnfinished( + long sequenceId, + SuccessTaskCallback addItem, + SuccessTaskCallback onComplete); + + [DllImport(InteropUtility.DLLName)] + public static extern void Transaction_GetLatest( + string productId, + long taskId, + SuccessTaskCallback onSuccess, + NSErrorTaskCallback onError); + + [DllImport(InteropUtility.DLLName)] + public static extern void Transaction_Updates( + long taskId, + SuccessTaskBoolReturningCallback onUpdate + ); + + [DllImport(InteropUtility.DLLName)] + public static extern void Transaction_BeginRefundWithId( + ulong transactionId, + long taskId, + SuccessTaskCallback onSuccess, + NSErrorTaskCallback onError + ); + } + #endregion + } +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Transaction.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Transaction.cs.meta new file mode 100644 index 00000000..848b69c3 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Transaction.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4e49dc03911a5474a98dd0b7b95d0982 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/VerificationResult.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/VerificationResult.cs new file mode 100644 index 00000000..2fa538af --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/VerificationResult.cs @@ -0,0 +1,402 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using AOT; +using Apple.Core; +using Apple.Core.Runtime; +using UnityEngine; + +namespace Apple.StoreKit +{ + /// + /// Generic verification result wrapper with strongly-typed payload access and JWS properties + /// + /// The type of the signed payload (Transaction or AppTransaction) + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public sealed class VerificationResult : InteropReference where T : InteropReference + { + private T _cachedPayload; + private readonly object _payloadLock = new object(); + private NSError _verificationError; + private readonly object _errorLock = new object(); + + internal VerificationResult(IntPtr pointer) : base(pointer) { } + + /// + /// Whether the transaction was verified + /// + public bool IsVerified => Get(); + + /// + /// Gets the payload value as a string without verification + /// + public string UnsafePayloadValue => Get(); + + /// + /// Gets the strongly-typed payload if verified + /// + /// Thrown if the result is not verified + public T SafePayload + { + get + { + if (!IsVerified) + throw new InvalidOperationException("Cannot access payload of unverified result. Use TryGetVerified() or UnsafePayload instead."); + return GetPayload(); + } + } + + /// + /// Gets the strongly-typed payload without verification (returns payload whether verified or not) + /// + public T UnsafePayload => GetPayload(); + + /// + /// Gets the verification error if the result is unverified + /// + public NSError VerificationError + { + get + { + if (IsVerified) + return null; + + // Fast path without lock + if (_verificationError != null) + return _verificationError; + + lock (_errorLock) + { + if (_verificationError != null) + return _verificationError; + + var errorPtr = Get(); + if (errorPtr == IntPtr.Zero) + return null; + + _verificationError = new NSError(errorPtr); + return _verificationError; + } + } + } + + #region JWS Properties + + /// + /// The raw JSON Web Signature representation + /// + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public string JwsRepresentation => Get(); + + /// + /// The data for the header component of the JWS + /// + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public NSData HeaderData => Get(); + + /// + /// The data for the payload component of the JWS + /// + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public NSData PayloadData => Get(); + + /// + /// The data for the signature component of the JWS + /// + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public NSData SignatureData => Get(); + + /// + /// The signature of the JWS as raw bytes (P256.Signing.ECDSASignature.rawRepresentation) + /// + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public NSData Signature => Get(); + + /// + /// The component of the JWS that the signature is computed over + /// + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public NSData SignedData => Get(); + + /// + /// The date the signature was generated + /// + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public DateTime SignedDate => DateTimeOffset.FromUnixTimeSeconds( + Get() + ).DateTime; + + /// + /// A SHA-384 hash of AppStore.deviceVerificationID appended after deviceVerificationNonce + /// + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public NSData DeviceVerification => Get(); + + /// + /// The nonce used when computing deviceVerification + /// + [Introduced(iOS: "15.0", macOS: "12.0", tvOS: "15.0", visionOS: "2.2")] + public string DeviceVerificationNonce => Get(); + + #endregion + + #region Convenience Methods + + /// + /// Attempts to get the verified payload + /// + /// The verified payload if successful + /// True if verified, false otherwise + public bool TryGetVerified(out T payload) + { + if (IsVerified) + { + payload = SafePayload; + return true; + } + payload = null; + return false; + } + + /// + /// Pattern matching helper for handling verified and unverified cases + /// + /// The return type + /// Function to call if verified + /// Function to call if unverified + /// The result of the matching function + public TResult Match( + Func onVerified, + Func onUnverified) + { + return IsVerified + ? onVerified(SafePayload) + : onUnverified(UnsafePayload, VerificationError); + } + + #endregion + + #region Private Helpers + + private T GetPayload() + { + if (_cachedPayload != null) + return _cachedPayload; + + lock (_payloadLock) + { + if (_cachedPayload != null) + return _cachedPayload; + + var payloadPtr = Get("GetPayloadPointer"); + _cachedPayload = typeof(T) switch + { + Type t when t == typeof(Transaction) => (T)(object)new Transaction(payloadPtr), + Type t when t == typeof(AppTransaction) => (T)(object)new AppTransaction(payloadPtr), + Type t when t == typeof(RenewalInfo) => (T)(object)new RenewalInfo(payloadPtr), + _ => throw new NotSupportedException($"Type {typeof(T).Name} is not supported for VerificationResult"), + }; + return _cachedPayload; + } + } + + private TReturn Get([System.Runtime.CompilerServices.CallerMemberName] string methodName = null) + { + if (typeof(T) == typeof(Transaction)) + { + return methodName switch + { + nameof(IsVerified) => (TReturn)(object)VerificationResultInterop.VerificationResult_Transaction_IsVerified(Pointer), + nameof(UnsafePayloadValue) => (TReturn)(object)VerificationResultInterop.VerificationResult_Transaction_UnsafePayloadValue(Pointer), + nameof(VerificationError) => (TReturn)(object)VerificationResultInterop.VerificationResult_Transaction_VerificationError(Pointer), + "GetPayloadPointer" => (TReturn)(object)VerificationResultInterop.VerificationResult_Transaction_GetPayloadPointer(Pointer), + nameof(JwsRepresentation) => (TReturn)(object)VerificationResultInterop.VerificationResult_Transaction_GetJwsRepresentation(Pointer), + nameof(HeaderData) => (TReturn)(object)new NSData(VerificationResultInterop.VerificationResult_Transaction_GetHeaderData(Pointer)), + nameof(PayloadData) => (TReturn)(object)new NSData(VerificationResultInterop.VerificationResult_Transaction_GetPayloadData(Pointer)), + nameof(SignatureData) => (TReturn)(object)new NSData(VerificationResultInterop.VerificationResult_Transaction_GetSignatureData(Pointer)), + nameof(Signature) => (TReturn)(object)new NSData(VerificationResultInterop.VerificationResult_Transaction_GetSignature(Pointer)), + nameof(SignedData) => (TReturn)(object)new NSData(VerificationResultInterop.VerificationResult_Transaction_GetSignedData(Pointer)), + nameof(SignedDate) => (TReturn)(object)VerificationResultInterop.VerificationResult_Transaction_GetSignedDate(Pointer), + nameof(DeviceVerification) => (TReturn)(object)new NSData(VerificationResultInterop.VerificationResult_Transaction_GetDeviceVerification(Pointer)), + nameof(DeviceVerificationNonce) => (TReturn)(object)VerificationResultInterop.VerificationResult_Transaction_GetDeviceVerificationNonce(Pointer), + _ => throw new NotSupportedException($"Method {methodName} not supported") + }; + } + else if (typeof(T) == typeof(AppTransaction)) + { + return methodName switch + { + nameof(IsVerified) => (TReturn)(object)VerificationResultInterop.VerificationResult_AppTransaction_IsVerified(Pointer), + nameof(UnsafePayloadValue) => (TReturn)(object)VerificationResultInterop.VerificationResult_AppTransaction_UnsafePayloadValue(Pointer), + nameof(VerificationError) => (TReturn)(object)VerificationResultInterop.VerificationResult_AppTransaction_VerificationError(Pointer), + "GetPayloadPointer" => (TReturn)(object)VerificationResultInterop.VerificationResult_AppTransaction_GetPayloadPointer(Pointer), + nameof(JwsRepresentation) => (TReturn)(object)VerificationResultInterop.VerificationResult_AppTransaction_GetJwsRepresentation(Pointer), + nameof(HeaderData) => (TReturn)(object)new NSData(VerificationResultInterop.VerificationResult_AppTransaction_GetHeaderData(Pointer)), + nameof(PayloadData) => (TReturn)(object)new NSData(VerificationResultInterop.VerificationResult_AppTransaction_GetPayloadData(Pointer)), + nameof(SignatureData) => (TReturn)(object)new NSData(VerificationResultInterop.VerificationResult_AppTransaction_GetSignatureData(Pointer)), + nameof(Signature) => (TReturn)(object)new NSData(VerificationResultInterop.VerificationResult_AppTransaction_GetSignature(Pointer)), + nameof(SignedData) => (TReturn)(object)new NSData(VerificationResultInterop.VerificationResult_AppTransaction_GetSignedData(Pointer)), + nameof(SignedDate) => (TReturn)(object)VerificationResultInterop.VerificationResult_AppTransaction_GetSignedDate(Pointer), + nameof(DeviceVerification) => (TReturn)(object)new NSData(VerificationResultInterop.VerificationResult_AppTransaction_GetDeviceVerification(Pointer)), + nameof(DeviceVerificationNonce) => (TReturn)(object)VerificationResultInterop.VerificationResult_AppTransaction_GetDeviceVerificationNonce(Pointer), + _ => throw new NotSupportedException($"Method {methodName} not supported") + }; + } + else if (typeof(T) == typeof(RenewalInfo)) + { + return methodName switch + { + nameof(IsVerified) => (TReturn)(object)VerificationResultInterop.VerificationResult_RenewalInfo_IsVerified(Pointer), + nameof(VerificationError) => (TReturn)(object)VerificationResultInterop.VerificationResult_RenewalInfo_GetVerificationError(Pointer), + "GetPayloadPointer" => (TReturn)(object)VerificationResultInterop.VerificationResult_RenewalInfo_GetPayloadPointer(Pointer), + _ => throw new NotSupportedException($"Method {methodName} not supported for RenewalInfo VerificationResult") + }; + } + else + { + throw new NotSupportedException($"Type {typeof(T).Name} is not supported for VerificationResult"); + } + } + + #endregion + + #region Disposal + + protected override void OnDispose(bool isDisposing) + { + if (Pointer != IntPtr.Zero) + { + if (typeof(T) == typeof(Transaction)) + { + VerificationResultInterop.VerificationResult_Transaction_Free(Pointer); + } + else if (typeof(T) == typeof(AppTransaction)) + { + VerificationResultInterop.VerificationResult_AppTransaction_Free(Pointer); + } + else if (typeof(T) == typeof(RenewalInfo)) + { + VerificationResultInterop.VerificationResult_RenewalInfo_Free(Pointer); + } + Pointer = IntPtr.Zero; + } + } + + #endregion + } + + #region Interop + /// + /// Interop functions for VerificationResult + /// + internal static class VerificationResultInterop + { + // Transaction verification result - Free function + [DllImport(InteropUtility.DLLName)] + public static extern void VerificationResult_Transaction_Free(IntPtr pointer); + + // Transaction verification result - common functions + [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] + public static extern bool VerificationResult_Transaction_IsVerified(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string VerificationResult_Transaction_UnsafePayloadValue(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr VerificationResult_Transaction_VerificationError(IntPtr pointer); + + // Transaction verification result - JWS functions + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr VerificationResult_Transaction_GetPayloadPointer(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string VerificationResult_Transaction_GetJwsRepresentation(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr VerificationResult_Transaction_GetHeaderData(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr VerificationResult_Transaction_GetPayloadData(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr VerificationResult_Transaction_GetSignatureData(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr VerificationResult_Transaction_GetSignature(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr VerificationResult_Transaction_GetSignedData(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern long VerificationResult_Transaction_GetSignedDate(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr VerificationResult_Transaction_GetDeviceVerification(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string VerificationResult_Transaction_GetDeviceVerificationNonce(IntPtr pointer); + + // AppTransaction verification result - Free function + [DllImport(InteropUtility.DLLName)] + public static extern void VerificationResult_AppTransaction_Free(IntPtr pointer); + + // AppTransaction verification result - common functions + [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] + public static extern bool VerificationResult_AppTransaction_IsVerified(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string VerificationResult_AppTransaction_UnsafePayloadValue(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr VerificationResult_AppTransaction_VerificationError(IntPtr pointer); + + // AppTransaction verification result - JWS functions + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr VerificationResult_AppTransaction_GetPayloadPointer(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string VerificationResult_AppTransaction_GetJwsRepresentation(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr VerificationResult_AppTransaction_GetHeaderData(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr VerificationResult_AppTransaction_GetPayloadData(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr VerificationResult_AppTransaction_GetSignatureData(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr VerificationResult_AppTransaction_GetSignature(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr VerificationResult_AppTransaction_GetSignedData(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern long VerificationResult_AppTransaction_GetSignedDate(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr VerificationResult_AppTransaction_GetDeviceVerification(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern string VerificationResult_AppTransaction_GetDeviceVerificationNonce(IntPtr pointer); + + // RenewalInfo verification result + [DllImport(InteropUtility.DLLName)] + public static extern void VerificationResult_RenewalInfo_Free(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + [return: MarshalAs(UnmanagedType.I1)] + public static extern bool VerificationResult_RenewalInfo_IsVerified(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr VerificationResult_RenewalInfo_GetPayloadPointer(IntPtr pointer); + + [DllImport(InteropUtility.DLLName)] + public static extern IntPtr VerificationResult_RenewalInfo_GetVerificationError(IntPtr pointer); + } + #endregion +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/VerificationResult.cs.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/VerificationResult.cs.meta new file mode 100644 index 00000000..90eb807f --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/VerificationResult.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0ca1eb3db87604315ad35646f9584aff \ No newline at end of file diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/link.xml b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/link.xml new file mode 100644 index 00000000..64fc8e8c --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/link.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/link.xml.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/link.xml.meta new file mode 100644 index 00000000..a1d33788 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/link.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f7195ea4e8222401fbfec21490616a74 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/package.json b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/package.json new file mode 100644 index 00000000..0d294630 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/package.json @@ -0,0 +1,29 @@ +{ + "name": "com.apple.unityplugin.storekit", + "displayName": "Apple.StoreKit", + "description": "Exposes Apple's StoreKit.framework to Unity developers via C# script API", + "version": "1.0.0", + "unity": "2022.3", + "dependencies": { + "com.apple.unityplugin.core": "3.3.0" + }, + "keywords": [ + "storekit", + "in-app purchase", + "iap", + "subscriptions", + "apple" + ], + "author": { + "name": "Apple, Inc", + "email": "developer@apple.com", + "url": "https://developer.apple.com" + }, + "samples": [ + { + "displayName": "StoreKit Demo", + "description": "Demo for StoreKit integration", + "path": "Demos/Apple.StoreKit.Sample" + } + ] +} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/package.json.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/package.json.meta new file mode 100644 index 00000000..6ff45b27 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9e34743f3f8ea441d90834bc555f17fc +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Doxyfile b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Doxyfile new file mode 100644 index 00000000..7e06b765 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Doxyfile @@ -0,0 +1,2976 @@ +# Doxyfile 1.15.0 + +# This file describes the settings to be used by the documentation system +# Doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). +# +# Note: +# +# Use Doxygen to compare the used configuration file with the template +# configuration file: +# doxygen -x [configFile] +# Use Doxygen to compare the used configuration file with the template +# configuration file without replacing the environment variables or CMake type +# replacement variables: +# doxygen -x_noenv [configFile] + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the configuration +# file that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# https://www.gnu.org/software/libiconv/ for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "Apple.StoreKit" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewers a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# With the PROJECT_ICON tag one can specify an icon that is included in the tabs +# when the HTML document is shown. Doxygen will copy the logo to the output +# directory. + +PROJECT_ICON = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where Doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES then Doxygen will create up to 4096 +# sub-directories (in 2 levels) under the output directory of each output format +# and will distribute the generated files over these directories. Enabling this +# option can be useful when feeding Doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise cause +# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to +# control the number of sub-directories. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# Controls the number of sub-directories that will be created when +# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every +# level increment doubles the number of directories, resulting in 4096 +# directories at level 8 which is the default and also the maximum value. The +# sub-directories are organized in 2 levels, the first level always has a fixed +# number of 16 directories. +# Minimum value: 0, maximum value: 8, default value: 8. +# This tag requires that the tag CREATE_SUBDIRS is set to YES. + +CREATE_SUBDIRS_LEVEL = 8 + +# If the ALLOW_UNICODE_NAMES tag is set to YES, Doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by Doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, +# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English +# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, +# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with +# English messages), Korean, Korean-en (Korean with English messages), Latvian, +# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, +# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, +# Swedish, Turkish, Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, Doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, Doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, Doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, Doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which Doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where Doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, Doxygen will generate much shorter (but +# less readable) file names. This can be useful if your file system doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen will interpret the +# first line (until the first dot, question mark or exclamation mark) of a +# Javadoc-style comment as the brief description. If set to NO, the Javadoc- +# style will behave just like regular Qt-style comments (thus requiring an +# explicit @brief command for a brief description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the JAVADOC_BANNER tag is set to YES then Doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by Doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will interpret the first +# line (until the first dot, question mark or exclamation mark) of a Qt-style +# comment as the brief description. If set to NO, the Qt-style will behave just +# like regular Qt-style comments (thus requiring an explicit \brief command for +# a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# By default Python docstrings are displayed as preformatted text and Doxygen's +# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the +# Doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as Doxygen documentation. +# The default value is: YES. + +PYTHON_DOCSTRING = YES + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then Doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:^^" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice +# sources only. Doxygen will then generate output that is more tailored for that +# language. For instance, namespaces will be presented as modules, types will be +# separated into more groups, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_SLICE = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by Doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser +# tries to guess whether the code is fixed or free formatted code, this is the +# default for Fortran type files). For instance to make Doxygen treat .inc files +# as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by Doxygen. When specifying no_extension you should add +# * to the FILE_PATTERNS. +# +# Note see also the list of default file extension mappings. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then Doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See https://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by Doxygen, so you can +# mix Doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# If the MARKDOWN_STRICT tag is enabled then Doxygen treats text in comments as +# Markdown formatted also in cases where Doxygen's native markup format +# conflicts with that of Markdown. This is only relevant in cases where +# backticks are used. Doxygen's native markup style allows a single quote to end +# a text fragment started with a backtick and then treat it as a piece of quoted +# text, whereas in Markdown such text fragment is treated as verbatim and only +# ends when a second matching backtick is found. Also, Doxygen's native markup +# format requires double quotes to be escaped when they appear in a backtick +# section, whereas this is not needed for Markdown. +# The default value is: YES. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +MARKDOWN_STRICT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 6. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 6 + +# The MARKDOWN_ID_STYLE tag can be used to specify the algorithm used to +# generate identifiers for the Markdown headings. Note: Every identifier is +# unique. +# Possible values are: DOXYGEN use a fixed 'autotoc_md' string followed by a +# sequence number starting at 0 and GITHUB use the lower case version of title +# with any whitespace replaced by '-' and punctuation characters removed. +# The default value is: DOXYGEN. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +MARKDOWN_ID_STYLE = DOXYGEN + +# When enabled Doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. Words listed in the +# AUTOLINK_IGNORE_WORDS tag are excluded from automatic linking. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# This tag specifies a list of words that, when matching the start of a word in +# the documentation, will suppress auto links generation, if it is enabled via +# AUTOLINK_SUPPORT. This list does not affect links explicitly created using \# +# or the \link or commands. +# This tag requires that the tag AUTOLINK_SUPPORT is set to YES. + +AUTOLINK_IGNORE_WORDS = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let Doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also makes the inheritance and +# collaboration diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# https://www.riverbankcomputing.com/software) sources only. Doxygen will parse +# them like normal C++ but will assume all classes use public instead of private +# inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# Doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then Doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, Doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# Doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run Doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +# The NUM_PROC_THREADS specifies the number of threads Doxygen is allowed to use +# during processing. When set to 0 Doxygen will based this on the number of +# cores available in the system. You can set it explicitly to a value larger +# than 0 to get more control over the balance between CPU load and processing +# speed. At this moment only the input processing can be done using multiple +# threads. Since this is still an experimental feature the default is set to 1, +# which effectively disables parallel processing. Please report any issues you +# encounter. Generating dot graphs in parallel is controlled by the +# DOT_NUM_THREADS setting. +# Minimum value: 0, maximum value: 512, default value: 1. + +NUM_PROC_THREADS = 1 + +# If the TIMESTAMP tag is set different from NO then each generated page will +# contain the date or date and time when the page was generated. Setting this to +# NO can help when comparing the output of multiple runs. +# Possible values are: YES, NO, DATETIME and DATE. +# The default value is: NO. + +TIMESTAMP = NO + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, Doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If this flag is set to YES, the name of an unnamed parameter in a declaration +# will be determined by the corresponding definition. By default unnamed +# parameters remain unnamed in the output. +# The default value is: YES. + +RESOLVE_UNNAMED_PARAMS = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# will also hide undocumented C++ concepts if enabled. This option has no effect +# if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_UNDOC_NAMESPACES tag is set to YES, Doxygen will hide all +# undocumented namespaces that are normally visible in the namespace hierarchy. +# If set to NO, these namespaces will be included in the various overviews. This +# option has no effect if EXTRACT_ALL is enabled. +# The default value is: YES. + +HIDE_UNDOC_NAMESPACES = YES + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all friend +# declarations. If set to NO, these declarations will be included in the +# documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# With the correct setting of option CASE_SENSE_NAMES Doxygen will better be +# able to match the capabilities of the underlying filesystem. In case the +# filesystem is case sensitive (i.e. it supports files in the same directory +# whose names only differ in casing), the option must be set to YES to properly +# deal with such files in case they appear in the input. For filesystems that +# are not case sensitive the option should be set to NO to properly deal with +# output files written for symbols that only differ in casing, such as for two +# classes, one named CLASS and the other named Class, and to also support +# references to files without having to specify the exact matching casing. On +# Windows (including Cygwin) and macOS, users should typically set this option +# to NO, whereas on Linux or other Unix flavors it should typically be set to +# YES. +# Possible values are: SYSTEM, NO and YES. +# The default value is: SYSTEM. + +CASE_SENSE_NAMES = SYSTEM + +# If the HIDE_SCOPE_NAMES tag is set to NO then Doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then Doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class +# will show which file needs to be included to use the class. +# The default value is: YES. + +SHOW_HEADERFILE = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES then Doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then Doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then Doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then Doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then Doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and Doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING Doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# Doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by Doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by Doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents Doxygen's defaults, run Doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. See also section "Changing the +# layout of pages" for information. +# +# Note that if you run Doxygen from a directory containing a file called +# DoxygenLayout.xml, Doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +# The EXTERNAL_TOOL_PATH tag can be used to extend the search path (PATH +# environment variable) so that external tools such as latex and gs can be +# found. +# Note: Directories specified with EXTERNAL_TOOL_PATH are added in front of the +# path already specified by the PATH variable, and are added in the order +# specified. +# Note: This option is particularly useful for macOS version 14 (Sonoma) and +# higher, when running Doxygen from Doxywizard, because in this case any user- +# defined changes to the PATH are ignored. A typical example on macOS is to set +# EXTERNAL_TOOL_PATH = /Library/TeX/texbin /usr/local/bin +# together with the standard path, the full search path used by doxygen when +# launching external tools will then become +# PATH=/Library/TeX/texbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin + +EXTERNAL_TOOL_PATH = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by Doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by Doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then Doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, Doxygen will generate warnings for +# potential errors in the documentation, such as documenting some parameters in +# a documented function twice, or documenting parameters that don't exist or +# using markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# If WARN_IF_INCOMPLETE_DOC is set to YES, Doxygen will warn about incomplete +# function parameter documentation. If set to NO, Doxygen will accept that some +# parameters have no documentation without warning. +# The default value is: YES. + +WARN_IF_INCOMPLETE_DOC = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, Doxygen will only warn about wrong parameter +# documentation, but not about the absence of documentation. If EXTRACT_ALL is +# set to YES then this flag will automatically be disabled. See also +# WARN_IF_INCOMPLETE_DOC +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, Doxygen will warn about +# undocumented enumeration values. If set to NO, Doxygen will accept +# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: NO. + +WARN_IF_UNDOC_ENUM_VAL = NO + +# If WARN_LAYOUT_FILE option is set to YES, Doxygen will warn about issues found +# while parsing the user defined layout file, such as missing or wrong elements. +# See also LAYOUT_FILE for details. If set to NO, problems with the layout file +# will be suppressed. +# The default value is: YES. + +WARN_LAYOUT_FILE = YES + +# If the WARN_AS_ERROR tag is set to YES then Doxygen will immediately stop when +# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS +# then Doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the Doxygen process Doxygen will return with a non-zero status. +# If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS_PRINT then Doxygen behaves +# like FAIL_ON_WARNINGS but in case no WARN_LOGFILE is defined Doxygen will not +# write the warning messages in between other messages but write them at the end +# of a run, in case a WARN_LOGFILE is defined the warning messages will be +# besides being in the defined file also be shown at the end of a run, unless +# the WARN_LOGFILE is defined as - i.e. standard output (stdout) in that case +# the behavior will remain as with the setting FAIL_ON_WARNINGS. +# Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that Doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# See also: WARN_LINE_FORMAT +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# In the $text part of the WARN_FORMAT command it is possible that a reference +# to a more specific place is given. To make it easier to jump to this place +# (outside of Doxygen) the user can define a custom "cut" / "paste" string. +# Example: +# WARN_LINE_FORMAT = "'vi $file +$line'" +# See also: WARN_FORMAT +# The default value is: at line $line of file $file. + +WARN_LINE_FORMAT = "at line $line of file $file" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). In case the file specified cannot be opened for writing the +# warning and error messages are written to standard error. When as file - is +# specified the warning and error messages are written to standard output +# (stdout). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = Assets/Apple.StoreKit/Source + +# This tag can be used to specify the character encoding of the source files +# that Doxygen parses. Internally Doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: +# https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# See also: INPUT_FILE_ENCODING +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# This tag can be used to specify the character encoding of the source files +# that Doxygen parses. The INPUT_FILE_ENCODING tag can be used to specify +# character encoding on a per file pattern basis. Doxygen will compare the file +# name with each pattern and apply the encoding instead of the default +# INPUT_ENCODING if there is a match. The character encodings are a list of the +# form: pattern=encoding (like *.php=ISO-8859-1). +# See also: INPUT_ENCODING for further information on supported encodings. + +INPUT_FILE_ENCODING = + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by Doxygen. +# +# Note the list of default checked file patterns might differ from the list of +# default file extension mappings. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm, +# *.cpp, *.cppm, *.ccm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, +# *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, +# *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be +# provided as Doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cxxm \ + *.cpp \ + *.cppm \ + *.ccm \ + *.c++ \ + *.c++m \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.idl \ + *.ddl \ + *.odl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.l \ + *.cs \ + *.d \ + *.php \ + *.php4 \ + *.php5 \ + *.phtml \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.pyw \ + *.f90 \ + *.f95 \ + *.f03 \ + *.f08 \ + *.f18 \ + *.f \ + *.for \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf \ + *.ice + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which Doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# ANamespace::AClass, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that Doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that Doxygen will use the data processed and written to standard output +# for further processing, therefore nothing else, like debug statements or used +# commands (so in case of a Windows batch file always use @echo OFF), should be +# written to standard output. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by Doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by Doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the Doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +# If the IMPLICIT_DIR_DOCS tag is set to YES, any README.md file found in sub- +# directories of the project's root, is used as the documentation for that sub- +# directory, except when the README.md starts with a \dir, \page or \mainpage +# command. If set to NO, the README.md file needs to start with an explicit \dir +# command in order to be used as directory documentation. +# The default value is: YES. + +IMPLICIT_DIR_DOCS = YES + +# The Fortran standard specifies that for fixed formatted Fortran code all +# characters from position 72 are to be considered as comment. A common +# extension is to allow longer lines before the automatic comment starts. The +# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can +# be processed before the automatic comment starts. +# Minimum value: 7, maximum value: 10000, default value: 72. + +FORTRAN_COMMENT_AFTER = 72 + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# multi-line macros, enums or list initialized variables directly into the +# documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct Doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# entity all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of Doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see https://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by Doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then Doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) +# that should be ignored while generating the index headers. The IGNORE_PREFIX +# tag works for classes, function and member names. The entity will be placed in +# the alphabetical list under the first letter of the entity name that remains +# after removing the prefix. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, Doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank Doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that Doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that Doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of Doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank Doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that Doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank Doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that Doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by Doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). +# Note: Since the styling of scrollbars can currently not be overruled in +# Webkit/Chromium, the styling will be left out of the default doxygen.css if +# one or more extra stylesheets have been specified. So if scrollbar +# customization is desired it has to be added explicitly. For an example see the +# documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output +# should be rendered with a dark or light theme. +# Possible values are: LIGHT always generates light mode output, DARK always +# generates dark mode output, AUTO_LIGHT automatically sets the mode according +# to the user preference, uses light mode if no preference is set (the default), +# AUTO_DARK automatically sets the mode according to the user preference, uses +# dark mode if no preference is set and TOGGLE allows a user to switch between +# light and dark mode via a button. +# The default value is: AUTO_LIGHT. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE = AUTO_LIGHT + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a color-wheel, see +# https://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use gray-scales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via JavaScript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have JavaScript, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# If the HTML_CODE_FOLDING tag is set to YES then classes and functions can be +# dynamically folded and expanded in the generated HTML source code. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_CODE_FOLDING = YES + +# If the HTML_COPY_CLIPBOARD tag is set to YES then Doxygen will show an icon in +# the top right corner of code and text fragments that allows the user to copy +# its content to the clipboard. Note this only works if supported by the browser +# and the web page is served via a secure context (see: +# https://www.w3.org/TR/secure-contexts/), i.e. using the https: or file: +# protocol. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COPY_CLIPBOARD = YES + +# Doxygen stores a couple of settings persistently in the browser (via e.g. +# cookies). By default these settings apply to all HTML pages generated by +# Doxygen across all projects. The HTML_PROJECT_COOKIE tag can be used to store +# the settings under a project specific key, such that the user preferences will +# be stored separately. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_PROJECT_COOKIE = + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: +# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To +# create a documentation set, Doxygen will generate a Makefile in the HTML +# output directory. Running make will produce the docset in that directory and +# running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy +# genXcode/_index.html for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag determines the URL of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDURL = + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then Doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# on Windows. In the beginning of 2021 Microsoft took the original page, with +# a.o. the download links, offline (the HTML help workshop was already many +# years in maintenance mode). You can download the HTML help workshop from the +# web archives at Installation executable (see: +# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo +# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by Doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# Doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the main .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# The SITEMAP_URL tag is used to specify the full URL of the place where the +# generated documentation will be placed on the server by the user during the +# deployment of the documentation. The generated sitemap is called sitemap.xml +# and placed on the directory specified by HTML_OUTPUT. In case no SITEMAP_URL +# is specified no sitemap is generated. For information about the sitemap +# protocol see https://www.sitemaps.org +# This tag requires that the tag GENERATE_HTML is set to YES. + +SITEMAP_URL = + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location (absolute path +# including file name) of Qt's qhelpgenerator. If non-empty Doxygen will try to +# run qhelpgenerator on the generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine tune the look of the index (see "Fine-tuning the output"). As an +# example, the default style sheet generated by Doxygen has an example that +# shows how to put an image at the root of the tree instead of the PROJECT_NAME. +# Since the tree basically has more details information than the tab index, you +# could consider setting DISABLE_INDEX to YES when enabling this option. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = YES + +# When GENERATE_TREEVIEW is set to YES, the PAGE_OUTLINE_PANEL option determines +# if an additional navigation panel is shown at the right hand side of the +# screen, displaying an outline of the contents of the main page, similar to +# e.g. https://developer.android.com/reference If GENERATE_TREEVIEW is set to +# NO, this option has no effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +PAGE_OUTLINE_PANEL = YES + +# When GENERATE_TREEVIEW is set to YES, the FULL_SIDEBAR option determines if +# the side bar is limited to only the treeview area (value NO) or if it should +# extend to the full height of the window (value YES). Setting this to YES gives +# a layout similar to e.g. https://docs.readthedocs.io with more room for +# contents, but less room for the project logo, title, and description. If +# GENERATE_TREEVIEW is set to NO, this option has no effect. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FULL_SIDEBAR = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# Doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# When the SHOW_ENUM_VALUES tag is set doxygen will show the specified +# enumeration values besides the enumeration mnemonics. +# The default value is: NO. + +SHOW_ENUM_VALUES = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, Doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# If the OBFUSCATE_EMAILS tag is set to YES, Doxygen will obfuscate email +# addresses. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +OBFUSCATE_EMAILS = YES + +# If the HTML_FORMULA_FORMAT option is set to svg, Doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png (the default) and svg (looks nicer but requires the +# pdf2svg or inkscape tool). +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = png + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# Doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. + +FORMULA_MACROFILE = + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# https://www.mathjax.org) which uses client side JavaScript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. +# Note that the different versions of MathJax have different requirements with +# regards to the different settings, so it is possible that also other MathJax +# settings have to be changed when switching between the different MathJax +# versions. +# Possible values are: MathJax_2, MathJax_3 and MathJax_4. +# The default value is: MathJax_2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_VERSION = MathJax_2 + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. For more details about the output format see MathJax +# version 2 (see: +# https://docs.mathjax.org/en/v2.7/output.html), MathJax version 3 (see: +# https://docs.mathjax.org/en/v3.2/output/index.html) and MathJax version 4 +# (see: +# https://docs.mathjax.org/en/v4.0/output/index.htm). +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility. This is the name for Mathjax version 2, for MathJax version 3 +# this will be translated into chtml), NativeMML (i.e. MathML. Only supported +# for MathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This +# is the name for Mathjax version 3, for MathJax version 2 this will be +# translated into HTML-CSS) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. For Mathjax version 2 the +# destination directory should contain the MathJax.js script. For instance, if +# the mathjax directory is located at the same level as the HTML output +# directory, then MATHJAX_RELPATH should be ../mathjax.s For Mathjax versions 3 +# and 4 the destination directory should contain the tex-.js script +# (where is either chtml or svg). The default value points to the +# MathJax Content Delivery Network so you can quickly see the result without +# installing MathJax. However, it is strongly recommended to install a local +# copy of MathJax from https://www.mathjax.org before deployment. The default +# value is: +# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 +# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 +# - in case of MathJax version 4: https://cdn.jsdelivr.net/npm/mathjax@4 +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# for MathJax version 2 (see https://docs.mathjax.org/en/v2.7/tex.html): +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# For example for MathJax version 3 (see +# https://docs.mathjax.org/en/v3.2/input/tex/extensions/): +# MATHJAX_EXTENSIONS = ams +# For example for MathJax version 4 (see +# https://docs.mathjax.org/en/v4.0/input/tex/extensions/): +# MATHJAX_EXTENSIONS = units +# Note that for Mathjax version 4 quite a few extensions are already +# automatically loaded. To disable a package in Mathjax version 4 one can use +# the package name prepended with a minus sign (- like MATHJAX_EXTENSIONS += +# -textmacros) +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with JavaScript pieces +# of code that will be used on startup of the MathJax code. See the Mathjax site +# for more details: +# - MathJax version 2 (see: +# https://docs.mathjax.org/en/v2.7/) +# - MathJax version 3 (see: +# https://docs.mathjax.org/en/v3.2/) +# - MathJax version 4 (see: +# https://docs.mathjax.org/en/v4.0/) For an example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled Doxygen will generate a search box for +# the HTML output. The underlying search engine uses JavaScript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the JavaScript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /