├── .gitignore ├── ScreenShots ├── ScreenShot1.png ├── ScreenShot10.png ├── ScreenShot2.png ├── ScreenShot3.png ├── ScreenShot4.png ├── ScreenShot5.png ├── ScreenShot6.png ├── ScreenShot7.png ├── ScreenShot8.png └── ScreenShot9.png ├── Assets ├── Plugins │ ├── iOS │ │ ├── libAppsFlyerLib.a │ │ ├── AppsFlyerWrapper.h │ │ ├── AppsFlyerCrossPromotionHelper.h │ │ ├── AppsFlyerDelegate.h │ │ ├── AppsFlyerShareInviteHelper.h │ │ ├── AppsFlyerLinkGenerator.h │ │ ├── AppsFlyerDelegate.mm │ │ ├── AppsFlyerAppController.mm │ │ ├── AppsFlyerWrapper.mm │ │ └── AppsFlyerTracker.h │ ├── Android │ │ ├── AF-Android-SDK.jar │ │ ├── AppsFlyerAndroidPlugin.jar │ │ └── libs │ │ │ ├── support-v4-25.3.1.aar │ │ │ ├── firebase-messaging-10.2.0.aar │ │ │ ├── play-services-base-10.2.0.aar │ │ │ ├── play-services-gcm-10.2.0.aar │ │ │ ├── play-services-iid-10.2.0.aar │ │ │ └── play-services-basement-10.2.0.aar │ ├── Android.meta │ ├── AppsFlyerTrackerCallbacks.cs │ ├── AFInAppEvents.cs │ └── AppsFlyer.cs ├── Sample │ ├── Graphics │ │ ├── check.svg.hi.png │ │ ├── AF vertical Logotype.png │ │ ├── check.svg.hi.png.meta │ │ └── AF vertical Logotype.png.meta │ ├── startup.unity.meta │ ├── Graphics.meta │ ├── StartUp.cs.meta │ ├── AF_Sample_BGScript.cs.meta │ ├── AF_Sample_BGScript.cs │ ├── StartUp.cs │ └── startup.unity ├── Plugins.meta ├── Sample.meta └── Demo.unity ├── AppsFlyerUnityPlugin_v4.15.0.unitypackage ├── AppsFlyerUnitySampleApp.userprefs ├── AppsFlyerUnitySampleApp.sln ├── README.md ├── Assembly-CSharp-firstpass.csproj └── Assembly-CSharp.csproj /.gitignore: -------------------------------------------------------------------------------- 1 | Library 2 | ProjectSettings 3 | iOS_Build 4 | *.meta 5 | UnityLockfile 6 | Temp 7 | *.apk -------------------------------------------------------------------------------- /ScreenShots/ScreenShot1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerUnitySampleApp/HEAD/ScreenShots/ScreenShot1.png -------------------------------------------------------------------------------- /ScreenShots/ScreenShot10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerUnitySampleApp/HEAD/ScreenShots/ScreenShot10.png -------------------------------------------------------------------------------- /ScreenShots/ScreenShot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerUnitySampleApp/HEAD/ScreenShots/ScreenShot2.png -------------------------------------------------------------------------------- /ScreenShots/ScreenShot3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerUnitySampleApp/HEAD/ScreenShots/ScreenShot3.png -------------------------------------------------------------------------------- /ScreenShots/ScreenShot4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerUnitySampleApp/HEAD/ScreenShots/ScreenShot4.png -------------------------------------------------------------------------------- /ScreenShots/ScreenShot5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerUnitySampleApp/HEAD/ScreenShots/ScreenShot5.png -------------------------------------------------------------------------------- /ScreenShots/ScreenShot6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerUnitySampleApp/HEAD/ScreenShots/ScreenShot6.png -------------------------------------------------------------------------------- /ScreenShots/ScreenShot7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerUnitySampleApp/HEAD/ScreenShots/ScreenShot7.png -------------------------------------------------------------------------------- /ScreenShots/ScreenShot8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerUnitySampleApp/HEAD/ScreenShots/ScreenShot8.png -------------------------------------------------------------------------------- /ScreenShots/ScreenShot9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerUnitySampleApp/HEAD/ScreenShots/ScreenShot9.png -------------------------------------------------------------------------------- /Assets/Plugins/iOS/libAppsFlyerLib.a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerUnitySampleApp/HEAD/Assets/Plugins/iOS/libAppsFlyerLib.a -------------------------------------------------------------------------------- /Assets/Sample/Graphics/check.svg.hi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerUnitySampleApp/HEAD/Assets/Sample/Graphics/check.svg.hi.png -------------------------------------------------------------------------------- /AppsFlyerUnityPlugin_v4.15.0.unitypackage: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerUnitySampleApp/HEAD/AppsFlyerUnityPlugin_v4.15.0.unitypackage -------------------------------------------------------------------------------- /Assets/Plugins/Android/AF-Android-SDK.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerUnitySampleApp/HEAD/Assets/Plugins/Android/AF-Android-SDK.jar -------------------------------------------------------------------------------- /Assets/Sample/Graphics/AF vertical Logotype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerUnitySampleApp/HEAD/Assets/Sample/Graphics/AF vertical Logotype.png -------------------------------------------------------------------------------- /Assets/Plugins/Android/AppsFlyerAndroidPlugin.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerUnitySampleApp/HEAD/Assets/Plugins/Android/AppsFlyerAndroidPlugin.jar -------------------------------------------------------------------------------- /Assets/Plugins/Android/libs/support-v4-25.3.1.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerUnitySampleApp/HEAD/Assets/Plugins/Android/libs/support-v4-25.3.1.aar -------------------------------------------------------------------------------- /Assets/Plugins/Android/libs/firebase-messaging-10.2.0.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerUnitySampleApp/HEAD/Assets/Plugins/Android/libs/firebase-messaging-10.2.0.aar -------------------------------------------------------------------------------- /Assets/Plugins/Android/libs/play-services-base-10.2.0.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerUnitySampleApp/HEAD/Assets/Plugins/Android/libs/play-services-base-10.2.0.aar -------------------------------------------------------------------------------- /Assets/Plugins/Android/libs/play-services-gcm-10.2.0.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerUnitySampleApp/HEAD/Assets/Plugins/Android/libs/play-services-gcm-10.2.0.aar -------------------------------------------------------------------------------- /Assets/Plugins/Android/libs/play-services-iid-10.2.0.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerUnitySampleApp/HEAD/Assets/Plugins/Android/libs/play-services-iid-10.2.0.aar -------------------------------------------------------------------------------- /Assets/Plugins/Android/libs/play-services-basement-10.2.0.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerUnitySampleApp/HEAD/Assets/Plugins/Android/libs/play-services-basement-10.2.0.aar -------------------------------------------------------------------------------- /Assets/Sample/startup.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ddcdf22c591214389a412b3e7606093f 3 | timeCreated: 1463391010 4 | licenseType: Free 5 | DefaultImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Plugins.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5c7bc54eae8e544e4b0b7e26551168b7 3 | folderAsset: yes 4 | timeCreated: 1482074254 5 | licenseType: Free 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/Sample.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cdb1abeee56ca4c45b498c60777ca892 3 | folderAsset: yes 4 | timeCreated: 1463396527 5 | licenseType: Free 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/Plugins/Android.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e5e5bd87cfe524f13aefd7ab1cf7e446 3 | folderAsset: yes 4 | timeCreated: 1482074254 5 | licenseType: Free 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/Sample/Graphics.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 98e27d4f55c224fed81a58cfc9943df5 3 | folderAsset: yes 4 | timeCreated: 1463396895 5 | licenseType: Free 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/Plugins/iOS/AppsFlyerWrapper.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppsFlyerWarpper.h 3 | // 4 | // 5 | // Created by AppsFlyer 2013 6 | // 7 | // 8 | 9 | #import 10 | #import "AppsFlyerDelegate.h" 11 | 12 | @interface AppsFlyerWarpper : NSObject 13 | 14 | 15 | +(AppsFlyerDelegate *) getAppsFlyerDelegate; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Assets/Sample/StartUp.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 35248fb1326794b9dbc805a11a8323c1 3 | timeCreated: 1463391010 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /Assets/Sample/AF_Sample_BGScript.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ad10f597229fa4a63bd9011a9bc3e4ee 3 | timeCreated: 1463391013 4 | licenseType: Free 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /Assets/Plugins/iOS/AppsFlyerCrossPromotionHelper.h: -------------------------------------------------------------------------------- 1 | // 2 | // CrossPromotionHelper.h 3 | // AppsFlyerLib 4 | // 5 | // Created by Gil Meroz on 27/01/2017. 6 | // 7 | // 8 | 9 | #import 10 | #import 11 | 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | @interface AppsFlyerCrossPromotionHelper : NSObject 16 | + (void) trackCrossPromoteImpression:(nonnull NSString*) appID 17 | campaign:(nullable NSString*) campaign; 18 | 19 | + (void) trackAndOpenStore:(nonnull NSString*) appID 20 | campaign:(nullable NSString *) campaign 21 | paramters:(nullable NSDictionary*) parameters 22 | openStore:(void (^)(NSURLSession *urlSession,NSURL *clickURL))openStoreBlock; 23 | @end 24 | 25 | NS_ASSUME_NONNULL_END 26 | -------------------------------------------------------------------------------- /AppsFlyerUnitySampleApp.userprefs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /Assets/Sample/AF_Sample_BGScript.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using System.Collections; 3 | using UnityEngine.UI; 4 | using System.Collections.Generic; 5 | 6 | public class AF_Sample_BGScript : MonoBehaviour { 7 | // Use this for initialization 8 | public GameObject Button; 9 | public GameObject ButtonText; 10 | public GameObject Check; 11 | public GameObject text; 12 | 13 | private static bool isPressed=false; 14 | void Start () { 15 | Check.SetActive (false); 16 | } 17 | 18 | // Update is called once per frame 19 | void Update () { 20 | if (isPressed) { 21 | StartCoroutine (PressAnim ()); 22 | isPressed = false; 23 | } 24 | } 25 | public static void pressed(){ 26 | isPressed = true; 27 | } 28 | 29 | IEnumerator PressAnim() { 30 | Check.SetActive (true); 31 | ButtonText.GetComponent ().text = "Event Tracked!"; 32 | Button.SetActive (false); 33 | yield return new WaitForSeconds(3.5f); 34 | 35 | Check.SetActive (false); 36 | ButtonText.GetComponent ().text = "Track Event"; 37 | Button.SetActive (true); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /Assets/Plugins/iOS/AppsFlyerDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppsFlyerDelegate.h 3 | // 4 | // 5 | // Created by Golan on 6/21/15. 6 | // 7 | // 8 | 9 | #import 10 | #import "AppsFlyerTracker.h" 11 | #import "AppDelegateListener.h" 12 | 13 | 14 | static const char * UNITY_SENDMESSAGE_CALLBACK_MANAGER = "AppsFlyerTrackerCallbacks"; 15 | 16 | // corresponds to the AppsFlyers Validate purchase Delegate 17 | static const char * UNITY_SENDMESSAGE_CALLBACK_VALIDATE = "didFinishValidateReceipt"; 18 | static const char * UNITY_SENDMESSAGE_CALLBACK_VALIDATE_ERROR = "didFinishValidateReceiptWithError"; 19 | 20 | // corresponds to the AppsFlyers Conversions Delegate 21 | static const char * UNITY_SENDMESSAGE_CALLBACK_CONVERSION = "didReceiveConversionData"; 22 | static const char * UNITY_SENDMESSAGE_CALLBACK_CONVERSION_ERROR = "didReceiveConversionDataWithError"; 23 | static const char * UNITY_SENDMESSAGE_CALLBACK_RETARGETTING = "onAppOpenAttribution"; 24 | static const char * UNITY_SENDMESSAGE_CALLBACK_RETARGETTING_ERROR = "onAppOpenAttributionFailure"; 25 | 26 | static const char * UNITY_SENDMESSAGE_OPEN_URL = "onAppOpenUrl"; 27 | 28 | 29 | @interface AppsFlyerDelegate : NSObject 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /Assets/Plugins/iOS/AppsFlyerShareInviteHelper.h: -------------------------------------------------------------------------------- 1 | // 2 | // ShareInviteHelper.h 3 | // AppsFlyerLib 4 | // 5 | // Created by Gil Meroz on 27/01/2017. 6 | // 7 | // 8 | 9 | #import 10 | #import "AppsFlyerLinkGenerator.h" 11 | 12 | @interface AppsFlyerShareInviteHelper : NSObject 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | /*! 17 | * The AppsFlyerShareInviteHelper class builds the invite URL according to various setter methods 18 | * which allow passing on additional information on the click. 19 | * This information is available through `onConversionDataReceived:` when the user accepts the invite and installs the app. 20 | * In addition, campaign and channel parameters are visible within the AppsFlyer Dashboard. 21 | */ 22 | + (void) generateInviteUrlWithLinkGenerator:(AppsFlyerLinkGenerator * (^)(AppsFlyerLinkGenerator *generator))generatorCreator 23 | completionHandler:(void (^)(NSURL * _Nullable url))completionHandler; 24 | 25 | /*! 26 | * It is recommended to generate an in-app event after the invite is sent to track the invites from the senders' perspective. 27 | * This enables you to find the users that tend most to invite friends, and the media sources that get you these users. 28 | */ 29 | + (void) trackInvite:(nullable NSString *)channel parameters:(nullable NSDictionary *)parameters; 30 | 31 | @end 32 | 33 | NS_ASSUME_NONNULL_END 34 | -------------------------------------------------------------------------------- /Assets/Sample/Graphics/check.svg.hi.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 55d3addcc62f14419866a53c07c18d05 3 | timeCreated: 1463391014 4 | licenseType: Free 5 | TextureImporter: 6 | fileIDToRecycleName: {} 7 | serializedVersion: 2 8 | mipmaps: 9 | mipMapMode: 0 10 | enableMipMap: 0 11 | linearTexture: 0 12 | correctGamma: 0 13 | fadeOut: 0 14 | borderMipMap: 0 15 | mipMapFadeDistanceStart: 1 16 | mipMapFadeDistanceEnd: 3 17 | bumpmap: 18 | convertToNormalMap: 0 19 | externalNormalMap: 0 20 | heightScale: 0.25 21 | normalMapFilter: 0 22 | isReadable: 0 23 | grayScaleToAlpha: 0 24 | generateCubemap: 0 25 | cubemapConvolution: 0 26 | cubemapConvolutionSteps: 7 27 | cubemapConvolutionExponent: 1.5 28 | seamlessCubemap: 0 29 | textureFormat: -1 30 | maxTextureSize: 2048 31 | textureSettings: 32 | filterMode: -1 33 | aniso: -1 34 | mipBias: -1 35 | wrapMode: 1 36 | nPOTScale: 0 37 | lightmap: 0 38 | rGBM: 0 39 | compressionQuality: 50 40 | allowsAlphaSplitting: 0 41 | spriteMode: 1 42 | spriteExtrude: 1 43 | spriteMeshType: 1 44 | alignment: 0 45 | spritePivot: {x: 0.5, y: 0.5} 46 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 47 | spritePixelsToUnits: 100 48 | alphaIsTransparency: 1 49 | textureType: 8 50 | buildTargetSettings: [] 51 | spriteSheet: 52 | sprites: [] 53 | outline: [] 54 | spritePackingTag: 55 | userData: 56 | assetBundleName: 57 | assetBundleVariant: 58 | -------------------------------------------------------------------------------- /Assets/Sample/Graphics/AF vertical Logotype.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a0796a5861c784d23af0d41690c573ca 3 | timeCreated: 1463391015 4 | licenseType: Free 5 | TextureImporter: 6 | fileIDToRecycleName: {} 7 | serializedVersion: 2 8 | mipmaps: 9 | mipMapMode: 0 10 | enableMipMap: 0 11 | linearTexture: 0 12 | correctGamma: 0 13 | fadeOut: 0 14 | borderMipMap: 0 15 | mipMapFadeDistanceStart: 1 16 | mipMapFadeDistanceEnd: 3 17 | bumpmap: 18 | convertToNormalMap: 0 19 | externalNormalMap: 0 20 | heightScale: 0.25 21 | normalMapFilter: 0 22 | isReadable: 0 23 | grayScaleToAlpha: 0 24 | generateCubemap: 0 25 | cubemapConvolution: 0 26 | cubemapConvolutionSteps: 7 27 | cubemapConvolutionExponent: 1.5 28 | seamlessCubemap: 0 29 | textureFormat: -1 30 | maxTextureSize: 2048 31 | textureSettings: 32 | filterMode: -1 33 | aniso: 16 34 | mipBias: -1 35 | wrapMode: 1 36 | nPOTScale: 0 37 | lightmap: 0 38 | rGBM: 0 39 | compressionQuality: 50 40 | allowsAlphaSplitting: 0 41 | spriteMode: 1 42 | spriteExtrude: 1 43 | spriteMeshType: 1 44 | alignment: 0 45 | spritePivot: {x: 0.5, y: 0.5} 46 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 47 | spritePixelsToUnits: 100 48 | alphaIsTransparency: 1 49 | textureType: 8 50 | buildTargetSettings: [] 51 | spriteSheet: 52 | sprites: [] 53 | outline: [] 54 | spritePackingTag: 55 | userData: 56 | assetBundleName: 57 | assetBundleVariant: 58 | -------------------------------------------------------------------------------- /Assets/Plugins/iOS/AppsFlyerLinkGenerator.h: -------------------------------------------------------------------------------- 1 | // 2 | // LinkGenerator.h 3 | // AppsFlyerLib 4 | // 5 | // Created by Gil Meroz on 27/01/2017. 6 | // 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | /*! 14 | * Payload container for the `generateInviteUrlWithLinkGenerator:completionHandler:` from `AppsFlyerShareInviteHelper` 15 | */ 16 | @interface AppsFlyerLinkGenerator: NSObject 17 | 18 | - (instancetype)init NS_UNAVAILABLE; 19 | + (instancetype)new NS_UNAVAILABLE; 20 | 21 | /// The channel through which the invite was sent (e.g. Facebook/Gmail/etc.). Usage: Recommended 22 | - (void)setChannel :(nonnull NSString *)channel; 23 | - (void)setReferrerCustomerId:(nonnull NSString *)referrerCustomerId; 24 | /// A campaign name. Usage: Optional 25 | - (void)setCampaign :(nonnull NSString *)campaign; 26 | - (void)setReferrerUID :(nonnull NSString *)referrerUID; 27 | - (void)setReferrerName :(nonnull NSString *)referrerName; 28 | /// The URL to referrer user avatar. Usage: Optional 29 | - (void)setReferrerImageURL :(nonnull NSString *)referrerImageURL; 30 | - (void)setAppleAppID :(nonnull NSString *)appleAppID; 31 | - (void)setDeeplinkPath :(nonnull NSString *)deeplinkPath; 32 | - (void)setBaseDeeplink :(nonnull NSString *)baseDeeplink; 33 | /// A single key value custom parameter. Usage: Optional 34 | - (void)addParameterValue :(nonnull NSString *)value forKey:(NSString*)key; 35 | /// Multiple key value custom parameters. Usage: Optional 36 | - (void)addParameters :(nonnull NSDictionary *)parameters; 37 | 38 | @end 39 | 40 | NS_ASSUME_NONNULL_END 41 | -------------------------------------------------------------------------------- /AppsFlyerUnitySampleApp.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 11.00 3 | # Visual Studio 2010 4 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AppsFlyerUnitySampleApp", "Assembly-CSharp.csproj", "{DC254097-6CA1-DD9A-DDB4-68BC798B09D3}" 5 | EndProject 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AppsFlyerUnitySampleApp", "Assembly-CSharp-firstpass.csproj", "{CAA74034-4528-A519-6505-D032D6DA47CC}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {DC254097-6CA1-DD9A-DDB4-68BC798B09D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {DC254097-6CA1-DD9A-DDB4-68BC798B09D3}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {DC254097-6CA1-DD9A-DDB4-68BC798B09D3}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {DC254097-6CA1-DD9A-DDB4-68BC798B09D3}.Release|Any CPU.Build.0 = Release|Any CPU 18 | {CAA74034-4528-A519-6505-D032D6DA47CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 19 | {CAA74034-4528-A519-6505-D032D6DA47CC}.Debug|Any CPU.Build.0 = Debug|Any CPU 20 | {CAA74034-4528-A519-6505-D032D6DA47CC}.Release|Any CPU.ActiveCfg = Release|Any CPU 21 | {CAA74034-4528-A519-6505-D032D6DA47CC}.Release|Any CPU.Build.0 = Release|Any CPU 22 | EndGlobalSection 23 | GlobalSection(SolutionProperties) = preSolution 24 | HideSolutionNode = FALSE 25 | EndGlobalSection 26 | GlobalSection(MonoDevelopProperties) = preSolution 27 | StartupItem = Assembly-CSharp.csproj 28 | EndGlobalSection 29 | EndGlobal 30 | -------------------------------------------------------------------------------- /Assets/Plugins/AppsFlyerTrackerCallbacks.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using System.Collections; 3 | using UnityEngine.UI; 4 | 5 | public class AppsFlyerTrackerCallbacks : MonoBehaviour { 6 | 7 | public Text callbacks; 8 | 9 | // Use this for initialization 10 | void Start () { 11 | print ("AppsFlyerTrackerCallbacks on Start"); 12 | 13 | } 14 | 15 | // Update is called once per frame 16 | void Update () { 17 | 18 | } 19 | 20 | public void didReceiveConversionData(string conversionData) { 21 | printCallback ("AppsFlyerTrackerCallbacks:: got conversion data = " + conversionData); 22 | } 23 | 24 | public void didReceiveConversionDataWithError(string error) { 25 | printCallback ("AppsFlyerTrackerCallbacks:: got conversion data error = " + error); 26 | } 27 | 28 | public void didFinishValidateReceipt(string validateResult) { 29 | printCallback ("AppsFlyerTrackerCallbacks:: got didFinishValidateReceipt = " + validateResult); 30 | 31 | } 32 | 33 | public void didFinishValidateReceiptWithError (string error) { 34 | printCallback ("AppsFlyerTrackerCallbacks:: got idFinishValidateReceiptWithError error = " + error); 35 | 36 | } 37 | 38 | public void onAppOpenAttribution(string validateResult) { 39 | printCallback ("AppsFlyerTrackerCallbacks:: got onAppOpenAttribution = " + validateResult); 40 | 41 | } 42 | 43 | public void onAppOpenAttributionFailure (string error) { 44 | printCallback ("AppsFlyerTrackerCallbacks:: got onAppOpenAttributionFailure error = " + error); 45 | 46 | } 47 | 48 | public void onInAppBillingSuccess () { 49 | printCallback ("AppsFlyerTrackerCallbacks:: got onInAppBillingSuccess succcess"); 50 | 51 | } 52 | public void onInAppBillingFailure (string error) { 53 | printCallback ("AppsFlyerTrackerCallbacks:: got onInAppBillingFailure error = " + error); 54 | 55 | } 56 | 57 | void printCallback(string str) { 58 | callbacks.text += str + "\n"; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /Assets/Plugins/iOS/AppsFlyerDelegate.mm: -------------------------------------------------------------------------------- 1 | // 2 | // AppsFlyerDelegate.mm 3 | // 4 | // 5 | // Created by Golan on 6/21/15. 6 | // Edited by Shachar on 5/18/17. 7 | // 8 | // 9 | 10 | #import "AppsFlyerDelegate.h" 11 | #import "UnityAppController.h" 12 | 13 | 14 | @interface AppsFlyerDelegate() { 15 | BOOL didEnteredBackGround; 16 | } 17 | 18 | @end 19 | 20 | @implementation AppsFlyerDelegate 21 | 22 | - (instancetype)init 23 | { 24 | NSLog(@"initializing AppsFlyerDelegate"); 25 | self = [super init]; 26 | if (self) { 27 | } 28 | return self; 29 | } 30 | 31 | // AppsFlyer Callbacks 32 | 33 | - (void) onConversionDataReceived:(NSDictionary*) installData { 34 | 35 | NSString *conversionDataResult = [self getJsonStringFromDictionary:installData]; 36 | NSLog (@"AppsFlyerDelegate onConversionDataReceived = %@", conversionDataResult); 37 | UnitySendMessage(UNITY_SENDMESSAGE_CALLBACK_MANAGER, UNITY_SENDMESSAGE_CALLBACK_CONVERSION, [conversionDataResult UTF8String]); 38 | } 39 | 40 | - (void) onConversionDataRequestFailure:(NSError *)error { 41 | 42 | NSString *errDesc = [error localizedDescription]; 43 | NSLog (@"AppsFlyerDelegate onConversionDataRequestFailure = %@", errDesc); 44 | UnitySendMessage(UNITY_SENDMESSAGE_CALLBACK_MANAGER, UNITY_SENDMESSAGE_CALLBACK_CONVERSION_ERROR, [errDesc UTF8String]); 45 | } 46 | 47 | - (void) onAppOpenAttribution:(NSDictionary*) attributionData { 48 | NSString *attrData = [self getJsonStringFromDictionary:attributionData]; 49 | NSLog (@"AppsFlyerDelegate onAppOpenAttribution = %@", attrData); 50 | UnitySendMessage(UNITY_SENDMESSAGE_CALLBACK_MANAGER, UNITY_SENDMESSAGE_CALLBACK_RETARGETTING, [attrData UTF8String]); 51 | } 52 | 53 | - (void) onAppOpenAttributionFailure:(NSError *)error{ 54 | NSString *errDesc = [error localizedDescription]; 55 | NSLog (@"AppsFlyerDelegate onAppOpenAttributionFailure = %@", errDesc); 56 | UnitySendMessage(UNITY_SENDMESSAGE_CALLBACK_MANAGER, UNITY_SENDMESSAGE_CALLBACK_RETARGETTING_ERROR, [errDesc UTF8String]); 57 | 58 | } 59 | 60 | - (NSString *) getJsonStringFromDictionary:(NSDictionary *)dict { 61 | NSError *error; 62 | NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict 63 | options:0 64 | error:&error]; 65 | 66 | if (!jsonData) { 67 | NSLog(@"JSON error: %@", error); 68 | return nil; 69 | } else { 70 | 71 | NSString *JSONString = [[NSString alloc] initWithBytes:[jsonData bytes] length:[jsonData length] encoding:NSUTF8StringEncoding]; 72 | NSLog(@"JSON OUTPUT: %@", JSONString); 73 | return JSONString; 74 | } 75 | } 76 | 77 | 78 | @end 79 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 |

