commit db327b4157ced7ce335d2c96a13abf93ceee7265 Author: huyufei Date: Fri Dec 15 15:35:30 2023 +0800 init commit diff --git a/Editor.meta b/Editor.meta new file mode 100644 index 0000000..ee08eac --- /dev/null +++ b/Editor.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 729cc47bf56d436ba4c20380ca1e5e59 +timeCreated: 1673860499 \ No newline at end of file diff --git a/Editor/Dependencies.xml b/Editor/Dependencies.xml new file mode 100644 index 0000000..7a9e6f5 --- /dev/null +++ b/Editor/Dependencies.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + git@github.com:castbox/GuruSpecs.git + + + + + diff --git a/Editor/Dependencies.xml.meta b/Editor/Dependencies.xml.meta new file mode 100644 index 0000000..d8253d4 --- /dev/null +++ b/Editor/Dependencies.xml.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b9cafb1d82bb45598fdd566d9b8f6a80 +timeCreated: 1674110869 \ No newline at end of file diff --git a/Editor/Proguards.txt b/Editor/Proguards.txt new file mode 100644 index 0000000..e277f50 --- /dev/null +++ b/Editor/Proguards.txt @@ -0,0 +1,2 @@ +-keep class com.guru.** { *; } +-keep class guru.core.** { *; } \ No newline at end of file diff --git a/Editor/Proguards.txt.meta b/Editor/Proguards.txt.meta new file mode 100644 index 0000000..d636922 --- /dev/null +++ b/Editor/Proguards.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: fb5e4cd53ce674f5ebbb1d5d865a0127 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Tests.meta b/Editor/Tests.meta new file mode 100644 index 0000000..c15a241 --- /dev/null +++ b/Editor/Tests.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9285dfb682d54e929bf0072a504e41b7 +timeCreated: 1690343284 \ No newline at end of file diff --git a/Editor/Tests/GuruUnitTest.cs b/Editor/Tests/GuruUnitTest.cs new file mode 100644 index 0000000..f804fc7 --- /dev/null +++ b/Editor/Tests/GuruUnitTest.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Guru; +using NUnit.Framework; +using UnityEngine; + +public class GuruUnitTest +{ + private void TestInit(Action callback) + { + FirebaseUtil.InitFirebase(callback); + } + + [Test] + public void Test_Tch001() + { + TestInit(() => + { + double value = 0.0100000000899764; + Analytics.Tch001ADRev(value); + Analytics.Tch02ADRev(value); + }); + + } + + +} diff --git a/Editor/Tests/GuruUnitTest.cs.meta b/Editor/Tests/GuruUnitTest.cs.meta new file mode 100644 index 0000000..f89722a --- /dev/null +++ b/Editor/Tests/GuruUnitTest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b6fe6b4805b4c40a1aea627baf6c976a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/imgs.meta b/Editor/imgs.meta new file mode 100644 index 0000000..3466884 --- /dev/null +++ b/Editor/imgs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cd9f52a72bd884a9382ae92fc9ec2726 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/imgs/sc01.png b/Editor/imgs/sc01.png new file mode 100644 index 0000000..f8c4dd9 Binary files /dev/null and b/Editor/imgs/sc01.png differ diff --git a/Editor/imgs/sc01.png.meta b/Editor/imgs/sc01.png.meta new file mode 100644 index 0000000..e0208d2 --- /dev/null +++ b/Editor/imgs/sc01.png.meta @@ -0,0 +1,133 @@ +fileFormatVersion: 2 +guid: 82a7793d183b045eeb9591cc4c15bd76 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins.meta b/Plugins.meta new file mode 100644 index 0000000..259aef4 --- /dev/null +++ b/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cbde866c1fe3a4961b2412feddfe68a3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Android.meta b/Plugins/Android.meta new file mode 100644 index 0000000..d5e9826 --- /dev/null +++ b/Plugins/Android.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2b5e2e7c4d1ed49cfb4b27dcfe69ab5a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Android/U3DAnalytics-release.aar b/Plugins/Android/U3DAnalytics-release.aar new file mode 100644 index 0000000..1ba7c22 Binary files /dev/null and b/Plugins/Android/U3DAnalytics-release.aar differ diff --git a/Plugins/Android/U3DAnalytics-release.aar.meta b/Plugins/Android/U3DAnalytics-release.aar.meta new file mode 100644 index 0000000..8c5d070 --- /dev/null +++ b/Plugins/Android/U3DAnalytics-release.aar.meta @@ -0,0 +1,32 @@ +fileFormatVersion: 2 +guid: a336b814594434b4092d38e5ce76577a +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Android/guru_analytics-release.aar b/Plugins/Android/guru_analytics-release.aar new file mode 100644 index 0000000..b8826ec Binary files /dev/null and b/Plugins/Android/guru_analytics-release.aar differ diff --git a/Plugins/Android/guru_analytics-release.aar.meta b/Plugins/Android/guru_analytics-release.aar.meta new file mode 100644 index 0000000..54f128a --- /dev/null +++ b/Plugins/Android/guru_analytics-release.aar.meta @@ -0,0 +1,32 @@ +fileFormatVersion: 2 +guid: c5a9f9e11213b4bb78856debe4c967ca +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Android: Android + second: + enabled: 1 + settings: {} + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/iOS.meta b/Plugins/iOS.meta new file mode 100644 index 0000000..adc3568 --- /dev/null +++ b/Plugins/iOS.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1f7f3e184bd7d457b9e678321a69ad1b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/iOS/Podfile b/Plugins/iOS/Podfile new file mode 100644 index 0000000..2e9bf51 --- /dev/null +++ b/Plugins/iOS/Podfile @@ -0,0 +1,14 @@ +source 'https://github.com/CocoaPods/Specs.git' +source 'git@github.com:castbox/GuruSpecs.git' + +platform :ios, '11.0' + +target 'UnityFramework' do + + pod 'GuruAnalyticsLib', '~>0.2.2' +# pod 'GuruAnalyticsLib', :git => 'git@github.com:castbox/GuruAnalytics_iOS.git', :branch => 'dev' +end +target 'Unity-iPhone' do +end +use_frameworks! + diff --git a/Plugins/iOS/Podfile.meta b/Plugins/iOS/Podfile.meta new file mode 100644 index 0000000..769c9b7 --- /dev/null +++ b/Plugins/iOS/Podfile.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 10035163694574b63b74cd99c7ee5c68 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/iOS/U3DAnalytics.mm b/Plugins/iOS/U3DAnalytics.mm new file mode 100644 index 0000000..a485a9a --- /dev/null +++ b/Plugins/iOS/U3DAnalytics.mm @@ -0,0 +1,294 @@ +// ============================================== +// U3DConsent.mm +// UnityFramework +// +// Created by EricHu on 2022/11/17. +// Copyright © 2022 guru. All rights reserved. +// ============================================== + +#import +#import "UnityAppController+UnityInterface.h" +#import + +@interface U3DAnalytics : NSObject + +//+ (void)requestGDPR: (NSString *)deviceId :(int) debugGeo; +//+ (UIViewController *) getUnityViewController; + +@end + +static NSString *gameobjectName; +static NSString *callbackName; + +static GuruAnalytics *_analytics; + + +@implementation U3DAnalytics + +// Const value define +NSString * const Version = @"1.8.1"; + +static const double kUploadPeriodInSecond = 60.0; +static const int kBatchLimit = 15; +static const double kEventExpiredSeconds = 7 * 24 * 60 * 60; +static const double kInitializeTimeout = 5.0; + +static double tch001MaxValue = 0.01; +static double tch02MaxValue = 0.2; +NSString * const TchAdRevRoas001 = @"tch_ad_rev_roas_001"; +NSString * const TchAdRevRoas02 = @"tch_ad_rev_roas_02"; +NSString * const TchError = @"tch_error"; + + + ++(UnityAppController *)GetAppController { + return (UnityAppController*)[UIApplication sharedApplication].delegate; +} + ++(UIViewController *) getUnityViewController { + return UnityGetGLViewController(); +} + +// 字符串转换 ++(const char*) stringToChar: (NSString *) str{ + return [str cStringUsingEncoding:NSASCIIStringEncoding]; +} + + ++(NSString *) charToString: (const char *) c{ + return [[NSString alloc] initWithUTF8String:c]; +} + +// 获取最终字符串 ++(char*) finalChar: (NSString *) string +{ + const char *tmpChar = [string cStringUsingEncoding:NSASCIIStringEncoding]; + + if (string == NULL) + return NULL; + + char* res = (char*)malloc(strlen(tmpChar) + 1); + strcpy(res, tmpChar); + + return res; +} + +// 设置太极02的预设值 ++(void) setTch02MaxValue: (const double) value{ + tch02MaxValue = value; +} + +// 构建数据 +//+(NSString *) buildDataString: (int)status andMessage: (NSString *)msg{ +// +// NSString *jsonString = [NSString stringWithFormat: @"{\"action\":\"gdpr\",\"data\":{\"status\":%d,\"msg\":\"%@\"}}", status, msg]; +// return jsonString; +//} + +// 构建数据字典 ++(NSDictionary *) buildDataDict: (NSString *) str{ + + NSArray *raw = [str componentsSeparatedByString:@","]; + if( raw == nil || raw.count == 0) return nil; + + NSMutableDictionary* dict = [[NSMutableDictionary alloc] init]; //must init before using + + for(NSString *s in raw ){ + NSArray *kvp = [s componentsSeparatedByString:@":"]; + if(kvp == nil || kvp.count < 2){ + continue; + } + + NSString *k = kvp[0]; + NSString *t = [kvp[1] substringToIndex:1]; + NSString *v = [kvp[1] substringFromIndex:1]; + + // NSLog(@"---[iOS] parse kvp key:%@ type:%@ value:%@", k, t, v); + + //TODO 解析字符值 + if([t isEqual: @"i"]){ + // int + [dict setValue:@([v integerValue]) forKey:k]; + }else if([t isEqual: @"d"]){ + // double + [dict setValue:@([v doubleValue]) forKey:k]; + } else { + // String + [dict setValue:v forKey:k]; + } + } + return dict; +} + +// 构建Json格式的数据字典 ++(NSMutableDictionary *) buildDataWithJson: (NSString *) json andKey: (NSString *) key{ + + if( json == nil || json.length == 0) return nil; + + NSData *jsonData = [json dataUsingEncoding:NSUTF8StringEncoding]; + NSError *err; + NSMutableDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData + options:NSJSONReadingMutableContainers + error:&err]; + + if(err || dict == nil) + { + NSLog(@"json解析失败:%@",err); + [U3DAnalytics onTchErrorEvent:@"json_error" andRaw:json andOther:@""]; + return nil; + } + + // ---------- 太极数据校验 ------------- + if(key == TchAdRevRoas001){ + // tch 001 参数修复 + [U3DAnalytics fixTchParams: dict andJson:json andMaxValue:tch001MaxValue]; + } else if(key == TchAdRevRoas02){ + // tch 02 参数修复 + [U3DAnalytics fixTchParams: dict andJson:json andMaxValue:tch02MaxValue]; + } + + return dict; +} + +// 修复自打点数据 ++(void) fixTchParams: (NSMutableDictionary *)dict andJson: (NSString *)json andMaxValue: (double) targetValue { + // --- 保存 raw数据 --- + [dict setValue: json forKey:@"raw"]; + + id _platform = [dict objectForKey:@"ad_platform"]; + id _value = [dict objectForKey:@"value"]; + + if([U3DAnalytics isNullObject: _platform]) { + // 不存在 ad_paltform + [U3DAnalytics onTchErrorEvent:@"no_ad_platform" andRaw:json andOther:@""]; + } else { + // 非IAP订单 + if(![[_platform stringValue] isEqual:@"appstore"] ) + { + if([U3DAnalytics isNullObject: _value] ){ + [dict setValue: [NSNumber numberWithDouble: targetValue] forKey:@"value"]; + [U3DAnalytics onTchErrorEvent:@"no_value" andRaw:json andOther:@""]; + } else { + if([_value doubleValue] < targetValue){ + [dict setValue: [NSNumber numberWithDouble: targetValue] forKey:@"value"]; + [U3DAnalytics onTchErrorEvent:@"value_error" + andRaw:json andOther: [_value stringValue]]; + } + } + } + } +} + + + +// 上报 tch_error 事件 ++(void) onTchErrorEvent:(NSString *) evtName andRaw: (NSString *)raw andOther: (NSString *) other{ + NSString *json = [NSString stringWithFormat:@"{\"event\":\"%@\", \"raw\":\"%@\", \"other\":\"%@\"}", evtName, raw, other]; + + [GuruAnalytics logEvent:TchError + parameters:[U3DAnalytics buildDataWithJson:json andKey:evtName]]; +} + +// 对象判空 ++ (BOOL)isNullObject:(__kindof id) obj{ + if(!obj){ + return YES; + } + + if(obj == NULL){ + return YES; + } + + if([obj isEqual:[NSNull null]]){ + return YES; + } + + return NO; +} + +@end + +//============================ UNITY PUBLIC API ============================ + +extern "C" { + + // 请求GDPR + void unityInitAnalytics(const char *appId, const char *deviceInfo, bool isDebug) + { +// NSLog(@"--- [iOS] init Analytics libs"); + [GuruAnalytics initializeLibWithUploadPeriodInSecond:kUploadPeriodInSecond + batchLimit:kBatchLimit + eventExpiredSeconds:kEventExpiredSeconds + initializeTimeout:kInitializeTimeout + saasXAPPID:[U3DAnalytics charToString:appId] + saasXDEVICEINFO:[U3DAnalytics charToString:deviceInfo] + loggerDebug:isDebug]; + } + + // 设置用户ID + void unitySetUserID(const char *uid){ + [GuruAnalytics setUserID:[U3DAnalytics charToString:uid]]; + } + + // 设置用户ID + void unitySetScreen(const char *screenName){ + [GuruAnalytics setScreen:[U3DAnalytics charToString:screenName]]; + } + + // 设置用户ADID + void unitySetAdId(const char *adId){ + [GuruAnalytics setAdId:[U3DAnalytics charToString:adId]]; + } + + // 设置用户AdjustID + void unitySetAdjustID(const char *adjustId){ + [GuruAnalytics setAdjustId:[U3DAnalytics charToString:adjustId]]; + } + + // 设置用户FirebaseID + void unitySetFirebaseId(const char *firebaseId){ + [GuruAnalytics setFirebaseId:[U3DAnalytics charToString:firebaseId]]; + } + + // 设置用户设备ID + void unitySetDeviceId(const char *did){ + [GuruAnalytics setDeviceId:[U3DAnalytics charToString:did]]; + } + + // 设置用户属性 + void unitySetUserProperty(const char *key, const char *value){ + [GuruAnalytics setUserProperty:[U3DAnalytics charToString:value] + forName:[U3DAnalytics charToString:key]]; + } + + // 上报事件 + void unityLogEvent(const char *key, const char *data){ + NSString *evtName = [U3DAnalytics charToString:key]; + NSString *json = [U3DAnalytics charToString:data]; + + [GuruAnalytics logEvent: evtName + parameters:[U3DAnalytics buildDataWithJson:json andKey:evtName]]; // JSON转换 + } + + // 上报事件 + void unitySetTch02Value(const double value){ + [U3DAnalytics setTch02MaxValue:value]; + } + + // 打点事件成功率 + void unityReportEventRate(void){ + [GuruAnalytics debug_eventsStatistics:^(NSInteger uploadedEventsCount, NSInteger loggedEventsCount) { + + // 上报事件总量 + [GuruAnalytics setUserProperty:[NSString stringWithFormat:@"%ld", loggedEventsCount] + forName:@"lgd"]; + // 上报成功数量 + [GuruAnalytics setUserProperty:[NSString stringWithFormat:@"%ld", uploadedEventsCount] + forName:@"uld"]; + }]; + } + +} + + + diff --git a/Plugins/iOS/U3DAnalytics.mm.meta b/Plugins/iOS/U3DAnalytics.mm.meta new file mode 100644 index 0000000..b4ae2ee --- /dev/null +++ b/Plugins/iOS/U3DAnalytics.mm.meta @@ -0,0 +1,37 @@ +fileFormatVersion: 2 +guid: 621002eb5acb547ec95af0d804cfb17f +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: {} + - first: + tvOS: tvOS + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/iOS/U3DException.mm b/Plugins/iOS/U3DException.mm new file mode 100644 index 0000000..c4a9071 --- /dev/null +++ b/Plugins/iOS/U3DException.mm @@ -0,0 +1,70 @@ +// +// JJException.m +// UnityFramework +// +// Created by Castbox on 2023/2/28. +// + +#import +#import +#import "UnityAppController+UnityInterface.h" +#import +#import + +@interface U3DException : NSObject + + +@end + +@implementation U3DException + +static U3DException *_instance; + ++ (instancetype)sharedInstance { + static dispatch_once_t oneToken; + dispatch_once(&oneToken,^{ + _instance = [[self alloc]init]; + }); + return _instance; +} + ++ (instancetype)allocWithZone:(NSZone *)zone{ + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _instance = [super allocWithZone:zone]; + }); + return _instance; +} + +- (void)start { + [JJException configExceptionCategory:JJExceptionGuardUnrecognizedSelector]; + [JJException startGuardException]; + [JJException registerExceptionHandle:self]; +} + +#pragma mark - Exception Delegate + +- (void)handleCrashException:(NSString*)exceptionMessage extraInfo:(NSDictionary*)info{ + NSLog(@"handleCrashException: %@ info: %@", exceptionMessage, info); + NSArray *messages = [exceptionMessage componentsSeparatedByString:@"\n"]; + NSString *domain = @"[U3DException]-handler exception"; + if (messages.count > 2) { +// messages.objectat + domain = [messages objectAtIndex:2]; + } + NSError *error = [[NSError alloc] initWithDomain:domain code:-1 userInfo:@{NSLocalizedDescriptionKey: exceptionMessage}]; + [[FIRCrashlytics crashlytics] recordError:error]; +} + +@end + + +extern "C" { + void unityInitException() { + [[U3DException sharedInstance] start]; + } + + void unityTestUnrecognizedSelectorCrash() { + [[U3DException sharedInstance] performSelector:NSSelectorFromString(@"testUnrecognizedSelectorCrash")]; + } +} diff --git a/Plugins/iOS/U3DException.mm.meta b/Plugins/iOS/U3DException.mm.meta new file mode 100644 index 0000000..ce16476 --- /dev/null +++ b/Plugins/iOS/U3DException.mm.meta @@ -0,0 +1,37 @@ +fileFormatVersion: 2 +guid: 66c93bfd67d2e46f887594e87fa16b39 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: {} + - first: + tvOS: tvOS + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/README.md b/README.md new file mode 100644 index 0000000..acf90c0 --- /dev/null +++ b/README.md @@ -0,0 +1,252 @@ +# Guru Unity Analytics + +GuruAnalyticsLib 的 Unity 插件库 + +--- + +## Change Logs + +### 1.8.4 +- 优化Android 端 Worker 调用逻辑, 重启 Worker 有助于让打点数据更准确 + +### 1.8.3 +- 修复 fg 打点上报时长不正确的问题 + +### 1.8.2 +- 修复参数类型转换的BUG, param数据转换为JSON对象 + +### 1.8.1 +- 修复自打点浮点参数精度问题 +- 添加太极020数值设置接口 + +### 1.7.5 +- 删除 `androidx.appcompat:appcompat` 库依赖 + + +
+ +--- + +## Document + +- 项目整合插件后, **请一定要在各插件的初始化后上报各相关ID**: + +- 相关接口如下 + +- ### UID + + ```C# + + // ---- 需要等待中台初始化后上报: + // 上报中台返回的用户ID + string uid = IPMConfig.IPM_UID + GuruAnalytics.SetUid(uid); + + ``` + +- ### DeviceID + ```C# + // 上报设备ID + string deviceId = IPMConfig.IPM_DEVICE_ID + GuruAnalytics.SetDeviceId(DeviceID); + + ``` + +- ### FirebaseID + ```C# + + // ---- 需要Firebase Analytic 初始化后, 异步获取对应的ID: + private static async void InitFirebaseAnalytics() + { + Debug.Log($"---[ANA] IPM UID: {IPMConfig.IPM_UID}"); + + var task = FirebaseAnalytics.GetAnalyticsInstanceIdAsync(); + await task; + if (task.IsCompleted) + { + var fid = task.Result; + if (!string.IsNullOrEmpty(fid)) + { + Debug.Log($"---[ANA] Firebase ID: {fid}"); + GuruAnalytics.SetFirebaseId(fid); + } + } + else + { + Debug.LogError("---- Get Firebase Analytics Instance Fail"); + } + } + + + ``` + +- ### AdjustID + + ```C# + + // ---- Adjust 启动后调用: + string adjustID = Adjust.getAdid(); + GuruAnalytics.SetAdjustId(adjustID); + + + ``` + +- ### AdID + + ```C# + string adId = ""; + Adjust.getGoogleAdId(id => + { + Debug.Log($"---- [ADJ] ADId: {id}"); + adId = id; + GuruAnalytics.SetAdId(id); + }); + + + ``` + +- 上报用户属性: + + ```C# + + string item_category = "main"; + int level = 7; + + GuruAnalytics.SetUserProperty("item_category", item_category); + GuruAnalytics.SetUserProperty("level", level.ToString()); + + ``` + +- 上报视图名称 + + ```C# + + string screenName = "MainView"; + GuruAnalytics.SetScreen(screenName); + + ``` + + +- 上报自定义打点: + + ```C# + + string eventName = "user_get_coin"; + Dictionary data = new Dictionary() + { + { "level", 7 }, + { "user_coin", 105L }, + { "win_rate", 21.25f }, + { "b_level", 7 }, + { "result", "retry" } + }; + GuruAnalytics.LogEvent(eventName, data); + + ``` +--- + +
+ +## 依赖台配置说明 + +本项目已开始使用 `ExternalDependencyManager` 简称 `EDM` 来解决各种库的依赖问题 + +详细配置可见: [Dependencies.xml](Editor/Dependencies.xml) + +IOS 项目注意配置如下图: + +--> 取消勾选 **Link frameworks statically** + +![](Editor/imgs/sc01.png) + + +### Android 项目配置: + +于主菜单 `BuildSettings/PlayerSettings/PubishSettings:` + +开启如下选项: + +- [x] Custom Main Gradle Template +- [x] Custom Properties Gradle Template + +之后会在项目的 `Plugins/Android`内生成对应的文件. + +(A) 修改 `gradleTemplate.properties` + +添加一下内容支持 `AndroidX` + +```java +org.gradle.jvmargs=-Xmx**JVM_HEAP_SIZE**M +org.gradle.parallel=true +android.enableR8=false +unityStreamingAssets=.unity3d**STREAMING_ASSETS** +android.useAndroidX=true +android.enableJetifier=true +**ADDITIONAL_PROPERTIES** +``` + +(B) 修改 `mainTemplate.gradle` + +于 `dependency` 内添加如下依赖 (目前会自动添加, 无需手动添加) + +```java + +dependencies { + ... + + implementation 'androidx.core:core:1.7.0' + compile 'com.mapzen:on-the-road:0.8.1' + + // basicDependencies + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'com.jakewharton.timber:timber:4.7.1' + implementation 'com.google.code.gson:gson:2.8.5' + // roomDependencies + implementation 'androidx.room:room-runtime:2.4.3' + implementation 'androidx.room:room-rxjava2:2.4.3' + // retrofitDependencies + implementation 'com.squareup.retrofit2:retrofit:2.7.1' + implementation 'com.squareup.retrofit2:converter-gson:2.7.1' + implementation 'com.squareup.retrofit2:adapter-rxjava2:2.7.1' + // okhttpDependencies + implementation 'androidx.work:work-runtime:2.7.1' + implementation 'androidx.work:work-runtime-ktx:2.7.1' + implementation 'androidx.work:work-rxjava2:2.7.1' + // process + implementation 'androidx.lifecycle:lifecycle-process:2.4.0' + // okhttp3 + implementation 'com.squareup.okhttp3:okhttp:4.9.3' + + ... +} + +``` + +最低 `minTarget` 设置为 **21** + +(D) 修改 `proguard-user.txt` 文件, 在最后追加此插件的相关代码 + +若项目使用了 ProGuard 压缩混淆, 需要修改此文件, 否则可能造成JAVA类无法被找到 + +```java + +... + +-keep class com.guru.** { *; } +-keep class guru.core.** { *; } + +``` + + +--- + +
+ + +## 示例项目 + +- 示例项目位于 [~Sample](~Sample) 目录内. 详见 [CuruAnalyticsDemo.cs](~Sample/CuruAnalyticsDemo.cs) +- 示例借用了 BallSortPuzzle 的 `AppID` 和 `BundleID` + + + diff --git a/README.md.meta b/README.md.meta new file mode 100644 index 0000000..1d541ac --- /dev/null +++ b/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8def6937882714f739e50c9b1e011967 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime.meta b/Runtime.meta new file mode 100644 index 0000000..c20741d --- /dev/null +++ b/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1892c569dc49c456f9ae1d99ea76e3b9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Script.meta b/Runtime/Script.meta new file mode 100644 index 0000000..44aeccb --- /dev/null +++ b/Runtime/Script.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 30c092dbfbc6d4194b436c91ae7290b9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Script/GuruAnalytics.cs b/Runtime/Script/GuruAnalytics.cs new file mode 100644 index 0000000..610fd1a --- /dev/null +++ b/Runtime/Script/GuruAnalytics.cs @@ -0,0 +1,247 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using Newtonsoft.Json; +using UnityEngine; + + +namespace Guru +{ + + public class GuruAnalytics + { + // Plugin Version + public const string Version = "1.8.4"; + + public static readonly string Tag = "[ANA]"; + private static IAnalyticsAgent _agent; + + public static IAnalyticsAgent Agent + { + get + { + if (_agent == null) + { + #if UNITY_EDITOR + _agent = new AnalyticsAgentStub(); + #elif UNITY_ANDROID + _agent = new AnalyticsAgentAndroid(); + #elif UNITY_IOS + _agent = new AnalyticsAgentIOS(); + #endif + } + return _agent; + } + } + + private static Dictionary _userProperties; + /// + /// 用户属性缓存字典 + /// + public static Dictionary UserProperties + { + get + { + if (_userProperties == null) + { + _userProperties = new Dictionary(10); + } + return _userProperties; + } + } + + + #region 公用接口 + + /// + /// 初始化接口 + /// + public static void Init(string appId, string deviceInfo, bool isDebug = false) + { + Agent?.Init(appId, deviceInfo, isDebug); +#if UNITY_IOS + // AnalyticsAgentIOS.TestCrashEvent(); // 测试触发一下崩溃事件 +#endif + } + + /// + /// 设置视图名称 + /// + /// + public static void SetScreen(string screenName) + { + CacheUserProperty($"screen_name", screenName); + Agent?.SetScreen(screenName); + } + + /// + /// 设置广告ID + /// + /// + public static void SetAdId(string id) + { + CacheUserProperty($"ad_id", id); + Agent?.SetAdId(id); + } + + /// + /// 设置用户属性 + /// + /// + /// + public static void SetUserProperty(string key, string value) + { + CacheUserProperty(key, value); // 添加用户属性 + Agent?.SetUserProperty(key, value); + } + /// + /// 设置Firebase ID + /// + /// + public static void SetFirebaseId(string id) + { + CacheUserProperty($"firebase_id", id); + Agent?.SetFirebaseId(id); + } + + /// + /// 设置Adjust ID + /// + /// + public static void SetAdjustId(string id) + { + CacheUserProperty($"adjust_id", id); + Agent?.SetAdjustId(id); + } + + /// + /// 设置设备ID + /// + /// + public static void SetDeviceId(string deviceId) + { + CacheUserProperty($"device_id", deviceId); + Agent?.SetDeviceId(deviceId); + } + + /// + /// 设置用户ID + /// + /// + public static void SetUid(string uid) + { + CacheUserProperty($"uid", uid); + Agent?.SetUid(uid); + } + + /// + /// 上报事件成功率 + /// + public static void ReportEventSuccessRate() => Agent?.ReportEventSuccessRate(); + + /// + /// 上报打点事件 + /// + /// 事件名称 + /// INT类型的值 + public static void LogEvent(string eventName, Dictionary data = null) + { + string raw = ""; + if (data != null && data.Count > 0) + { + raw = BuildParamsJson(data); + } + Debug.Log($"{Tag} event:{eventName} | raw: {raw}"); + Agent?.LogEvent(eventName, raw); + } + + private static string BuildParamsString(Dictionary data) + { + string raw = ""; + List strList = new List(data.Count); + foreach (var kvp in data) + { + strList.Add(BuildStringValue(kvp)); + raw = string.Join(",", strList); + } + return raw; + } + + private static string BuildParamsJson(Dictionary data) + { + try + { + // 强制转换加入国家设置 + return JsonConvert.SerializeObject(data, new JsonSerializerSettings() + { + Culture = new CultureInfo("en-US"), + }); + } + catch (Exception e) + { + Debug.LogError(e); + } + + return ""; + } + + /// + /// 构建带有类型格式的Str值 + /// + /// + /// + private static string BuildStringValue(KeyValuePair kvp) + { + if (kvp.Value is int || kvp.Value is long) + { + return $"{kvp.Key}:i{kvp.Value}"; + } + + if (kvp.Value is double || kvp.Value is float) + { + double dValue = (double)((object)kvp.Value); + return $"{kvp.Key}:d{dValue.ToString("F11", new CultureInfo("en-US"))}"; // 保留精度进行转换 + } + + return $"{kvp.Key}:s{kvp.Value}"; + } + + /// + /// 设置太极02值 + /// + /// + public static void SetTch02Value(double value) + { + Debug.Log($"{Tag} set tch_02_value:{value}"); + Agent?.SetTch02Value(value); + } + + #endregion + + #region iOS独有接口 + +#if UNITY_IOS + // 触发测试崩溃埋点 + public static void TestCrash() => AnalyticsAgentIOS.TestCrashEvent(); +#endif + + #endregion + + #region 用户属性 + + /// + /// 记录用户属性 + /// + /// + /// + private static void CacheUserProperty(string key, string value) + { + UserProperties[key] = value; + } + + #endregion + } +} + diff --git a/Runtime/Script/GuruAnalytics.cs.meta b/Runtime/Script/GuruAnalytics.cs.meta new file mode 100644 index 0000000..f340841 --- /dev/null +++ b/Runtime/Script/GuruAnalytics.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 09fd5c799d5d24931a3974af59d496a3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Script/IAnalyticsAgent.cs b/Runtime/Script/IAnalyticsAgent.cs new file mode 100644 index 0000000..70d1fa0 --- /dev/null +++ b/Runtime/Script/IAnalyticsAgent.cs @@ -0,0 +1,21 @@ +namespace Guru +{ + /// + /// 自打点代理接口 + /// + public interface IAnalyticsAgent + { + void Init(string appId, string deviceInfo, bool isDebug = false); + void SetScreen(string screenName); + void SetAdId(string id); + void SetUserProperty(string key, string value); + void SetFirebaseId(string id); + void SetAdjustId(string id); + void SetDeviceId(string deviceId); + void SetUid(string uid); + bool IsDebug { get; } + void LogEvent(string eventName, string parameters); + void ReportEventSuccessRate(); // 上报任务成功率 + void SetTch02Value(double value); // 设置太极02数值 + } +} \ No newline at end of file diff --git a/Runtime/Script/IAnalyticsAgent.cs.meta b/Runtime/Script/IAnalyticsAgent.cs.meta new file mode 100644 index 0000000..2b001ac --- /dev/null +++ b/Runtime/Script/IAnalyticsAgent.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0541b7a79e6e44a5aa8ab5cc00218c9b +timeCreated: 1672388238 \ No newline at end of file diff --git a/Runtime/Script/Impl.meta b/Runtime/Script/Impl.meta new file mode 100644 index 0000000..4599071 --- /dev/null +++ b/Runtime/Script/Impl.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e9a20f30f62248ac88252dc5958a338b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Script/Impl/AnalyticsAgentAndroid.cs b/Runtime/Script/Impl/AnalyticsAgentAndroid.cs new file mode 100644 index 0000000..ec2b179 --- /dev/null +++ b/Runtime/Script/Impl/AnalyticsAgentAndroid.cs @@ -0,0 +1,95 @@ +using System; +using UnityEngine; + +namespace Guru +{ + public class AnalyticsAgentAndroid: IAnalyticsAgent + { + +#if UNITY_ANDROID + + public static readonly string AnalyticsClassName = "com.guru.unity.analytics.Analytics"; + private static AndroidJavaClass _classAnalytics; + private static AndroidJavaClass ClassAnalytics => _classAnalytics ??= new AndroidJavaClass(AnalyticsClassName); + +#endif + private static bool _isDebug = false; + public static bool UseWorker = true; + + #region 工具方法 + + + + /// + /// 调用静态方法 + /// + /// + /// + private static void CallStatic(string methodName, params object[] args) + { +#if UNITY_ANDROID + try + { + if (ClassAnalytics != null) + { + ClassAnalytics.CallStatic(methodName, args); + if(_isDebug) Debug.Log($"{GuruAnalytics.Tag} Android call static :: {methodName}"); + } + } + catch (Exception e) + { + Debug.LogError(e.Message); + } +#endif + } + + /// + /// 调用静态方法 + /// + /// + /// + /// + private static T CallStatic(string methodName, params object[] args) + { +#if UNITY_ANDROID + try + { + if (ClassAnalytics != null) + { + if(_isDebug) Debug.Log($"{GuruAnalytics.Tag} Android call static <{typeof(T).ToString()}> :: {methodName}"); + return ClassAnalytics.CallStatic(methodName, args); + } + } + catch (Exception e) + { + Debug.LogError(e.Message); + } +#endif + return default(T); + } + + #endregion + + #region 接口实现 + + public void Init(string appId, string deviceInfo, bool isDebug = false) + { + _isDebug = isDebug; + string bundleId = Application.identifier; + CallStatic("init", appId, deviceInfo, bundleId, UseWorker, isDebug); // 调用接口 + } + public void SetScreen(string screenName) => CallStatic("setScreen", screenName); + public void SetAdId(string id) => CallStatic("setAdId", id); + public void SetUserProperty(string key, string value) => CallStatic("setUserProperty", key, value); + public void SetFirebaseId(string id) => CallStatic("setFirebaseId", id); + public void SetAdjustId(string id) => CallStatic("setAdjustId", id); + public void SetDeviceId(string deviceId) => CallStatic("setDeviceId", deviceId); + public void SetUid(string uid) => CallStatic("setUid", uid); + public bool IsDebug => CallStatic("isDebug"); + public void LogEvent(string eventName, string parameters) => CallStatic("logEvent", eventName, parameters); + public void ReportEventSuccessRate() => CallStatic("reportEventRate"); + public void SetTch02Value(double value) => CallStatic("setTch02Value", value); + #endregion + + } +} \ No newline at end of file diff --git a/Runtime/Script/Impl/AnalyticsAgentAndroid.cs.meta b/Runtime/Script/Impl/AnalyticsAgentAndroid.cs.meta new file mode 100644 index 0000000..df3d964 --- /dev/null +++ b/Runtime/Script/Impl/AnalyticsAgentAndroid.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 27181ab00e124c639b1f4468c535047c +timeCreated: 1672389052 \ No newline at end of file diff --git a/Runtime/Script/Impl/AnalyticsAgentIOS.cs b/Runtime/Script/Impl/AnalyticsAgentIOS.cs new file mode 100644 index 0000000..42d1af9 --- /dev/null +++ b/Runtime/Script/Impl/AnalyticsAgentIOS.cs @@ -0,0 +1,124 @@ +using System.Runtime.InteropServices; + +namespace Guru +{ + public class AnalyticsAgentIOS: IAnalyticsAgent + { + + #region 属性定义 + + private const string K_INTERNAL = "__Internal"; + +#if UNITY_IOS + // ------------- U3DAnalytics.mm Interface ----------------- + [DllImport(K_INTERNAL)] private static extern void unityInitAnalytics(string appId, string deviceInfo, bool isDebug); + [DllImport(K_INTERNAL)] private static extern void unitySetUserID(string uid); + [DllImport(K_INTERNAL)] private static extern void unitySetScreen(string screenName); + [DllImport(K_INTERNAL)] private static extern void unitySetAdId(string adId); + [DllImport(K_INTERNAL)] private static extern void unitySetAdjustID(string adjustId); + [DllImport(K_INTERNAL)] private static extern void unitySetFirebaseId(string fid); + [DllImport(K_INTERNAL)] private static extern void unitySetDeviceId(string did); + [DllImport(K_INTERNAL)] private static extern void unitySetUserProperty(string key, string value); + [DllImport(K_INTERNAL)] private static extern void unityLogEvent(string key, string data); + [DllImport(K_INTERNAL)] private static extern void unityReportEventRate(); + [DllImport(K_INTERNAL)] private static extern void unityInitException(); + [DllImport(K_INTERNAL)] private static extern void unityTestUnrecognizedSelectorCrash(); + [DllImport(K_INTERNAL)] private static extern void unitySetTch02Value(double value); +#endif + + private static bool _isDebug = false; + + #endregion + + #region 接口实现 + + public void Init(string appId, string deviceInfo, bool isDebug = false) + { + _isDebug = isDebug; +#if UNITY_IOS + unityInitAnalytics(appId, deviceInfo, isDebug); + unityInitException(); // 初始化报错守护进程 +#endif + } + + public void SetScreen(string screenName) + { +#if UNITY_IOS + unitySetScreen(screenName); +#endif + } + + public void SetAdId(string id) + { +#if UNITY_IOS + unitySetAdId(id); +#endif + } + + public void SetUserProperty(string key, string value) + { +#if UNITY_IOS + unitySetUserProperty(key, value); +#endif + } + + public void SetFirebaseId(string fid) + { +#if UNITY_IOS + unitySetFirebaseId(fid); +#endif + } + + public void SetAdjustId(string id) + { +#if UNITY_IOS + unitySetAdjustID(id); +#endif + } + + public void SetDeviceId(string deviceId) + { +#if UNITY_IOS + unitySetDeviceId(deviceId); +#endif + } + + public void SetUid(string uid) + { +#if UNITY_IOS + unitySetUserID(uid); +#endif + } + + public bool IsDebug => _isDebug; + + public void LogEvent(string eventName, string data) + { +#if UNITY_IOS + unityLogEvent(eventName, data); +#endif + } + + public void ReportEventSuccessRate() + { +#if UNITY_IOS + unityReportEventRate(); +#endif + } + + public void SetTch02Value(double value) + { +#if UNITY_IOS + unitySetTch02Value(value); +#endif + } + +#if UNITY_IOS + // iOS 测试用事件 + public static void TestCrashEvent()=> unityTestUnrecognizedSelectorCrash(); +#endif + + #endregion + + } +} \ No newline at end of file diff --git a/Runtime/Script/Impl/AnalyticsAgentIOS.cs.meta b/Runtime/Script/Impl/AnalyticsAgentIOS.cs.meta new file mode 100644 index 0000000..113084c --- /dev/null +++ b/Runtime/Script/Impl/AnalyticsAgentIOS.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 93f0211868c14c60aed081f928dc114e +timeCreated: 1672901309 \ No newline at end of file diff --git a/Runtime/Script/Impl/AnalyticsAgentStub.cs b/Runtime/Script/Impl/AnalyticsAgentStub.cs new file mode 100644 index 0000000..00deab0 --- /dev/null +++ b/Runtime/Script/Impl/AnalyticsAgentStub.cs @@ -0,0 +1,122 @@ +using System.Text; +using UnityEngine; + +namespace Guru +{ + public class AnalyticsAgentStub: IAnalyticsAgent + { + + public static readonly string TAG = "[EDT]"; + + private bool _isShowLog = false; + private bool _isDebug = false; + + + public void Init(string appId, string deviceInfo, bool isDebug = false) + { +#if UNITY_EDITOR + _isShowLog = true; +#endif + _isDebug = isDebug; + if(_isShowLog) + Debug.Log($"{TAG} init with Debug: {isDebug} appId:{appId} deviceInfo:{deviceInfo}"); + } + + public void SetScreen(string screenName) + { + if(_isShowLog) + Debug.Log($"{TAG} SetScreen: {screenName}"); + } + + public void SetAdId(string id) + { + if(_isShowLog) + Debug.Log($"{TAG} SetAdId: {id}"); + } + + public void SetUserProperty(string key, string value) + { + if(_isShowLog) + Debug.Log($"{TAG} SetUserProperty: {key} : {value}"); + } + + public void SetFirebaseId(string id) + { + if(_isShowLog) + Debug.Log($"{TAG} SetFirebaseId: {id}"); + } + + public void SetAdjustId(string id) + { + if(_isShowLog) + Debug.Log($"{TAG} SetAdjustId: {id}"); + } + + public void SetDeviceId(string deviceId) + { + if(_isShowLog) + Debug.Log($"{TAG} SetDeviceId: {deviceId}"); + } + + public void SetUid(string uid) + { + if(_isShowLog) + Debug.Log($"{TAG} SetUid: {uid}"); + } + + public bool IsDebug => _isDebug; + + + public void LogEvent(string eventName, string parameters) + { + if (_isShowLog) + { + var raw = parameters.Split(','); + if (raw.Length > 0) + { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < raw.Length; i++) + { + var ss = raw[i]; + if(string.IsNullOrEmpty(ss)) continue; + + var p = ss.Split(':'); + if (p.Length > 1) + { + + var key = p[0]; + var t = p[1].Substring(0, 1); + var v = p[1].Substring(1, p[1].Length - 1); + + + // 字符串解析 + switch(t){ + case "i": + sb.Append($"{key} : [int]{v}\n"); + break; + case "d": + sb.Append($"{key} : [double]{v}\n"); + break; + default: + sb.Append($"{key} : [string]{v}\n"); + break; + } + } + } + + Debug.Log($"{TAG} LogEvent: event:{eventName} Properties:\n{sb.ToString()}"); + } + } + } + + public void ReportEventSuccessRate() + { + Debug.Log($"{TAG} Log Event Success Rate"); + } + + public void SetTch02Value(double value) + { + Debug.Log($"{TAG} Tch02MaxValue: {value}"); + } + } +} \ No newline at end of file diff --git a/Runtime/Script/Impl/AnalyticsAgentStub.cs.meta b/Runtime/Script/Impl/AnalyticsAgentStub.cs.meta new file mode 100644 index 0000000..c1466ca --- /dev/null +++ b/Runtime/Script/Impl/AnalyticsAgentStub.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8fd78c80a8d44637819c9803c1b71724 +timeCreated: 1672389623 \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..c452747 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "com.guru.unity.analytics", + "displayName": "Guru SDK", + "version": "1.8.4", + "description": "Guru Custom Analytics", + "unity": "2020.3", + "author":{ + "name": "Guru Fungames Studio" + }, + "license": "MIT", + "category": "Game,Tool,Development", + "dependencies": { + } +} \ No newline at end of file diff --git a/package.json.meta b/package.json.meta new file mode 100644 index 0000000..6438516 --- /dev/null +++ b/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 249b5c6c7b433404ea44e9eb2bd35066 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/~Sample.meta b/~Sample.meta new file mode 100644 index 0000000..d5d69bb --- /dev/null +++ b/~Sample.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 82693d012b64748c8ac997389b0426a7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/~Sample/CuruAnalyticsDemo.cs b/~Sample/CuruAnalyticsDemo.cs new file mode 100644 index 0000000..0d4842c --- /dev/null +++ b/~Sample/CuruAnalyticsDemo.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UI; + +namespace Guru +{ + public class CuruAnalyticsDemo: MonoBehaviour + { + [SerializeField] private bool _isDebug = true; + [SerializeField] private Button _btnInitSDK; + [SerializeField] private Button _btnStatus; + [SerializeField] private Button _btnUserProperties; + [SerializeField] private Button _btnEvents; + [SerializeField] private Button _btnEvents2; + [SerializeField] private Button _btnReport; + [SerializeField] private Button _btnTestCrash; + + // ----------- All Status IDs ----------- + private static readonly string AdjustID = "e35b41522140fa2db9089ef3c78eb8f9"; + private static readonly string FirebaseID = "b7ab5fc399a7bc8725c004943fa82837"; + private static readonly string UID = "BS-YYYYF"; + private static readonly string AdID = "dda3cc2b-5a5e-44cb-8a59-4a0b1b3780fd"; + private static readonly string DeviceID = "e2fb3c5a4c36473648c989bd86a41153"; + private static readonly string AppID = ""; + private static readonly string DeviceInfo = ""; + + + private static readonly string ScreenName = "MainMenu"; + + + + private void Awake() + { + _btnInitSDK.onClick.AddListener(OnClickInit); + _btnStatus.onClick.AddListener(OnClickStatus); + _btnUserProperties.onClick.AddListener(OnClickUserProperties); + _btnEvents.onClick.AddListener(OnClickEvents); + _btnEvents2.onClick.AddListener(OnClickEvents2); + _btnReport.onClick.AddListener(OnClickReport); + _btnTestCrash.onClick.AddListener(OnClickTestCrash); +#if !UNITY_IOS + _btnTestCrash.gameObject.SetActive(false); +#endif + + + } + + + + #region Button Callbacks + + + private void OnClickInit() + { + Debug.Log($"---- [DEMO] Call Analytics init"); + GuruAnalytics.Init(AppID, DeviceInfo, _isDebug); + } + + private void OnClickStatus() + { + Debug.Log($"---- [DEMO] Report Stats IDs: UID:{UID} DeviceID:{DeviceID} FirebaseID:{FirebaseID} AdID:{AdID} AdjustID:{AdjustID}"); + GuruAnalytics.SetUid(UID); + GuruAnalytics.SetDeviceId(DeviceID); + GuruAnalytics.SetFirebaseId(FirebaseID); + GuruAnalytics.SetAdId(AdID); + GuruAnalytics.SetAdjustId(AdjustID); + } + + private void OnClickUserProperties() + { + string item_category = "main"; + int level = 7; + Debug.Log($"---- [DEMO] Call SetUserProperty: item_category:{item_category} level:{level}"); + GuruAnalytics.SetUserProperty("item_category", item_category); + GuruAnalytics.SetUserProperty("level", level.ToString()); + } + + private void OnClickEvents() + { + Debug.Log($"---- [DEMO] Report Screen: {ScreenName}"); + GuruAnalytics.SetScreen(ScreenName); + + string eventName = "user_get_coin"; + Dictionary data = new Dictionary() + { + { "level", 7 }, + { "user_coin", 105L }, + { "win_rate", 21.25f }, + { "b_level", 7 }, + { "result", "retry" } + }; + + string s = "---- Data ----\n"; + foreach (var k in data.Keys) + { + s += $"-- K:{k} V:{data[k]}\n"; + } + Debug.Log(s); + + Debug.Log($"---- [DEMO] Call LogEvent"); + GuruAnalytics.LogEvent(eventName, data); + } + + private void OnClickEvents2() + { + string eventName = "user_data_loaded"; + GuruAnalytics.LogEvent(eventName); + } + + + private void OnClickReport() + { + GuruAnalytics.ReportEventSuccessRate(); + } + + + + private void OnClickTestCrash() + { +#if UNITY_IOS + Debug.Log($"--> OnClickTestCrash"); + GuruAnalytics.TestCrash(); +#endif + } + + + #endregion + + + + + + + + + } +} \ No newline at end of file diff --git a/~Sample/CuruAnalyticsDemo.cs.meta b/~Sample/CuruAnalyticsDemo.cs.meta new file mode 100644 index 0000000..6d59a46 --- /dev/null +++ b/~Sample/CuruAnalyticsDemo.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8fde2a18f7d347408a6b869ee03e7de9 +timeCreated: 1672712830 \ No newline at end of file diff --git a/~Sample/GuruAnalyticsDemo.unity b/~Sample/GuruAnalyticsDemo.unity new file mode 100644 index 0000000..c3a87bd --- /dev/null +++ b/~Sample/GuruAnalyticsDemo.unity @@ -0,0 +1,2014 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.3731193, g: 0.38073996, b: 0.35872698, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &66634519 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 66634520} + - component: {fileID: 66634523} + - component: {fileID: 66634522} + - component: {fileID: 66634521} + m_Layer: 5 + m_Name: btn_testcrash + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &66634520 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 66634519} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 728747533} + m_Father: {fileID: 1270885176} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 800, y: 120} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &66634521 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 66634519} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 66634522} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &66634522 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 66634519} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.990566, g: 0.6337243, b: 0.43454072, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &66634523 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 66634519} + m_CullTransparentMesh: 1 +--- !u!1 &97229769 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 97229770} + - component: {fileID: 97229772} + - component: {fileID: 97229771} + - component: {fileID: 97229773} + m_Layer: 5 + m_Name: btn_init + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &97229770 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 97229769} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1657584965} + m_Father: {fileID: 1270885176} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 800, y: 120} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &97229771 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 97229769} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &97229772 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 97229769} + m_CullTransparentMesh: 1 +--- !u!114 &97229773 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 97229769} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 97229771} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &170095335 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 170095336} + m_Layer: 5 + m_Name: root + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &170095336 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 170095335} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 483802708} + m_Father: {fileID: 295971387} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &295971383 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 295971387} + - component: {fileID: 295971386} + - component: {fileID: 295971385} + - component: {fileID: 295971384} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &295971384 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 295971383} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &295971385 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 295971383} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 1080, y: 1920} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &295971386 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 295971383} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 1 + m_Camera: {fileID: 531764817} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &295971387 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 295971383} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 1486183099} + - {fileID: 531764818} + - {fileID: 170095336} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &483802707 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 483802708} + - component: {fileID: 483802709} + m_Layer: 5 + m_Name: analytics_demo + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &483802708 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 483802707} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1996017830} + m_Father: {fileID: 170095336} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &483802709 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 483802707} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8fde2a18f7d347408a6b869ee03e7de9, type: 3} + m_Name: + m_EditorClassIdentifier: + _isDebug: 1 + _btnInitSDK: {fileID: 97229773} + _btnStatus: {fileID: 2106733042} + _btnUserProperties: {fileID: 1299751324} + _btnEvents: {fileID: 1773066580} + _btnEvents2: {fileID: 2038787617} + _btnReport: {fileID: 611641100} + _btnTestCrash: {fileID: 66634521} +--- !u!1 &531764815 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 531764818} + - component: {fileID: 531764817} + - component: {fileID: 531764816} + m_Layer: 0 + m_Name: UICamera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &531764816 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 531764815} + m_Enabled: 1 +--- !u!20 &531764817 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 531764815} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: -10 + far clip plane: 500 + field of view: 60 + orthographic: 1 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &531764818 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 531764815} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 295971387} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &611641098 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 611641099} + - component: {fileID: 611641102} + - component: {fileID: 611641101} + - component: {fileID: 611641100} + m_Layer: 5 + m_Name: btn_report + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &611641099 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 611641098} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 832164394} + m_Father: {fileID: 1270885176} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 800, y: 120} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &611641100 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 611641098} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 611641101} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &611641101 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 611641098} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &611641102 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 611641098} + m_CullTransparentMesh: 1 +--- !u!1 &728747532 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 728747533} + - component: {fileID: 728747535} + - component: {fileID: 728747534} + m_Layer: 5 + m_Name: label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &728747533 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 728747532} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 66634520} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &728747534 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 728747532} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.23584908, g: 0.23584908, b: 0.23584908, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: "\u6D4B\u8BD5\u5D29\u6E83\u4E0A\u62A5" +--- !u!222 &728747535 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 728747532} + m_CullTransparentMesh: 1 +--- !u!1 &832164393 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 832164394} + - component: {fileID: 832164396} + - component: {fileID: 832164395} + m_Layer: 5 + m_Name: label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &832164394 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 832164393} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 611641099} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &832164395 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 832164393} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.23584908, g: 0.23584908, b: 0.23584908, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: "\u4E0A\u62A5\u6253\u70B9\u6210\u529F\u7387" +--- !u!222 &832164396 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 832164393} + m_CullTransparentMesh: 1 +--- !u!1 &920755264 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 920755265} + - component: {fileID: 920755267} + - component: {fileID: 920755266} + m_Layer: 5 + m_Name: label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &920755265 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 920755264} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1773066579} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &920755266 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 920755264} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.23584908, g: 0.23584908, b: 0.23584908, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: "\u4E0A\u62A5\u6253\u70B9\u4E8B\u4EF6" +--- !u!222 &920755267 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 920755264} + m_CullTransparentMesh: 1 +--- !u!1 &999622155 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 999622156} + - component: {fileID: 999622158} + - component: {fileID: 999622157} + m_Layer: 5 + m_Name: label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &999622156 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 999622155} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2106733041} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &999622157 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 999622155} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.23584908, g: 0.23584908, b: 0.23584908, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: "\u4E0A\u62A5\u5404\u5C5E\u6027ID" +--- !u!222 &999622158 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 999622155} + m_CullTransparentMesh: 1 +--- !u!1 &1270885175 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1270885176} + - component: {fileID: 1270885177} + m_Layer: 5 + m_Name: content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1270885176 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1270885175} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 97229770} + - {fileID: 2106733041} + - {fileID: 1299751323} + - {fileID: 1773066579} + - {fileID: 2038787616} + - {fileID: 611641099} + - {fileID: 66634520} + m_Father: {fileID: 1996017830} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 405.2} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1270885177 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1270885175} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 4 + m_Spacing: 20 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &1299751322 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1299751323} + - component: {fileID: 1299751326} + - component: {fileID: 1299751325} + - component: {fileID: 1299751324} + m_Layer: 5 + m_Name: btn_userproperties + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1299751323 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1299751322} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1727689995} + m_Father: {fileID: 1270885176} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 800, y: 120} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1299751324 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1299751322} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1299751325} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1299751325 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1299751322} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1299751326 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1299751322} + m_CullTransparentMesh: 1 +--- !u!1 &1486183098 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1486183099} + - component: {fileID: 1486183101} + - component: {fileID: 1486183100} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1486183099 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1486183098} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -540, y: -960, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 295971387} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1486183100 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1486183098} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1486183101 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1486183098} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!1 &1657584964 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1657584965} + - component: {fileID: 1657584967} + - component: {fileID: 1657584966} + m_Layer: 5 + m_Name: label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1657584965 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1657584964} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 97229770} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1657584966 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1657584964} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.23584908, g: 0.23584908, b: 0.23584908, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: "\u521D\u59CB\u5316SDK" +--- !u!222 &1657584967 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1657584964} + m_CullTransparentMesh: 1 +--- !u!1 &1727689994 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1727689995} + - component: {fileID: 1727689997} + - component: {fileID: 1727689996} + m_Layer: 5 + m_Name: label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1727689995 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1727689994} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1299751323} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1727689996 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1727689994} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.23584908, g: 0.23584908, b: 0.23584908, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: "\u4E0A\u62A5\u7528\u6237\u5C5E\u6027" +--- !u!222 &1727689997 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1727689994} + m_CullTransparentMesh: 1 +--- !u!1 &1730981159 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1730981160} + - component: {fileID: 1730981162} + - component: {fileID: 1730981161} + m_Layer: 5 + m_Name: label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1730981160 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1730981159} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2038787616} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1730981161 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1730981159} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.23584908, g: 0.23584908, b: 0.23584908, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: "\u4E0A\u62A5\u6253\u70B9\u4E8B\u4EF6(\u4EC5\u4E8B\u4EF6\u540D)" +--- !u!222 &1730981162 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1730981159} + m_CullTransparentMesh: 1 +--- !u!1 &1773066578 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1773066579} + - component: {fileID: 1773066582} + - component: {fileID: 1773066581} + - component: {fileID: 1773066580} + m_Layer: 5 + m_Name: btn_events + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1773066579 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1773066578} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 920755265} + m_Father: {fileID: 1270885176} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 800, y: 120} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1773066580 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1773066578} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1773066581} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1773066581 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1773066578} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1773066582 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1773066578} + m_CullTransparentMesh: 1 +--- !u!1 &1996017829 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1996017830} + - component: {fileID: 1996017832} + - component: {fileID: 1996017831} + m_Layer: 5 + m_Name: root + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1996017830 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1996017829} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1270885176} + m_Father: {fileID: 483802708} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1996017831 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1996017829} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.8} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1996017832 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1996017829} + m_CullTransparentMesh: 1 +--- !u!1 &2038787615 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2038787616} + - component: {fileID: 2038787619} + - component: {fileID: 2038787618} + - component: {fileID: 2038787617} + m_Layer: 5 + m_Name: btn_event2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2038787616 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2038787615} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1730981160} + m_Father: {fileID: 1270885176} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 800, y: 120} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2038787617 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2038787615} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 2038787618} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &2038787618 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2038787615} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2038787619 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2038787615} + m_CullTransparentMesh: 1 +--- !u!1 &2106733040 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2106733041} + - component: {fileID: 2106733044} + - component: {fileID: 2106733043} + - component: {fileID: 2106733042} + m_Layer: 5 + m_Name: btn_status + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2106733041 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2106733040} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 999622156} + m_Father: {fileID: 1270885176} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 800, y: 120} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2106733042 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2106733040} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 2106733043} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &2106733043 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2106733040} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2106733044 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2106733040} + m_CullTransparentMesh: 1 diff --git a/~Sample/GuruAnalyticsDemo.unity.meta b/~Sample/GuruAnalyticsDemo.unity.meta new file mode 100644 index 0000000..f586962 --- /dev/null +++ b/~Sample/GuruAnalyticsDemo.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ea095a004daab4fc096aa297c21fca99 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: