From a3619545b478a7dbfb68841d47e1f45dcb304ac1 Mon Sep 17 00:00:00 2001 From: Andrew Hall Date: Thu, 11 Dec 2025 15:16:40 -0800 Subject: [PATCH 01/26] Fix #60 (#74) GKGameActivity has a static initializer that was being called regardless of system support. The static initializer needs to check availability first. --- .../Assets/Apple.GameKit/Source/GKGameActivity.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 281970fd..46e56e83 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 @@ -32,7 +32,10 @@ public class GKGameActivity : NSObject static GKGameActivity() { - Interop.GKGameActivity_SetWantsToPlayCallback(OnWantsToPlay); + if (Availability.IsTypeAvailable()) + { + Interop.GKGameActivity_SetWantsToPlayCallback(OnWantsToPlay); + } } #if IOS_19_BETA_1_WANTSTOPLAY_MAIN_THREAD_WORKAROUND From 1fd5b4356cecdd562aabf35ef7157460d6eb82ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=CC=87lter=20Bilgu=CC=88ven?= Date: Wed, 5 Feb 2025 14:35:22 +0300 Subject: [PATCH 02/26] fix: UnityPickers.AssetPickerDrawer throws exception when fieldInfo is null --- .../Editor/UnityPickers/AssetPickerDrawer.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Editor/UnityPickers/AssetPickerDrawer.cs b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Editor/UnityPickers/AssetPickerDrawer.cs index 669dbfc3..f07c195f 100644 --- a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Editor/UnityPickers/AssetPickerDrawer.cs +++ b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Editor/UnityPickers/AssetPickerDrawer.cs @@ -10,6 +10,13 @@ public class AssetPickerDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { + if (fieldInfo == null) + { + // If fieldInfo is null, draw the property field as is. + EditorGUI.PropertyField(position, property, label); + return; + } + var assetType = fieldInfo.FieldType; if (assetType.IsUnityCollection()) assetType = assetType.GetElementType(); From 9477dd7923e2be347646bf72f6ba2219cbbf1d56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=CC=87lter=20Bilgu=CC=88ven?= Date: Wed, 5 Feb 2025 14:51:27 +0300 Subject: [PATCH 03/26] fix: UnityPickers.AssetPickerDrawer throws exception when assetType is null --- .../Editor/UnityPickers/AssetPickerDrawer.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Editor/UnityPickers/AssetPickerDrawer.cs b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Editor/UnityPickers/AssetPickerDrawer.cs index f07c195f..adf72ef0 100644 --- a/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Editor/UnityPickers/AssetPickerDrawer.cs +++ b/plug-ins/Apple.CoreHaptics/Apple.CoreHaptics_Unity/Assets/Apple.CoreHaptics/Editor/UnityPickers/AssetPickerDrawer.cs @@ -22,7 +22,11 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten assetType = assetType.GetElementType(); if (assetType == null) + { + // If assetType is null, draw the property field as is. + EditorGUI.PropertyField(position, property, label); return; + } var a = fieldInfo.GetAttribute(); From 4a7481eac586b14ed36c6b0d85191d0c49ec248f Mon Sep 17 00:00:00 2001 From: Joaquim Lobo Silva Date: Mon, 2 Feb 2026 11:52:29 -0800 Subject: [PATCH 04/26] Accessibility: Audio Descriptions support Add the ability to check whether or not Audio Descriptions are enabled --- .../AccessibilitySettings.cs | 36 +++++++++++++++++++ .../AppleAccessibilityBridge.m | 24 +++++++++++++ 2 files changed, 60 insertions(+) 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..6e98f91f 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; } @@ -780,6 +803,19 @@ private static void _UnityAX_UIAccessibilityIsOnOffSwitchLabelsEnabledDidChangeN } #endif +#if (UNITY_IOS || UNITY_TVOS) && !UNITY_EDITOR + private delegate void UIAccessibilityIsAudioDescriptionEnabledDidChangeNotificationDelegate(); + + [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/Native/AppleAccessibility/AppleAccessibilityBridge.m b/plug-ins/Apple.Accessibility/Native/AppleAccessibility/AppleAccessibilityBridge.m index 92f0d737..9ca44eca 100644 --- a/plug-ins/Apple.Accessibility/Native/AppleAccessibility/AppleAccessibilityBridge.m +++ b/plug-ins/Apple.Accessibility/Native/AppleAccessibility/AppleAccessibilityBridge.m @@ -7,6 +7,7 @@ #import #import +#import #import #import #import "AppleAccessibilitySafeOverride.h" @@ -365,6 +366,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 @@ -548,6 +563,14 @@ - (void)_accessibilityStatusChangedCallback:(NSNotification *)notification { return; } } + if ( [notification.name isEqualToString:(__bridge NSString *)kMAAudibleMediaSettingsChangedNotification] ) + { + if ( __axIsAudioDescriptionEnabledDidChangeNotificationDelegate != NULL ) + { + __axIsAudioDescriptionEnabledDidChangeNotificationDelegate(); + } + return; + } } @end @@ -601,6 +624,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 ) From f883ce21d6e63ccff157bbfc4d1e449765a4266c Mon Sep 17 00:00:00 2001 From: Gabriel Jacoby-Cooper Date: Tue, 10 Mar 2026 19:30:02 -0700 Subject: [PATCH 05/26] rdar://172239633 (Plug-In Builds Fail When Source Root Has Space Character in Path) --- .../xcschemes/iOS - Debug.xcscheme | 2 +- .../xcschemes/iOS - Release.xcscheme | 2 +- .../xcschemes/tvOS - Debug.xcscheme | 2 +- .../xcschemes/tvOS - Release.xcscheme | 2 +- .../xcschemes/iOS - Debug.xcscheme | 2 +- .../xcschemes/iOS - Release.xcscheme | 2 +- .../xcschemes/macOS - Debug.xcscheme | 2 +- .../xcschemes/macOS - Release.xcscheme | 2 +- .../xcschemes/tvOS - Debug.xcscheme | 2 +- .../xcschemes/tvOS - Release.xcscheme | 2 +- .../xcschemes/visionOS - Debug.xcscheme | 2 +- .../xcschemes/visionOS - Release.xcscheme | 2 +- .../xcschemes/iOS - Debug.xcscheme | 2 +- .../xcschemes/iOS - Release.xcscheme | 2 +- .../xcschemes/macOS - Debug.xcscheme | 2 +- .../xcschemes/macOS - Release.xcscheme | 2 +- .../xcschemes/tvOS - Debug.xcscheme | 2 +- .../xcschemes/tvOS - Release.xcscheme | 2 +- .../xcschemes/visionOS - Debug.xcscheme | 2 +- .../xcschemes/visionOS - Release.xcscheme | 2 +- .../xcschemes/iOS - Debug.xcscheme | 2 +- .../xcschemes/iOS - Release.xcscheme | 2 +- .../xcschemes/macOS - Debug.xcscheme | 2 +- .../xcschemes/macOS - Release.xcscheme | 2 +- .../xcschemes/tvOS - Debug.xcscheme | 2 +- .../xcschemes/tvOS - Release.xcscheme | 2 +- .../xcschemes/visionOS - Debug.xcscheme | 2 +- .../xcschemes/visionOS - Release.xcscheme | 2 +- .../xcschemes/iOS - Debug.xcscheme | 2 +- .../xcschemes/iOS - Release.xcscheme | 2 +- .../xcschemes/macOS - Debug.xcscheme | 2 +- .../xcschemes/macOS - Release.xcscheme | 2 +- .../xcschemes/tvOS - Debug.xcscheme | 2 +- .../xcschemes/tvOS - Release.xcscheme | 2 +- .../xcschemes/visionOS - Debug.xcscheme | 2 +- .../xcschemes/visionOS - Release.xcscheme | 2 +- .../xcschemes/iOS - Debug.xcscheme | 2 +- .../xcschemes/iOS - Release.xcscheme | 2 +- .../xcschemes/macOS - Debug.xcscheme | 2 +- .../xcschemes/macOS - Release.xcscheme | 2 +- .../xcschemes/tvOS - Debug.xcscheme | 2 +- .../xcschemes/tvOS - Release.xcscheme | 2 +- .../xcschemes/visionOS - Debug.xcscheme | 2 +- .../xcschemes/visionOS - Release.xcscheme | 2 +- .../xcschemes/visionOS - Debug.xcscheme | 2 +- .../xcschemes/visionOS - Release.xcscheme | 2 +- scripts/shell/copy_native_libraries.sh | 18 +++++++++--------- 47 files changed, 55 insertions(+), 55 deletions(-) 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 "> + 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 "> + 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 "> + 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 "> Date: Thu, 19 Mar 2026 15:10:05 -0700 Subject: [PATCH 06/26] rdar://166326954 ([Unity Plug-ins] Add unity API for triggerForArcade(handler:)) https://developer.apple.com/documentation/gamekit/gkaccesspoint/triggerforarcade(handler:) --- .../Scenes/GameKit_Sample.unity | 375 ++++++++++++++---- .../Scripts/AccessPointPanel.cs | 19 + .../Apple.GameKit/Source/GKAccessPoint.cs | 14 + .../Native/GameKitWrapper/GKAccessPoint.swift | 25 ++ 4 files changed, 363 insertions(+), 70 deletions(-) diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Demos/Apple.GameKit.Sample/Scenes/GameKit_Sample.unity b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Demos/Apple.GameKit.Sample/Scenes/GameKit_Sample.unity index 6d37b809..ee1e2478 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Demos/Apple.GameKit.Sample/Scenes/GameKit_Sample.unity +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Demos/Apple.GameKit.Sample/Scenes/GameKit_Sample.unity @@ -153,10 +153,10 @@ RectTransform: - {fileID: 951309303} m_Father: {fileID: 116163517} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 0, y: -50} - m_SizeDelta: {x: 1089.9274, y: 50} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 50} m_Pivot: {x: 0, y: 1} --- !u!114 &40052927 MonoBehaviour: @@ -437,7 +437,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 0, y: -225} - m_SizeDelta: {x: 373, y: 50} + m_SizeDelta: {x: 917.5129, y: 50} m_Pivot: {x: 0, y: 1} --- !u!114 &40919616 MonoBehaviour: @@ -1123,6 +1123,160 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 71106025} m_CullTransparentMesh: 1 +--- !u!1 &73618543 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 73618544} + - component: {fileID: 73618548} + - component: {fileID: 73618547} + - component: {fileID: 73618546} + - component: {fileID: 73618545} + m_Layer: 5 + m_Name: TriggerForArcade Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &73618544 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 73618543} + 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: 1312905616} + m_Father: {fileID: 1070270903} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: -375} + m_SizeDelta: {x: 917.5129, y: 50} + m_Pivot: {x: 0, y: 1} +--- !u!114 &73618545 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 73618543} + 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: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 50 + m_FlexibleWidth: 1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &73618546 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 73618543} + 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: 73618547} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 260017488} + m_TargetAssemblyTypeName: Apple.GameKit.Sample.AccessPointPanel, Apple.Arcade.GameKit.Sample + m_MethodName: OnTriggerForArcade + m_Mode: 1 + 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 +--- !u!114 &73618547 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 73618543} + 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 &73618548 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 73618543} + m_CullTransparentMesh: 0 --- !u!1 &83650410 GameObject: m_ObjectHideFlags: 0 @@ -1428,10 +1582,10 @@ RectTransform: - {fileID: 2049336023} m_Father: {fileID: 213230003} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 544.9637, y: -100} - m_SizeDelta: {x: 1089.9274, y: 100} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 100} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &116163518 MonoBehaviour: @@ -1468,7 +1622,7 @@ CanvasGroup: m_GameObject: {fileID: 116163516} m_Enabled: 1 m_Alpha: 1 - m_Interactable: 1 + m_Interactable: 0 m_BlocksRaycasts: 1 m_IgnoreParentGroups: 0 --- !u!1 &122634004 @@ -2860,7 +3014,7 @@ MonoBehaviour: m_ChildForceExpandWidth: 1 m_ChildForceExpandHeight: 0 m_ChildControlWidth: 1 - m_ChildControlHeight: 1 + m_ChildControlHeight: 0 m_ChildScaleWidth: 0 m_ChildScaleHeight: 1 m_ReverseArrangement: 0 @@ -2921,6 +3075,7 @@ MonoBehaviour: _triggerForChallengesButton: {fileID: 0} _triggerForPlayTogetherButton: {fileID: 716492892} _triggerForFriendingButton: {fileID: 1211429027} + _triggerForArcadeButton: {fileID: 0} --- !u!1 &276980308 GameObject: m_ObjectHideFlags: 0 @@ -3390,10 +3545,10 @@ RectTransform: - {fileID: 635372228} m_Father: {fileID: 116163517} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 0, y: -450} - m_SizeDelta: {x: 1089.9274, y: 50} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 50} m_Pivot: {x: 0, y: 1} --- !u!114 &294305322 MonoBehaviour: @@ -3942,10 +4097,10 @@ RectTransform: - {fileID: 1303485082} m_Father: {fileID: 116163517} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 0, y: -200} - m_SizeDelta: {x: 1089.9274, y: 50} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 50} m_Pivot: {x: 0, y: 1} --- !u!114 &412680050 MonoBehaviour: @@ -4507,10 +4662,10 @@ RectTransform: - {fileID: 1603917834} m_Father: {fileID: 116163517} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 0, y: -300} - m_SizeDelta: {x: 1089.9274, y: 50} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 50} m_Pivot: {x: 0, y: 1} --- !u!114 &440151477 MonoBehaviour: @@ -5275,10 +5430,10 @@ RectTransform: - {fileID: 732951070} m_Father: {fileID: 116163517} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 0, y: -400} - m_SizeDelta: {x: 1089.9274, y: 50} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 50} m_Pivot: {x: 0, y: 1} --- !u!114 &562618468 MonoBehaviour: @@ -5812,7 +5967,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 0, y: -50} - m_SizeDelta: {x: 373, y: 50} + m_SizeDelta: {x: 917.5129, y: 50} m_Pivot: {x: 0, y: 1} --- !u!114 &615126189 MonoBehaviour: @@ -6787,7 +6942,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 0, y: -275} - m_SizeDelta: {x: 373, y: 50} + m_SizeDelta: {x: 917.5129, y: 50} m_Pivot: {x: 0, y: 1} --- !u!114 &716492891 MonoBehaviour: @@ -7717,8 +7872,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 186.5, y: -212.5} - m_SizeDelta: {x: 373, y: 25} + m_AnchoredPosition: {x: 458.75644, y: -212.5} + m_SizeDelta: {x: 917.5129, y: 25} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &812086659 MonoBehaviour: @@ -9357,8 +9512,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 196.5, y: -42.5} - m_SizeDelta: {x: 373, y: 25} + m_AnchoredPosition: {x: 468.75644, y: -42.5} + m_SizeDelta: {x: 917.5129, y: 25} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &962578470 MonoBehaviour: @@ -9911,10 +10066,10 @@ RectTransform: - {fileID: 1152895801} m_Father: {fileID: 213230003} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 544.9637, y: -25} - m_SizeDelta: {x: 1089.9274, y: 50} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 50} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1050369992 MonoBehaviour: @@ -10186,12 +10341,13 @@ RectTransform: - {fileID: 40919615} - {fileID: 716492890} - {fileID: 1211429025} + - {fileID: 73618544} m_Father: {fileID: 260017484} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 196.5, y: -242.5} - m_SizeDelta: {x: 373, y: 375} + m_AnchoredPosition: {x: 468.75644, y: -316.9255} + m_SizeDelta: {x: 917.5129, y: 523.851} m_Pivot: {x: 0.5, y: 0.5} --- !u!225 &1070270905 CanvasGroup: @@ -10229,7 +10385,7 @@ MonoBehaviour: m_ChildControlWidth: 1 m_ChildControlHeight: 1 m_ChildScaleWidth: 0 - m_ChildScaleHeight: 1 + m_ChildScaleHeight: 0 m_ReverseArrangement: 0 --- !u!1 &1079024731 GameObject: @@ -10265,10 +10421,10 @@ RectTransform: - {fileID: 1083469213} m_Father: {fileID: 116163517} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 1089.9274, y: 50} + m_SizeDelta: {x: 0, y: 50} m_Pivot: {x: 0, y: 1} --- !u!114 &1079024733 MonoBehaviour: @@ -11111,10 +11267,10 @@ RectTransform: - {fileID: 1994114257} m_Father: {fileID: 116163517} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 0, y: -150} - m_SizeDelta: {x: 1089.9274, y: 50} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 50} m_Pivot: {x: 0, y: 1} --- !u!114 &1183707453 MonoBehaviour: @@ -11880,7 +12036,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 0, y: -325} - m_SizeDelta: {x: 373, y: 50} + m_SizeDelta: {x: 917.5129, y: 50} m_Pivot: {x: 0, y: 1} --- !u!114 &1211429026 MonoBehaviour: @@ -13154,6 +13310,85 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1303485081} m_CullTransparentMesh: 0 +--- !u!1 &1312905615 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1312905616} + - component: {fileID: 1312905618} + - component: {fileID: 1312905617} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1312905616 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1312905615} + 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: 73618544} + 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 &1312905617 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1312905615} + 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: 14 + m_FontStyle: 0 + m_BestFit: 1 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: TriggerForArcade +--- !u!222 &1312905618 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1312905615} + m_CullTransparentMesh: 0 --- !u!1 &1329439375 GameObject: m_ObjectHideFlags: 0 @@ -13595,7 +13830,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 373, y: 50} + m_SizeDelta: {x: 917.5129, y: 50} m_Pivot: {x: 0, y: 1} --- !u!114 &1371854413 MonoBehaviour: @@ -14965,8 +15200,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 186.5, y: -175} - m_SizeDelta: {x: 373, y: 50} + m_AnchoredPosition: {x: 458.75644, y: -175} + m_SizeDelta: {x: 917.5129, y: 50} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1504392416 MonoBehaviour: @@ -15653,10 +15888,10 @@ RectTransform: - {fileID: 1229046494} m_Father: {fileID: 116163517} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 0, y: -350} - m_SizeDelta: {x: 1089.9274, y: 50} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 50} m_Pivot: {x: 0, y: 1} --- !u!114 &1532177100 MonoBehaviour: @@ -16082,10 +16317,10 @@ RectTransform: - {fileID: 1814723053} m_Father: {fileID: 116163517} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 0, y: -100} - m_SizeDelta: {x: 1089.9274, y: 50} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 50} m_Pivot: {x: 0, y: 1} --- !u!114 &1592456518 MonoBehaviour: @@ -16749,8 +16984,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 196.5, y: -17.5} - m_SizeDelta: {x: 373, y: 25} + m_AnchoredPosition: {x: 468.75644, y: -17.5} + m_SizeDelta: {x: 917.5129, y: 25} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &1632291091 MonoBehaviour: @@ -20972,7 +21207,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 0, y: -100} - m_SizeDelta: {x: 373, y: 50} + m_SizeDelta: {x: 917.5129, y: 50} m_Pivot: {x: 0, y: 1} --- !u!114 &2002955071 MonoBehaviour: @@ -21823,10 +22058,10 @@ RectTransform: - {fileID: 968081232} m_Father: {fileID: 116163517} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 0, y: -500} - m_SizeDelta: {x: 1089.9274, y: 50} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 50} m_Pivot: {x: 0, y: 1} --- !u!1 &2053992938 GameObject: @@ -22396,10 +22631,10 @@ RectTransform: - {fileID: 1495230046} m_Father: {fileID: 116163517} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 0, y: -250} - m_SizeDelta: {x: 1089.9274, y: 50} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 50} m_Pivot: {x: 0, y: 1} --- !u!114 &2091184685 MonoBehaviour: diff --git a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Demos/Apple.GameKit.Sample/Scripts/AccessPointPanel.cs b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Demos/Apple.GameKit.Sample/Scripts/AccessPointPanel.cs index 58ff54fd..712a979a 100644 --- a/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Demos/Apple.GameKit.Sample/Scripts/AccessPointPanel.cs +++ b/plug-ins/Apple.GameKit/Apple.GameKit_Unity/Assets/Apple.GameKit/Demos/Apple.GameKit.Sample/Scripts/AccessPointPanel.cs @@ -15,6 +15,7 @@ public class AccessPointPanel : MonoBehaviour [SerializeField] Button _triggerForChallengesButton = default; [SerializeField] Button _triggerForPlayTogetherButton = default; [SerializeField] Button _triggerForFriendingButton = default; + [SerializeField] Button _triggerForArcadeButton = default; private readonly bool IsAccessPointAvailable = Availability.IsTypeAvailable(); @@ -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..754e0543 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,18 @@ public Task TriggerForFriending() } #endif + /// + /// Brings up the arcade view. + /// + /// c:objc(cs)GKAccessPoint(im)triggerAccessPointForArcadeWithHandler: + [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; + } + #if UNITY_IOS || UNITY_STANDALONE_OSX /// /// Brings up the game activity play together flow for the provided definition. @@ -338,6 +350,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/Native/GameKitWrapper/GKAccessPoint.swift b/plug-ins/Apple.GameKit/Native/GameKitWrapper/GKAccessPoint.swift index f25dfd0d..d041a79b 100644 --- a/plug-ins/Apple.GameKit/Native/GameKitWrapper/GKAccessPoint.swift +++ b/plug-ins/Apple.GameKit/Native/GameKitWrapper/GKAccessPoint.swift @@ -354,6 +354,31 @@ public func GKAccessPoint_TriggerForFriending } #endif +#if os(iOS) || os(macOS) +@_cdecl("GKAccessPoint_TriggerForArcade") +public func GKAccessPoint_TriggerForArcade +( + pointer: UnsafeMutableRawPointer, // GKAccessPoint + taskId: Int64, + onSuccess: @escaping SuccessTaskCallback, + onError: @escaping NSErrorTaskCallback +) +{ + if #available(iOS 26.2, macOS 26.2, *) { + let target: GKAccessPoint = pointer.takeUnretainedValue(); + if (!target.isPresentingGameCenter) { + target.triggerForArcade(handler: { + onSuccess(taskId); + }); + } else { + onError(taskId, NSError(code: GKErrorCodeExtension.gameCenterDashboardAlreadyShown).passRetainedUnsafeMutablePointer()); + } + } else { + onError(taskId, NSError(code: GKErrorCodeExtension.unsupportedOperationForOSVersion).passRetainedUnsafeMutablePointer()); + } +} +#endif + @_cdecl("GKAccessPoint_GetLocation") public func GKAccessPoint_GetLocation ( From ceb79cc7dba963f2cbd14f378e8444a095e50100 Mon Sep 17 00:00:00 2001 From: Andrew Hall Date: Wed, 1 Apr 2026 13:59:13 -0700 Subject: [PATCH 07/26] fix: move @available attribute to extension in GKGameActivityDelegate (#95) GKGameActivityListener requires iOS/macOS/tvOS/visionOS 26.0+, so the @available attribute must be on the extension declaration rather than on the individual method to avoid a compile error referencing an unavailable protocol. --- .../Native/GameKitWrapper/GKGameActivityDelegate.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plug-ins/Apple.GameKit/Native/GameKitWrapper/GKGameActivityDelegate.swift b/plug-ins/Apple.GameKit/Native/GameKitWrapper/GKGameActivityDelegate.swift index 070b21fa..ed85b51a 100644 --- a/plug-ins/Apple.GameKit/Native/GameKitWrapper/GKGameActivityDelegate.swift +++ b/plug-ins/Apple.GameKit/Native/GameKitWrapper/GKGameActivityDelegate.swift @@ -19,9 +19,9 @@ class WantsToPlayActivityCompletionHandlerContainer : NSObject { public var completionHandler : WantsToPlayActivityCompletionHandler? = nil; } +@available(iOS 26.0, macOS 26.0, tvOS 26.0, visionOS 26.0, *) extension GKWLocalPlayerListener : GKGameActivityListener { - @available(iOS 26.0, macOS 26.0, tvOS 26.0, visionOS 26.0, *) public func player(_ player: GKPlayer, wantsToPlay activity: GKGameActivity, completionHandler completion: @escaping WantsToPlayActivityCompletionHandler) { guard let wantsToPlayActivity = WantsToPlayActivity else { completion(false); From 10569f5219b73aa195e0c10a39f1ce293eaefcca Mon Sep 17 00:00:00 2001 From: Andrew Hall Date: Thu, 23 Apr 2026 15:23:46 -0700 Subject: [PATCH 08/26] rdar://170262914 add [MarshalAs(UnmanagedType.I1)] to bool DllImport declarations (#100) * fix: add [MarshalAs(UnmanagedType.I1)] to bool DllImport declarations (rdar://170262914) Unity/Mono requires explicit marshaling attributes on bool return types and parameters in DllImport extern declarations. Without them, the C# bool (1 byte) may be incorrectly marshaled from the native bool (platform-dependent width), causing random incorrect values at runtime. --- .../Apple.Accessibility/AccessibilityNode.cs | 2 +- .../AccessibilitySettings.cs | 20 +++++++++++++++++++ .../CHHapticEngine/CHHapticEngineInterface.cs | 15 +++++++++----- .../CHHapticAdvancedPatternPlayerInterface.cs | 6 ++++-- .../CHHapticPlayerInterface.cs | 3 ++- .../Apple.GameKit/Source/GKAccessPoint.cs | 12 +++++++++-- .../Apple.GameKit/Source/GKAchievement.cs | 4 +++- .../Source/GKAchievementDescription.cs | 2 ++ .../Source/GKChallengeDefinition.cs | 3 ++- .../Apple.GameKit/Source/GKGameActivity.cs | 4 ++-- .../Source/GKGameActivityDefinition.cs | 2 ++ .../Apple.GameKit/Source/GKLocalPlayer.cs | 6 ++++++ .../Assets/Apple.GameKit/Source/GKPlayer.cs | 2 ++ .../Source/Leaderboards/GKLeaderboard.cs | 1 + .../Source/Multiplayer/GKInvite.cs | 1 + .../Source/Multiplayer/GKMatchmaker.cs | 4 ++-- .../Multiplayer/GKMatchmakerViewController.cs | 8 +++++--- .../Source/Multiplayer/GKTurnBasedMatch.cs | 4 ++-- .../GKTurnBasedMatchmakerViewController.cs | 3 ++- .../Source/Multiplayer/GKVoiceChat.cs | 6 ++++-- .../Scripts/SpatialControllerInternal.cs | 16 +++++++++++++++ 21 files changed, 99 insertions(+), 25 deletions(-) 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 97d914dc..6d373fed 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 @@ -869,7 +869,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(int identifier, int parentIdentifier, bool hasParent); + [DllImport("__Internal")] private static extern void _UnityAX_RegisterElementWithIdentifier(int identifier, int parentIdentifier, [MarshalAs(UnmanagedType.I1)] bool hasParent); [DllImport("__Internal")] private static extern void _UnityAX_UnregisterElementWithIdentifier(int identifier); private delegate string AccessibilityFrameDelegate(int 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 6e98f91f..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 @@ -558,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); @@ -571,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); @@ -584,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); @@ -597,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); @@ -610,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); @@ -623,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); @@ -637,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); @@ -650,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); @@ -663,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); @@ -676,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); @@ -689,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); @@ -702,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); @@ -715,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); @@ -728,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); @@ -741,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); @@ -754,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); @@ -767,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); @@ -780,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); @@ -793,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); @@ -806,6 +825,7 @@ private static void _UnityAX_UIAccessibilityIsOnOffSwitchLabelsEnabledDidChangeN #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); 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.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 754e0543..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,10 +244,12 @@ 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() { @@ -255,6 +257,7 @@ public Task TriggerForArcade() Interop.GKAccessPoint_TriggerForArcade(Pointer, taskId, OnTriggerSuccess, OnTriggerError); return tcs.Task; } +#endif #if UNITY_IOS || UNITY_STANDALONE_OSX /// @@ -307,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 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..092ace61 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(); @@ -469,6 +473,8 @@ private static class Interop public static extern void GKLocalPlayer_LoadDefaultLeaderboardIdentifier(IntPtr pointer, long taskId, SuccessTaskCallback onSuccess, NSErrorTaskCallback onError); [DllImport(InteropUtility.DLLName)] public static extern void GKLocalPlayer_SetDefaultLeaderboardIdentifier(IntPtr pointer, long taskId, IntPtr identifierPtr, SuccessTaskCallback onSuccess, NSErrorTaskCallback onError); + [DllImport(InteropUtility.DLLName)] + public static extern void GKLocalPlayer_RegisterLocalPlayerListener(); #if !UNITY_TVOS [DllImport(InteropUtility.DLLName)] public static extern void GKLocalPlayer_SaveGameData(IntPtr pointer, long taskId, IntPtr nsDataPtr, string name, SuccessTaskCallback onSuccess, NSErrorTaskCallback onError); 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.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); /// From 0dd77907cee14f6276060ddc26343cf08736882c Mon Sep 17 00:00:00 2001 From: Andrew Hall Date: Thu, 28 May 2026 14:16:26 -0700 Subject: [PATCH 09/26] Update gitignore for AI --- .gitignore | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index d13b1ae7..b8b670bc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,8 @@ +# AI +.claude +.etabli + +# Build Output Build/ TestBuilds/ scripts/python/__pycache__/ @@ -5,10 +10,14 @@ 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~/ + + From ce6a8bbf3389fec70502291ae061c083df759c7f Mon Sep 17 00:00:00 2001 From: Andrew Hall Date: Fri, 5 Jun 2026 15:20:00 -0700 Subject: [PATCH 10/26] Prepare for Xcode 27 --- README.md | 2 +- .../Accessibility.xcodeproj/project.pbxproj | 8 +-- .../AppleCoreNative.xcodeproj/project.pbxproj | 52 +++++++++---------- .../project.pbxproj | 52 +++++++++---------- .../project.pbxproj | 44 ++++++++-------- .../GameKitWrapper.xcodeproj/project.pbxproj | 32 ++++++------ .../project.pbxproj | 4 +- 7 files changed, 97 insertions(+), 97 deletions(-) diff --git a/README.md b/README.md index f1467f0c..a4adff8a 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ To get started with integration of these plug-ins into your Unity projects, run | OS | Version | | :- | :------ | | iOS | 15.6 | -| macOS | 11.5 | +| macOS | 12.0 | | tvOS | 15.6 | | visionOS | 1.3 | | watchOS | not supported | 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.Core/Native/AppleCoreNative.xcodeproj/project.pbxproj b/plug-ins/Apple.Core/Native/AppleCoreNative.xcodeproj/project.pbxproj index be90d6c4..7a848a5f 100644 --- a/plug-ins/Apple.Core/Native/AppleCoreNative.xcodeproj/project.pbxproj +++ b/plug-ins/Apple.Core/Native/AppleCoreNative.xcodeproj/project.pbxproj @@ -473,14 +473,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 +489,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 +507,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 +523,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 +582,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 +639,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 +661,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 +676,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 +693,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 +707,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 +724,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 +738,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 +755,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 +780,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 +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; }; 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.GameController/Native/GameControllerWrapper.xcodeproj/project.pbxproj b/plug-ins/Apple.GameController/Native/GameControllerWrapper.xcodeproj/project.pbxproj index 0f86776c..0cd3bf88 100644 --- a/plug-ins/Apple.GameController/Native/GameControllerWrapper.xcodeproj/project.pbxproj +++ b/plug-ins/Apple.GameController/Native/GameControllerWrapper.xcodeproj/project.pbxproj @@ -375,13 +375,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.GameControllerWrapper-visionOS"; PRODUCT_NAME = GameControllerWrapper; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -391,7 +391,7 @@ SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 7; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; WATCHOS_DEPLOYMENT_TARGET = ""; }; name = Debug; @@ -406,13 +406,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.GameControllerWrapper-visionOS"; PRODUCT_NAME = GameControllerWrapper; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -421,7 +421,7 @@ SUPPORTS_MACCATALYST = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 7; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; WATCHOS_DEPLOYMENT_TARGET = ""; }; name = Release; @@ -479,7 +479,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ""; - IPHONEOS_DEPLOYMENT_TARGET = 13.6; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -536,7 +536,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ""; - IPHONEOS_DEPLOYMENT_TARGET = 13.6; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; @@ -556,7 +556,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", @@ -570,7 +570,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; }; @@ -584,7 +584,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", @@ -597,7 +597,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; }; @@ -608,13 +608,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.GameControllerWrapper-macOS"; PRODUCT_NAME = GameControllerWrapper; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -623,7 +623,7 @@ SWIFT_OBJC_BRIDGING_HEADER = "GameControllerWrapper/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; @@ -635,13 +635,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.GameControllerWrapper-macOS"; PRODUCT_NAME = GameControllerWrapper; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -649,7 +649,7 @@ SKIP_INSTALL = YES; SWIFT_OBJC_BRIDGING_HEADER = "GameControllerWrapper/BridgingHeader-macOS.h"; SWIFT_VERSION = 5.0; - TVOS_DEPLOYMENT_TARGET = 13.0; + TVOS_DEPLOYMENT_TARGET = 15.0; WRAPPER_EXTENSION = bundle; }; name = Release; @@ -664,7 +664,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", @@ -679,7 +679,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; }; @@ -693,7 +693,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", @@ -707,7 +707,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.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.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; From 1c0cedb624aa1d0de76c5f21c325a85c093706ce Mon Sep 17 00:00:00 2001 From: Andrew Hall Date: Sun, 7 Jun 2026 19:13:15 -0700 Subject: [PATCH 11/26] Add a StoreKit plug-in (#105) Introduces the Apple.StoreKit Unity Plug-In, which exposes Apple's StoreKit 2 framework to Unity developers with a modern C# API for in-app purchases, subscriptions, and transaction management on iOS, macOS, tvOS, and visionOS. See https://developer.apple.com/storekit/ for more details --- README.md | 1 + build.py | 7 +- .../Assets/Apple.Core/Runtime/AsyncStream.cs | 254 + .../Apple.Core/Runtime/AsyncStream.cs.meta | 11 + .../Assets/Apple.Core/Runtime/Currency.cs | 39 + .../Apple.Core/Runtime/Currency.cs.meta | 11 + .../Apple.Core/Runtime/InteropDelegates.cs | 7 + .../Assets/Apple.Core/Runtime/InteropTasks.cs | 70 +- .../Assets/Apple.Core/Runtime/NSObject.cs | 2 +- .../Assets/Apple.Core/Runtime/SwiftArray.cs | 90 + .../Apple.Core/Runtime/SwiftArray.cs.meta | 2 + .../Apple.Core_Unity/Packages/manifest.json | 12 +- .../Packages/packages-lock.json | 56 +- .../ProjectSettings/MultiplayerManager.asset | 7 + .../ProjectSettings/ProjectVersion.txt | 4 +- .../AppleCoreNative.xcodeproj/project.pbxproj | 20 + .../Native/AppleCoreNative/Currency.swift | 31 + .../Native/AppleCoreNative/NSObject.m | 2 + .../Native/AppleCoreNative/NativeArray.swift | 28 + .../ProjectSettings/ProjectSettings.asset | 51 +- .../ProjectSettings/QualitySettings.asset | 128 +- plug-ins/Apple.StoreKit/.gitignore | 41 + .../Apple.StoreKit_Unity/.gitignore | 2 + .../Assets/Apple.StoreKit.meta | 8 + .../Assets/Apple.StoreKit/Demos.meta | 8 + .../Demos/Apple.StoreKit.Sample.meta | 8 + .../Apple.StoreKit.Sample.asmdef | 17 + .../Apple.StoreKit.Sample.asmdef.meta | 7 + .../Demos/Apple.StoreKit.Sample/Prefabs.meta | 8 + .../Prefabs/Product.prefab | 457 + .../Prefabs/Product.prefab.meta | 7 + .../Prefabs/TransactionItem.prefab | 260 + .../Prefabs/TransactionItem.prefab.meta | 7 + .../Apple.StoreKit.Sample/Sample.storekit | 83 + .../Sample.storekit.meta | 7 + .../Demos/Apple.StoreKit.Sample/Scenes.meta | 8 + .../Scenes/Apple.StoreKit.Sample.Scene.unity | 11088 ++++++++++++++++ .../Apple.StoreKit.Sample.Scene.unity.meta | 7 + .../Demos/Apple.StoreKit.Sample/Scripts.meta | 8 + .../AdvancedCommerceProductPanelComponent.cs | 134 + ...ancedCommerceProductPanelComponent.cs.meta | 2 + .../Scripts/AppStorePanelComponent.cs | 153 + .../Scripts/AppStorePanelComponent.cs.meta | 2 + .../Scripts/AppTransactionScript.cs | 73 + .../Scripts/AppTransactionScript.cs.meta | 2 + .../Scripts/EventsPanelComponent.cs | 159 + .../Scripts/EventsPanelComponent.cs.meta | 2 + .../Scripts/MenuComponent.cs | 56 + .../Scripts/MenuComponent.cs.meta | 2 + .../Scripts/NavigationComponent.cs | 58 + .../Scripts/NavigationComponent.cs.meta | 2 + .../ProductPromotionInfoPanelComponent.cs | 143 + ...ProductPromotionInfoPanelComponent.cs.meta | 2 + .../Scripts/ProductScript.cs | 136 + .../Scripts/ProductScript.cs.meta | 2 + .../Scripts/ProductsPanelComponent.cs | 147 + .../Scripts/ProductsPanelComponent.cs.meta | 2 + .../Scripts/SKOverlayComponent.cs | 45 + .../Scripts/SKOverlayComponent.cs.meta | 2 + .../SubscriptionStatusPanelComponent.cs | 127 + .../SubscriptionStatusPanelComponent.cs.meta | 2 + .../Scripts/TransactionItem.cs | 51 + .../Scripts/TransactionItem.cs.meta | 2 + .../Scripts/TransactionsPanelComponent.cs | 256 + .../TransactionsPanelComponent.cs.meta | 2 + .../Apple.StoreKit/Documentation~/StoreKit.md | 210 + .../Assets/Apple.StoreKit/Editor.meta | 8 + .../Editor/AppleStoreKitBuildStep.cs | 43 + .../Editor/AppleStoreKitBuildStep.cs.meta | 11 + .../Assets/Apple.StoreKit/README.md | 205 + .../Assets/Apple.StoreKit/README.md.meta | 7 + .../Assets/Apple.StoreKit/Source.meta | 8 + .../Source/AdvancedCommerceProduct.cs | 90 + .../Source/AdvancedCommerceProduct.cs.meta | 2 + .../Assets/Apple.StoreKit/Source/AppStore.cs | 213 + .../Apple.StoreKit/Source/AppStore.cs.meta | 2 + .../Apple.StoreKit/Source/AppTransaction.cs | 258 + .../Source/AppTransaction.cs.meta | 11 + .../Source/Apple.StoreKit.asmdef | 22 + .../Source/Apple.StoreKit.asmdef.meta | 7 + .../Apple.StoreKit/Source/InteropUtility.cs | 16 + .../Source/InteropUtility.cs.meta | 11 + .../Assets/Apple.StoreKit/Source/Message.cs | 159 + .../Apple.StoreKit/Source/Message.cs.meta | 2 + .../Assets/Apple.StoreKit/Source/Product.cs | 769 ++ .../Apple.StoreKit/Source/Product.cs.meta | 11 + .../Source/ProductPromotionInfo.cs | 229 + .../Source/ProductPromotionInfo.cs.meta | 2 + .../Apple.StoreKit/Source/PurchaseIntent.cs | 113 + .../Source/PurchaseIntent.cs.meta | 2 + .../Apple.StoreKit/Source/RenewalInfo.cs | 105 + .../Apple.StoreKit/Source/RenewalInfo.cs.meta | 2 + .../Assets/Apple.StoreKit/Source/SKOverlay.cs | 130 + .../Apple.StoreKit/Source/SKOverlay.cs.meta | 2 + .../Source/StoreKitException.cs | 27 + .../Source/StoreKitException.cs.meta | 11 + .../Apple.StoreKit/Source/Storefront.cs | 86 + .../Apple.StoreKit/Source/Storefront.cs.meta | 2 + .../Source/SubscriptionStatus.cs | 57 + .../Source/SubscriptionStatus.cs.meta | 2 + .../Apple.StoreKit/Source/Transaction.cs | 731 + .../Apple.StoreKit/Source/Transaction.cs.meta | 11 + .../Source/VerificationResult.cs | 402 + .../Source/VerificationResult.cs.meta | 2 + .../Assets/Apple.StoreKit/link.xml | 8 + .../Assets/Apple.StoreKit/link.xml.meta | 7 + .../Assets/Apple.StoreKit/package.json | 29 + .../Assets/Apple.StoreKit/package.json.meta | 7 + .../Apple.StoreKit_Unity/Assets/Scenes.meta | 8 + .../Assets/Scenes/SampleScene.unity | 267 + .../Assets/Scenes/SampleScene.unity.meta | 7 + .../Apple.StoreKit_Unity/Doxyfile | 2976 +++++ .../Packages/manifest.json | 41 + .../Packages/packages-lock.json | 374 + .../ProjectSettings/AudioManager.asset | 19 + .../ProjectSettings/ClusterInputManager.asset | 6 + .../ProjectSettings/DynamicsManager.asset | 34 + .../ProjectSettings/EditorBuildSettings.asset | 12 + .../ProjectSettings/EditorSettings.asset | 30 + .../ProjectSettings/GraphicsSettings.asset | 63 + .../ProjectSettings/InputManager.asset | 295 + .../ProjectSettings/MemorySettings.asset | 35 + .../ProjectSettings/MultiplayerManager.asset | 7 + .../ProjectSettings/NavMeshAreas.asset | 91 + .../PackageManagerSettings.asset | 35 + .../Settings.json | 5 + .../ProjectSettings/Physics2DSettings.asset | 56 + .../ProjectSettings/PresetManager.asset | 7 + .../ProjectSettings/ProjectSettings.asset | 944 ++ .../ProjectSettings/ProjectVersion.txt | 2 + .../ProjectSettings/QualitySettings.asset | 234 + .../SceneTemplateSettings.json | 121 + .../ProjectSettings/TagManager.asset | 43 + .../ProjectSettings/TimeManager.asset | 9 + .../UnityConnectSettings.asset | 36 + .../ProjectSettings/VFXManager.asset | 12 + .../VersionControlSettings.asset | 8 + .../ProjectSettings/XRSettings.asset | 10 + .../Native/StoreKit-iOS.xcconfig | 1 + .../Native/StoreKit-macOS.xcconfig | 1 + .../Native/StoreKit-tvOS.xcconfig | 1 + .../Native/StoreKit-visionOS.xcconfig | 1 + .../Apple.StoreKit/Native/StoreKit.xcconfig | 33 + .../StoreKitWrapper.xcodeproj/project.pbxproj | 943 ++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcschemes/iOS - Debug.xcscheme | 76 + .../xcschemes/iOS - Release.xcscheme | 85 + .../xcschemes/macOS - Debug.xcscheme | 85 + .../xcschemes/macOS - Release.xcscheme | 85 + .../xcschemes/tvOS - Debug.xcscheme | 85 + .../xcschemes/tvOS - Release.xcscheme | 85 + .../xcschemes/visionOS - Debug.xcscheme | 84 + .../xcschemes/visionOS - Release.xcscheme | 84 + .../AdvancedCommerceProduct.swift | 108 + .../Native/StoreKitWrapper/AppStore.swift | 157 + .../StoreKitWrapper/AppTransaction.swift | 181 + .../AppleCoreRuntimeShared.swift | 98 + .../Native/StoreKitWrapper/Message.swift | 102 + .../Native/StoreKitWrapper/Product.swift | 1031 ++ .../StoreKitWrapper/PurchaseIntent.swift | 53 + .../Native/StoreKitWrapper/SKOverlay.swift | 89 + .../Native/StoreKitWrapper/StoreKitBridge.h | 7 + .../Native/StoreKitWrapper/StoreKitWrapper.h | 15 + .../Native/StoreKitWrapper/Storefront.swift | 57 + .../Native/StoreKitWrapper/Transaction.swift | 770 ++ .../Native/StoreKitWrapper/UiUtilities.swift | 84 + .../StoreKitWrapper/VerificationResult.swift | 282 + scripts/python/upi_cli_argument_options.py | 1 + 170 files changed, 28880 insertions(+), 74 deletions(-) create mode 100644 plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/AsyncStream.cs create mode 100644 plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/AsyncStream.cs.meta create mode 100644 plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/Currency.cs create mode 100644 plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/Currency.cs.meta create mode 100644 plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/SwiftArray.cs create mode 100644 plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/SwiftArray.cs.meta create mode 100644 plug-ins/Apple.Core/Apple.Core_Unity/ProjectSettings/MultiplayerManager.asset create mode 100644 plug-ins/Apple.Core/Native/AppleCoreNative/Currency.swift create mode 100644 plug-ins/Apple.Core/Native/AppleCoreNative/NativeArray.swift create mode 100644 plug-ins/Apple.StoreKit/.gitignore create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/.gitignore create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Apple.StoreKit.Sample.asmdef create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Apple.StoreKit.Sample.asmdef.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Prefabs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Prefabs/Product.prefab create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Prefabs/Product.prefab.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Prefabs/TransactionItem.prefab create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Prefabs/TransactionItem.prefab.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Sample.storekit create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Sample.storekit.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scenes.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scenes/Apple.StoreKit.Sample.Scene.unity create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scenes/Apple.StoreKit.Sample.Scene.unity.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AdvancedCommerceProductPanelComponent.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AdvancedCommerceProductPanelComponent.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AppStorePanelComponent.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AppStorePanelComponent.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AppTransactionScript.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/AppTransactionScript.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/EventsPanelComponent.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/EventsPanelComponent.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/MenuComponent.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/MenuComponent.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/NavigationComponent.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/NavigationComponent.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductPromotionInfoPanelComponent.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductPromotionInfoPanelComponent.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductScript.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductScript.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductsPanelComponent.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/ProductsPanelComponent.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/SKOverlayComponent.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/SKOverlayComponent.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/SubscriptionStatusPanelComponent.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/SubscriptionStatusPanelComponent.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/TransactionItem.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/TransactionItem.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/TransactionsPanelComponent.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Demos/Apple.StoreKit.Sample/Scripts/TransactionsPanelComponent.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Documentation~/StoreKit.md create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Editor.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Editor/AppleStoreKitBuildStep.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Editor/AppleStoreKitBuildStep.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/README.md create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/README.md.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AdvancedCommerceProduct.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AdvancedCommerceProduct.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AppStore.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AppStore.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AppTransaction.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AppTransaction.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Apple.StoreKit.asmdef create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Apple.StoreKit.asmdef.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/InteropUtility.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/InteropUtility.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Message.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Message.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Product.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Product.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/ProductPromotionInfo.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/ProductPromotionInfo.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/PurchaseIntent.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/PurchaseIntent.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/RenewalInfo.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/RenewalInfo.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/SKOverlay.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/SKOverlay.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/StoreKitException.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/StoreKitException.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Storefront.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Storefront.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/SubscriptionStatus.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/SubscriptionStatus.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Transaction.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Transaction.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/VerificationResult.cs create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/VerificationResult.cs.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/link.xml create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/link.xml.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/package.json create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/package.json.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Scenes.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Scenes/SampleScene.unity create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Scenes/SampleScene.unity.meta create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Doxyfile create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Packages/manifest.json create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Packages/packages-lock.json create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/AudioManager.asset create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/ClusterInputManager.asset create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/DynamicsManager.asset create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/EditorBuildSettings.asset create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/EditorSettings.asset create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/GraphicsSettings.asset create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/InputManager.asset create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/MemorySettings.asset create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/MultiplayerManager.asset create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/NavMeshAreas.asset create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/PackageManagerSettings.asset create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/Physics2DSettings.asset create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/PresetManager.asset create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/ProjectSettings.asset create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/ProjectVersion.txt create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/QualitySettings.asset create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/SceneTemplateSettings.json create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/TagManager.asset create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/TimeManager.asset create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/UnityConnectSettings.asset create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/VFXManager.asset create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/VersionControlSettings.asset create mode 100644 plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/ProjectSettings/XRSettings.asset create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKit-iOS.xcconfig create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKit-macOS.xcconfig create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKit-tvOS.xcconfig create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKit-visionOS.xcconfig create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKit.xcconfig create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper.xcodeproj/project.pbxproj create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper.xcodeproj/xcshareddata/xcschemes/iOS - Debug.xcscheme create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper.xcodeproj/xcshareddata/xcschemes/iOS - Release.xcscheme create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper.xcodeproj/xcshareddata/xcschemes/macOS - Debug.xcscheme create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper.xcodeproj/xcshareddata/xcschemes/macOS - Release.xcscheme create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper.xcodeproj/xcshareddata/xcschemes/tvOS - Debug.xcscheme create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper.xcodeproj/xcshareddata/xcschemes/tvOS - Release.xcscheme create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper.xcodeproj/xcshareddata/xcschemes/visionOS - Debug.xcscheme create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper.xcodeproj/xcshareddata/xcschemes/visionOS - Release.xcscheme create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper/AdvancedCommerceProduct.swift create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper/AppStore.swift create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper/AppTransaction.swift create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper/AppleCoreRuntimeShared.swift create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper/Message.swift create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper/Product.swift create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper/PurchaseIntent.swift create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper/SKOverlay.swift create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper/StoreKitBridge.h create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper/StoreKitWrapper.h create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper/Storefront.swift create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper/Transaction.swift create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper/UiUtilities.swift create mode 100644 plug-ins/Apple.StoreKit/Native/StoreKitWrapper/VerificationResult.swift diff --git a/README.md b/README.md index a4adff8a..28036327 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ To get started with integration of these plug-ins into your Unity projects, run | 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 | diff --git a/build.py b/build.py index b768fa91..bd52f983 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}, 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}") @@ -235,7 +235,8 @@ def Main(): PluginID.GAME_CONTROLLER: False, PluginID.SPATIAL_CONTROLLER: False, PluginID.GAME_KIT: False, - PluginID.PHASE: False + PluginID.PHASE: False, + PluginID.STORE_KIT: False } valid_plugin_found = False @@ -249,7 +250,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}, or {PluginID.ALL} (Default)") # ------------------------------------------------------------------------- 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/Runtime/AsyncStream.cs.meta b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/AsyncStream.cs.meta new file mode 100644 index 00000000..251063f0 --- /dev/null +++ b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/AsyncStream.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b3b637e270c184e76b23dcce14f62afc +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/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/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/Runtime/SwiftArray.cs.meta b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/SwiftArray.cs.meta new file mode 100644 index 00000000..83ac1500 --- /dev/null +++ b/plug-ins/Apple.Core/Apple.Core_Unity/Assets/Apple.Core/Runtime/SwiftArray.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: dbe633e24a9354111bfb6977fc26f01e \ No newline at end of file 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..d74bb39c 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,11 @@ { "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.23", + "com.unity.multiplayer.center": "1.0.0", + "com.unity.test-framework": "1.6.0", + "com.unity.ugui": "2.0.0", + "com.unity.modules.accessibility": "1.0.0", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", "com.unity.modules.animation": "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..87e7a327 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.0.5", "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,7 +16,7 @@ "url": "https://packages.unity.com" }, "com.unity.ide.visualstudio": { - "version": "2.0.22", + "version": "2.0.23", "depth": 0, "source": "registry", "dependencies": { @@ -25,35 +24,26 @@ }, "url": "https://packages.unity.com" }, - "com.unity.ide.vscode": { - "version": "1.2.5", + "com.unity.multiplayer.center": { + "version": "1.0.0", "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.6.0", "depth": 0, - "source": "registry", + "source": "builtin", "dependencies": { "com.unity.ext.nunit": "2.0.3", "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", - "depth": 0, - "source": "registry", - "dependencies": { - "com.unity.ugui": "1.0.0" - }, - "url": "https://packages.unity.com" + } }, "com.unity.ugui": { - "version": "1.0.0", + "version": "2.0.0", "depth": 0, "source": "builtin", "dependencies": { @@ -61,6 +51,12 @@ "com.unity.modules.imgui": "1.0.0" } }, + "com.unity.modules.accessibility": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, "com.unity.modules.ai": { "version": "1.0.0", "depth": 0, @@ -108,6 +104,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, @@ -196,7 +198,9 @@ "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.umbra": { 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/ProjectVersion.txt b/plug-ins/Apple.Core/Apple.Core_Unity/ProjectSettings/ProjectVersion.txt index b8523623..b5c96e15 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.2.6f2 +m_EditorVersionWithRevision: 6000.2.6f2 (4a4dcaec6541) diff --git a/plug-ins/Apple.Core/Native/AppleCoreNative.xcodeproj/project.pbxproj b/plug-ins/Apple.Core/Native/AppleCoreNative.xcodeproj/project.pbxproj index 7a848a5f..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 */, diff --git a/plug-ins/Apple.Core/Native/AppleCoreNative/Currency.swift b/plug-ins/Apple.Core/Native/AppleCoreNative/Currency.swift new file mode 100644 index 00000000..313001a3 --- /dev/null +++ b/plug-ins/Apple.Core/Native/AppleCoreNative/Currency.swift @@ -0,0 +1,31 @@ +// +// Currency.swift +// AppleCoreNative +// + +import Foundation + +@available(iOS 16.0, macOS 13.0, tvOS 16.0, visionOS 1.0, *) +@_cdecl("Currency_Free") +public func Currency_Free(pointer: UnsafeMutableRawPointer) +{ + let currencyPtr = pointer.assumingMemoryBound(to: Locale.Currency.self) + currencyPtr.deinitialize(count: 1) + currencyPtr.deallocate() +} + +@available(iOS 16.0, macOS 13.0, tvOS 16.0, visionOS 1.0, *) +@_cdecl("Currency_GetIdentifier") +public func Currency_GetIdentifier(pointer: UnsafeMutableRawPointer) -> 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.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/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.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/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~/StoreKit.md b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Documentation~/StoreKit.md new file mode 100644 index 00000000..4201fcce --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Documentation~/StoreKit.md @@ -0,0 +1,210 @@ +# 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.Success) +{ + var transaction = result.VerificationResult.Transaction; + Debug.Log($"Purchase successful! Transaction ID: {transaction.Id}"); + + // Finish the transaction + await transaction.Finish(); +} +else if (result.Result == PurchaseResult.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 transaction in Transaction.GetAll()) +{ + 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.) +await foreach (var verificationResult in Transaction.Updates()) +{ + if (verificationResult.IsVerified) + { + var transaction = verificationResult.Transaction; + Debug.Log($"New transaction: {transaction.ProductId}"); + + // Deliver content to user + // ... + + // Finish the transaction + await transaction.Finish(); + } +} +``` + +## Best Practices + +### Transaction Verification +Always verify transactions before delivering content: +```csharp +var result = await product.Purchase(); +if (result.VerificationResult.IsVerified) +{ + // Transaction is authentic, deliver content + var transaction = result.VerificationResult.Transaction; + DeliverContent(transaction.ProductId); + await transaction.Finish(); +} +``` + +### Finishing Transactions +Always finish transactions after processing: +```csharp +await transaction.Finish(); +``` +Unfinished transactions will be re-delivered on app launch. + +### Handling Updates +Set up transaction update listeners early in your app lifecycle: +```csharp +async void Start() +{ + await foreach (var result in Transaction.Updates()) + { + ProcessTransaction(result.Transaction); + } +} +``` + +### 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 + +### Xcode StoreKit Configuration +A sample StoreKit configuration file is included at `Demos/Apple.StoreKit.Sample/Sample.storekit`. To use it when running on device or in the Xcode Simulator: + +1. Build your Unity project for iOS/macOS to generate the Xcode project. +2. Open the generated `.xcodeproj` in Xcode. +3. In the menu bar choose **Product → Scheme → Edit Scheme…** +4. Select the **Run** action in the left panel. +5. Open the **Options** tab. +6. Set **StoreKit Configuration** to `Sample.storekit` (use the file picker to locate it in the project). +7. Close the scheme editor and run the app. + +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/README.md b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/README.md new file mode 100644 index 00000000..1f7445a2 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/README.md @@ -0,0 +1,205 @@ +# Apple.StoreKit Unity Plug-In + +## 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. + +## 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 + +## 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+ + +## Installation +1. Run `python3 build.py` from the repository root +2. Import the generated `.tgz` package from the `Build/` directory into your Unity project +3. Ensure Apple.Core is also installed (included as a dependency) + +## Quick Start + +### 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.Success) +{ + var transaction = result.VerificationResult.Transaction; + Debug.Log($"Purchase successful! Transaction ID: {transaction.Id}"); + + // Finish the transaction + await transaction.Finish(); +} +else if (result.Result == PurchaseResult.UserCancelled) +{ + Debug.Log("User cancelled the purchase"); +} +``` + +You can also provide purchase options: +```csharp +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 transaction in Transaction.GetAll()) +{ + 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.) +await foreach (var verificationResult in Transaction.Updates()) +{ + if (verificationResult.IsVerified) + { + var transaction = verificationResult.Transaction; + Debug.Log($"New transaction: {transaction.ProductId}"); + + // Deliver content to user + // ... + + // Finish the transaction + await transaction.Finish(); + } +} +``` + +## 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 + +## Best Practices + +### Transaction Verification +Always verify transactions before delivering content: +```csharp +var result = await product.Purchase(); +if (result.VerificationResult.IsVerified) +{ + // Transaction is authentic, deliver content + var transaction = result.VerificationResult.Transaction; + DeliverContent(transaction.ProductId); + await transaction.Finish(); +} +``` + +### Finishing Transactions +Always finish transactions after processing: +```csharp +await transaction.Finish(); +``` +Unfinished transactions will be re-delivered on app launch. + +### Handling Updates +Set up transaction update listeners early in your app lifecycle: +```csharp +async void Start() +{ + await foreach (var result in Transaction.Updates()) + { + ProcessTransaction(result.Transaction); + } +} +``` + +### Error Handling +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 + +### Xcode StoreKit Configuration +A sample StoreKit configuration file is included at `Demos/Apple.StoreKit.Sample/Sample.storekit`. To use it when running on device or in the Xcode Simulator: + +1. Build your Unity project for iOS/macOS to generate the Xcode project. +2. Open the generated `.xcodeproj` in Xcode. +3. In the menu bar choose **Product → Scheme → Edit Scheme…** +4. Select the **Run** action in the left panel. +5. Open the **Options** tab. +6. Set **StoreKit Configuration** to `Sample.storekit` (use the file picker to locate it in the project). +7. Close the scheme editor and run the app. + +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 + +## 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) + +## Support +For issues, questions, or feedback, please visit the [main repository](../../../../../../README.md) or file an issue on GitHub. + +## License +See the main repository LICENSE file for licensing information. diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/README.md.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/README.md.meta new file mode 100644 index 00000000..9920a9f9 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 69432e488bb0342c4b69a9f2f077555d +TextScriptImporter: + externalObjects: {} + 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..234b4af4 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/AppStore.cs @@ -0,0 +1,213 @@ +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 + } + } + #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_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/Product.cs b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Product.cs new file mode 100644 index 00000000..e1419081 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Product.cs @@ -0,0 +1,769 @@ +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); + } + + 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_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)); + } + + 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); + } + } + + /// + /// 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..063f16f7 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/RenewalInfo.cs @@ -0,0 +1,105 @@ +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; + } + } + + 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); + } + } +} 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..a2bd7dd9 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Storefront.cs @@ -0,0 +1,86 @@ +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 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 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..57afe8e6 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/SubscriptionStatus.cs @@ -0,0 +1,57 @@ +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 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 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); + } + } +} 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..770c5179 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Apple.StoreKit/Source/Transaction.cs @@ -0,0 +1,731 @@ +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; + } + } + + 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, int refundRequestStatus) + { + InteropTasks.TrySetResultAndRemove(taskId, (RefundRequestStatus)refundRequestStatus); + } + + [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 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 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..3b786eed --- /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.1.8" + }, + "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/Assets/Scenes.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Scenes.meta new file mode 100644 index 00000000..4109e404 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c588f6f56c3ed4c5c97f3cf659b4df0f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Scenes/SampleScene.unity b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Scenes/SampleScene.unity new file mode 100644 index 00000000..c39e5814 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Scenes/SampleScene.unity @@ -0,0 +1,267 @@ +%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: 9 + 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: 705507994} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + 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_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + 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: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + 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 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &705507993 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 705507995} + - component: {fileID: 705507994} + 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 &705507994 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 705507993} + m_Enabled: 1 + serializedVersion: 8 + 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_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_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 1 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &705507995 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 705507993} + 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_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &963194225 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 963194228} + - component: {fileID: 963194227} + - component: {fileID: 963194226} + 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 &963194226 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_Enabled: 1 +--- !u!20 &963194227 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 963194225} + 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_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_GateFitMode: 2 + m_FocalLength: 50 + 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 &963194228 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 963194225} + 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_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Scenes/SampleScene.unity.meta b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Scenes/SampleScene.unity.meta new file mode 100644 index 00000000..952bd1e9 --- /dev/null +++ b/plug-ins/Apple.StoreKit/Apple.StoreKit_Unity/Assets/Scenes/SampleScene.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9fc0d4010bbf28b4594072e72b8655ab +DefaultImporter: + 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 +# , /