AppsFlyer Unity Sample App

4 | 5 | Instructions for AppsFlyer's Unity Sample App project: 6 | 7 | Open the Sample App Project using Unity. 8 | 9 | Inside "Sample" folder, open "StartUp.cs". 10 | 11 | In "StartUp.cs", enter your AppsFlyer Dev Key inside the "init"/"setAppsFlyerKey" function, and your Package Name / AppID inside "setAppID" function" - 12 | 13 | 14 |

15 | using System.Collections;
16 | using System.Collections.Generic;
17 | using UnityEngine;
18 | 
19 | public class AppsFlyerObject : MonoBehaviour {
20 |    void Start () {
21 |    
22 |    /* Mandatory - set your AppsFlyer’s Developer key. */
23 |    AppsFlyer.setAppsFlyerKey ("YOUR_APPSFLYER_DEV_KEY");
24 |    /* For detailed logging */
25 |    /* AppsFlyer.setIsDebug (true); */
26 |    
27 |    #if UNITY_IOS
28 |    
29 |       /* Mandatory - set your apple app ID
30 |       NOTE: You should enter the number only and not the "ID" prefix */
31 |       AppsFlyer.setAppID ("YOUR_APP_ID_HERE");
32 |       AppsFlyer.getConversionData();
33 |       AppsFlyer.trackAppLaunch ();
34 |       
35 |    #elif UNITY_ANDROID
36 |    
37 |      /* For getting the conversion data in Android, you need to add the "AppsFlyerTrackerCallbacks" listener.*/
38 |      AppsFlyer.init ("YOUR_APPSFLYER_DEV_KEY","AppsFlyerTrackerCallbacks");
39 |      
40 |   #endif
41 |    }
42 | }
43 | 
44 | 45 |

Android: Change the project's package name in Player Setting.

46 |

iOS: Make sure to that Security.framework is added to XCode

47 | 48 | Go to your AppsFlyer dashboard and add the app using the Package Name / App ID you configured in the code. 49 | 50 | Create a custom tracking link from your AppsFlyer dashboard - 51 | More Information 52 | 53 | Click the link on your device (Make sure to add &advertising_id="Your_Device_Google_Advertising_Id" for Android or &IDFA="Your_Device_IDFA" for iOS at the end of your tracking link). More Information 54 | 55 | 56 | Install the App on your device. You should be seeing the Attribution result on the screen. 57 | 58 | If you received the "Install Type: Non Organic" message on the app, you can go to your AppsFlyer dashboard and see the non-organic install there. 59 | 60 | For a Non-Organic install - click the "Track Event" to track a custom purchase event. You can then see the revenue and event on your AppsFlyer dashboard. 61 | 62 | 63 | [iOS Integration Guide](http://support.appsflyer.com/entries/25458906-iOS-SDK-Integration-Guide-v2-5-3-x-New-API-). 64 | 65 | [Android Integration Guide](http://support.appsflyer.com/entries/22801952-Android-SDK-Integration-Guide). 66 | 67 | 68 |

Screen Shots

69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | -------------------------------------------------------------------------------- /Assets/Plugins/iOS/AppsFlyerAppController.mm: -------------------------------------------------------------------------------- 1 | // 2 | // AppsFlyerAppController.mm 3 | // 4 | // Created by Shachar Aharon on 15/05/2017. 5 | // 6 | // 7 | 8 | #import "UnityAppController.h" 9 | #import "AppsFlyerTracker.h" 10 | #import "AppsFlyerDelegate.h" 11 | #import "AppDelegateListener.h" 12 | 13 | @interface AppsFlyerAppController : UnityAppController 14 | { 15 | BOOL didEnteredBackGround; 16 | } 17 | @end 18 | 19 | @implementation AppsFlyerAppController 20 | 21 | - (instancetype)init 22 | { 23 | NSLog(@"initializing AppsFlyerAppController"); 24 | self = [super init]; 25 | if (self) { 26 | UnityRegisterAppDelegateListener(self); 27 | } 28 | return self; 29 | } 30 | 31 | - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *))restorationHandler { 32 | [[AppsFlyerTracker sharedTracker] continueUserActivity:userActivity restorationHandler:restorationHandler]; 33 | return YES; 34 | } 35 | 36 | -(BOOL) application:(UIApplication *)application openUrl:(NSURL *)url options:(NSDictionary *)options { 37 | NSLog(@"got openUrl: %@",url); 38 | [[AppsFlyerTracker sharedTracker] handleOpenUrl:url options:options]; 39 | return YES; 40 | } 41 | 42 | 43 | // AppDelegateListener protocol 44 | 45 | - (void)onOpenURL:(NSNotification*)notification { 46 | NSLog(@"got onOpenURL = %@", notification.userInfo); 47 | NSURL *url = notification.userInfo[@"url"]; 48 | NSString *sourceApplication = notification.userInfo[@"sourceApplication"]; 49 | 50 | if (sourceApplication == nil) { 51 | sourceApplication = @""; 52 | } 53 | 54 | if (url != nil) { 55 | [[AppsFlyerTracker sharedTracker] handleOpenURL:url sourceApplication:sourceApplication withAnnotation:nil]; 56 | } 57 | 58 | } 59 | 60 | - (void)didReceiveRemoteNotification:(NSNotification*)notification { 61 | NSLog(@"got didReceiveRemoteNotification = %@", notification.userInfo); 62 | [[AppsFlyerTracker sharedTracker] handlePushNotification:notification.userInfo]; 63 | } 64 | 65 | // LifeCycleListener protocol 66 | 67 | - (void)didFinishLaunching:(NSNotification*)notification { 68 | NSLog(@"got didFinishLaunching = %@",notification.userInfo); 69 | if (notification.userInfo[@"url"]) { 70 | [self onOpenURL:notification]; 71 | } 72 | } 73 | 74 | -(void)didBecomeActive:(NSNotification*)notification { 75 | 76 | NSLog(@"got didBecomeActive(out) = %@", notification.userInfo); 77 | if (didEnteredBackGround == YES) { 78 | NSLog(@"got didBecomeActive = %@", notification.userInfo); 79 | [[AppsFlyerTracker sharedTracker] trackAppLaunch]; 80 | didEnteredBackGround = NO; 81 | 82 | } 83 | 84 | } 85 | 86 | - (void)willResignActive:(NSNotification*)notification { 87 | NSLog(@"got willResignActive = %@", notification.userInfo); 88 | 89 | } 90 | 91 | - (void)didEnterBackground:(NSNotification*)notification { 92 | NSLog(@"got didEnterBackground = %@", notification.userInfo); 93 | didEnteredBackGround = YES; 94 | } 95 | 96 | - (void)willEnterForeground:(NSNotification*)notification { 97 | NSLog(@"got willEnterForeground = %@", notification.userInfo); 98 | 99 | } 100 | 101 | - (void)willTerminate:(NSNotification*)notification { 102 | NSLog(@"got willTerminate = %@", notification.userInfo); 103 | 104 | } 105 | 106 | @end 107 | 108 | IMPL_APP_CONTROLLER_SUBCLASS(AppsFlyerAppController) 109 | -------------------------------------------------------------------------------- /Assets/Plugins/AFInAppEvents.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using System.Collections; 3 | 4 | public class AFInAppEvents { 5 | /** 6 | * Event Type 7 | * */ 8 | public const string LEVEL_ACHIEVED = "af_level_achieved"; 9 | public const string ADD_PAYMENT_INFO = "af_add_payment_info"; 10 | public const string ADD_TO_CART = "af_add_to_cart"; 11 | public const string ADD_TO_WISH_LIST = "af_add_to_wishlist"; 12 | public const string COMPLETE_REGISTRATION = "af_complete_registration"; 13 | public const string TUTORIAL_COMPLETION = "af_tutorial_completion"; 14 | public const string INITIATED_CHECKOUT = "af_initiated_checkout"; 15 | public const string PURCHASE = "af_purchase"; 16 | public const string RATE = "af_rate"; 17 | public const string SEARCH = "af_search"; 18 | public const string SPENT_CREDIT = "af_spent_credits"; 19 | public const string ACHIEVEMENT_UNLOCKED = "af_achievement_unlocked"; 20 | public const string CONTENT_VIEW = "af_content_view"; 21 | public const string TRAVEL_BOOKING = "af_travel_booking"; 22 | public const string SHARE = "af_share"; 23 | public const string INVITE = "af_invite"; 24 | public const string LOGIN = "af_login"; 25 | public const string RE_ENGAGE = "af_re_engage"; 26 | public const string UPDATE = "af_update"; 27 | public const string OPENED_FROM_PUSH_NOTIFICATION = "af_opened_from_push_notification"; 28 | public const string LOCATION_CHANGED = "af_location_changed"; 29 | public const string LOCATION_COORDINATES = "af_location_coordinates"; 30 | public const string ORDER_ID = "af_order_id"; 31 | /** 32 | * Event Parameter Name 33 | * **/ 34 | public const string LEVEL = "af_level"; 35 | public const string SCORE = "af_score"; 36 | public const string SUCCESS = "af_success"; 37 | public const string PRICE = "af_price"; 38 | public const string CONTENT_TYPE = "af_content_type"; 39 | public const string CONTENT_ID = "af_content_id"; 40 | public const string CONTENT_LIST = "af_content_list"; 41 | public const string CURRENCY = "af_currency"; 42 | public const string QUANTITY = "af_quantity"; 43 | public const string REGSITRATION_METHOD = "af_registration_method"; 44 | public const string PAYMENT_INFO_AVAILIBLE = "af_payment_info_available"; 45 | public const string MAX_RATING_VALUE = "af_max_rating_value"; 46 | public const string RATING_VALUE = "af_rating_value"; 47 | public const string SEARCH_STRING = "af_search_string"; 48 | public const string DATE_A = "af_date_a"; 49 | public const string DATE_B = "af_date_b"; 50 | public const string DESTINATION_A = "af_destination_a"; 51 | public const string DESTINATION_B = "af_destination_b"; 52 | public const string DESCRIPTION = "af_description"; 53 | public const string CLASS = "af_class"; 54 | public const string EVENT_START = "af_event_start"; 55 | public const string EVENT_END = "af_event_end"; 56 | public const string LATITUDE = "af_lat"; 57 | public const string LONGTITUDE = "af_long"; 58 | public const string CUSTOMER_USER_ID = "af_customer_user_id"; 59 | public const string VALIDATED = "af_validated"; 60 | public const string REVENUE = "af_revenue"; 61 | public const string RECEIPT_ID = "af_receipt_id"; 62 | public const string PARAM_1 = "af_param_1"; 63 | public const string PARAM_2 = "af_param_2"; 64 | public const string PARAM_3 = "af_param_3"; 65 | public const string PARAM_4 = "af_param_4"; 66 | public const string PARAM_5 = "af_param_5"; 67 | public const string PARAM_6 = "af_param_6"; 68 | public const string PARAM_7 = "af_param_7"; 69 | public const string PARAM_8 = "af_param_8"; 70 | public const string PARAM_9 = "af_param_9"; 71 | public const string PARAM_10 = "af_param_10"; 72 | } -------------------------------------------------------------------------------- /Assets/Sample/StartUp.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using UnityEngine.UI; 5 | 6 | public class StartUp : MonoBehaviour { 7 | public GameObject text; 8 | private bool tokenSent; 9 | 10 | // Use this for initialization 11 | void Start () { 12 | Application.runInBackground = true; 13 | Screen.orientation = ScreenOrientation.Portrait; 14 | DontDestroyOnLoad (this); 15 | AppsFlyer.setIsDebug(true); 16 | 17 | #if UNITY_IOS 18 | 19 | AppsFlyer.setAppsFlyerKey ("YOUR_DEV_KEY"); 20 | AppsFlyer.setAppID ("YOUR_APP_ID"); 21 | AppsFlyer.setIsDebug (true); 22 | AppsFlyer.getConversionData (); 23 | AppsFlyer.trackAppLaunch (); 24 | 25 | // register to push notifications for iOS uninstall 26 | UnityEngine.iOS.NotificationServices.RegisterForNotifications (UnityEngine.iOS.NotificationType.Alert | UnityEngine.iOS.NotificationType.Badge | UnityEngine.iOS.NotificationType.Sound); 27 | Screen.orientation = ScreenOrientation.Portrait; 28 | 29 | #elif UNITY_ANDROID 30 | 31 | AppsFlyer.init ("WdpTVAcYwmxsaQ4WeTspmh"); 32 | 33 | //AppsFlyer.setAppID ("YOUR_APP_ID"); 34 | 35 | // for getting the conversion data 36 | AppsFlyer.loadConversionData("StartUp"); 37 | 38 | // for in app billing validation 39 | // AppsFlyer.createValidateInAppListener ("AppsFlyerTrackerCallbacks", "onInAppBillingSuccess", "onInAppBillingFailure"); 40 | 41 | //For Android Uninstall 42 | //AppsFlyer.setGCMProjectNumber ("YOUR_GCM_PROJECT_NUMBER"); 43 | 44 | 45 | #endif 46 | } 47 | 48 | 49 | // Update is called once per frame 50 | void Update () { 51 | if (Input.GetKeyDown (KeyCode.Escape)) { 52 | //go to background when pressing back button 53 | #if UNITY_ANDROID 54 | AndroidJavaObject activity = 55 | new AndroidJavaClass("com.unity3d.player.UnityPlayer") 56 | .GetStatic("currentActivity"); 57 | activity.Call("moveTaskToBack", true); 58 | #endif 59 | } 60 | 61 | 62 | #if UNITY_IOS 63 | if (!tokenSent) { 64 | byte[] token = UnityEngine.iOS.NotificationServices.deviceToken; 65 | if (token != null) { 66 | //For iOS uninstall 67 | AppsFlyer.registerUninstall (token); 68 | tokenSent = true; 69 | } 70 | } 71 | #endif 72 | } 73 | //A custom event tracking 74 | public void Purchase(){ 75 | Dictionary eventValue = new Dictionary (); 76 | eventValue.Add("af_revenue","300"); 77 | eventValue.Add("af_content_type","category_a"); 78 | eventValue.Add("af_content_id","1234567"); 79 | eventValue.Add("af_currency","USD"); 80 | AppsFlyer.trackRichEvent("af_purchase", eventValue); 81 | 82 | AF_Sample_BGScript.pressed (); 83 | 84 | } 85 | 86 | //On Android ou can call the conversion data directly from your CS file, or from the default AppsFlyerTrackerCallbacks 87 | public void didReceiveConversionData(string conversionData) { 88 | print ("AppsFlyerTrackerCallbacks:: got conversion data = " + conversionData); 89 | if (conversionData.Contains ("Non")) { 90 | text.GetComponent ().text = "Non-Organic Install"; 91 | } else { 92 | text.GetComponent ().text = "Organic Install"; 93 | } 94 | } 95 | public void didReceiveConversionDataWithError(string error) { 96 | print ("AppsFlyerTrackerCallbacks:: got conversion data error = " + error); 97 | } 98 | 99 | public void onAppOpenAttribution(string validateResult) { 100 | print ("AppsFlyerTrackerCallbacks:: got onAppOpenAttribution = " + validateResult); 101 | 102 | } 103 | 104 | public void onAppOpenAttributionFailure (string error) { 105 | print ("AppsFlyerTrackerCallbacks:: got onAppOpenAttributionFailure error = " + error); 106 | 107 | } 108 | 109 | } 110 | -------------------------------------------------------------------------------- /Assembly-CSharp-firstpass.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 4 5 | 6 | 7 | Debug 8 | AnyCPU 9 | 10.0.20506 10 | 2.0 11 | 12 | {CAA74034-4528-A519-6505-D032D6DA47CC} 13 | Library 14 | Properties 15 | Assembly-CSharp-firstpass 16 | v3.5 17 | 512 18 | Assets 19 | 20 | 21 | true 22 | full 23 | false 24 | Temp\bin\Debug\ 25 | DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_1_2;UNITY_2017_1;UNITY_2017;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_GENERICS;ENABLE_PVR_GI;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_RUNTIME_NAVMESH_BUILDING;ENABLE_SPRITERENDERER_FLIPPING;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_RAKNET;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_NATIVE_ARRAY;ENABLE_SPRITE_MASKING;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;INCLUDE_PUBNUB;ENABLE_PLAYMODE_TESTS_RUNNER;ENABLE_VIDEO;ENABLE_RMGUI;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_STYLE_SHEETS;PLATFORM_ANDROID;UNITY_ANDROID;UNITY_ANDROID_API;ENABLE_SUBSTANCE;ENABLE_EGL;ENABLE_NETWORK;ENABLE_RUNTIME_GI;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;PLATFORM_SUPPORTS_ADS_ID;UNITY_CAN_SHOW_SPLASH_SCREEN;ENABLE_VR;ENABLE_UNITYADS_RUNTIME;UNITY_UNITYADS_API;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_OSX;ENABLE_NATIVE_ARRAY_CHECKS;UNITY_TEAM_LICENSE;UNITY_HAS_GOOGLEVR 26 | prompt 27 | 4 28 | 0169 29 | true 30 | 31 | 32 | pdbonly 33 | true 34 | Temp\bin\Release\ 35 | prompt 36 | 4 37 | 0169 38 | true 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | /Applications/Unity/Unity.app/Contents/Managed/UnityEngine.dll 48 | 49 | 50 | /Applications/Unity/Unity.app/Contents/Managed/UnityEditor.dll 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | /Applications/Unity/Unity.app/Contents/UnityExtensions/Unity/GUISystem/UnityEngine.UI.dll 59 | 60 | 61 | /Applications/Unity/Unity.app/Contents/UnityExtensions/Unity/Networking/UnityEngine.Networking.dll 62 | 63 | 64 | /Applications/Unity/Unity.app/Contents/UnityExtensions/Unity/TestRunner/UnityEngine.TestRunner.dll 65 | 66 | 67 | /Applications/Unity/Unity.app/Contents/UnityExtensions/Unity/TestRunner/net35/unity-custom/nunit.framework.dll 68 | 69 | 70 | /Applications/Unity/Unity.app/Contents/UnityExtensions/Unity/Timeline/RuntimeEditor/UnityEngine.Timeline.dll 71 | 72 | 73 | /Applications/Unity/Unity.app/Contents/UnityExtensions/Unity/UnityAnalytics/UnityEngine.Analytics.dll 74 | 75 | 76 | /Applications/Unity/Unity.app/Contents/UnityExtensions/Unity/UnityHoloLens/RuntimeEditor/UnityEngine.HoloLens.dll 77 | 78 | 79 | 80 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /Assembly-CSharp.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 4 5 | 6 | 7 | Debug 8 | AnyCPU 9 | 10.0.20506 10 | 2.0 11 | 12 | {DC254097-6CA1-DD9A-DDB4-68BC798B09D3} 13 | Library 14 | Properties 15 | Assembly-CSharp 16 | v3.5 17 | 512 18 | Assets 19 | 20 | 21 | true 22 | full 23 | false 24 | Temp\bin\Debug\ 25 | DEBUG;TRACE;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_1_2;UNITY_2017_1;UNITY_2017;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_GENERICS;ENABLE_PVR_GI;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_RUNTIME_NAVMESH_BUILDING;ENABLE_SPRITERENDERER_FLIPPING;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_RAKNET;ENABLE_DIRECTOR;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_WEBCAM;ENABLE_WWW;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_HUB;ENABLE_CLOUD_PROJECT_ID;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_TIMELINE;ENABLE_EDITOR_METRICS;ENABLE_EDITOR_METRICS_CACHING;ENABLE_NATIVE_ARRAY;ENABLE_SPRITE_MASKING;INCLUDE_DYNAMIC_GI;INCLUDE_GI;ENABLE_MONO_BDWGC;PLATFORM_SUPPORTS_MONO;INCLUDE_PUBNUB;ENABLE_PLAYMODE_TESTS_RUNNER;ENABLE_VIDEO;ENABLE_RMGUI;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_STYLE_SHEETS;PLATFORM_ANDROID;UNITY_ANDROID;UNITY_ANDROID_API;ENABLE_SUBSTANCE;ENABLE_EGL;ENABLE_NETWORK;ENABLE_RUNTIME_GI;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_UNITYWEBREQUEST;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;PLATFORM_SUPPORTS_ADS_ID;UNITY_CAN_SHOW_SPLASH_SCREEN;ENABLE_VR;ENABLE_UNITYADS_RUNTIME;UNITY_UNITYADS_API;ENABLE_MONO;NET_2_0_SUBSET;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_OSX;ENABLE_NATIVE_ARRAY_CHECKS;UNITY_TEAM_LICENSE;UNITY_HAS_GOOGLEVR 26 | prompt 27 | 4 28 | 0169 29 | true 30 | 31 | 32 | pdbonly 33 | true 34 | Temp\bin\Release\ 35 | prompt 36 | 4 37 | 0169 38 | true 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | /Applications/Unity/Unity.app/Contents/Managed/UnityEngine.dll 48 | 49 | 50 | /Applications/Unity/Unity.app/Contents/Managed/UnityEditor.dll 51 | 52 | 53 | 54 | 55 | 56 | 57 | /Applications/Unity/Unity.app/Contents/UnityExtensions/Unity/GUISystem/UnityEngine.UI.dll 58 | 59 | 60 | /Applications/Unity/Unity.app/Contents/UnityExtensions/Unity/Networking/UnityEngine.Networking.dll 61 | 62 | 63 | /Applications/Unity/Unity.app/Contents/UnityExtensions/Unity/TestRunner/UnityEngine.TestRunner.dll 64 | 65 | 66 | /Applications/Unity/Unity.app/Contents/UnityExtensions/Unity/TestRunner/net35/unity-custom/nunit.framework.dll 67 | 68 | 69 | /Applications/Unity/Unity.app/Contents/UnityExtensions/Unity/Timeline/RuntimeEditor/UnityEngine.Timeline.dll 70 | 71 | 72 | /Applications/Unity/Unity.app/Contents/UnityExtensions/Unity/UnityAnalytics/UnityEngine.Analytics.dll 73 | 74 | 75 | /Applications/Unity/Unity.app/Contents/UnityExtensions/Unity/UnityHoloLens/RuntimeEditor/UnityEngine.HoloLens.dll 76 | 77 | 78 | 79 | 80 | {CAA74034-4528-A519-6505-D032D6DA47CC} Assembly-CSharp-firstpass 81 | 82 | 83 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /Assets/Demo.unity: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!29 &1 4 | OcclusionCullingSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_OcclusionBakeSettings: 8 | smallestOccluder: 5 9 | smallestHole: 0.25 10 | backfaceThreshold: 100 11 | m_SceneGUID: 00000000000000000000000000000000 12 | m_OcclusionCullingData: {fileID: 0} 13 | --- !u!104 &2 14 | RenderSettings: 15 | m_ObjectHideFlags: 0 16 | serializedVersion: 8 17 | m_Fog: 0 18 | m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} 19 | m_FogMode: 3 20 | m_FogDensity: 0.01 21 | m_LinearFogStart: 0 22 | m_LinearFogEnd: 300 23 | m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} 24 | m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} 25 | m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} 26 | m_AmbientIntensity: 1 27 | m_AmbientMode: 0 28 | m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} 29 | m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} 30 | m_HaloStrength: 0.5 31 | m_FlareStrength: 1 32 | m_FlareFadeSpeed: 3 33 | m_HaloTexture: {fileID: 0} 34 | m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} 35 | m_DefaultReflectionMode: 0 36 | m_DefaultReflectionResolution: 128 37 | m_ReflectionBounces: 1 38 | m_ReflectionIntensity: 1 39 | m_CustomReflection: {fileID: 0} 40 | m_Sun: {fileID: 0} 41 | m_IndirectSpecularColor: {r: 0.44657826, g: 0.49641263, b: 0.57481676, a: 1} 42 | --- !u!157 &3 43 | LightmapSettings: 44 | m_ObjectHideFlags: 0 45 | serializedVersion: 11 46 | m_GIWorkflowMode: 0 47 | m_GISettings: 48 | serializedVersion: 2 49 | m_BounceScale: 1 50 | m_IndirectOutputScale: 1 51 | m_AlbedoBoost: 1 52 | m_TemporalCoherenceThreshold: 1 53 | m_EnvironmentLightingMode: 0 54 | m_EnableBakedLightmaps: 1 55 | m_EnableRealtimeLightmaps: 1 56 | m_LightmapEditorSettings: 57 | serializedVersion: 9 58 | m_Resolution: 2 59 | m_BakeResolution: 40 60 | m_TextureWidth: 1024 61 | m_TextureHeight: 1024 62 | m_AO: 0 63 | m_AOMaxDistance: 1 64 | m_CompAOExponent: 1 65 | m_CompAOExponentDirect: 0 66 | m_Padding: 2 67 | m_LightmapParameters: {fileID: 0} 68 | m_LightmapsBakeMode: 1 69 | m_TextureCompression: 1 70 | m_FinalGather: 0 71 | m_FinalGatherFiltering: 1 72 | m_FinalGatherRayCount: 256 73 | m_ReflectionCompression: 2 74 | m_MixedBakeMode: 2 75 | m_BakeBackend: 0 76 | m_PVRSampling: 1 77 | m_PVRDirectSampleCount: 32 78 | m_PVRSampleCount: 500 79 | m_PVRBounces: 2 80 | m_PVRFilterTypeDirect: 0 81 | m_PVRFilterTypeIndirect: 0 82 | m_PVRFilterTypeAO: 0 83 | m_PVRFilteringMode: 1 84 | m_PVRCulling: 1 85 | m_PVRFilteringGaussRadiusDirect: 1 86 | m_PVRFilteringGaussRadiusIndirect: 5 87 | m_PVRFilteringGaussRadiusAO: 2 88 | m_PVRFilteringAtrousPositionSigmaDirect: 0.5 89 | m_PVRFilteringAtrousPositionSigmaIndirect: 2 90 | m_PVRFilteringAtrousPositionSigmaAO: 1 91 | m_LightingDataAsset: {fileID: 0} 92 | m_UseShadowmask: 1 93 | --- !u!196 &4 94 | NavMeshSettings: 95 | serializedVersion: 2 96 | m_ObjectHideFlags: 0 97 | m_BuildSettings: 98 | serializedVersion: 2 99 | agentTypeID: 0 100 | agentRadius: 0.5 101 | agentHeight: 2 102 | agentSlope: 45 103 | agentClimb: 0.4 104 | ledgeDropHeight: 0 105 | maxJumpAcrossDistance: 0 106 | minRegionArea: 2 107 | manualCellSize: 0 108 | cellSize: 0.16666667 109 | manualTileSize: 0 110 | tileSize: 256 111 | accuratePlacement: 0 112 | m_NavMeshData: {fileID: 0} 113 | --- !u!1 &869141643 114 | GameObject: 115 | m_ObjectHideFlags: 0 116 | m_PrefabParentObject: {fileID: 0} 117 | m_PrefabInternal: {fileID: 0} 118 | serializedVersion: 5 119 | m_Component: 120 | - component: {fileID: 869141648} 121 | - component: {fileID: 869141647} 122 | - component: {fileID: 869141646} 123 | - component: {fileID: 869141645} 124 | - component: {fileID: 869141644} 125 | m_Layer: 0 126 | m_Name: Main Camera 127 | m_TagString: MainCamera 128 | m_Icon: {fileID: 0} 129 | m_NavMeshLayer: 0 130 | m_StaticEditorFlags: 0 131 | m_IsActive: 1 132 | --- !u!81 &869141644 133 | AudioListener: 134 | m_ObjectHideFlags: 0 135 | m_PrefabParentObject: {fileID: 0} 136 | m_PrefabInternal: {fileID: 0} 137 | m_GameObject: {fileID: 869141643} 138 | m_Enabled: 1 139 | --- !u!124 &869141645 140 | Behaviour: 141 | m_ObjectHideFlags: 0 142 | m_PrefabParentObject: {fileID: 0} 143 | m_PrefabInternal: {fileID: 0} 144 | m_GameObject: {fileID: 869141643} 145 | m_Enabled: 1 146 | --- !u!92 &869141646 147 | Behaviour: 148 | m_ObjectHideFlags: 0 149 | m_PrefabParentObject: {fileID: 0} 150 | m_PrefabInternal: {fileID: 0} 151 | m_GameObject: {fileID: 869141643} 152 | m_Enabled: 1 153 | --- !u!20 &869141647 154 | Camera: 155 | m_ObjectHideFlags: 0 156 | m_PrefabParentObject: {fileID: 0} 157 | m_PrefabInternal: {fileID: 0} 158 | m_GameObject: {fileID: 869141643} 159 | m_Enabled: 1 160 | serializedVersion: 2 161 | m_ClearFlags: 1 162 | m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} 163 | m_NormalizedViewPortRect: 164 | serializedVersion: 2 165 | x: 0 166 | y: 0 167 | width: 1 168 | height: 1 169 | near clip plane: 0.3 170 | far clip plane: 1000 171 | field of view: 60 172 | orthographic: 0 173 | orthographic size: 5 174 | m_Depth: -1 175 | m_CullingMask: 176 | serializedVersion: 2 177 | m_Bits: 4294967295 178 | m_RenderingPath: -1 179 | m_TargetTexture: {fileID: 0} 180 | m_TargetDisplay: 0 181 | m_TargetEye: 3 182 | m_HDR: 1 183 | m_AllowMSAA: 1 184 | m_ForceIntoRT: 0 185 | m_OcclusionCulling: 1 186 | m_StereoConvergence: 10 187 | m_StereoSeparation: 0.022 188 | m_StereoMirrorMode: 0 189 | --- !u!4 &869141648 190 | Transform: 191 | m_ObjectHideFlags: 0 192 | m_PrefabParentObject: {fileID: 0} 193 | m_PrefabInternal: {fileID: 0} 194 | m_GameObject: {fileID: 869141643} 195 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 196 | m_LocalPosition: {x: 0, y: 1, z: -10} 197 | m_LocalScale: {x: 1, y: 1, z: 1} 198 | m_Children: [] 199 | m_Father: {fileID: 0} 200 | m_RootOrder: 0 201 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 202 | --- !u!1 &1212899510 203 | GameObject: 204 | m_ObjectHideFlags: 0 205 | m_PrefabParentObject: {fileID: 0} 206 | m_PrefabInternal: {fileID: 0} 207 | serializedVersion: 5 208 | m_Component: 209 | - component: {fileID: 1212899512} 210 | - component: {fileID: 1212899511} 211 | m_Layer: 0 212 | m_Name: Directional Light 213 | m_TagString: Untagged 214 | m_Icon: {fileID: 0} 215 | m_NavMeshLayer: 0 216 | m_StaticEditorFlags: 0 217 | m_IsActive: 1 218 | --- !u!108 &1212899511 219 | Light: 220 | m_ObjectHideFlags: 0 221 | m_PrefabParentObject: {fileID: 0} 222 | m_PrefabInternal: {fileID: 0} 223 | m_GameObject: {fileID: 1212899510} 224 | m_Enabled: 1 225 | serializedVersion: 8 226 | m_Type: 1 227 | m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} 228 | m_Intensity: 1 229 | m_Range: 10 230 | m_SpotAngle: 30 231 | m_CookieSize: 10 232 | m_Shadows: 233 | m_Type: 2 234 | m_Resolution: -1 235 | m_CustomResolution: -1 236 | m_Strength: 1 237 | m_Bias: 0.05 238 | m_NormalBias: 0.4 239 | m_NearPlane: 0.2 240 | m_Cookie: {fileID: 0} 241 | m_DrawHalo: 0 242 | m_Flare: {fileID: 0} 243 | m_RenderMode: 0 244 | m_CullingMask: 245 | serializedVersion: 2 246 | m_Bits: 4294967295 247 | m_Lightmapping: 4 248 | m_AreaSize: {x: 1, y: 1} 249 | m_BounceIntensity: 1 250 | m_ColorTemperature: 6570 251 | m_UseColorTemperature: 0 252 | m_ShadowRadius: 0 253 | m_ShadowAngle: 0 254 | --- !u!4 &1212899512 255 | Transform: 256 | m_ObjectHideFlags: 0 257 | m_PrefabParentObject: {fileID: 0} 258 | m_PrefabInternal: {fileID: 0} 259 | m_GameObject: {fileID: 1212899510} 260 | m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} 261 | m_LocalPosition: {x: 0, y: 3, z: 0} 262 | m_LocalScale: {x: 1, y: 1, z: 1} 263 | m_Children: [] 264 | m_Father: {fileID: 0} 265 | m_RootOrder: 1 266 | m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} 267 | -------------------------------------------------------------------------------- /Assets/Plugins/iOS/AppsFlyerWrapper.mm: -------------------------------------------------------------------------------- 1 | // 2 | // AppsFlyerWarpper.m 3 | // 4 | // 5 | // Created by AppsFlyer 2013 6 | // 7 | // 8 | 9 | #import "AppsFlyerWrapper.h" 10 | #import "AppsFlyerTracker.h" 11 | #import "AppsFlyerDelegate.h" 12 | 13 | 14 | static AppsFlyerDelegate *mAppsFlyerdelegate; 15 | static const int kPushNotificationSize = 32; 16 | 17 | @interface AppsFlyerWarpper () { 18 | } 19 | 20 | @end 21 | 22 | @implementation AppsFlyerWarpper 23 | 24 | +(AppsFlyerDelegate *) getAppsFlyerDelegate { 25 | 26 | if (mAppsFlyerdelegate == nil) { 27 | mAppsFlyerdelegate = [[AppsFlyerDelegate alloc] init]; 28 | } 29 | return mAppsFlyerdelegate; 30 | } 31 | 32 | 33 | 34 | extern "C" { 35 | 36 | const void mTrackEvent(const char *eventName,const char *eventValue){ 37 | NSString *name = [NSString stringWithUTF8String:eventName]; 38 | NSString *value = [NSString stringWithUTF8String:eventValue]; 39 | [[AppsFlyerTracker sharedTracker] trackEvent:name withValue:value]; 40 | 41 | } 42 | 43 | const void mTrackRichEvent(const char *eventName, const char *eventValues){ 44 | NSString *name = [NSString stringWithUTF8String:eventName]; 45 | 46 | NSString *attris = [NSString stringWithUTF8String:eventValues]; 47 | 48 | NSArray *attributesArray = [attris componentsSeparatedByString:@"\n"]; 49 | 50 | NSMutableDictionary *oAttributes = [[NSMutableDictionary alloc] init]; 51 | for (int i=0; i < [attributesArray count]; i++) { 52 | NSString *keyValuePair = [attributesArray objectAtIndex:i]; 53 | NSRange range = [keyValuePair rangeOfString:@"="]; 54 | if (range.location != NSNotFound) { 55 | NSString *key = [keyValuePair substringToIndex:range.location]; 56 | NSString *value = [keyValuePair substringFromIndex:range.location+1]; 57 | [oAttributes setObject:value forKey:key]; 58 | } 59 | } 60 | 61 | 62 | [[AppsFlyerTracker sharedTracker] trackEvent:name withValues:oAttributes]; 63 | 64 | } 65 | 66 | const void mSetCurrencyCode(const char *currencyCode){ 67 | NSString *code = [NSString stringWithUTF8String:currencyCode]; 68 | [[AppsFlyerTracker sharedTracker] setCurrencyCode:code]; 69 | 70 | } 71 | 72 | const void mSetCustomerUserID(const char *customerUserID){ 73 | NSString *customerUserIDString = [NSString stringWithUTF8String:customerUserID]; 74 | [[AppsFlyerTracker sharedTracker] setCustomerUserID:customerUserIDString]; 75 | 76 | } 77 | 78 | const void mSetAppsFlyerDevKey(const char *devKey){ 79 | NSString *devKeyString = [NSString stringWithUTF8String:devKey]; 80 | [AppsFlyerTracker sharedTracker].appsFlyerDevKey = devKeyString; 81 | } 82 | 83 | const void mTrackAppLaunch() { 84 | [[AppsFlyerTracker sharedTracker] trackAppLaunch]; 85 | } 86 | 87 | const void mSetAppID(const char *appleAppID){ 88 | NSString *appleAppIDString = [NSString stringWithUTF8String:appleAppID]; 89 | [AppsFlyerTracker sharedTracker].appleAppID = appleAppIDString; 90 | } 91 | 92 | const void mValidateReceipt(const char *productIdentifier, const char *price, const char *currency, const char *transactionId ,const char *additionalParams) { 93 | 94 | NSString *productIdentifierString = [NSString stringWithUTF8String:productIdentifier]; 95 | NSString *currencyString = [NSString stringWithUTF8String:currency]; 96 | NSString *priceValue = [NSString stringWithUTF8String:price]; 97 | NSString *transactionIdString = [NSString stringWithUTF8String:transactionId]; 98 | 99 | NSString *attris = [NSString stringWithUTF8String:additionalParams]; 100 | NSArray *attributesArray = [attris componentsSeparatedByString:@"\n"]; 101 | 102 | NSMutableDictionary *customParams = [[NSMutableDictionary alloc] init]; 103 | for (int i=0; i < [attributesArray count]; i++) { 104 | NSString *keyValuePair = [attributesArray objectAtIndex:i]; 105 | NSRange range = [keyValuePair rangeOfString:@"="]; 106 | if (range.location != NSNotFound) { 107 | NSString *key = [keyValuePair substringToIndex:range.location]; 108 | NSString *value = [keyValuePair substringFromIndex:range.location+1]; 109 | [customParams setObject:value forKey:key]; 110 | } 111 | } 112 | 113 | 114 | [[AppsFlyerTracker sharedTracker] validateAndTrackInAppPurchase:productIdentifierString 115 | price:priceValue 116 | currency:currencyString 117 | transactionId:transactionIdString 118 | additionalParameters:customParams 119 | success:^(NSDictionary *result) 120 | { 121 | NSLog(@"Purcahse succeeded And verified!!!"); 122 | 123 | NSData *jsonData; 124 | 125 | NSError *jsonError; 126 | jsonData = [NSJSONSerialization dataWithJSONObject:result 127 | options:0 128 | error:&jsonError]; 129 | if (jsonError) 130 | { 131 | NSLog(@"JSON parse error"); 132 | UnitySendMessage(UNITY_SENDMESSAGE_CALLBACK_MANAGER, UNITY_SENDMESSAGE_CALLBACK_VALIDATE_ERROR, [@"Invalid Response" UTF8String]); 133 | } 134 | else 135 | { 136 | NSString *JSONString = [[NSString alloc] initWithBytes:[jsonData bytes] length:[jsonData length] encoding:NSUTF8StringEncoding]; 137 | UnitySendMessage(UNITY_SENDMESSAGE_CALLBACK_MANAGER, UNITY_SENDMESSAGE_CALLBACK_VALIDATE, [JSONString UTF8String]); 138 | 139 | } 140 | } 141 | failure:^(NSError *error, id response) 142 | { 143 | NSString *errorString = (!error) ? @"unknown" : [NSString stringWithFormat:@"error: %@", [error localizedDescription]]; 144 | if ([response isKindOfClass:[NSDictionary class]]) { 145 | if ([response objectForKey:@"error"] != nil) 146 | { 147 | errorString = response[@"error"]; 148 | } 149 | else if ([response objectForKey:@"status"] != nil) 150 | { 151 | errorString = [NSString stringWithFormat:@"Error code = %@", response[@"status"]]; 152 | } 153 | } 154 | else if ([response isKindOfClass:[NSData class]]) { 155 | errorString = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]; 156 | } 157 | else if ([response isKindOfClass:[NSString class]]) { 158 | errorString = response; 159 | } 160 | NSLog(@"Response = %@", errorString); 161 | 162 | UnitySendMessage(UNITY_SENDMESSAGE_CALLBACK_MANAGER, UNITY_SENDMESSAGE_CALLBACK_VALIDATE_ERROR, [errorString UTF8String]); 163 | }]; 164 | } 165 | 166 | const void mSetIsDebug(bool isDebug) { 167 | [AppsFlyerTracker sharedTracker].isDebug = isDebug; 168 | } 169 | 170 | const void mSetIsSandbox(bool isSandbox) { 171 | [AppsFlyerTracker sharedTracker].useReceiptValidationSandbox = isSandbox; 172 | } 173 | 174 | 175 | const void mGetConversionData() { 176 | [[AppsFlyerTracker sharedTracker] setDelegate:[AppsFlyerWarpper getAppsFlyerDelegate]]; 177 | } 178 | 179 | 180 | const void mHandleOpenUrl(const char *url, const char *sourceApplication, const char *annotation) { 181 | [[AppsFlyerTracker sharedTracker] handleOpenURL:[NSURL URLWithString:[NSString stringWithUTF8String:url]] sourceApplication:[NSString stringWithUTF8String:sourceApplication] withAnnotation:[NSString stringWithUTF8String:annotation]]; 182 | } 183 | 184 | const void mHandlePushNotification(const char *payloadData) { 185 | 186 | NSString *attris = [NSString stringWithUTF8String:payloadData]; 187 | NSArray *attributesArray = [attris componentsSeparatedByString:@"\n"]; 188 | 189 | NSMutableDictionary *pushPayloadDict = [[NSMutableDictionary alloc] init]; 190 | for (int i=0; i < [attributesArray count]; i++) { 191 | NSString *keyValuePair = [attributesArray objectAtIndex:i]; 192 | NSRange range = [keyValuePair rangeOfString:@"="]; 193 | if (range.location != NSNotFound) { 194 | NSString *key = [keyValuePair substringToIndex:range.location]; 195 | NSString *value = [keyValuePair substringFromIndex:range.location+1]; 196 | [pushPayloadDict setObject:value forKey:key]; 197 | } 198 | } 199 | [[AppsFlyerTracker sharedTracker] handlePushNotification:pushPayloadDict]; 200 | 201 | } 202 | 203 | const void mRegisterUninstall (unsigned char *pushToken) { 204 | NSData* tokenData = [NSData dataWithBytes:(const void *)pushToken length:sizeof(unsigned char)*kPushNotificationSize]; 205 | [[AppsFlyerTracker sharedTracker] registerUninstall:tokenData]; 206 | } 207 | 208 | char* cStringAFCopy(const char* string) 209 | { 210 | if (string == NULL) 211 | return NULL; 212 | 213 | char* res = (char*)malloc(strlen(string) + 1); 214 | strcpy(res, string); 215 | 216 | return res; 217 | } 218 | 219 | const char *mGetAppsFlyerId () { 220 | NSString *afid = [[AppsFlyerTracker sharedTracker] getAppsFlyerUID]; 221 | return cStringAFCopy([afid UTF8String]); 222 | } 223 | 224 | const void mSetShouldCollectDeviceName (bool shouldCollectDeviceName) { 225 | [AppsFlyerTracker sharedTracker].shouldCollectDeviceName = shouldCollectDeviceName; 226 | } 227 | 228 | 229 | } 230 | 231 | @end 232 | -------------------------------------------------------------------------------- /Assets/Plugins/iOS/AppsFlyerTracker.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppsFlyerTracker.h 3 | // AppsFlyerLib 4 | // 5 | // AppsFlyer iOS SDK 4.8.0 (597) 6 | // Copyright (c) 2013 AppsFlyer Ltd. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppsFlyerCrossPromotionHelper.h" 11 | #import "AppsFlyerShareInviteHelper.h" 12 | 13 | 14 | 15 | // In app event names constants 16 | #define AFEventLevelAchieved @"af_level_achieved" 17 | #define AFEventAddPaymentInfo @"af_add_payment_info" 18 | #define AFEventAddToCart @"af_add_to_cart" 19 | #define AFEventAddToWishlist @"af_add_to_wishlist" 20 | #define AFEventCompleteRegistration @"af_complete_registration" 21 | #define AFEventTutorial_completion @"af_tutorial_completion" 22 | #define AFEventInitiatedCheckout @"af_initiated_checkout" 23 | #define AFEventPurchase @"af_purchase" 24 | #define AFEventRate @"af_rate" 25 | #define AFEventSearch @"af_search" 26 | #define AFEventSpentCredits @"af_spent_credits" 27 | #define AFEventAchievementUnlocked @"af_achievement_unlocked" 28 | #define AFEventContentView @"af_content_view" 29 | #define AFEventListView @"af_list_view" 30 | #define AFEventTravelBooking @"af_travel_booking" 31 | #define AFEventShare @"af_share" 32 | #define AFEventInvite @"af_invite" 33 | #define AFEventLogin @"af_login" 34 | #define AFEventReEngage @"af_re_engage" 35 | #define AFEventUpdate @"af_update" 36 | #define AFEventOpenedFromPushNotification @"af_opened_from_push_notification" 37 | #define AFEventLocation @"af_location_coordinates" 38 | #define AFEventCustomerSegment @"af_customer_segment" 39 | 40 | 41 | 42 | // In app event parameter names 43 | #define AFEventParamAchievenmentId @"af_achievement_id" 44 | #define AFEventParamLevel @"af_level" 45 | #define AFEventParamScore @"af_score" 46 | #define AFEventParamSuccess @"af_success" 47 | #define AFEventParamPrice @"af_price" 48 | #define AFEventParamContentType @"af_content_type" 49 | #define AFEventParamContentId @"af_content_id" 50 | #define AFEventParamContentList @"af_content_list" 51 | #define AFEventParamCurrency @"af_currency" 52 | #define AFEventParamQuantity @"af_quantity" 53 | #define AFEventParamRegistrationMethod @"af_registration_method" 54 | #define AFEventParamPaymentInfoAvailable @"af_payment_info_available" 55 | #define AFEventParamMaxRatingValue @"af_max_rating_value" 56 | #define AFEventParamRatingValue @"af_rating_value" 57 | #define AFEventParamSearchString @"af_search_string" 58 | #define AFEventParamDateA @"af_date_a" 59 | #define AFEventParamDateB @"af_date_b" 60 | #define AFEventParamDestinationA @"af_destination_a" 61 | #define AFEventParamDestinationB @"af_destination_b" 62 | #define AFEventParamDescription @"af_description" 63 | #define AFEventParamClass @"af_class" 64 | #define AFEventParamEventStart @"af_event_start" 65 | #define AFEventParamEventEnd @"af_event_end" 66 | #define AFEventParamLat @"af_lat" 67 | #define AFEventParamLong @"af_long" 68 | #define AFEventParamCustomerUserId @"af_customer_user_id" 69 | #define AFEventParamValidated @"af_validated" 70 | #define AFEventParamRevenue @"af_revenue" 71 | #define AFEventProjectedParamRevenue @"af_projected_revenue" 72 | #define AFEventParamReceiptId @"af_receipt_id" 73 | #define AFEventParamTutorialId @"af_tutorial_id" 74 | #define AFEventParamAchievenmentId @"af_achievement_id" 75 | #define AFEventParamVirtualCurrencyName @"af_virtual_currency_name" 76 | #define AFEventParamDeepLink @"af_deep_link" 77 | #define AFEventParamOldVersion @"af_old_version" 78 | #define AFEventParamNewVersion @"af_new_version" 79 | #define AFEventParamReviewText @"af_review_text" 80 | #define AFEventParamCouponCode @"af_coupon_code" 81 | #define AFEventParamOrderId @"af_order_id" 82 | #define AFEventParam1 @"af_param_1" 83 | #define AFEventParam2 @"af_param_2" 84 | #define AFEventParam3 @"af_param_3" 85 | #define AFEventParam4 @"af_param_4" 86 | #define AFEventParam5 @"af_param_5" 87 | #define AFEventParam6 @"af_param_6" 88 | #define AFEventParam7 @"af_param_7" 89 | #define AFEventParam8 @"af_param_8" 90 | #define AFEventParam9 @"af_param_9" 91 | #define AFEventParam10 @"af_param_10" 92 | 93 | #define AFEventParamDepartingDepartureDate @"af_departing_departure_date" 94 | #define AFEventParamReturningDepartureDate @"af_returning_departure_date" 95 | #define AFEventParamDestinationList @"af_destination_list" //array of string 96 | #define AFEventParamCity @"af_city" 97 | #define AFEventParamRegion @"af_region" 98 | #define AFEventParamCountry @"af_country" 99 | 100 | 101 | #define AFEventParamDepartingArrivalDate @"af_departing_arrival_date" 102 | #define AFEventParamReturningArrivalDate @"af_returning_arrival_date" 103 | #define AFEventParamSuggestedDestinations @"af_suggested_destinations" //array of string 104 | #define AFEventParamTravelStart @"af_travel_start" 105 | #define AFEventParamTravelEnd @"af_travel_end" 106 | #define AFEventParamNumAdults @"af_num_adults" 107 | #define AFEventParamNumChildren @"af_num_children" 108 | #define AFEventParamNumInfants @"af_num_infants" 109 | #define AFEventParamSuggestedHotels @"af_suggested_hotels" //array of string 110 | 111 | #define AFEventParamUserScore @"af_user_score" 112 | #define AFEventParamHotelScore @"af_hotel_score" 113 | #define AFEventParamPurchaseCurrency @"af_purchase_currency" 114 | 115 | #define AFEventParamPreferredStarRatings @"af_preferred_star_ratings" //array of int (basically a tupple (min,max) but we'll use array of int and instruct the developer to use two values) 116 | 117 | #define AFEventParamPreferredPriceRange @"af_preferred_price_range" //array of int (basically a tupple (min,max) but we'll use array of int and instruct the developer to use two values) 118 | #define AFEventParamPreferredNeighborhoods @"af_preferred_neighborhoods" //array of string 119 | #define AFEventParamPreferredNumStops @"af_preferred_num_stops" 120 | 121 | 122 | #define kAppsFlyerOneLinkVersion @"oneLinkVersion" 123 | #define kAppsFlyerOneLinkScheme @"oneLinkScheme" 124 | #define kAppsFlyerOneLinkDomain @"oneLinkDomain" 125 | #define kDefaultOneLink @"go.onelink.me" 126 | #define kNoOneLinkFallback @"https://app.appsflyer.com" 127 | #define kINviteAppleAppID @"af_siteid" 128 | 129 | 130 | 131 | 132 | typedef enum { 133 | EmailCryptTypeNone = 0, 134 | EmailCryptTypeSHA1 = 1, 135 | EmailCryptTypeMD5 = 2, 136 | EmailCryptTypeSHA256 = 3 137 | } EmailCryptType; 138 | 139 | /* 140 | * This delegate should be use if you want to use AppsFlyer conversion data. See AppsFlyer iOS 141 | */ 142 | @protocol AppsFlyerTrackerDelegate 143 | 144 | @optional 145 | - (void) onConversionDataReceived:(NSDictionary*) installData; 146 | - (void) onConversionDataRequestFailure:(NSError *)error; 147 | - (void) onAppOpenAttribution:(NSDictionary*) attributionData; 148 | - (void) onAppOpenAttributionFailure:(NSError *)error; 149 | 150 | @end 151 | 152 | @interface AppsFlyerTracker : NSObject { 153 | 154 | BOOL _isDebug; 155 | BOOL permitAggregateiAdData; 156 | BOOL _useReceiptValidationSandbox; 157 | BOOL _useUninstallSandbox; 158 | EmailCryptType emailCryptType; 159 | NSArray *userEmails; 160 | } 161 | 162 | +(AppsFlyerTracker*) sharedTracker; 163 | 164 | /* In case you use your own user ID in your app, you can set this property to that ID. */ 165 | @property (nonatomic, strong, setter=setCustomerUserID:) NSString *customerUserID; 166 | 167 | 168 | /* In case you use Custom data and you want to receive it in the raw reports.*/ 169 | @property (nonatomic, strong, setter=setAdditionalData:) NSDictionary *customData; 170 | 171 | /* Use this property to set your AppsFlyer's dev key. */ 172 | @property (nonatomic, strong, setter=setAppsFlyerDevKey:) NSString *appsFlyerDevKey; 173 | 174 | /* Use this property to set your app's Apple ID (taken from the app's page on iTunes Connect) */ 175 | @property (nonatomic, strong, setter=setAppleAppID:) NSString *appleAppID; 176 | 177 | /* 178 | * In case of in app purchase events, you can set the currency code your user has purchased with. 179 | * The currency code is a 3 letter code according to ISO standards. Example: "USD" 180 | */ 181 | @property (nonatomic, strong) NSString *currencyCode; 182 | 183 | 184 | /* AppsFlyer's SDK send the data to AppsFlyer's servers over HTTPS. You can set the isHTTPS property to NO in order to use regular HTTP. */ 185 | //@property BOOL isHTTPS; 186 | 187 | /* 188 | * AppsFLyer SDK collect Apple's advertisingIdentifier if the AdSupport framework included in the SDK. 189 | * You can disable this behavior by setting the following property to YES. 190 | */ 191 | @property BOOL disableAppleAdSupportTracking; 192 | 193 | /* 194 | * Prints our messages to the log. This property should only be used in DEBUG mode. The default value 195 | * is NO. 196 | */ 197 | @property (nonatomic, setter = setIsDebug:) BOOL isDebug; 198 | 199 | 200 | /* 201 | * Set this flag to NO, to not collect the device name. 202 | */ 203 | @property (nonatomic, setter = setShouldCollectDeviceName:) BOOL shouldCollectDeviceName; 204 | 205 | 206 | @property (nonatomic, setter = setAppInviteOneLink:) NSString* appInviteOneLinkID; 207 | 208 | /* 209 | * Opt-out tracking for specific user 210 | */ 211 | @property BOOL deviceTrackingDisabled; 212 | 213 | /* 214 | * Opt-out tracking for iAd attributions 215 | */ 216 | @property BOOL disableIAdTracking; 217 | 218 | /* 219 | * AppsFlyer delegate. See AppsFlyerTrackerDelegate abvoe 220 | */ 221 | @property (weak, nonatomic) id delegate; 222 | 223 | /* 224 | * In app purchase receipt validation Apple environment (production or sandbox). The default value 225 | * is NO. 226 | */ 227 | @property (nonatomic, setter = setUseReceiptValidationSandbox:) BOOL useReceiptValidationSandbox; 228 | 229 | 230 | /* 231 | * Set this flag to test uninstall on Apple environment (production or sandbox). The default value 232 | * is NO. 233 | */ 234 | @property (nonatomic, setter = setUseUninstallSandbox:) BOOL useUninstallSandbox; 235 | 236 | /* 237 | * Advertising Id (exposed for RemoteDebug) 238 | */ 239 | @property (nonatomic, strong) NSString *advertiserId; 240 | 241 | /* 242 | * Use this to send the User's emails 243 | */ 244 | -(void) setUserEmails:(NSArray *) userEmails withCryptType:(EmailCryptType) type; 245 | 246 | 247 | /* Track application launch*/ 248 | - (void) trackAppLaunch; 249 | 250 | /* 251 | * Use this method to track events in your app like purchases or user actions. 252 | * Example : 253 | * [[AppsFlyer sharedTracker] trackEvent:@"hotel-booked" withValue:"200"]; 254 | */ 255 | - (void) trackEvent:(NSString*)eventName withValue:(NSString*)value __attribute__((deprecated)); 256 | 257 | /* 258 | * Use this method to track an events with mulitple values. See AppsFlyer's documentation for details. 259 | * 260 | */ 261 | - (void) trackEvent:(NSString *)eventName withValues:(NSDictionary*)values; 262 | 263 | /* 264 | * To track in app purchases you can call this method from the completeTransaction: method on 265 | * your SKPaymentTransactionObserver. 266 | */ 267 | - (void) validateAndTrackInAppPurchase:(NSString *)productIdentifier 268 | price:(NSString *)price 269 | currency:(NSString *)currency 270 | transactionId:(NSString *) tranactionId 271 | additionalParameters:(NSDictionary *)params 272 | success:(void (^)(NSDictionary *response))successBlock 273 | failure:(void (^)(NSError *error, id reponse)) failedBlock NS_AVAILABLE(10_7, 7_0); 274 | 275 | 276 | 277 | /* 278 | * To Track location for geo-fencing. 279 | */ 280 | - (void) trackLocation:(double) longitude latitude:(double) latitude; 281 | 282 | /* 283 | * This method returns AppsFLyer's internal user ID (unique for your app) 284 | */ 285 | - (NSString *) getAppsFlyerUID; 286 | 287 | /* 288 | * In case you want to use AppsFlyer tracking data in your app you can use the following method set a 289 | * delegate with callback buttons for the tracking data. See AppsFlyerTrackerDelegate above. 290 | */ 291 | - (void) loadConversionDataWithDelegate:(id) delegate __attribute__((deprecated)); 292 | 293 | /* 294 | * In case you want to track deep linking, call this method from your delegate's openURL method. 295 | */ 296 | - (void) handleOpenURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication __attribute__((deprecated)); 297 | 298 | /* 299 | * In case you want to track deep linking, call this method from your delegate's openURL method with refferer. 300 | */ 301 | - (void) handleOpenURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication withAnnotation:(id) annotation __attribute__((deprecated)); 302 | 303 | 304 | - (void) handleOpenUrl:(NSURL *) url options:(NSDictionary *)options; 305 | /* 306 | * For Universal links iOS 9 307 | */ 308 | 309 | - (BOOL) continueUserActivity:(NSUserActivity *) userActivity restorationHandler:(void (^)(NSArray *))restorationHandler NS_AVAILABLE_IOS(9_0); 310 | - (void) didUpdateUserActivity:(NSUserActivity *)userActivity NS_AVAILABLE_IOS(9_0); 311 | - (void) handlePushNotification:(NSDictionary *) pushPayload; 312 | 313 | 314 | /* 315 | Register uninstall - you should register for remote notification and provide Appsflyer the push device token. 316 | */ 317 | - (void) registerUninstall:(NSData *) deviceToken; 318 | 319 | /* 320 | Get SDK version. 321 | */ 322 | - (NSString *) getSDKVersion; 323 | 324 | 325 | 326 | - (void) remoteDebuggingCallWithData:(NSString *) data; 327 | 328 | //- (void) crossPromotionViewed:(NSString*) appID campaign:(NSString*) campaign; 329 | //- (void) openAppStoreForAppID:(NSString*) appID campaign:(NSString*) 330 | //campaign paramters:(NSDictionary*) parameters 331 | // viewController: (UIViewController*) viewController; 332 | 333 | /*! 334 | * @brief This property accepts a string value representing the host name for all enpoints. 335 | * @warning To use `default` SDK endpoint – set value to `nil`. 336 | * @code 337 | * Objective-C: 338 | * [[AppsFlyerTracker sharedTracker] setHost:@"example.com"]; 339 | * Swift: 340 | * AppsFlyerTracker.shared().host = "example.com" 341 | * @endcode 342 | */ 343 | 344 | @property (nonatomic, strong) NSString *host; 345 | 346 | /*! 347 | * This property is responsible for timeout between sessions in seconds. 348 | * Default value is 5 seconds. 349 | */ 350 | @property (atomic) NSUInteger minTimeBetweenSessions; 351 | 352 | @end 353 | -------------------------------------------------------------------------------- /Assets/Plugins/AppsFlyer.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine; 3 | using System.Collections; 4 | // We need this one for importing our IOS functions 5 | using System.Runtime.InteropServices; 6 | using System.Collections.Generic; 7 | 8 | public class AppsFlyer : MonoBehaviour { 9 | 10 | 11 | #if UNITY_IOS && !UNITY_EDITOR 12 | [DllImport("__Internal")] 13 | private static extern void mTrackEvent(string eventName,string eventValue); 14 | 15 | [DllImport("__Internal")] 16 | private static extern void mSetCurrencyCode(string currencyCode); 17 | 18 | [DllImport("__Internal")] 19 | private static extern void mSetCustomerUserID(string customerUserID); 20 | 21 | [DllImport("__Internal")] 22 | private static extern void mSetAppsFlyerDevKey(string devKey); 23 | 24 | [DllImport("__Internal")] 25 | private static extern void mTrackAppLaunch(); 26 | 27 | [DllImport("__Internal")] 28 | private static extern void mSetAppID(string appleAppId); 29 | 30 | [DllImport("__Internal")] 31 | private static extern void mTrackRichEvent(string eventName, string eventValues); 32 | 33 | [DllImport("__Internal")] 34 | private static extern void mValidateReceipt(string productIdentifier, string price, string currency, string transactionId ,string additionalParams); 35 | 36 | [DllImport("__Internal")] 37 | private static extern void mSetIsDebug(bool isDebug); 38 | 39 | [DllImport("__Internal")] 40 | private static extern void mSetIsSandbox(bool isSandbox); 41 | 42 | [DllImport("__Internal")] 43 | private static extern void mGetConversionData(); 44 | 45 | [DllImport("__Internal")] 46 | private static extern void mHandleOpenUrl(string url, string sourceApplication, string annotation); 47 | 48 | [DllImport("__Internal")] 49 | private static extern string mGetAppsFlyerId(); 50 | 51 | [DllImport("__Internal")] 52 | private static extern void mHandlePushNotification(string payload); 53 | 54 | [DllImport("__Internal")] 55 | private static extern void mRegisterUninstall(byte[] pushToken); 56 | 57 | [DllImport("__Internal")] 58 | private static extern void mSetShouldCollectDeviceName(bool shouldCollectDeviceName); 59 | 60 | public static void trackEvent(string eventName,string eventValue){ 61 | mTrackEvent(eventName,eventValue); 62 | print("AF.cs this is deprecated method. please use trackRichEvent instead."); 63 | } 64 | 65 | public static void setCurrencyCode(string currencyCode){ 66 | mSetCurrencyCode(currencyCode); 67 | } 68 | 69 | public static void setCustomerUserID(string customerUserID){ 70 | mSetCustomerUserID(customerUserID); 71 | } 72 | 73 | public static void setAppsFlyerKey(string key){ 74 | mSetAppsFlyerDevKey(key); 75 | } 76 | 77 | public static void trackAppLaunch(){ 78 | mTrackAppLaunch(); 79 | } 80 | 81 | public static void setAppID(string appleAppId){ 82 | mSetAppID(appleAppId); 83 | } 84 | 85 | public static void trackRichEvent(string eventName, Dictionary eventValues) { 86 | 87 | string attributesString = ""; 88 | foreach(KeyValuePair kvp in eventValues) 89 | { 90 | attributesString += kvp.Key + "=" + kvp.Value + "\n"; 91 | } 92 | 93 | mTrackRichEvent (eventName, attributesString); 94 | } 95 | 96 | public static void validateReceipt(string productIdentifier, string price, string currency, string transactionId, Dictionary additionalParametes) { 97 | string attributesString = ""; 98 | foreach(KeyValuePair kvp in additionalParametes) 99 | { 100 | attributesString += kvp.Key + "=" + kvp.Value + "\n"; 101 | } 102 | mValidateReceipt (productIdentifier, price, currency, transactionId, attributesString); 103 | } 104 | 105 | public static void setIsDebug(bool isDebug){ 106 | mSetIsDebug(isDebug); 107 | } 108 | 109 | public static void setIsSandbox(bool isSandbox){ 110 | mSetIsSandbox(isSandbox); 111 | } 112 | 113 | public static void getConversionData () { 114 | mGetConversionData (); 115 | } 116 | 117 | public static string getAppsFlyerId () { 118 | return mGetAppsFlyerId (); 119 | } 120 | 121 | public static void handleOpenUrl(string url, string sourceApplication, string annotation) { 122 | 123 | mHandleOpenUrl (url, sourceApplication, annotation); 124 | } 125 | 126 | public static void handlePushNotification(Dictionary payload) { 127 | string attributesString = ""; 128 | foreach(KeyValuePair kvp in payload) { 129 | attributesString += kvp.Key + "=" + kvp.Value + "\n"; 130 | } 131 | mHandlePushNotification(attributesString); 132 | } 133 | 134 | public static void registerUninstall(byte[] token) { 135 | mRegisterUninstall(token); 136 | } 137 | 138 | public static void setShouldCollectDeviceName(bool shouldCollectDeviceName) { 139 | mSetShouldCollectDeviceName(shouldCollectDeviceName); 140 | } 141 | 142 | #elif UNITY_ANDROID && !UNITY_EDITOR 143 | 144 | private static AndroidJavaClass obj = new AndroidJavaClass ("com.appsflyer.AppsFlyerLib"); 145 | private static AndroidJavaObject cls_AppsFlyer = obj.CallStatic("getInstance"); 146 | private static AndroidJavaClass propertiesClass = new AndroidJavaClass ("com.appsflyer.AppsFlyerProperties"); 147 | private static AndroidJavaObject afPropertiesInstance = propertiesClass.CallStatic("getInstance"); 148 | private static AndroidJavaClass cls_AppsFlyerHelper = new AndroidJavaClass("com.appsflyer.AppsFlyerUnityHelper"); 149 | private static string devKey; 150 | 151 | 152 | public static void trackEvent(string eventName,string eventValue){ 153 | // using(AndroidJavaClass cls_UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) 154 | // { 155 | // using(AndroidJavaObject cls_Activity = cls_UnityPlayer.GetStatic("currentActivity")) 156 | // { 157 | // cls_AppsFlyer.Call("trackEvent",cls_Activity, eventName, eventValue); 158 | // } 159 | // } 160 | 161 | print("AF.cs this is deprecated method. please use trackRichEvent instead. nothing is sent."); 162 | } 163 | 164 | public static void setCurrencyCode(string currencyCode){ 165 | cls_AppsFlyer.Call("setCurrencyCode", currencyCode); 166 | } 167 | 168 | public static void setCustomerUserID(string customerUserID){ 169 | cls_AppsFlyer.Call("setAppUserId", customerUserID); 170 | } 171 | 172 | 173 | public static void loadConversionData(string callbackObject){ 174 | using(AndroidJavaClass cls_UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) 175 | { 176 | using(AndroidJavaObject cls_Activity = cls_UnityPlayer.GetStatic("currentActivity")) { 177 | cls_AppsFlyerHelper.CallStatic("createConversionDataListener", cls_Activity, callbackObject); 178 | } 179 | } 180 | } 181 | 182 | [System.Obsolete("Use loadConversionData(string callbackObject)")] 183 | public static void loadConversionData(string callbackObject, string callbackMethod, string callbackFailedMethod){ 184 | loadConversionData(callbackObject); 185 | } 186 | 187 | 188 | public static void setCollectIMEI (bool shouldCollect) { 189 | cls_AppsFlyer.Call("setCollectIMEI", shouldCollect); 190 | } 191 | 192 | public static void setCollectAndroidID (bool shouldCollect) { 193 | print("AF.cs setCollectAndroidID"); 194 | cls_AppsFlyer.Call("setCollectAndroidID", shouldCollect); 195 | } 196 | 197 | public static void init(string key){ 198 | print("AF.cs init"); 199 | devKey = key; 200 | using (AndroidJavaClass cls_UnityPlayer = new AndroidJavaClass ("com.unity3d.player.UnityPlayer")) { 201 | using (AndroidJavaObject cls_Activity = cls_UnityPlayer.GetStatic ("currentActivity")) { 202 | cls_Activity.Call("runOnUiThread", new AndroidJavaRunnable(init_cb)); 203 | } 204 | } 205 | } 206 | 207 | static void init_cb() { 208 | 209 | print("AF.cs start tracking"); 210 | trackAppLaunch (); 211 | 212 | using (AndroidJavaClass cls_UnityPlayer = new AndroidJavaClass ("com.unity3d.player.UnityPlayer")) { 213 | using (AndroidJavaObject cls_Activity = cls_UnityPlayer.GetStatic ("currentActivity")) { 214 | AndroidJavaObject cls_Application = cls_Activity.Call("getApplication"); 215 | cls_AppsFlyer.Call("startTracking", cls_Application, devKey); 216 | } 217 | } 218 | } 219 | 220 | 221 | public static void setAppsFlyerKey(string key){ 222 | print("AF.cs setAppsFlyerKey"); 223 | } 224 | 225 | public static void trackAppLaunch(){ 226 | print("AF.cs trackAppLaunch"); 227 | using(AndroidJavaClass cls_UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) { 228 | using(AndroidJavaObject cls_Activity = cls_UnityPlayer.GetStatic("currentActivity")) { 229 | cls_AppsFlyer.Call("trackAppLaunch",cls_Activity, devKey); 230 | } 231 | } 232 | } 233 | 234 | public static void setAppID(string packageName){ 235 | // In Android we take the package name 236 | cls_AppsFlyer.Call("setAppId", packageName); 237 | } 238 | 239 | public static void createValidateInAppListener(string aObject, string callbackMethod, string callbackFailedMethod) { 240 | print ("AF.cs createValidateInAppListener called"); 241 | 242 | using(AndroidJavaClass cls_UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) { 243 | using(AndroidJavaObject cls_Activity = cls_UnityPlayer.GetStatic("currentActivity")) { 244 | cls_AppsFlyerHelper.CallStatic("createValidateInAppListener", cls_Activity, aObject, callbackMethod, callbackFailedMethod); 245 | } 246 | } 247 | } 248 | 249 | 250 | public static void validateReceipt(string publicKey, string purchaseData, string signature, string price, string currency, Dictionary extraParams) { 251 | print ("AF.cs validateReceipt pk = " + publicKey + " data = " + purchaseData + "sig = " + signature); 252 | 253 | using(AndroidJavaClass cls_UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) { 254 | using(AndroidJavaObject cls_Activity = cls_UnityPlayer.GetStatic("currentActivity")) { 255 | AndroidJavaObject convertedDict = null; 256 | if (extraParams != null) { 257 | convertedDict = ConvertHashMap (extraParams); 258 | } 259 | print ("inside cls_activity"); 260 | cls_AppsFlyer.Call("validateAndTrackInAppPurchase",cls_Activity, publicKey, signature, purchaseData, price, currency, convertedDict); 261 | } 262 | } 263 | } 264 | 265 | 266 | public static void trackRichEvent(string eventName, Dictionary eventValues){ 267 | using(AndroidJavaClass cls_UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) { 268 | using(AndroidJavaObject cls_Activity = cls_UnityPlayer.GetStatic("currentActivity")) { 269 | AndroidJavaObject convertedDict = ConvertHashMap (eventValues); 270 | cls_AppsFlyer.Call("trackEvent",cls_Activity, eventName, convertedDict); 271 | } 272 | } 273 | } 274 | 275 | //turn a dictionary into hashmap, to pass it in JNI 276 | private static AndroidJavaObject ConvertHashMap(Dictionary dict) 277 | { 278 | AndroidJavaObject obj_HashMap = new AndroidJavaObject("java.util.HashMap"); 279 | 280 | IntPtr method_Put = AndroidJNIHelper.GetMethodID(obj_HashMap.GetRawClass(), "put", 281 | "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); 282 | 283 | object[] args = new object[2]; 284 | foreach(KeyValuePair kvp in dict) 285 | { 286 | using(AndroidJavaObject k = new AndroidJavaObject("java.lang.String", kvp.Key)) 287 | { 288 | using(AndroidJavaObject v = new AndroidJavaObject("java.lang.String", kvp.Value)) 289 | { 290 | args[0] = k; 291 | args[1] = v; 292 | AndroidJNI.CallObjectMethod(obj_HashMap.GetRawObject(), 293 | method_Put, AndroidJNIHelper.CreateJNIArgArray(args)); 294 | } 295 | } 296 | } 297 | return obj_HashMap; 298 | } 299 | 300 | public static void setImeiData(string imeiData) { 301 | print("AF.cs setImeiData"); 302 | cls_AppsFlyer.Call("setImeiData", imeiData); 303 | } 304 | 305 | public static void setAndroidIdData(string androidIdData) { 306 | print("AF.cs setImeiData"); 307 | cls_AppsFlyer.Call("setAndroidIdData", androidIdData); 308 | } 309 | 310 | 311 | public static void setIsDebug(bool isDebug) { 312 | print("AF.cs setDebugLog"); 313 | cls_AppsFlyer.Call("setDebugLog", isDebug); 314 | } 315 | 316 | public static void setIsSandbox(bool isSandbox){ 317 | } 318 | 319 | public static void getConversionData () { 320 | } 321 | 322 | public static void handleOpenUrl(string url, string sourceApplication, string annotation) { 323 | } 324 | 325 | public static string getAppsFlyerId () { 326 | 327 | string appsFlyerId; 328 | using (AndroidJavaClass cls_UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) { 329 | using (AndroidJavaObject cls_Activity = cls_UnityPlayer.GetStatic("currentActivity")) { 330 | appsFlyerId = cls_AppsFlyer.Call ("getAppsFlyerUID", cls_Activity); 331 | } 332 | } 333 | return appsFlyerId; 334 | } 335 | 336 | public static void setGCMProjectNumber(string googleGCMNumber) { 337 | cls_AppsFlyer.Call("setGCMProjectNumber", googleGCMNumber); 338 | } 339 | 340 | public static void updateServerUninstallToken(string token) { 341 | AndroidJavaClass obj = new AndroidJavaClass ("com.appsflyer.AppsFlyerLib"); 342 | AndroidJavaObject cls_AppsFlyer = obj.CallStatic("getInstance"); 343 | 344 | using(AndroidJavaClass cls_UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) 345 | { 346 | using(AndroidJavaObject cls_Activity = cls_UnityPlayer.GetStatic("currentActivity")) 347 | { 348 | cls_AppsFlyer.Call("updateServerUninstallToken", cls_Activity, token); 349 | } 350 | } 351 | } 352 | 353 | public static void enableUninstallTracking(string senderId) { 354 | AndroidJavaClass obj = new AndroidJavaClass ("com.appsflyer.AppsFlyerLib"); 355 | AndroidJavaObject cls_AppsFlyer = obj.CallStatic("getInstance"); 356 | cls_AppsFlyer.Call("updateServerUninstallToken", senderId); 357 | } 358 | 359 | #else 360 | // Editor (API) 361 | public static void validateReceipt(string publicKey, string purchaseData, string signature, string price, string currency, Dictionary extraParams) {} 362 | public static void validateReceipt(string productIdentifier, string price, string currency, string transactionId, Dictionary additionalParametes) {} 363 | public static void handlePushNotification(Dictionary payload) {} 364 | public static void registerUninstall(byte[] token) {} 365 | public static void setCollectIMEI (bool shouldCollect) {} 366 | public static void createValidateInAppListener(string aObject, string callbackMethod, string callbackFailedMethod){} 367 | public static void init (string devKey){} 368 | public static void setImeiData(string imeiData){} 369 | public static void trackEvent(string eventName,string eventValue){} 370 | public static void setCurrencyCode(string currencyCode){} 371 | public static void setCustomerUserID(string customerUserID){} 372 | public static void loadConversionData(string callbackObject){} 373 | public static void setAppsFlyerKey(string key){} 374 | public static void trackAppLaunch(){} 375 | public static void setAppID(string appleAppId){} 376 | public static void trackRichEvent(string eventName, Dictionary eventValues){} 377 | public static void setIsDebug(bool isDebug){} 378 | public static void setIsSandbox(bool isSandbox){} 379 | public static void getConversionData (){} 380 | public static string getAppsFlyerId () {return null;} 381 | public static void handleOpenUrl(string url, string sourceApplication, string annotation) {} 382 | public static void enableUninstallTracking(string senderId) {} 383 | public static void updateServerUninstallToken(string token) {} 384 | 385 | // deprecated APIs 386 | [System.Obsolete("Use loadConversionData(string callbackObject)")] 387 | public static void loadConversionData(string callbackObject, string callbackMethod, string callbackFailedMethod){} 388 | [System.Obsolete("Use enableUninstallTracking(string senderId)")] 389 | public static void setGCMProjectNumber(string googleGCMNumber){} 390 | public static void setShouldCollectDeviceName(bool shouldCollectDeviceName) {} 391 | #endif 392 | } 393 | -------------------------------------------------------------------------------- /Assets/Sample/startup.unity: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!29 &1 4 | OcclusionCullingSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_OcclusionBakeSettings: 8 | smallestOccluder: 5 9 | smallestHole: 0.25 10 | backfaceThreshold: 100 11 | m_SceneGUID: 00000000000000000000000000000000 12 | m_OcclusionCullingData: {fileID: 0} 13 | --- !u!104 &2 14 | RenderSettings: 15 | m_ObjectHideFlags: 0 16 | serializedVersion: 8 17 | m_Fog: 0 18 | m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} 19 | m_FogMode: 3 20 | m_FogDensity: 0.01 21 | m_LinearFogStart: 0 22 | m_LinearFogEnd: 300 23 | m_AmbientSkyColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} 24 | m_AmbientEquatorColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} 25 | m_AmbientGroundColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} 26 | m_AmbientIntensity: 1 27 | m_AmbientMode: 3 28 | m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} 29 | m_SkyboxMaterial: {fileID: 0} 30 | m_HaloStrength: 0.5 31 | m_FlareStrength: 1 32 | m_FlareFadeSpeed: 3 33 | m_HaloTexture: {fileID: 0} 34 | m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} 35 | m_DefaultReflectionMode: 0 36 | m_DefaultReflectionResolution: 128 37 | m_ReflectionBounces: 1 38 | m_ReflectionIntensity: 1 39 | m_CustomReflection: {fileID: 0} 40 | m_Sun: {fileID: 0} 41 | m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} 42 | --- !u!157 &4 43 | LightmapSettings: 44 | m_ObjectHideFlags: 0 45 | serializedVersion: 11 46 | m_GIWorkflowMode: 1 47 | m_GISettings: 48 | serializedVersion: 2 49 | m_BounceScale: 1 50 | m_IndirectOutputScale: 1 51 | m_AlbedoBoost: 1 52 | m_TemporalCoherenceThreshold: 1 53 | m_EnvironmentLightingMode: 0 54 | m_EnableBakedLightmaps: 1 55 | m_EnableRealtimeLightmaps: 0 56 | m_LightmapEditorSettings: 57 | serializedVersion: 9 58 | m_Resolution: 1 59 | m_BakeResolution: 50 60 | m_TextureWidth: 1024 61 | m_TextureHeight: 1024 62 | m_AO: 0 63 | m_AOMaxDistance: 1 64 | m_CompAOExponent: 0 65 | m_CompAOExponentDirect: 0 66 | m_Padding: 2 67 | m_LightmapParameters: {fileID: 0} 68 | m_LightmapsBakeMode: 1 69 | m_TextureCompression: 0 70 | m_FinalGather: 0 71 | m_FinalGatherFiltering: 1 72 | m_FinalGatherRayCount: 1024 73 | m_ReflectionCompression: 2 74 | m_MixedBakeMode: 1 75 | m_BakeBackend: 0 76 | m_PVRSampling: 1 77 | m_PVRDirectSampleCount: 32 78 | m_PVRSampleCount: 500 79 | m_PVRBounces: 2 80 | m_PVRFilterTypeDirect: 0 81 | m_PVRFilterTypeIndirect: 0 82 | m_PVRFilterTypeAO: 0 83 | m_PVRFilteringMode: 0 84 | m_PVRCulling: 1 85 | m_PVRFilteringGaussRadiusDirect: 1 86 | m_PVRFilteringGaussRadiusIndirect: 5 87 | m_PVRFilteringGaussRadiusAO: 2 88 | m_PVRFilteringAtrousPositionSigmaDirect: 0.5 89 | m_PVRFilteringAtrousPositionSigmaIndirect: 2 90 | m_PVRFilteringAtrousPositionSigmaAO: 1 91 | m_LightingDataAsset: {fileID: 0} 92 | m_UseShadowmask: 0 93 | --- !u!196 &5 94 | NavMeshSettings: 95 | serializedVersion: 2 96 | m_ObjectHideFlags: 0 97 | m_BuildSettings: 98 | serializedVersion: 2 99 | agentTypeID: 0 100 | agentRadius: 0.5 101 | agentHeight: 2 102 | agentSlope: 45 103 | agentClimb: 0.4 104 | ledgeDropHeight: 0 105 | maxJumpAcrossDistance: 0 106 | minRegionArea: 2 107 | manualCellSize: 0 108 | cellSize: 0.16666666 109 | manualTileSize: 0 110 | tileSize: 256 111 | accuratePlacement: 0 112 | m_NavMeshData: {fileID: 0} 113 | --- !u!1 &282136961 114 | GameObject: 115 | m_ObjectHideFlags: 0 116 | m_PrefabParentObject: {fileID: 0} 117 | m_PrefabInternal: {fileID: 0} 118 | serializedVersion: 5 119 | m_Component: 120 | - component: {fileID: 282136962} 121 | - component: {fileID: 282136964} 122 | - component: {fileID: 282136963} 123 | m_Layer: 5 124 | m_Name: Check 125 | m_TagString: Untagged 126 | m_Icon: {fileID: 0} 127 | m_NavMeshLayer: 0 128 | m_StaticEditorFlags: 0 129 | m_IsActive: 1 130 | --- !u!224 &282136962 131 | RectTransform: 132 | m_ObjectHideFlags: 0 133 | m_PrefabParentObject: {fileID: 0} 134 | m_PrefabInternal: {fileID: 0} 135 | m_GameObject: {fileID: 282136961} 136 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 137 | m_LocalPosition: {x: 0, y: 0, z: 0} 138 | m_LocalScale: {x: 1, y: 1, z: 1} 139 | m_Children: [] 140 | m_Father: {fileID: 496610204} 141 | m_RootOrder: 6 142 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 143 | m_AnchorMin: {x: 0.5, y: 0.5} 144 | m_AnchorMax: {x: 0.5, y: 0.5} 145 | m_AnchoredPosition: {x: 10.5000305, y: -346.5} 146 | m_SizeDelta: {x: 100, y: 100} 147 | m_Pivot: {x: 0.5, y: 0.5} 148 | --- !u!114 &282136963 149 | MonoBehaviour: 150 | m_ObjectHideFlags: 0 151 | m_PrefabParentObject: {fileID: 0} 152 | m_PrefabInternal: {fileID: 0} 153 | m_GameObject: {fileID: 282136961} 154 | m_Enabled: 1 155 | m_EditorHideFlags: 0 156 | m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} 157 | m_Name: 158 | m_EditorClassIdentifier: 159 | m_Material: {fileID: 0} 160 | m_Color: {r: 1, g: 1, b: 1, a: 1} 161 | m_RaycastTarget: 1 162 | m_OnCullStateChanged: 163 | m_PersistentCalls: 164 | m_Calls: [] 165 | m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, 166 | Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 167 | m_Sprite: {fileID: 21300000, guid: 55d3addcc62f14419866a53c07c18d05, type: 3} 168 | m_Type: 0 169 | m_PreserveAspect: 0 170 | m_FillCenter: 1 171 | m_FillMethod: 4 172 | m_FillAmount: 1 173 | m_FillClockwise: 1 174 | m_FillOrigin: 0 175 | --- !u!222 &282136964 176 | CanvasRenderer: 177 | m_ObjectHideFlags: 0 178 | m_PrefabParentObject: {fileID: 0} 179 | m_PrefabInternal: {fileID: 0} 180 | m_GameObject: {fileID: 282136961} 181 | --- !u!1 &481796988 182 | GameObject: 183 | m_ObjectHideFlags: 0 184 | m_PrefabParentObject: {fileID: 0} 185 | m_PrefabInternal: {fileID: 0} 186 | serializedVersion: 5 187 | m_Component: 188 | - component: {fileID: 481796993} 189 | - component: {fileID: 481796992} 190 | - component: {fileID: 481796991} 191 | - component: {fileID: 481796990} 192 | - component: {fileID: 481796989} 193 | m_Layer: 0 194 | m_Name: Camera 195 | m_TagString: Untagged 196 | m_Icon: {fileID: 0} 197 | m_NavMeshLayer: 0 198 | m_StaticEditorFlags: 0 199 | m_IsActive: 1 200 | --- !u!81 &481796989 201 | AudioListener: 202 | m_ObjectHideFlags: 0 203 | m_PrefabParentObject: {fileID: 0} 204 | m_PrefabInternal: {fileID: 0} 205 | m_GameObject: {fileID: 481796988} 206 | m_Enabled: 1 207 | --- !u!92 &481796990 208 | Behaviour: 209 | m_ObjectHideFlags: 0 210 | m_PrefabParentObject: {fileID: 0} 211 | m_PrefabInternal: {fileID: 0} 212 | m_GameObject: {fileID: 481796988} 213 | m_Enabled: 1 214 | --- !u!124 &481796991 215 | Behaviour: 216 | m_ObjectHideFlags: 0 217 | m_PrefabParentObject: {fileID: 0} 218 | m_PrefabInternal: {fileID: 0} 219 | m_GameObject: {fileID: 481796988} 220 | m_Enabled: 1 221 | --- !u!20 &481796992 222 | Camera: 223 | m_ObjectHideFlags: 0 224 | m_PrefabParentObject: {fileID: 0} 225 | m_PrefabInternal: {fileID: 0} 226 | m_GameObject: {fileID: 481796988} 227 | m_Enabled: 1 228 | serializedVersion: 2 229 | m_ClearFlags: 1 230 | m_BackGroundColor: {r: 1, g: 1, b: 1, a: 0.019607844} 231 | m_NormalizedViewPortRect: 232 | serializedVersion: 2 233 | x: 0 234 | y: 0 235 | width: 1 236 | height: 1 237 | near clip plane: 0.3 238 | far clip plane: 1000 239 | field of view: 60 240 | orthographic: 0 241 | orthographic size: 5 242 | m_Depth: 0 243 | m_CullingMask: 244 | serializedVersion: 2 245 | m_Bits: 4294967295 246 | m_RenderingPath: -1 247 | m_TargetTexture: {fileID: 0} 248 | m_TargetDisplay: 0 249 | m_TargetEye: 3 250 | m_HDR: 0 251 | m_AllowMSAA: 1 252 | m_ForceIntoRT: 0 253 | m_OcclusionCulling: 1 254 | m_StereoConvergence: 10 255 | m_StereoSeparation: 0.022 256 | m_StereoMirrorMode: 0 257 | --- !u!4 &481796993 258 | Transform: 259 | m_ObjectHideFlags: 0 260 | m_PrefabParentObject: {fileID: 0} 261 | m_PrefabInternal: {fileID: 0} 262 | m_GameObject: {fileID: 481796988} 263 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 264 | m_LocalPosition: {x: 459, y: 381, z: -536} 265 | m_LocalScale: {x: 0.59958327, y: 0.59958327, z: 0.59958327} 266 | m_Children: [] 267 | m_Father: {fileID: 0} 268 | m_RootOrder: 2 269 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 270 | --- !u!1 &496610200 271 | GameObject: 272 | m_ObjectHideFlags: 0 273 | m_PrefabParentObject: {fileID: 0} 274 | m_PrefabInternal: {fileID: 0} 275 | serializedVersion: 5 276 | m_Component: 277 | - component: {fileID: 496610204} 278 | - component: {fileID: 496610203} 279 | - component: {fileID: 496610202} 280 | - component: {fileID: 496610201} 281 | m_Layer: 5 282 | m_Name: Canvas 283 | m_TagString: Untagged 284 | m_Icon: {fileID: 0} 285 | m_NavMeshLayer: 0 286 | m_StaticEditorFlags: 0 287 | m_IsActive: 1 288 | --- !u!114 &496610201 289 | MonoBehaviour: 290 | m_ObjectHideFlags: 0 291 | m_PrefabParentObject: {fileID: 0} 292 | m_PrefabInternal: {fileID: 0} 293 | m_GameObject: {fileID: 496610200} 294 | m_Enabled: 1 295 | m_EditorHideFlags: 0 296 | m_Script: {fileID: 1301386320, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} 297 | m_Name: 298 | m_EditorClassIdentifier: 299 | m_IgnoreReversedGraphics: 1 300 | m_BlockingObjects: 0 301 | m_BlockingMask: 302 | serializedVersion: 2 303 | m_Bits: 4294967295 304 | --- !u!114 &496610202 305 | MonoBehaviour: 306 | m_ObjectHideFlags: 0 307 | m_PrefabParentObject: {fileID: 0} 308 | m_PrefabInternal: {fileID: 0} 309 | m_GameObject: {fileID: 496610200} 310 | m_Enabled: 1 311 | m_EditorHideFlags: 0 312 | m_Script: {fileID: 1980459831, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} 313 | m_Name: 314 | m_EditorClassIdentifier: 315 | m_UiScaleMode: 1 316 | m_ReferencePixelsPerUnit: 100 317 | m_ScaleFactor: 1 318 | m_ReferenceResolution: {x: 800, y: 600} 319 | m_ScreenMatchMode: 0 320 | m_MatchWidthOrHeight: 0 321 | m_PhysicalUnit: 3 322 | m_FallbackScreenDPI: 96 323 | m_DefaultSpriteDPI: 96 324 | m_DynamicPixelsPerUnit: 1 325 | --- !u!223 &496610203 326 | Canvas: 327 | m_ObjectHideFlags: 0 328 | m_PrefabParentObject: {fileID: 0} 329 | m_PrefabInternal: {fileID: 0} 330 | m_GameObject: {fileID: 496610200} 331 | m_Enabled: 1 332 | serializedVersion: 3 333 | m_RenderMode: 0 334 | m_Camera: {fileID: 0} 335 | m_PlaneDistance: 100 336 | m_PixelPerfect: 0 337 | m_ReceivesEvents: 1 338 | m_OverrideSorting: 0 339 | m_OverridePixelPerfect: 0 340 | m_SortingBucketNormalizedSize: 0 341 | m_AdditionalShaderChannelsFlag: 25 342 | m_SortingLayerID: 0 343 | m_SortingOrder: 0 344 | m_TargetDisplay: 0 345 | --- !u!224 &496610204 346 | RectTransform: 347 | m_ObjectHideFlags: 0 348 | m_PrefabParentObject: {fileID: 0} 349 | m_PrefabInternal: {fileID: 0} 350 | m_GameObject: {fileID: 496610200} 351 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 352 | m_LocalPosition: {x: 0, y: 0, z: 0} 353 | m_LocalScale: {x: 0, y: 0, z: 0} 354 | m_Children: 355 | - {fileID: 1166701680} 356 | - {fileID: 1864762187} 357 | - {fileID: 1011453658} 358 | - {fileID: 1285088588} 359 | - {fileID: 1923847705} 360 | - {fileID: 1433846770} 361 | - {fileID: 282136962} 362 | m_Father: {fileID: 0} 363 | m_RootOrder: 1 364 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 365 | m_AnchorMin: {x: 0, y: 0} 366 | m_AnchorMax: {x: 0, y: 0} 367 | m_AnchoredPosition: {x: 0, y: 0} 368 | m_SizeDelta: {x: 0, y: 0} 369 | m_Pivot: {x: 0, y: 0} 370 | --- !u!1 &1011453657 371 | GameObject: 372 | m_ObjectHideFlags: 0 373 | m_PrefabParentObject: {fileID: 0} 374 | m_PrefabInternal: {fileID: 0} 375 | serializedVersion: 5 376 | m_Component: 377 | - component: {fileID: 1011453658} 378 | - component: {fileID: 1011453660} 379 | - component: {fileID: 1011453659} 380 | m_Layer: 5 381 | m_Name: Text 382 | m_TagString: Untagged 383 | m_Icon: {fileID: 0} 384 | m_NavMeshLayer: 0 385 | m_StaticEditorFlags: 0 386 | m_IsActive: 1 387 | --- !u!224 &1011453658 388 | RectTransform: 389 | m_ObjectHideFlags: 0 390 | m_PrefabParentObject: {fileID: 0} 391 | m_PrefabInternal: {fileID: 0} 392 | m_GameObject: {fileID: 1011453657} 393 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 394 | m_LocalPosition: {x: 0, y: 0, z: 0} 395 | m_LocalScale: {x: 1, y: 1, z: 1} 396 | m_Children: [] 397 | m_Father: {fileID: 496610204} 398 | m_RootOrder: 2 399 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 400 | m_AnchorMin: {x: 0.5, y: 0.5} 401 | m_AnchorMax: {x: 0.5, y: 0.5} 402 | m_AnchoredPosition: {x: 2.5, y: 34.21} 403 | m_SizeDelta: {x: 160, y: 30} 404 | m_Pivot: {x: 0.5, y: 0.5} 405 | --- !u!114 &1011453659 406 | MonoBehaviour: 407 | m_ObjectHideFlags: 0 408 | m_PrefabParentObject: {fileID: 0} 409 | m_PrefabInternal: {fileID: 0} 410 | m_GameObject: {fileID: 1011453657} 411 | m_Enabled: 1 412 | m_EditorHideFlags: 0 413 | m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} 414 | m_Name: 415 | m_EditorClassIdentifier: 416 | m_Material: {fileID: 0} 417 | m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} 418 | m_RaycastTarget: 1 419 | m_OnCullStateChanged: 420 | m_PersistentCalls: 421 | m_Calls: [] 422 | m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, 423 | Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 424 | m_FontData: 425 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 426 | m_FontSize: 35 427 | m_FontStyle: 0 428 | m_BestFit: 0 429 | m_MinSize: 1 430 | m_MaxSize: 35 431 | m_Alignment: 4 432 | m_AlignByGeometry: 0 433 | m_RichText: 1 434 | m_HorizontalOverflow: 1 435 | m_VerticalOverflow: 1 436 | m_LineSpacing: 1 437 | m_Text: Stand by... 438 | --- !u!222 &1011453660 439 | CanvasRenderer: 440 | m_ObjectHideFlags: 0 441 | m_PrefabParentObject: {fileID: 0} 442 | m_PrefabInternal: {fileID: 0} 443 | m_GameObject: {fileID: 1011453657} 444 | --- !u!1 &1103942867 445 | GameObject: 446 | m_ObjectHideFlags: 0 447 | m_PrefabParentObject: {fileID: 0} 448 | m_PrefabInternal: {fileID: 0} 449 | serializedVersion: 5 450 | m_Component: 451 | - component: {fileID: 1103942869} 452 | - component: {fileID: 1103942868} 453 | m_Layer: 0 454 | m_Name: AppsFlyerTrackerCallbacks 455 | m_TagString: Untagged 456 | m_Icon: {fileID: 0} 457 | m_NavMeshLayer: 0 458 | m_StaticEditorFlags: 0 459 | m_IsActive: 1 460 | --- !u!114 &1103942868 461 | MonoBehaviour: 462 | m_ObjectHideFlags: 0 463 | m_PrefabParentObject: {fileID: 0} 464 | m_PrefabInternal: {fileID: 0} 465 | m_GameObject: {fileID: 1103942867} 466 | m_Enabled: 1 467 | m_EditorHideFlags: 0 468 | m_Script: {fileID: 11500000, guid: caacf88836fdb420cb9956e9c1ee523c, type: 3} 469 | m_Name: 470 | m_EditorClassIdentifier: 471 | callbacks: {fileID: 0} 472 | --- !u!4 &1103942869 473 | Transform: 474 | m_ObjectHideFlags: 0 475 | m_PrefabParentObject: {fileID: 0} 476 | m_PrefabInternal: {fileID: 0} 477 | m_GameObject: {fileID: 1103942867} 478 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 479 | m_LocalPosition: {x: 0, y: 0, z: 0} 480 | m_LocalScale: {x: 1, y: 1, z: 1} 481 | m_Children: [] 482 | m_Father: {fileID: 0} 483 | m_RootOrder: 4 484 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 485 | --- !u!1 &1166701679 486 | GameObject: 487 | m_ObjectHideFlags: 0 488 | m_PrefabParentObject: {fileID: 0} 489 | m_PrefabInternal: {fileID: 0} 490 | serializedVersion: 5 491 | m_Component: 492 | - component: {fileID: 1166701680} 493 | - component: {fileID: 1166701682} 494 | - component: {fileID: 1166701681} 495 | m_Layer: 5 496 | m_Name: Logo 497 | m_TagString: Untagged 498 | m_Icon: {fileID: 0} 499 | m_NavMeshLayer: 0 500 | m_StaticEditorFlags: 0 501 | m_IsActive: 1 502 | --- !u!224 &1166701680 503 | RectTransform: 504 | m_ObjectHideFlags: 0 505 | m_PrefabParentObject: {fileID: 0} 506 | m_PrefabInternal: {fileID: 0} 507 | m_GameObject: {fileID: 1166701679} 508 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 509 | m_LocalPosition: {x: 0, y: 0, z: 0} 510 | m_LocalScale: {x: 3, y: 3, z: 1} 511 | m_Children: [] 512 | m_Father: {fileID: 496610204} 513 | m_RootOrder: 0 514 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 515 | m_AnchorMin: {x: 0.5, y: 0.5} 516 | m_AnchorMax: {x: 0.5, y: 0.5} 517 | m_AnchoredPosition: {x: 10.5, y: 466.65} 518 | m_SizeDelta: {x: 100, y: 100} 519 | m_Pivot: {x: 0.5, y: 0.5} 520 | --- !u!114 &1166701681 521 | MonoBehaviour: 522 | m_ObjectHideFlags: 0 523 | m_PrefabParentObject: {fileID: 0} 524 | m_PrefabInternal: {fileID: 0} 525 | m_GameObject: {fileID: 1166701679} 526 | m_Enabled: 1 527 | m_EditorHideFlags: 0 528 | m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} 529 | m_Name: 530 | m_EditorClassIdentifier: 531 | m_Material: {fileID: 0} 532 | m_Color: {r: 1, g: 1, b: 1, a: 1} 533 | m_RaycastTarget: 1 534 | m_OnCullStateChanged: 535 | m_PersistentCalls: 536 | m_Calls: [] 537 | m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, 538 | Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 539 | m_Sprite: {fileID: 21300000, guid: a0796a5861c784d23af0d41690c573ca, type: 3} 540 | m_Type: 0 541 | m_PreserveAspect: 0 542 | m_FillCenter: 1 543 | m_FillMethod: 4 544 | m_FillAmount: 1 545 | m_FillClockwise: 1 546 | m_FillOrigin: 0 547 | --- !u!222 &1166701682 548 | CanvasRenderer: 549 | m_ObjectHideFlags: 0 550 | m_PrefabParentObject: {fileID: 0} 551 | m_PrefabInternal: {fileID: 0} 552 | m_GameObject: {fileID: 1166701679} 553 | --- !u!1 &1285088587 554 | GameObject: 555 | m_ObjectHideFlags: 0 556 | m_PrefabParentObject: {fileID: 0} 557 | m_PrefabInternal: {fileID: 0} 558 | serializedVersion: 5 559 | m_Component: 560 | - component: {fileID: 1285088588} 561 | - component: {fileID: 1285088590} 562 | - component: {fileID: 1285088589} 563 | m_Layer: 5 564 | m_Name: Header 565 | m_TagString: Untagged 566 | m_Icon: {fileID: 0} 567 | m_NavMeshLayer: 0 568 | m_StaticEditorFlags: 0 569 | m_IsActive: 1 570 | --- !u!224 &1285088588 571 | RectTransform: 572 | m_ObjectHideFlags: 0 573 | m_PrefabParentObject: {fileID: 0} 574 | m_PrefabInternal: {fileID: 0} 575 | m_GameObject: {fileID: 1285088587} 576 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 577 | m_LocalPosition: {x: 0, y: 0, z: 0} 578 | m_LocalScale: {x: 1, y: 1, z: 1} 579 | m_Children: [] 580 | m_Father: {fileID: 496610204} 581 | m_RootOrder: 3 582 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 583 | m_AnchorMin: {x: 0.5, y: 0.5} 584 | m_AnchorMax: {x: 0.5, y: 0.5} 585 | m_AnchoredPosition: {x: 5.4, y: 179} 586 | m_SizeDelta: {x: 160, y: 30} 587 | m_Pivot: {x: 0.5, y: 0.5} 588 | --- !u!114 &1285088589 589 | MonoBehaviour: 590 | m_ObjectHideFlags: 0 591 | m_PrefabParentObject: {fileID: 0} 592 | m_PrefabInternal: {fileID: 0} 593 | m_GameObject: {fileID: 1285088587} 594 | m_Enabled: 1 595 | m_EditorHideFlags: 0 596 | m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} 597 | m_Name: 598 | m_EditorClassIdentifier: 599 | m_Material: {fileID: 0} 600 | m_Color: {r: 0, g: 0.62352943, b: 0.8745098, a: 1} 601 | m_RaycastTarget: 1 602 | m_OnCullStateChanged: 603 | m_PersistentCalls: 604 | m_Calls: [] 605 | m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, 606 | Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 607 | m_FontData: 608 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 609 | m_FontSize: 20 610 | m_FontStyle: 0 611 | m_BestFit: 0 612 | m_MinSize: 1 613 | m_MaxSize: 40 614 | m_Alignment: 1 615 | m_AlignByGeometry: 0 616 | m_RichText: 1 617 | m_HorizontalOverflow: 0 618 | m_VerticalOverflow: 0 619 | m_LineSpacing: 1 620 | m_Text: Attribution Values 621 | --- !u!222 &1285088590 622 | CanvasRenderer: 623 | m_ObjectHideFlags: 0 624 | m_PrefabParentObject: {fileID: 0} 625 | m_PrefabInternal: {fileID: 0} 626 | m_GameObject: {fileID: 1285088587} 627 | --- !u!1 &1433846769 628 | GameObject: 629 | m_ObjectHideFlags: 0 630 | m_PrefabParentObject: {fileID: 0} 631 | m_PrefabInternal: {fileID: 0} 632 | serializedVersion: 5 633 | m_Component: 634 | - component: {fileID: 1433846770} 635 | - component: {fileID: 1433846772} 636 | - component: {fileID: 1433846771} 637 | m_Layer: 5 638 | m_Name: ButtonText 639 | m_TagString: Untagged 640 | m_Icon: {fileID: 0} 641 | m_NavMeshLayer: 0 642 | m_StaticEditorFlags: 0 643 | m_IsActive: 1 644 | --- !u!224 &1433846770 645 | RectTransform: 646 | m_ObjectHideFlags: 0 647 | m_PrefabParentObject: {fileID: 0} 648 | m_PrefabInternal: {fileID: 0} 649 | m_GameObject: {fileID: 1433846769} 650 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 651 | m_LocalPosition: {x: 0, y: 0, z: 0} 652 | m_LocalScale: {x: 1, y: 1, z: 1.06} 653 | m_Children: [] 654 | m_Father: {fileID: 496610204} 655 | m_RootOrder: 5 656 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 657 | m_AnchorMin: {x: 0.5, y: 0.5} 658 | m_AnchorMax: {x: 0.5, y: 0.5} 659 | m_AnchoredPosition: {x: -6.9999733, y: -447.99994} 660 | m_SizeDelta: {x: 160, y: 30} 661 | m_Pivot: {x: 0.5, y: 0.5} 662 | --- !u!114 &1433846771 663 | MonoBehaviour: 664 | m_ObjectHideFlags: 0 665 | m_PrefabParentObject: {fileID: 0} 666 | m_PrefabInternal: {fileID: 0} 667 | m_GameObject: {fileID: 1433846769} 668 | m_Enabled: 1 669 | m_EditorHideFlags: 0 670 | m_Script: {fileID: 708705254, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} 671 | m_Name: 672 | m_EditorClassIdentifier: 673 | m_Material: {fileID: 0} 674 | m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} 675 | m_RaycastTarget: 0 676 | m_OnCullStateChanged: 677 | m_PersistentCalls: 678 | m_Calls: [] 679 | m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, 680 | Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 681 | m_FontData: 682 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 683 | m_FontSize: 35 684 | m_FontStyle: 0 685 | m_BestFit: 0 686 | m_MinSize: 1 687 | m_MaxSize: 35 688 | m_Alignment: 4 689 | m_AlignByGeometry: 0 690 | m_RichText: 1 691 | m_HorizontalOverflow: 1 692 | m_VerticalOverflow: 1 693 | m_LineSpacing: 1 694 | m_Text: Track Event 695 | --- !u!222 &1433846772 696 | CanvasRenderer: 697 | m_ObjectHideFlags: 0 698 | m_PrefabParentObject: {fileID: 0} 699 | m_PrefabInternal: {fileID: 0} 700 | m_GameObject: {fileID: 1433846769} 701 | --- !u!1 &1864762186 702 | GameObject: 703 | m_ObjectHideFlags: 0 704 | m_PrefabParentObject: {fileID: 0} 705 | m_PrefabInternal: {fileID: 0} 706 | serializedVersion: 5 707 | m_Component: 708 | - component: {fileID: 1864762187} 709 | - component: {fileID: 1864762189} 710 | - component: {fileID: 1864762188} 711 | m_Layer: 5 712 | m_Name: Image 713 | m_TagString: Untagged 714 | m_Icon: {fileID: 0} 715 | m_NavMeshLayer: 0 716 | m_StaticEditorFlags: 0 717 | m_IsActive: 1 718 | --- !u!224 &1864762187 719 | RectTransform: 720 | m_ObjectHideFlags: 0 721 | m_PrefabParentObject: {fileID: 0} 722 | m_PrefabInternal: {fileID: 0} 723 | m_GameObject: {fileID: 1864762186} 724 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 725 | m_LocalPosition: {x: 0, y: 0, z: 0} 726 | m_LocalScale: {x: 6, y: 3, z: 1} 727 | m_Children: [] 728 | m_Father: {fileID: 496610204} 729 | m_RootOrder: 1 730 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 731 | m_AnchorMin: {x: 0.5, y: 0.5} 732 | m_AnchorMax: {x: 0.5, y: 0.5} 733 | m_AnchoredPosition: {x: 0, y: 26} 734 | m_SizeDelta: {x: 100, y: 100} 735 | m_Pivot: {x: 0.5, y: 0.5} 736 | --- !u!114 &1864762188 737 | MonoBehaviour: 738 | m_ObjectHideFlags: 0 739 | m_PrefabParentObject: {fileID: 0} 740 | m_PrefabInternal: {fileID: 0} 741 | m_GameObject: {fileID: 1864762186} 742 | m_Enabled: 1 743 | m_EditorHideFlags: 0 744 | m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} 745 | m_Name: 746 | m_EditorClassIdentifier: 747 | m_Material: {fileID: 0} 748 | m_Color: {r: 0.19852942, g: 0.19852942, b: 0.19852942, a: 1} 749 | m_RaycastTarget: 1 750 | m_OnCullStateChanged: 751 | m_PersistentCalls: 752 | m_Calls: [] 753 | m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, 754 | Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 755 | m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} 756 | m_Type: 1 757 | m_PreserveAspect: 0 758 | m_FillCenter: 1 759 | m_FillMethod: 4 760 | m_FillAmount: 1 761 | m_FillClockwise: 1 762 | m_FillOrigin: 0 763 | --- !u!222 &1864762189 764 | CanvasRenderer: 765 | m_ObjectHideFlags: 0 766 | m_PrefabParentObject: {fileID: 0} 767 | m_PrefabInternal: {fileID: 0} 768 | m_GameObject: {fileID: 1864762186} 769 | --- !u!1 &1914987863 770 | GameObject: 771 | m_ObjectHideFlags: 0 772 | m_PrefabParentObject: {fileID: 0} 773 | m_PrefabInternal: {fileID: 0} 774 | serializedVersion: 5 775 | m_Component: 776 | - component: {fileID: 1914987865} 777 | - component: {fileID: 1914987864} 778 | - component: {fileID: 1914987866} 779 | m_Layer: 0 780 | m_Name: StartUp 781 | m_TagString: Untagged 782 | m_Icon: {fileID: 0} 783 | m_NavMeshLayer: 0 784 | m_StaticEditorFlags: 0 785 | m_IsActive: 1 786 | --- !u!114 &1914987864 787 | MonoBehaviour: 788 | m_ObjectHideFlags: 0 789 | m_PrefabParentObject: {fileID: 0} 790 | m_PrefabInternal: {fileID: 0} 791 | m_GameObject: {fileID: 1914987863} 792 | m_Enabled: 1 793 | m_EditorHideFlags: 0 794 | m_Script: {fileID: 11500000, guid: 35248fb1326794b9dbc805a11a8323c1, type: 3} 795 | m_Name: 796 | m_EditorClassIdentifier: 797 | text: {fileID: 1011453657} 798 | --- !u!4 &1914987865 799 | Transform: 800 | m_ObjectHideFlags: 0 801 | m_PrefabParentObject: {fileID: 0} 802 | m_PrefabInternal: {fileID: 0} 803 | m_GameObject: {fileID: 1914987863} 804 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 805 | m_LocalPosition: {x: 0.9053383, y: 1.7630863, z: -2.1394906} 806 | m_LocalScale: {x: 1, y: 1, z: 1} 807 | m_Children: [] 808 | m_Father: {fileID: 0} 809 | m_RootOrder: 0 810 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 811 | --- !u!114 &1914987866 812 | MonoBehaviour: 813 | m_ObjectHideFlags: 0 814 | m_PrefabParentObject: {fileID: 0} 815 | m_PrefabInternal: {fileID: 0} 816 | m_GameObject: {fileID: 1914987863} 817 | m_Enabled: 1 818 | m_EditorHideFlags: 0 819 | m_Script: {fileID: 11500000, guid: ad10f597229fa4a63bd9011a9bc3e4ee, type: 3} 820 | m_Name: 821 | m_EditorClassIdentifier: 822 | Button: {fileID: 1923847704} 823 | ButtonText: {fileID: 1433846769} 824 | Check: {fileID: 282136961} 825 | text: {fileID: 1011453657} 826 | --- !u!1 &1923847704 827 | GameObject: 828 | m_ObjectHideFlags: 0 829 | m_PrefabParentObject: {fileID: 0} 830 | m_PrefabInternal: {fileID: 0} 831 | serializedVersion: 5 832 | m_Component: 833 | - component: {fileID: 1923847705} 834 | - component: {fileID: 1923847708} 835 | - component: {fileID: 1923847707} 836 | - component: {fileID: 1923847706} 837 | m_Layer: 5 838 | m_Name: Button 839 | m_TagString: Untagged 840 | m_Icon: {fileID: 0} 841 | m_NavMeshLayer: 0 842 | m_StaticEditorFlags: 0 843 | m_IsActive: 1 844 | --- !u!224 &1923847705 845 | RectTransform: 846 | m_ObjectHideFlags: 0 847 | m_PrefabParentObject: {fileID: 0} 848 | m_PrefabInternal: {fileID: 0} 849 | m_GameObject: {fileID: 1923847704} 850 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 851 | m_LocalPosition: {x: 0, y: 0, z: 0} 852 | m_LocalScale: {x: 2, y: 3, z: 1} 853 | m_Children: [] 854 | m_Father: {fileID: 496610204} 855 | m_RootOrder: 4 856 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 857 | m_AnchorMin: {x: 0.5, y: 0.5} 858 | m_AnchorMax: {x: 0.5, y: 0.5} 859 | m_AnchoredPosition: {x: -9, y: -448} 860 | m_SizeDelta: {x: 160, y: 30} 861 | m_Pivot: {x: 0.5, y: 0.5} 862 | --- !u!114 &1923847706 863 | MonoBehaviour: 864 | m_ObjectHideFlags: 0 865 | m_PrefabParentObject: {fileID: 0} 866 | m_PrefabInternal: {fileID: 0} 867 | m_GameObject: {fileID: 1923847704} 868 | m_Enabled: 1 869 | m_EditorHideFlags: 0 870 | m_Script: {fileID: 1392445389, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} 871 | m_Name: 872 | m_EditorClassIdentifier: 873 | m_Navigation: 874 | m_Mode: 3 875 | m_SelectOnUp: {fileID: 0} 876 | m_SelectOnDown: {fileID: 0} 877 | m_SelectOnLeft: {fileID: 0} 878 | m_SelectOnRight: {fileID: 0} 879 | m_Transition: 1 880 | m_Colors: 881 | m_NormalColor: {r: 0, g: 0.62352943, b: 0.8745098, a: 1} 882 | m_HighlightedColor: {r: 0, g: 0.62352943, b: 0.8745098, a: 1} 883 | m_PressedColor: {r: 0, g: 0.7372549, b: 0.93333334, a: 1} 884 | m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} 885 | m_ColorMultiplier: 1 886 | m_FadeDuration: 0.1 887 | m_SpriteState: 888 | m_HighlightedSprite: {fileID: 0} 889 | m_PressedSprite: {fileID: 0} 890 | m_DisabledSprite: {fileID: 0} 891 | m_AnimationTriggers: 892 | m_NormalTrigger: Normal 893 | m_HighlightedTrigger: Highlighted 894 | m_PressedTrigger: Pressed 895 | m_DisabledTrigger: Disabled 896 | m_Interactable: 1 897 | m_TargetGraphic: {fileID: 1923847707} 898 | m_OnClick: 899 | m_PersistentCalls: 900 | m_Calls: 901 | - m_Target: {fileID: 1914987864} 902 | m_MethodName: Purchase 903 | m_Mode: 1 904 | m_Arguments: 905 | m_ObjectArgument: {fileID: 0} 906 | m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine 907 | m_IntArgument: 0 908 | m_FloatArgument: 0 909 | m_StringArgument: 910 | m_BoolArgument: 0 911 | m_CallState: 2 912 | m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0, 913 | Culture=neutral, PublicKeyToken=null 914 | --- !u!114 &1923847707 915 | MonoBehaviour: 916 | m_ObjectHideFlags: 0 917 | m_PrefabParentObject: {fileID: 0} 918 | m_PrefabInternal: {fileID: 0} 919 | m_GameObject: {fileID: 1923847704} 920 | m_Enabled: 1 921 | m_EditorHideFlags: 0 922 | m_Script: {fileID: -765806418, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} 923 | m_Name: 924 | m_EditorClassIdentifier: 925 | m_Material: {fileID: 0} 926 | m_Color: {r: 1, g: 1, b: 1, a: 1} 927 | m_RaycastTarget: 1 928 | m_OnCullStateChanged: 929 | m_PersistentCalls: 930 | m_Calls: [] 931 | m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI, 932 | Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 933 | m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} 934 | m_Type: 1 935 | m_PreserveAspect: 0 936 | m_FillCenter: 1 937 | m_FillMethod: 4 938 | m_FillAmount: 1 939 | m_FillClockwise: 1 940 | m_FillOrigin: 0 941 | --- !u!222 &1923847708 942 | CanvasRenderer: 943 | m_ObjectHideFlags: 0 944 | m_PrefabParentObject: {fileID: 0} 945 | m_PrefabInternal: {fileID: 0} 946 | m_GameObject: {fileID: 1923847704} 947 | --- !u!1 &1943741240 948 | GameObject: 949 | m_ObjectHideFlags: 0 950 | m_PrefabParentObject: {fileID: 0} 951 | m_PrefabInternal: {fileID: 0} 952 | serializedVersion: 5 953 | m_Component: 954 | - component: {fileID: 1943741243} 955 | - component: {fileID: 1943741242} 956 | - component: {fileID: 1943741241} 957 | m_Layer: 0 958 | m_Name: EventSystem 959 | m_TagString: Untagged 960 | m_Icon: {fileID: 0} 961 | m_NavMeshLayer: 0 962 | m_StaticEditorFlags: 0 963 | m_IsActive: 1 964 | --- !u!114 &1943741241 965 | MonoBehaviour: 966 | m_ObjectHideFlags: 0 967 | m_PrefabParentObject: {fileID: 0} 968 | m_PrefabInternal: {fileID: 0} 969 | m_GameObject: {fileID: 1943741240} 970 | m_Enabled: 1 971 | m_EditorHideFlags: 0 972 | m_Script: {fileID: 1077351063, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} 973 | m_Name: 974 | m_EditorClassIdentifier: 975 | m_HorizontalAxis: Horizontal 976 | m_VerticalAxis: Vertical 977 | m_SubmitButton: Submit 978 | m_CancelButton: Cancel 979 | m_InputActionsPerSecond: 10 980 | m_RepeatDelay: 0.5 981 | m_ForceModuleActive: 0 982 | --- !u!114 &1943741242 983 | MonoBehaviour: 984 | m_ObjectHideFlags: 0 985 | m_PrefabParentObject: {fileID: 0} 986 | m_PrefabInternal: {fileID: 0} 987 | m_GameObject: {fileID: 1943741240} 988 | m_Enabled: 1 989 | m_EditorHideFlags: 0 990 | m_Script: {fileID: -619905303, guid: f5f67c52d1564df4a8936ccd202a3bd8, type: 3} 991 | m_Name: 992 | m_EditorClassIdentifier: 993 | m_FirstSelected: {fileID: 0} 994 | m_sendNavigationEvents: 1 995 | m_DragThreshold: 5 996 | --- !u!4 &1943741243 997 | Transform: 998 | m_ObjectHideFlags: 0 999 | m_PrefabParentObject: {fileID: 0} 1000 | m_PrefabInternal: {fileID: 0} 1001 | m_GameObject: {fileID: 1943741240} 1002 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 1003 | m_LocalPosition: {x: 0, y: 0, z: 0} 1004 | m_LocalScale: {x: 1, y: 1, z: 1} 1005 | m_Children: [] 1006 | m_Father: {fileID: 0} 1007 | m_RootOrder: 3 1008 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1009 | --------------------------------------------------------------------------------