├── .gitignore ├── Documentation ├── 01_add_plugin.png ├── 02_modify_manifest.png ├── 03_add_component.png ├── 04_config_script.png ├── 05_config_build_settings.png ├── 06_trouble_manifest_merge.png ├── 07_portal_metrics.png └── Changelog.md ├── ExampleGame ├── Assets │ ├── HockeyAppUnityAndroid.meta │ ├── HockeyAppUnityAndroid │ │ ├── AndroidManifest.xml │ │ ├── AndroidManifest.xml.meta │ │ ├── HockeyAppUnity-Scripts.meta │ │ ├── HockeyAppUnity-Scripts │ │ │ ├── HockeyAppAndroid.cs │ │ │ └── HockeyAppAndroid.cs.meta │ │ ├── HockeySDK-5.2.0.aar │ │ ├── README.pdf │ │ ├── exampleunityplugin.jar │ │ ├── exampleunityplugin.jar.meta │ │ └── hockeysdk-unity-5.2.0.aar │ ├── TestScene.unity │ ├── TestScene.unity.meta │ ├── TestUI.meta │ └── TestUI │ │ ├── Ressources.meta │ │ ├── Ressources │ │ ├── btn_active.png │ │ ├── btn_active.png.meta │ │ ├── btn_normal.png │ │ └── btn_normal.png.meta │ │ ├── TestUI.cs │ │ ├── TestUI.cs.meta │ │ ├── TestUISkin.guiskin │ │ └── TestUISkin.guiskin.meta └── ProjectSettings │ ├── AudioManager.asset │ ├── ClusterInputManager.asset │ ├── DynamicsManager.asset │ ├── EditorBuildSettings.asset │ ├── EditorSettings.asset │ ├── GraphicsSettings.asset │ ├── InputManager.asset │ ├── NavMeshAreas.asset │ ├── NavMeshLayers.asset │ ├── NetworkManager.asset │ ├── Physics2DSettings.asset │ ├── ProjectSettings.asset │ ├── ProjectVersion.txt │ ├── QualitySettings.asset │ ├── TagManager.asset │ ├── TimeManager.asset │ ├── UnityAdsSettings.asset │ └── UnityConnectSettings.asset ├── HockeyAppUnityPlugin ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── hockeysdk-unity │ ├── build.gradle │ ├── libs │ │ └── HockeySDK-5.2.0.aar │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── net │ │ │ └── hockeyapp │ │ │ └── unity │ │ │ └── HockeyUnityPlugin.java │ │ └── res │ │ ├── drawable-hdpi │ │ └── ic_launcher.png │ │ ├── drawable-mdpi │ │ └── ic_launcher.png │ │ ├── drawable-xhdpi │ │ └── ic_launcher.png │ │ ├── drawable-xxhdpi │ │ └── ic_launcher.png │ │ ├── layout │ │ └── activity_plugin.xml │ │ ├── menu │ │ └── plugin.xml │ │ ├── values-sw600dp │ │ └── dimens.xml │ │ ├── values-sw720dp-land │ │ └── dimens.xml │ │ ├── values-v11 │ │ └── styles.xml │ │ ├── values-v14 │ │ └── styles.xml │ │ └── values │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml ├── import-summary.txt └── settings.gradle ├── LICENSE ├── Plugins └── HockeyAppUnityAndroid │ ├── AndroidManifest.xml │ ├── HockeyAppUnity-Scripts │ └── HockeyAppAndroid.cs │ ├── HockeySDK-5.2.0.aar │ ├── README.pdf │ └── hockeysdk-unity-5.2.0.aar └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # ================= # 2 | # Android generated # 3 | # ================= # 4 | *.apk 5 | *.ap_ 6 | *.dex 7 | *.class 8 | bin/ 9 | gen/ 10 | local.properties 11 | .classpath 12 | .project 13 | proguard/ 14 | *.iml 15 | *.ipr 16 | *.iws 17 | .idea/ 18 | gen-external-apklibs/ 19 | out/ 20 | target/ 21 | .gradle/ 22 | build/ 23 | /*/build/ 24 | *.log 25 | infer-out 26 | 27 | # =============== # 28 | # Unity generated # 29 | # =============== # 30 | Temp/ 31 | Obj/ 32 | UnityGenerated/ 33 | Library/ 34 | 35 | # ===================================== # 36 | # Visual Studio / MonoDevelop generated # 37 | # ===================================== # 38 | ExportedObj/ 39 | *.svd 40 | *.userprefs 41 | *.csproj 42 | *.pidb 43 | *.suo 44 | *.sln 45 | *.user 46 | *.unityproj 47 | *.booproj 48 | 49 | # ============ # 50 | # OS generated # 51 | # ============ # 52 | .DS_Store 53 | .DS_Store? 54 | ._* 55 | .Spotlight-V100 56 | .Trashes 57 | Icon? 58 | ehthumbs.db 59 | Thumbs.db -------------------------------------------------------------------------------- /Documentation/01_add_plugin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/Documentation/01_add_plugin.png -------------------------------------------------------------------------------- /Documentation/02_modify_manifest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/Documentation/02_modify_manifest.png -------------------------------------------------------------------------------- /Documentation/03_add_component.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/Documentation/03_add_component.png -------------------------------------------------------------------------------- /Documentation/04_config_script.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/Documentation/04_config_script.png -------------------------------------------------------------------------------- /Documentation/05_config_build_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/Documentation/05_config_build_settings.png -------------------------------------------------------------------------------- /Documentation/06_trouble_manifest_merge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/Documentation/06_trouble_manifest_merge.png -------------------------------------------------------------------------------- /Documentation/07_portal_metrics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/Documentation/07_portal_metrics.png -------------------------------------------------------------------------------- /Documentation/Changelog.md: -------------------------------------------------------------------------------- 1 | ## Changelog 2 | 3 | ### Version 5.2.0 4 | 5 | This release wraps HockeySDK-Android 5.2.0. 6 | 7 | * **[Improvement]** Replaced obsolete `WWW` request calls with the new `UnityWebRequest` version. 8 | 9 | #### Changelog for HockeySDK-Android 5.2.0 10 | 11 | * **[Bugfix]** Leaking HTTP connection. 12 | * **[Bugfix]** Fix HTTPS connection creation. 13 | * **[Security]** To enforce TLS 1.2 on all HTTPS connections the SDK makes, we are dropping support for API level 15 (which supports only TLS 1.0), the minimum SDK version thus becomes 16. Previous versions of the SDK were already using TLS 1.2 on API level 16+. 14 | 15 | ### Version 5.1.1 16 | 17 | This release wraps HockeySDK-Android 5.1.0. 18 | 19 | #### Changelog for HockeySDK-Android 5.1.0 20 | 21 | * **[Bugfix]** Fix issue in persistence logic that could cause Session information to be inaccurate. [#340](https://github.com/bitstadium/HockeySDK-Android/pull/340) 22 | * **[Improvement]** Remove left-to-right attribute in case the app that integrates the SDK doesn't use that. Thx to [Steven](https://github.com/smuldr) for this contribution. [#335](https://github.com/bitstadium/HockeySDK-Android/pull/335) 23 | * **[Improvement]** Improve error message for the Feedback feature. [#341](https://github.com/bitstadium/HockeySDK-Android/pull/341) 24 | * **[Improvement]** It's now possible to call `setUserId` for Feedback. [#339](https://github.com/bitstadium/HockeySDK-Android/pull/339) 25 | 26 | ### Version 5.1.0 27 | 28 | This release adds the missing bindings for the `trackEvent`-api in MetricsManager.java. 29 | 30 | ### 5.0.1 31 | 32 | This is a bugfix release. If you upgrade from version 1.X, please be aware of the breaking changes in version 5.0.0! 33 | 34 | * **[IMPROVEMENT]** Uses HockeySDK-Android 5.0.4. Please have a look at it's full changelog. 35 | * **[BUGFIX]** Fix bug that made it possible to bypass authentication. [#22](https://github.com/bitstadium/HockeySDK-Unity-Android/pull/22). 36 | * **[BUGFIX]** Fix an issue when using the GUID for crash reports. [#26](https://github.com/bitstadium/HockeySDK-Unity-Android/pull/26) 37 | * **[BUGFIX]** Fix a bug where merging AndroidManifest.xml would fail. [#11](https://github.com/bitstadium/HockeySDK-Unity-Android/issues/11) 38 | 39 | #### Changelog for HockeySDK-Android 5.0.4 40 | 41 | This version contains a few bugfixes as well as the removal of an API that has been deprecated since HockeySDK 3.7.0-Beta.2. 42 | 43 | * **Removal of deprecated API** `ExceptionHandler.saveException(Throwable exception, CrashManagerListener listener)` has been deprecated since 3.7.0-beta.2. Use `ExceptionHandler.saveException(Throwable exception, Thread thread, CrashManagerListener listener)` instead. 44 | * **Bugfix** The SDK now deletes redundant crash reports. 45 | * **Bugfix** The SDK does no longer send the event that indicates the start of a session twice but once. There was no impact on session counts as the event was de-duplicated on the server. 46 | * **Bugfix** Fixes a potential deadlock when reading device information when saving an exception. 47 | * **Bugfix** Fixes a potential NPE when processing stacktraces. Thanks to [Thomas Reis for reporting issue #331](https://github.com/bitstadium/HockeySDK-Android/issues/331). 48 | 49 | #### Changelog for HockeySDK-Android 5.0.3 50 | 51 | This release now limits the number of crashes that are stored by the SDK while the device is offline to 100 Crashes. HockeySDK-Android will stop to collect crashes until the number of unsent crashes drops below the limit of 100 unsent crashes. 52 | 53 | * [BUGFIX] Fixes a possible `OutOfMemoryError` exception. This only occurs when a very large number of crashes – several 100k or more – wasn't sent to the server. [#313](https://github.com/bitstadium/HockeySDK-Android/pull/313) 54 | 55 | 56 | ### 5.0.0 57 | 58 | Upgrade to HockeySDK for Android 5.0.2. 59 | 60 | This release comes with one major breaking change. HockeySDK 5.0.0 raises the minimum API level to 15. 61 | In addition, we no longer support restricting builds by device id. The reason is that, with Android O, `ANDROID_ID` no longer ensures a consistent way of identification of a user. 62 | 63 | To be ready for Android O, HockeySDK-Android now limits the `WRITE_EXTERNAL_STORAGE` permission with the `maxSdkVersion` filter. In some use cases, e.g. where an app contains a dependency that requires this permission, `maxSdkVersion` makes it impossible for those dependencies to grant or request the permission. The solution for those cases is to declare the `tools:node="replace"` manifest merging strategy later in the dependency tree: 64 | 65 | `````` 66 | 67 | #### Full changelog 68 | 69 | In addition, this release contains the following changes: 70 | 71 | * [IMPROVEMENT] Support for Android O. 72 | * [IMPROVEMENT] Code scans no longer trigger warnings related to usage of `ANDROID_ID` as we are no longer using it. 73 | * [IMPROVEMENT] The SDK supports Android Strict Mode way better as it no longer violates it. 74 | * [IMPROVEMENT] We've improved the way we send Feedback attachments. 75 | * [IMPROVEMENT] The SDK no longer caches information about in-app updates to make sure updates are available immediately. The iOS SDK has behaved like this for a while and we decided to align the behavior across SDKs. 76 | * [IMPROVEMENT] Add the ability to when to show the UpdateFragment [#280](https://github.com/bitstadium/HockeySDK-Android/issues/280). 77 | * [IMPROVEMENT] Retrieving the last crash details is now asynchronous. 78 | * [BUGFIX] Metrics no longer leaks a connection. 79 | * [BUGFIX] It's no longer possible to circumvent the login UI by pressing the backbutton under certain circumstances [#278](https://github.com/bitstadium/HockeySDK-Android/pull/278). 80 | * [BUGFIX] Fix a crash in MetricsManager [#279](https://github.com/bitstadium/HockeySDK-Android/pull/279). 81 | * [BUGFIX] Fix authentication by email [#288](https://github.com/bitstadium/HockeySDK-Android/pull/288). 82 | * [BUGFIX] Fix a regression that was introduced in 5.0.0-beta.1 that prevented attaching screenshots to work [#289](https://github.com/bitstadium/HockeySDK-Android/pull/289). 83 | * [BUGFIX] Fix Feedback notifications on Android [#290](https://github.com/bitstadium/HockeySDK-Android/pull/290). 84 | * [IMPROVEMENT] Add the ability to when to show the UpdateFragment [#280](https://github.com/bitstadium/HockeySDK-Android/issues/280). 85 | * [IMPROVEMENT] `CrashManagerListener` now has `onNoCrashesFound()` to notify you in case no new crashes were found [#280](https://github.com/bitstadium/HockeySDK-Android/issues/280). 86 | * [DEPRECATION] We've removed the `onCrashesFound` callback in `CrashManagerListener` as it has been deprecated since HockeySDK 3.0.0. 87 | * [Bugfix] Fixes a NPE in `FeedbackActivity`. [#303](https://github.com/bitstadium/HockeySDK-Android/pull/303) 88 | * [Bugfix] Fixes a potential deadlock in `CrashManager`.[#https://github.com/bitstadium/HockeySDK-Android/pull/308] 89 | * [Improvement] Fix potential NPE when calling `MetricsManager.sessionTrackingEnabled()` before calling `MetricsManager.register(...)`. [#310](https://github.com/bitstadium/HockeySDK-Android/pull/310) 90 | * * [Bugfix] Fix a bug in the Italian translation. [#296](https://github.com/bitstadium/HockeySDK-Android/pull/296) 91 | * [Improvement] Use different timestamp format for crash date and app start time. [#297](https://github.com/bitstadium/HockeySDK-Android/pull/297) 92 | 93 | ### 1.1.6 94 | 95 | Upgrade to HockeySDK for Android 4.1.5 96 | 97 | * [FIX] Fix a resource leak in Sender. 98 | * [FIX] Fix possibility to bypass authentication. 99 | * [FIX] Fix the progress bar when sending feedback. 100 | * [FIX] Fix the dates in the Feedback UI. 101 | * [FIX] Fix ConcurrentModificationException in metrics feature. 102 | * [FIX] Fix potential crash related to multi-threading in Channel. 103 | * [FIX] Fix the focus in the Feedback UI, this also improves accessibility. 104 | * [IMPROVEMENT] Fix some strict mode violations. 105 | * [IMPROVEMENT] Improve accessibility for Feedback attachments. 106 | * [IMPROVEMENT] Send batched events when the app goes into background. 107 | * [IMPROVEMENT] Automatically add the sdk to the often already existent Plugins folder 108 | 109 | ### 1.1.5 110 | 111 | * [FIX] Fixes session tracking by explicitly starting one. 112 | 113 | ### 1.1.4 114 | Upgrade to HockeySDK for Android 4.1.4 115 | 116 | * [IMPROVEMENT] Minor bugfixes 117 | * [IMPROVEMENT] FeedbackActivity now uses accessibility labels. 118 | 119 | 120 | ### 1.1.3 121 | * [IMPROVEMENT] Update to HockeySDK Android version 4.1.3 122 | * [FIX] Thanks to Ivan Matkov, it's no longer possible to avoid providing login information and circumvent authentication. [#208](https://github.com/bitstadium/HockeySDK-Android/pull/208) 123 | * [FIX] Thanks to Guillaume Perrot, the google play store detection was fixed for emulators running Android Nougat. [#209](https://github.com/bitstadium/HockeySDK-Android/pull/209) 124 | * [IMPROVEMENT] It's now possible to scroll within the `FeedbackActivity` while the keyboard is up. Previously, when providing a lot of feedback, the keyboard could hide the submit-button. [#207](https://github.com/bitstadium/HockeySDK-Android/pull/207) 125 | * [IMPROVEMENT] In case the app is offline, the Update feature will no longer log the IOException to avoid confusion. [#209](https://github.com/bitstadium/HockeySDK-Android/pull/209) 126 | 127 | ### 1.1.2 128 | * [BUGFIX] Installing an app through HockeyApp would falsely report this as a store installation on Android Nougat 129 | * [BUGFIX] Workaround an issue when installing updates and targeting SDK version 24 130 | * [BUGFIX] Added user contributed localizations for Simplified Chinese and Russian 131 | * [UPDATE] Plugin now uses HockeySDK Android 4.1.2 132 | 133 | ### 1.1.1 134 | * [BUGFIX] Fix bug where report for managed exceptions didn't contain a `CrashReporter Key`. The key is needed to get proper user statistics on the portal 135 | * [UPDATE] Plugin now uses HockeySDK Android 4.0.1 136 | 137 | ### 1.1.0 138 | * [NEW] User Metrics (user and session tracking) 139 | * [NEW] Trigger version update check explicitly 140 | * [NEW] Authentication 141 | * [BUGFIX] Avoid app crash when first launching app without internet connection 142 | * [UPDATE] Plugin now uses HockeySDK Android 4.0.0 143 | * [UPDATE] Minor bugfixes 144 | 145 | ### 1.0.8: 146 | 147 | - Update SDK to use HockeySDK 3.6.2 for Android 148 | - Fix minor bug 149 | 150 | ### 1.0.7: 151 | 152 | - Update SDK to use HockeySDK 3.6.1 for Android 153 | - Fix minor bug 154 | 155 | ### 1.0.6: 156 | 157 | - Append SDK and App information to crash reports 158 | * SDK name 159 | * SDK version 160 | * App version name 161 | -------------------------------------------------------------------------------- /ExampleGame/Assets/HockeyAppUnityAndroid.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 3d8f53f17d6c04c98aac9b59fcbcbaff 3 | folderAsset: yes 4 | timeCreated: 1433484542 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /ExampleGame/Assets/HockeyAppUnityAndroid/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ExampleGame/Assets/HockeyAppUnityAndroid/AndroidManifest.xml.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 12ea5c8efe5554cbd8a8ff017694f13b 3 | timeCreated: 1501524001 4 | licenseType: Pro 5 | TextScriptImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /ExampleGame/Assets/HockeyAppUnityAndroid/HockeyAppUnity-Scripts.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d9dc1e81ab942458c8a1cf3150005d40 3 | folderAsset: yes 4 | timeCreated: 1501523999 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /ExampleGame/Assets/HockeyAppUnityAndroid/HockeyAppUnity-Scripts/HockeyAppAndroid.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * Version: 5.2.0 3 | */ 4 | 5 | using UnityEngine; 6 | using System.Collections; 7 | using System.Collections.Generic; 8 | using System; 9 | using System.IO; 10 | using System.Runtime.InteropServices; 11 | 12 | public class HockeyAppAndroid : MonoBehaviour 13 | { 14 | private const string JAVA_UNITYPLAYER_CLASS = "com.unity3d.player.UnityPlayer"; 15 | private const string JAVA_HOCKEYUNITYPLUGIN_CLASS = "net.hockeyapp.unity.HockeyUnityPlugin"; 16 | 17 | protected const string HOCKEYAPP_BASEURL = "https://rink.hockeyapp.net/"; 18 | protected const string HOCKEYAPP_CRASHESPATH = "api/2/apps/[APPID]/crashes/upload"; 19 | protected const int MAX_CHARS = 199800; 20 | protected const string LOG_FILE_DIR = "/logs/"; 21 | private const string SERVER_URL_PLACEHOLDER = "your-custom-server-url"; 22 | private static HockeyAppAndroid instance; 23 | 24 | public enum AuthenticatorType 25 | { 26 | Anonymous, 27 | HockeyAppEmail, 28 | HockeyAppUser, 29 | Validate 30 | } 31 | 32 | [Header("HockeyApp Setup")] 33 | public string appID = "your-hockey-app-id"; 34 | public string packageID = "your-package-identifier"; 35 | public string serverURL = SERVER_URL_PLACEHOLDER; 36 | 37 | [Header("Authentication")] 38 | public AuthenticatorType authenticatorType; 39 | public string secret = "your-hockey-app-secret"; 40 | 41 | [Header("Crashes & Exceptions")] 42 | public bool autoUploadCrashes = false; 43 | public bool exceptionLogging = true; 44 | 45 | [Header("Metrics")] 46 | public bool userMetrics = true; 47 | 48 | [Header("Version Updates")] 49 | public bool updateAlert = true; 50 | 51 | void Awake () 52 | { 53 | #if (UNITY_ANDROID && !UNITY_EDITOR) 54 | if (instance != null) { 55 | Destroy(gameObject); 56 | return; 57 | } 58 | 59 | DontDestroyOnLoad(gameObject); 60 | CreateLogDirectory(); 61 | 62 | if(exceptionLogging == true && IsConnected() == true) { 63 | List logFileDirs = GetLogFiles(); 64 | if(logFileDirs.Count > 0) { 65 | Debug.Log("Found files: " + logFileDirs.Count); 66 | StartCoroutine(SendLogs(logFileDirs)); 67 | } 68 | } 69 | serverURL = GetBaseURL(); 70 | int authType = (int)authenticatorType; 71 | StartCrashManager(serverURL, appID, secret, authType, updateAlert, userMetrics, autoUploadCrashes); 72 | #endif 73 | } 74 | 75 | void OnEnable () 76 | { 77 | 78 | #if (UNITY_ANDROID && !UNITY_EDITOR) 79 | if(exceptionLogging == true) { 80 | System.AppDomain.CurrentDomain.UnhandledException += OnHandleUnresolvedException; 81 | Application.logMessageReceived += OnHandleLogCallback; 82 | } 83 | #endif 84 | } 85 | 86 | void OnDisable () 87 | { 88 | #if (UNITY_ANDROID && !UNITY_EDITOR) 89 | if (exceptionLogging == true) { 90 | System.AppDomain.CurrentDomain.UnhandledException -= OnHandleUnresolvedException; 91 | Application.logMessageReceived -= OnHandleLogCallback; 92 | } 93 | #endif 94 | } 95 | 96 | void OnApplicationPause(bool pause) 97 | { 98 | if (!pause) { 99 | PerformAuthentication(); 100 | } 101 | } 102 | 103 | /// 104 | /// Start HockeyApp for Unity. 105 | /// 106 | /// The url of the endpoint used for sending data. 107 | /// The app specific Identifier provided by HockeyApp. 108 | /// The app secret used for authenticating users. 109 | /// Auth type used for authentication: Anonymous, email, email& password, or check if user was explicitly added to use this app. 110 | /// True, if user should be notified about newer versions of the app. 111 | /// True, app should send user and session information. 112 | /// True, if crashes should be sent without asking the user for approval. 113 | protected void StartCrashManager (string urlString, string appID, string secret, int authType, bool updateManagerEnabled, bool userMetricsEnabled, bool autoSendEnabled) 114 | { 115 | #if (UNITY_ANDROID && !UNITY_EDITOR) 116 | using (var unityPlayer = new AndroidJavaClass(JAVA_UNITYPLAYER_CLASS)) 117 | using (var pluginClass = new AndroidJavaClass(JAVA_HOCKEYUNITYPLUGIN_CLASS)) 118 | { 119 | var currentActivity = unityPlayer.GetStatic("currentActivity"); 120 | pluginClass.CallStatic("startHockeyAppManager", currentActivity, urlString, appID, secret, authType, updateManagerEnabled, userMetricsEnabled, autoSendEnabled); 121 | } 122 | instance = this; 123 | #endif 124 | } 125 | 126 | /// 127 | /// This method allows to track an event that happened in your app. 128 | /// Remember to choose meaningful event names to have the best experience when diagnosing your app 129 | /// in the web portal. 130 | /// 131 | /// The name of the event, which should be tracked. 132 | public static void TrackEvent(string eventName) 133 | { 134 | #if (UNITY_ANDROID && !UNITY_EDITOR) 135 | if (instance != null) 136 | { 137 | using (var pluginClass = new AndroidJavaClass(JAVA_HOCKEYUNITYPLUGIN_CLASS)) 138 | { 139 | pluginClass.CallStatic("trackEvent", eventName); 140 | } 141 | } 142 | else 143 | { 144 | Debug.Log("Failed to track event. SDK has not been initialized, yet."); 145 | } 146 | #endif 147 | } 148 | 149 | /// 150 | /// This method allows to track an event that happened in your app. 151 | /// Remember to choose meaningful event names to have the best experience when diagnosing your app 152 | /// in the web portal. 153 | /// 154 | /// The name of the event, which should be tracked. 155 | /// Key value pairs, which contain custom metrics. 156 | public static void TrackEvent(string eventName, IDictionary properties) 157 | { 158 | #if (UNITY_ANDROID && !UNITY_EDITOR) 159 | if (instance != null) 160 | { 161 | using (var pluginClass = new AndroidJavaClass(JAVA_HOCKEYUNITYPLUGIN_CLASS)) 162 | { 163 | pluginClass.CallStatic("trackEvent", eventName, 164 | DictainaryToJavaMap(properties, "java.lang.String", "java.lang.String")); 165 | } 166 | } 167 | else 168 | { 169 | Debug.Log("Failed to track event. SDK has not been initialized, yet."); 170 | } 171 | #endif 172 | } 173 | 174 | /// 175 | /// This method allows to track an event that happened in your app. 176 | /// Remember to choose meaningful event names to have the best experience when diagnosing your app 177 | /// in the web portal. 178 | /// 179 | /// The name of the event, which should be tracked. 180 | /// Key value pairs with additional info about the event. 181 | /// Key value pairs, which contain custom metrics. 182 | public static void TrackEvent(string eventName, IDictionary properties, IDictionary measurements) 183 | { 184 | #if (UNITY_ANDROID && !UNITY_EDITOR) 185 | if (instance != null) 186 | { 187 | using (var pluginClass = new AndroidJavaClass(JAVA_HOCKEYUNITYPLUGIN_CLASS)) 188 | { 189 | pluginClass.CallStatic("trackEvent", eventName, 190 | DictainaryToJavaMap(properties, "java.lang.String", "java.lang.String"), 191 | DictainaryToJavaMap(measurements, "java.lang.String", "java.lang.Double")); 192 | } 193 | } 194 | else 195 | { 196 | Debug.Log("Failed to track event. SDK has not been initialized, yet."); 197 | } 198 | #endif 199 | } 200 | 201 | /// 202 | /// Performs user authentication. 203 | /// 204 | public static void PerformAuthentication() 205 | { 206 | #if (UNITY_ANDROID && !UNITY_EDITOR) 207 | using (var unityPlayer = new AndroidJavaClass(JAVA_UNITYPLAYER_CLASS)) 208 | using (var pluginClass = new AndroidJavaClass(JAVA_HOCKEYUNITYPLUGIN_CLASS)) 209 | { 210 | var currentActivity = unityPlayer.GetStatic("currentActivity"); 211 | pluginClass.CallStatic("performAuthentication", currentActivity); 212 | } 213 | #endif 214 | } 215 | 216 | /// 217 | /// Check for version update and present alert if newer version is available. 218 | /// 219 | public static void CheckForUpdate() 220 | { 221 | #if (UNITY_ANDROID && !UNITY_EDITOR) 222 | if (instance != null) 223 | { 224 | using (var unityPlayer = new AndroidJavaClass(JAVA_UNITYPLAYER_CLASS)) 225 | using (var pluginClass = new AndroidJavaClass(JAVA_HOCKEYUNITYPLUGIN_CLASS)) 226 | { 227 | var currentActivity = unityPlayer.GetStatic("currentActivity"); 228 | pluginClass.CallStatic("checkForUpdate", currentActivity, instance.serverURL, instance.appID); 229 | } 230 | } 231 | else 232 | { 233 | Debug.Log("Failed to check for update. SDK has not been initialized, yet."); 234 | } 235 | #endif 236 | } 237 | 238 | /// 239 | /// Display a feedback form. 240 | /// 241 | public static void ShowFeedbackForm() 242 | { 243 | #if (UNITY_ANDROID && !UNITY_EDITOR) 244 | if (instance != null) 245 | { 246 | using (var unityPlayer = new AndroidJavaClass(JAVA_UNITYPLAYER_CLASS)) 247 | using (var pluginClass = new AndroidJavaClass(JAVA_HOCKEYUNITYPLUGIN_CLASS)) 248 | { 249 | var currentActivity = unityPlayer.GetStatic("currentActivity"); 250 | pluginClass.CallStatic("startFeedbackForm", currentActivity); 251 | } 252 | } 253 | else 254 | { 255 | Debug.Log("Failed to present feedback form. SDK has not been initialized, yet."); 256 | } 257 | #endif 258 | } 259 | 260 | /// 261 | /// Collect all header fields for the custom exception report. 262 | /// 263 | /// A list which contains the header fields for a log file. 264 | protected virtual List GetLogHeaders () 265 | { 266 | List list = new List (); 267 | 268 | #if (UNITY_ANDROID && !UNITY_EDITOR) 269 | using (var pluginClass = new AndroidJavaClass(JAVA_HOCKEYUNITYPLUGIN_CLASS)) 270 | { 271 | var versionCode = pluginClass.CallStatic("getVersionCode"); 272 | var versionName = pluginClass.CallStatic("getVersionName"); 273 | var manufacturer = pluginClass.CallStatic("getManufacturer"); 274 | var model = pluginClass.CallStatic("getModel"); 275 | var deviceIdentifier = pluginClass.CallStatic("getDeviceIdentifier"); 276 | 277 | list.Add("Package: " + packageID); 278 | list.Add("Version Code: " + versionCode); 279 | list.Add("Version Name: " + versionName); 280 | 281 | var versionComponents = SystemInfo.operatingSystem.Split('/'); 282 | var osVersion = "Android: " + versionComponents[0].Replace("Android OS ", ""); 283 | list.Add (osVersion); 284 | 285 | list.Add("Manufacturer: " + manufacturer); 286 | list.Add("Model: " + model); 287 | list.Add("CrashReporter Key: " + deviceIdentifier); 288 | list.Add("Date: " + DateTime.UtcNow.ToString("ddd MMM dd HH:mm:ss {}zzzz yyyy").Replace("{}", "GMT")); 289 | } 290 | #endif 291 | 292 | return list; 293 | } 294 | 295 | /// 296 | /// Create the form data for a single exception report. 297 | /// 298 | /// A string that contains information about the exception. 299 | /// The form data for the current crash report. 300 | protected virtual WWWForm CreateForm (string log) 301 | { 302 | WWWForm form = new WWWForm (); 303 | 304 | #if (UNITY_ANDROID && !UNITY_EDITOR) 305 | byte[] bytes = null; 306 | using(FileStream fs = File.OpenRead(log)){ 307 | 308 | if (fs.Length > MAX_CHARS) { 309 | string resizedLog = null; 310 | 311 | using(StreamReader reader = new StreamReader(fs)) { 312 | 313 | reader.BaseStream.Seek( fs.Length - MAX_CHARS, SeekOrigin.Begin ); 314 | resizedLog = reader.ReadToEnd(); 315 | } 316 | 317 | List logHeaders = GetLogHeaders(); 318 | string logHeader = ""; 319 | 320 | foreach (string header in logHeaders) { 321 | logHeader += header + "\n"; 322 | } 323 | resizedLog = logHeader + "\n" + "[...]" + resizedLog; 324 | 325 | try { 326 | bytes = System.Text.Encoding.Default.GetBytes(resizedLog); 327 | } catch(ArgumentException ae) { 328 | if (Debug.isDebugBuild) { 329 | Debug.Log("Failed to read bytes of log file: " + ae); 330 | } 331 | } 332 | } else { 333 | try { 334 | bytes = File.ReadAllBytes(log); 335 | } catch(SystemException se) { 336 | if (Debug.isDebugBuild) { 337 | Debug.Log("Failed to read bytes of log file: " + se); 338 | } 339 | } 340 | } 341 | } 342 | 343 | if(bytes != null) { 344 | form.AddBinaryData("log", bytes, log, "text/plain"); 345 | } 346 | 347 | #endif 348 | 349 | return form; 350 | } 351 | 352 | /// 353 | /// Create the log directory if needed. 354 | /// 355 | protected virtual void CreateLogDirectory () 356 | { 357 | #if (UNITY_ANDROID && !UNITY_EDITOR) 358 | string logsDirectoryPath = Application.persistentDataPath + LOG_FILE_DIR; 359 | 360 | try { 361 | Directory.CreateDirectory (logsDirectoryPath); 362 | } catch (Exception e) { 363 | if (Debug.isDebugBuild) Debug.Log ("Failed to create log directory at " + logsDirectoryPath + ": " + e); 364 | } 365 | #endif 366 | } 367 | 368 | /// 369 | /// Get a list of all existing exception reports. 370 | /// 371 | /// A list which contains the filenames of the log files. 372 | protected virtual List GetLogFiles () 373 | { 374 | List logs = new List (); 375 | 376 | #if (UNITY_ANDROID && !UNITY_EDITOR) 377 | string logsDirectoryPath = Application.persistentDataPath + LOG_FILE_DIR; 378 | 379 | try { 380 | DirectoryInfo info = new DirectoryInfo(logsDirectoryPath); 381 | FileInfo[] files = info.GetFiles(); 382 | 383 | if (files.Length > 0) { 384 | foreach (FileInfo file in files) { 385 | if (file.Extension == ".log") { 386 | logs.Add(file.FullName); 387 | } else { 388 | File.Delete(file.FullName); 389 | } 390 | } 391 | } 392 | } catch(Exception e) { 393 | if (Debug.isDebugBuild) { 394 | Debug.Log("Failed to write exception log to file: " + e); 395 | } 396 | } 397 | #endif 398 | 399 | return logs; 400 | } 401 | 402 | /// 403 | /// Upload existing reports to HockeyApp and delete delete them locally. 404 | /// 405 | protected virtual IEnumerator SendLogs (List logs) 406 | { 407 | string crashPath = HOCKEYAPP_CRASHESPATH; 408 | string url = GetBaseURL () + crashPath.Replace ("[APPID]", appID); 409 | 410 | #if (UNITY_ANDROID && !UNITY_EDITOR) 411 | using (var pluginClass = new AndroidJavaClass(JAVA_HOCKEYUNITYPLUGIN_CLASS)) 412 | { 413 | var sdkName = pluginClass.CallStatic("getSdkName"); 414 | if (sdkName != null) { 415 | url += "?sdk=" + WWW.EscapeURL(sdkName); 416 | } 417 | } 418 | #endif 419 | 420 | foreach (string log in logs) { 421 | WWWForm postForm = CreateForm (log); 422 | string lContent = postForm.headers ["Content-Type"].ToString (); 423 | lContent = lContent.Replace ("\"", ""); 424 | Dictionary headers = new Dictionary (); 425 | headers.Add ("Content-Type", lContent); 426 | WWW www = new WWW (url, postForm.data, headers); 427 | yield return www; 428 | 429 | if (String.IsNullOrEmpty (www.error)) { 430 | try { 431 | File.Delete (log); 432 | } catch (Exception e) { 433 | if (Debug.isDebugBuild) 434 | Debug.Log ("Failed to delete exception log: " + e); 435 | } 436 | } else { 437 | if (Debug.isDebugBuild) 438 | Debug.Log ("Crash sending error: " + www.error); 439 | } 440 | } 441 | } 442 | 443 | /// 444 | /// Write a single exception report to disk. 445 | /// 446 | /// A string that contains the reason for the exception. 447 | /// The stacktrace for the exception. 448 | protected virtual void WriteLogToDisk (string logString, string stackTrace) 449 | { 450 | #if (UNITY_ANDROID && !UNITY_EDITOR) 451 | string logSession = DateTime.Now.ToString("yyyy-MM-dd-HH_mm_ss_fff"); 452 | string log = logString.Replace("\n", " "); 453 | string[]stacktraceLines = stackTrace.Split('\n'); 454 | 455 | log = "\n" + log + "\n"; 456 | foreach (string line in stacktraceLines) { 457 | if(line.Length > 0) { 458 | log +=" at " + line + "\n"; 459 | } 460 | } 461 | 462 | List logHeaders = GetLogHeaders(); 463 | using (StreamWriter file = new StreamWriter(Application.persistentDataPath + LOG_FILE_DIR + "LogFile_" + logSession + ".log", true)) { 464 | foreach (string header in logHeaders) { 465 | file.WriteLine(header); 466 | } 467 | file.WriteLine(log); 468 | } 469 | #endif 470 | } 471 | 472 | /// 473 | /// Get the base url used for custom exception reports. 474 | /// 475 | /// A formatted base url. 476 | protected virtual string GetBaseURL () 477 | { 478 | string baseURL = ""; 479 | 480 | #if (UNITY_ANDROID && !UNITY_EDITOR) 481 | 482 | string urlString = serverURL.Trim(); 483 | if(urlString.Length > 0 && urlString != SERVER_URL_PLACEHOLDER) { 484 | baseURL = urlString; 485 | 486 | if(baseURL[baseURL.Length -1].Equals("/") != true) { 487 | baseURL += "/"; 488 | } 489 | } else { 490 | baseURL = HOCKEYAPP_BASEURL; 491 | } 492 | #endif 493 | 494 | return baseURL; 495 | } 496 | 497 | /// 498 | /// Checks whether internet is reachable 499 | /// 500 | protected virtual bool IsConnected () 501 | { 502 | bool connected = false; 503 | 504 | #if (UNITY_ANDROID && !UNITY_EDITOR) 505 | 506 | if (Application.internetReachability == NetworkReachability.ReachableViaLocalAreaNetwork || 507 | (Application.internetReachability == NetworkReachability.ReachableViaCarrierDataNetwork)) { 508 | connected = true; 509 | } 510 | #endif 511 | 512 | return connected; 513 | } 514 | 515 | /// 516 | /// Handle a single exception. By default the exception and its stacktrace gets written to disk. 517 | /// 518 | /// A string that contains the reason for the exception. 519 | /// The stacktrace for the exception. 520 | protected virtual void HandleException (string logString, string stackTrace) 521 | { 522 | 523 | #if (UNITY_ANDROID && !UNITY_EDITOR) 524 | try 525 | { 526 | WriteLogToDisk(logString, stackTrace); 527 | } 528 | catch (Exception e) 529 | { 530 | AndroidLog(e.ToString()); 531 | } 532 | #endif 533 | } 534 | 535 | /// 536 | /// Callback for handling log messages. 537 | /// 538 | /// A string that contains the reason for the exception. 539 | /// The stacktrace for the exception. 540 | /// The type of the log message. 541 | public void OnHandleLogCallback (string logString, string stackTrace, LogType type) 542 | { 543 | #if (UNITY_ANDROID && !UNITY_EDITOR) 544 | if(LogType.Assert == type || LogType.Exception == type || LogType.Error == type) { 545 | HandleException(logString, stackTrace); 546 | } 547 | #endif 548 | } 549 | 550 | /// 551 | /// Callback for handling unresolved exceptions. 552 | /// 553 | public void OnHandleUnresolvedException (object sender, System.UnhandledExceptionEventArgs args) 554 | { 555 | #if (UNITY_ANDROID && !UNITY_EDITOR) 556 | if(args == null || args.ExceptionObject == null) { 557 | return; 558 | } 559 | 560 | if(args.ExceptionObject.GetType() == typeof(System.Exception)) { 561 | System.Exception e = (System.Exception)args.ExceptionObject; 562 | HandleException(e.Source, e.StackTrace); 563 | } 564 | #endif 565 | } 566 | 567 | #region Android Binding Helpers 568 | #if (UNITY_ANDROID && !UNITY_EDITOR) 569 | 570 | private static AndroidJavaObject DictainaryToJavaMap(IDictionary parameters, string javaKeyClass, string javaValueClass) 571 | { 572 | if (parameters == null) 573 | { 574 | return null; 575 | } 576 | var javaMap = new AndroidJavaObject("java.util.HashMap"); 577 | var putMethod = AndroidJNIHelper.GetMethodID(javaMap.GetRawClass(), "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); 578 | foreach (var kvp in parameters) 579 | { 580 | AndroidJNI.CallObjectMethod(javaMap.GetRawObject(), putMethod, AndroidJNIHelper.CreateJNIArgArray(new object[] 581 | { 582 | new AndroidJavaObject(javaKeyClass, kvp.Key), 583 | new AndroidJavaObject(javaValueClass, kvp.Value) 584 | })); 585 | } 586 | return javaMap; 587 | } 588 | 589 | private static void AndroidLog(string message) 590 | { 591 | var logClass = new AndroidJavaObject("android.util.Log"); 592 | logClass.CallStatic("d", "HockeyApp", message); 593 | } 594 | 595 | #endif 596 | #endregion 597 | } 598 | -------------------------------------------------------------------------------- /ExampleGame/Assets/HockeyAppUnityAndroid/HockeyAppUnity-Scripts/HockeyAppAndroid.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 72daf2375120d4568a9272f38a405ef5 3 | timeCreated: 1501523999 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /ExampleGame/Assets/HockeyAppUnityAndroid/HockeySDK-5.2.0.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/ExampleGame/Assets/HockeyAppUnityAndroid/HockeySDK-5.2.0.aar -------------------------------------------------------------------------------- /ExampleGame/Assets/HockeyAppUnityAndroid/README.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/ExampleGame/Assets/HockeyAppUnityAndroid/README.pdf -------------------------------------------------------------------------------- /ExampleGame/Assets/HockeyAppUnityAndroid/exampleunityplugin.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/ExampleGame/Assets/HockeyAppUnityAndroid/exampleunityplugin.jar -------------------------------------------------------------------------------- /ExampleGame/Assets/HockeyAppUnityAndroid/exampleunityplugin.jar.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7a8f6d75bef6b4fb7977a8e88c3625de 3 | timeCreated: 1433484544 4 | licenseType: Pro 5 | PluginImporter: 6 | serializedVersion: 1 7 | iconMap: {} 8 | executionOrder: {} 9 | isPreloaded: 0 10 | platformData: 11 | Any: 12 | enabled: 1 13 | settings: {} 14 | userData: 15 | assetBundleName: 16 | assetBundleVariant: 17 | -------------------------------------------------------------------------------- /ExampleGame/Assets/HockeyAppUnityAndroid/hockeysdk-unity-5.2.0.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/ExampleGame/Assets/HockeyAppUnityAndroid/hockeysdk-unity-5.2.0.aar -------------------------------------------------------------------------------- /ExampleGame/Assets/TestScene.unity: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!29 &1 4 | OcclusionCullingSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_OcclusionBakeSettings: 8 | smallestOccluder: 5 9 | smallestHole: 0.25 10 | backfaceThreshold: 100 11 | m_SceneGUID: 00000000000000000000000000000000 12 | m_OcclusionCullingData: {fileID: 0} 13 | --- !u!104 &2 14 | RenderSettings: 15 | m_ObjectHideFlags: 0 16 | serializedVersion: 8 17 | m_Fog: 0 18 | m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} 19 | m_FogMode: 3 20 | m_FogDensity: 0.01 21 | m_LinearFogStart: 0 22 | m_LinearFogEnd: 300 23 | m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} 24 | m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} 25 | m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} 26 | m_AmbientIntensity: 1 27 | m_AmbientMode: 0 28 | m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} 29 | m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} 30 | m_HaloStrength: 0.5 31 | m_FlareStrength: 1 32 | m_FlareFadeSpeed: 3 33 | m_HaloTexture: {fileID: 0} 34 | m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} 35 | m_DefaultReflectionMode: 0 36 | m_DefaultReflectionResolution: 128 37 | m_ReflectionBounces: 1 38 | m_ReflectionIntensity: 1 39 | m_CustomReflection: {fileID: 0} 40 | m_Sun: {fileID: 0} 41 | m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} 42 | --- !u!157 &4 43 | LightmapSettings: 44 | m_ObjectHideFlags: 0 45 | serializedVersion: 11 46 | m_GIWorkflowMode: 1 47 | m_GISettings: 48 | serializedVersion: 2 49 | m_BounceScale: 1 50 | m_IndirectOutputScale: 1 51 | m_AlbedoBoost: 1 52 | m_TemporalCoherenceThreshold: 1 53 | m_EnvironmentLightingMode: 0 54 | m_EnableBakedLightmaps: 1 55 | m_EnableRealtimeLightmaps: 1 56 | m_LightmapEditorSettings: 57 | serializedVersion: 9 58 | m_Resolution: 2 59 | m_BakeResolution: 40 60 | m_TextureWidth: 1024 61 | m_TextureHeight: 1024 62 | m_AO: 0 63 | m_AOMaxDistance: 1 64 | m_CompAOExponent: 0 65 | m_CompAOExponentDirect: 0 66 | m_Padding: 2 67 | m_LightmapParameters: {fileID: 0} 68 | m_LightmapsBakeMode: 1 69 | m_TextureCompression: 1 70 | m_FinalGather: 0 71 | m_FinalGatherFiltering: 1 72 | m_FinalGatherRayCount: 1024 73 | m_ReflectionCompression: 2 74 | m_MixedBakeMode: 1 75 | m_BakeBackend: 0 76 | m_PVRSampling: 1 77 | m_PVRDirectSampleCount: 32 78 | m_PVRSampleCount: 500 79 | m_PVRBounces: 2 80 | m_PVRFiltering: 0 81 | m_PVRFilteringMode: 1 82 | m_PVRCulling: 1 83 | m_PVRFilteringGaussRadiusDirect: 1 84 | m_PVRFilteringGaussRadiusIndirect: 5 85 | m_PVRFilteringGaussRadiusAO: 2 86 | m_PVRFilteringAtrousColorSigma: 1 87 | m_PVRFilteringAtrousNormalSigma: 1 88 | m_PVRFilteringAtrousPositionSigma: 1 89 | m_LightingDataAsset: {fileID: 0} 90 | m_UseShadowmask: 0 91 | --- !u!196 &5 92 | NavMeshSettings: 93 | serializedVersion: 2 94 | m_ObjectHideFlags: 0 95 | m_BuildSettings: 96 | serializedVersion: 2 97 | agentTypeID: 0 98 | agentRadius: 0.5 99 | agentHeight: 2 100 | agentSlope: 45 101 | agentClimb: 0.4 102 | ledgeDropHeight: 0 103 | maxJumpAcrossDistance: 0 104 | minRegionArea: 2 105 | manualCellSize: 0 106 | cellSize: 0.16666667 107 | manualTileSize: 0 108 | tileSize: 256 109 | accuratePlacement: 0 110 | m_NavMeshData: {fileID: 0} 111 | --- !u!1 &588686177 112 | GameObject: 113 | m_ObjectHideFlags: 0 114 | m_PrefabParentObject: {fileID: 0} 115 | m_PrefabInternal: {fileID: 0} 116 | serializedVersion: 5 117 | m_Component: 118 | - component: {fileID: 588686179} 119 | - component: {fileID: 588686180} 120 | m_Layer: 0 121 | m_Name: HockeyAppUnityAndroid 122 | m_TagString: Untagged 123 | m_Icon: {fileID: 0} 124 | m_NavMeshLayer: 0 125 | m_StaticEditorFlags: 0 126 | m_IsActive: 1 127 | --- !u!4 &588686179 128 | Transform: 129 | m_ObjectHideFlags: 0 130 | m_PrefabParentObject: {fileID: 0} 131 | m_PrefabInternal: {fileID: 0} 132 | m_GameObject: {fileID: 588686177} 133 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 134 | m_LocalPosition: {x: 0, y: 0, z: 0} 135 | m_LocalScale: {x: 1, y: 1, z: 1} 136 | m_Children: [] 137 | m_Father: {fileID: 0} 138 | m_RootOrder: 0 139 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 140 | --- !u!114 &588686180 141 | MonoBehaviour: 142 | m_ObjectHideFlags: 0 143 | m_PrefabParentObject: {fileID: 0} 144 | m_PrefabInternal: {fileID: 0} 145 | m_GameObject: {fileID: 588686177} 146 | m_Enabled: 1 147 | m_EditorHideFlags: 0 148 | m_Script: {fileID: 11500000, guid: 72daf2375120d4568a9272f38a405ef5, type: 3} 149 | m_Name: 150 | m_EditorClassIdentifier: 151 | appID: your-hockey-app-id 152 | packageID: your-package-identifier 153 | serverURL: your-custom-server-url 154 | authenticatorType: 0 155 | secret: your-hockey-app-secret 156 | autoUploadCrashes: 0 157 | exceptionLogging: 1 158 | userMetrics: 1 159 | updateAlert: 1 160 | --- !u!1 &1709789755 161 | GameObject: 162 | m_ObjectHideFlags: 0 163 | m_PrefabParentObject: {fileID: 0} 164 | m_PrefabInternal: {fileID: 0} 165 | serializedVersion: 5 166 | m_Component: 167 | - component: {fileID: 1709789760} 168 | - component: {fileID: 1709789759} 169 | - component: {fileID: 1709789758} 170 | - component: {fileID: 1709789757} 171 | - component: {fileID: 1709789756} 172 | - component: {fileID: 1709789761} 173 | m_Layer: 0 174 | m_Name: Camera 175 | m_TagString: Untagged 176 | m_Icon: {fileID: 0} 177 | m_NavMeshLayer: 0 178 | m_StaticEditorFlags: 0 179 | m_IsActive: 1 180 | --- !u!81 &1709789756 181 | AudioListener: 182 | m_ObjectHideFlags: 0 183 | m_PrefabParentObject: {fileID: 0} 184 | m_PrefabInternal: {fileID: 0} 185 | m_GameObject: {fileID: 1709789755} 186 | m_Enabled: 1 187 | --- !u!92 &1709789757 188 | Behaviour: 189 | m_ObjectHideFlags: 0 190 | m_PrefabParentObject: {fileID: 0} 191 | m_PrefabInternal: {fileID: 0} 192 | m_GameObject: {fileID: 1709789755} 193 | m_Enabled: 1 194 | --- !u!124 &1709789758 195 | Behaviour: 196 | m_ObjectHideFlags: 0 197 | m_PrefabParentObject: {fileID: 0} 198 | m_PrefabInternal: {fileID: 0} 199 | m_GameObject: {fileID: 1709789755} 200 | m_Enabled: 1 201 | --- !u!20 &1709789759 202 | Camera: 203 | m_ObjectHideFlags: 0 204 | m_PrefabParentObject: {fileID: 0} 205 | m_PrefabInternal: {fileID: 0} 206 | m_GameObject: {fileID: 1709789755} 207 | m_Enabled: 1 208 | serializedVersion: 2 209 | m_ClearFlags: 2 210 | m_BackGroundColor: {r: 1, g: 1, b: 1, a: 0.019607844} 211 | m_NormalizedViewPortRect: 212 | serializedVersion: 2 213 | x: 0 214 | y: 0 215 | width: 1 216 | height: 1 217 | near clip plane: 0.3 218 | far clip plane: 1000 219 | field of view: 60 220 | orthographic: 0 221 | orthographic size: 5 222 | m_Depth: 0 223 | m_CullingMask: 224 | serializedVersion: 2 225 | m_Bits: 4294967295 226 | m_RenderingPath: -1 227 | m_TargetTexture: {fileID: 0} 228 | m_TargetDisplay: 0 229 | m_TargetEye: 3 230 | m_HDR: 0 231 | m_AllowMSAA: 1 232 | m_ForceIntoRT: 0 233 | m_OcclusionCulling: 1 234 | m_StereoConvergence: 10 235 | m_StereoSeparation: 0.022 236 | m_StereoMirrorMode: 0 237 | --- !u!4 &1709789760 238 | Transform: 239 | m_ObjectHideFlags: 0 240 | m_PrefabParentObject: {fileID: 0} 241 | m_PrefabInternal: {fileID: 0} 242 | m_GameObject: {fileID: 1709789755} 243 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 244 | m_LocalPosition: {x: 0, y: 0, z: 0} 245 | m_LocalScale: {x: 1, y: 1, z: 1} 246 | m_Children: [] 247 | m_Father: {fileID: 0} 248 | m_RootOrder: 1 249 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 250 | --- !u!114 &1709789761 251 | MonoBehaviour: 252 | m_ObjectHideFlags: 0 253 | m_PrefabParentObject: {fileID: 0} 254 | m_PrefabInternal: {fileID: 0} 255 | m_GameObject: {fileID: 1709789755} 256 | m_Enabled: 1 257 | m_EditorHideFlags: 0 258 | m_Script: {fileID: 11500000, guid: 7453863bc32a44d8d875d5f68721c3f6, type: 3} 259 | m_Name: 260 | m_EditorClassIdentifier: 261 | customUISkin: {fileID: 11400000, guid: d7fb91a8c54f149948c667b9f0e70c96, type: 2} 262 | -------------------------------------------------------------------------------- /ExampleGame/Assets/TestScene.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 87fb373f238fc487eb954ac23c3978c6 3 | DefaultImporter: 4 | userData: 5 | assetBundleName: 6 | assetBundleVariant: 7 | -------------------------------------------------------------------------------- /ExampleGame/Assets/TestUI.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f1679da049b70478e9f70f08eb55b2a4 3 | folderAsset: yes 4 | DefaultImporter: 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /ExampleGame/Assets/TestUI/Ressources.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 033d017c1f17d40cab9c64ee75c082f4 3 | folderAsset: yes 4 | DefaultImporter: 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /ExampleGame/Assets/TestUI/Ressources/btn_active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/ExampleGame/Assets/TestUI/Ressources/btn_active.png -------------------------------------------------------------------------------- /ExampleGame/Assets/TestUI/Ressources/btn_active.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: aa363a8f65df74a90b43e6a9ded9d668 3 | TextureImporter: 4 | fileIDToRecycleName: {} 5 | serializedVersion: 2 6 | mipmaps: 7 | mipMapMode: 0 8 | enableMipMap: 0 9 | linearTexture: 0 10 | correctGamma: 0 11 | fadeOut: 0 12 | borderMipMap: 0 13 | mipMapFadeDistanceStart: 1 14 | mipMapFadeDistanceEnd: 3 15 | bumpmap: 16 | convertToNormalMap: 0 17 | externalNormalMap: 0 18 | heightScale: .25 19 | normalMapFilter: 0 20 | isReadable: 0 21 | grayScaleToAlpha: 0 22 | generateCubemap: 0 23 | cubemapConvolution: 0 24 | cubemapConvolutionSteps: 8 25 | cubemapConvolutionExponent: 1.5 26 | seamlessCubemap: 0 27 | textureFormat: -1 28 | maxTextureSize: 64 29 | textureSettings: 30 | filterMode: -1 31 | aniso: 1 32 | mipBias: -1 33 | wrapMode: 1 34 | nPOTScale: 0 35 | lightmap: 0 36 | rGBM: 0 37 | compressionQuality: 50 38 | spriteMode: 1 39 | spriteExtrude: 1 40 | spriteMeshType: 1 41 | alignment: 0 42 | spritePivot: {x: .5, y: .5} 43 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 44 | spritePixelsToUnits: 64 45 | alphaIsTransparency: 1 46 | textureType: 8 47 | buildTargetSettings: [] 48 | spriteSheet: 49 | sprites: [] 50 | spritePackingTag: 51 | userData: 52 | assetBundleName: 53 | assetBundleVariant: 54 | -------------------------------------------------------------------------------- /ExampleGame/Assets/TestUI/Ressources/btn_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/ExampleGame/Assets/TestUI/Ressources/btn_normal.png -------------------------------------------------------------------------------- /ExampleGame/Assets/TestUI/Ressources/btn_normal.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 33cfd0245ea97475f9cdfff3a86ddfce 3 | TextureImporter: 4 | fileIDToRecycleName: {} 5 | serializedVersion: 2 6 | mipmaps: 7 | mipMapMode: 0 8 | enableMipMap: 0 9 | linearTexture: 0 10 | correctGamma: 0 11 | fadeOut: 0 12 | borderMipMap: 0 13 | mipMapFadeDistanceStart: 1 14 | mipMapFadeDistanceEnd: 3 15 | bumpmap: 16 | convertToNormalMap: 0 17 | externalNormalMap: 0 18 | heightScale: .25 19 | normalMapFilter: 0 20 | isReadable: 0 21 | grayScaleToAlpha: 0 22 | generateCubemap: 0 23 | cubemapConvolution: 0 24 | cubemapConvolutionSteps: 8 25 | cubemapConvolutionExponent: 1.5 26 | seamlessCubemap: 0 27 | textureFormat: -1 28 | maxTextureSize: 64 29 | textureSettings: 30 | filterMode: -1 31 | aniso: 1 32 | mipBias: -1 33 | wrapMode: 1 34 | nPOTScale: 0 35 | lightmap: 0 36 | rGBM: 0 37 | compressionQuality: 50 38 | spriteMode: 1 39 | spriteExtrude: 1 40 | spriteMeshType: 1 41 | alignment: 0 42 | spritePivot: {x: .5, y: .5} 43 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 44 | spritePixelsToUnits: 64 45 | alphaIsTransparency: 1 46 | textureType: 8 47 | buildTargetSettings: [] 48 | spriteSheet: 49 | sprites: [] 50 | spritePackingTag: 51 | userData: 52 | assetBundleName: 53 | assetBundleVariant: 54 | -------------------------------------------------------------------------------- /ExampleGame/Assets/TestUI/TestUI.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using System; 3 | using System.Collections; 4 | using System.Collections.Generic; 5 | using System.Runtime.InteropServices; 6 | 7 | public class TestUI : MonoBehaviour{ 8 | 9 | public GUISkin customUISkin; 10 | private int controlHeight = 60; 11 | private int horizontalMargin = 16; 12 | private int space = 16; 13 | 14 | void OnGUI(){ 15 | 16 | AutoResize (640, 1136); 17 | GUI.skin = customUISkin; 18 | 19 | GUI.Label(GetControlRect(1), "Choose an exception type"); 20 | 21 | if(GUI.Button(GetControlRect(2), "Divide By Zero")) 22 | { 23 | 24 | int i = 0; 25 | i = 5 / i; 26 | } 27 | 28 | if(GUI.Button(GetControlRect(3), "Native Code Crash")) 29 | { 30 | ForceAppCrash(); 31 | } 32 | 33 | if(GUI.Button(GetControlRect(4), "Index Out Of Range")) 34 | { 35 | string[] arr = new string[3]; 36 | arr[4] = "Out of Range"; 37 | } 38 | 39 | if(GUI.Button(GetControlRect(5), "Custom Exception")) 40 | { 41 | throw new System.Exception("My Custom Exception"); 42 | } 43 | 44 | if(GUI.Button(GetControlRect(6), "Custom Coroutine Exception")) 45 | { 46 | StartCoroutine(CorutineCrash()); 47 | } 48 | 49 | if(GUI.Button(GetControlRect(7), "Handled Null Pointer Exception")) 50 | { 51 | try { 52 | NullReferenceException(); 53 | } catch (Exception e) { 54 | throw new Exception("Null Pointer Exception"); 55 | } 56 | } 57 | 58 | if(GUI.Button(GetControlRect(8), "Null Pointer Exception")) 59 | { 60 | NullReferenceException(); 61 | } 62 | 63 | if(GUI.Button(GetControlRect(9), "Coroutine Null Exception")) 64 | { 65 | StartCoroutine(CorutineNullCrash()); 66 | } 67 | 68 | GUI.Label(GetControlRect(10), "Features"); 69 | 70 | if(GUI.Button(GetControlRect(11), "Show Feedback Form")) 71 | { 72 | ShowFeedbackForm(); 73 | } 74 | 75 | if(GUI.Button(GetControlRect(12), "Check For Update")) 76 | { 77 | CheckForUpdate(); 78 | } 79 | 80 | if (GUI.Button(GetControlRect(13), "Track Event")) 81 | { 82 | TrackEvent(); 83 | } 84 | } 85 | 86 | private Rect GetControlRect(int controlIndex){ 87 | 88 | return new Rect (horizontalMargin, 89 | controlIndex * (controlHeight + space), 90 | 640 - (2 * horizontalMargin), 91 | controlHeight); 92 | } 93 | 94 | public void AutoResize(int screenWidth, int screenHeight){ 95 | 96 | Vector2 resizeRatio = new Vector2((float)Screen.width / screenWidth, (float)Screen.height / screenHeight); 97 | GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, new Vector3(resizeRatio.x, resizeRatio.y, 1.0f)); 98 | } 99 | 100 | System.Collections.IEnumerator CorutineNullCrash(){ 101 | 102 | string crash = null; 103 | crash = crash.ToLower(); 104 | yield break; 105 | } 106 | 107 | System.Collections.IEnumerator CorutineCrash(){ 108 | 109 | throw new System.Exception("Custom Coroutine Exception"); 110 | } 111 | 112 | public void NullReferenceException(){ 113 | object testObject = null; 114 | testObject.GetHashCode(); 115 | } 116 | 117 | public void ForceAppCrash(){ 118 | 119 | #if (UNITY_ANDROID && !UNITY_EDITOR) 120 | AndroidJavaClass player = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 121 | AndroidJavaObject activity = player.GetStatic("currentActivity"); 122 | AndroidJavaObject exampleClass = new AndroidJavaObject("net.hockeyapp.exampleunityplugin.ExampleClass"); 123 | exampleClass.Call("forceAppCrash", activity); 124 | #endif 125 | } 126 | 127 | public void ShowFeedbackForm(){ 128 | 129 | #if (UNITY_ANDROID && !UNITY_EDITOR) 130 | HockeyAppAndroid.ShowFeedbackForm(); 131 | #endif 132 | } 133 | 134 | public void CheckForUpdate(){ 135 | 136 | #if (UNITY_ANDROID && !UNITY_EDITOR) 137 | HockeyAppAndroid.CheckForUpdate(); 138 | #endif 139 | } 140 | 141 | public void TrackEvent(){ 142 | 143 | #if (UNITY_ANDROID && !UNITY_EDITOR) 144 | HockeyAppAndroid.TrackEvent("Test Unity"); 145 | HockeyAppAndroid.TrackEvent("Test Unity with properties", 146 | new Dictionary { { "Prop1", "Val1" }, { "Prop2", "Val2" } }); 147 | HockeyAppAndroid.TrackEvent("Test Unity with properties and measurements", 148 | new Dictionary { { "Prop1", "Val1" }, { "Prop2", "Val2" } }, 149 | new Dictionary { { "M1", 1.0 }, { "M2", 2.0 } }); 150 | #endif 151 | } 152 | } -------------------------------------------------------------------------------- /ExampleGame/Assets/TestUI/TestUI.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 7453863bc32a44d8d875d5f68721c3f6 3 | MonoImporter: 4 | serializedVersion: 2 5 | defaultReferences: 6 | - customUISkin: {fileID: 11400000, guid: d7fb91a8c54f149948c667b9f0e70c96, type: 2} 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /ExampleGame/Assets/TestUI/TestUISkin.guiskin: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!114 &11400000 4 | MonoBehaviour: 5 | m_ObjectHideFlags: 0 6 | m_PrefabParentObject: {fileID: 0} 7 | m_PrefabInternal: {fileID: 0} 8 | m_GameObject: {fileID: 0} 9 | m_Enabled: 1 10 | m_EditorHideFlags: 1 11 | m_Script: {fileID: 12001, guid: 0000000000000000e000000000000000, type: 0} 12 | m_Name: TestUISkin 13 | m_EditorClassIdentifier: 14 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 15 | m_box: 16 | m_Name: box 17 | m_Normal: 18 | m_Background: {fileID: 11001, guid: 0000000000000000e000000000000000, type: 0} 19 | m_TextColor: {r: .799999952, g: .799999952, b: .799999952, a: 1} 20 | m_Hover: 21 | m_Background: {fileID: 0} 22 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 23 | m_Active: 24 | m_Background: {fileID: 0} 25 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 26 | m_Focused: 27 | m_Background: {fileID: 0} 28 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 29 | m_OnNormal: 30 | m_Background: {fileID: 0} 31 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 32 | m_OnHover: 33 | m_Background: {fileID: 0} 34 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 35 | m_OnActive: 36 | m_Background: {fileID: 0} 37 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 38 | m_OnFocused: 39 | m_Background: {fileID: 0} 40 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 41 | m_Border: 42 | m_Left: 6 43 | m_Right: 6 44 | m_Top: 6 45 | m_Bottom: 6 46 | m_Margin: 47 | m_Left: 4 48 | m_Right: 4 49 | m_Top: 4 50 | m_Bottom: 4 51 | m_Padding: 52 | m_Left: 4 53 | m_Right: 4 54 | m_Top: 4 55 | m_Bottom: 4 56 | m_Overflow: 57 | m_Left: 0 58 | m_Right: 0 59 | m_Top: 0 60 | m_Bottom: 0 61 | m_Font: {fileID: 0} 62 | m_FontSize: 0 63 | m_FontStyle: 0 64 | m_Alignment: 1 65 | m_WordWrap: 0 66 | m_RichText: 1 67 | m_TextClipping: 1 68 | m_ImagePosition: 0 69 | m_ContentOffset: {x: 0, y: 0} 70 | m_FixedWidth: 0 71 | m_FixedHeight: 0 72 | m_StretchWidth: 1 73 | m_StretchHeight: 0 74 | m_button: 75 | m_Name: button 76 | m_Normal: 77 | m_Background: {fileID: 2800000, guid: 33cfd0245ea97475f9cdfff3a86ddfce, type: 3} 78 | m_TextColor: {r: 0, g: .450980395, b: .65882355, a: 1} 79 | m_Hover: 80 | m_Background: {fileID: 2800000, guid: aa363a8f65df74a90b43e6a9ded9d668, type: 3} 81 | m_TextColor: {r: 1, g: 1, b: 1, a: 1} 82 | m_Active: 83 | m_Background: {fileID: 2800000, guid: aa363a8f65df74a90b43e6a9ded9d668, type: 3} 84 | m_TextColor: {r: 1, g: 1, b: 1, a: 1} 85 | m_Focused: 86 | m_Background: {fileID: 2800000, guid: aa363a8f65df74a90b43e6a9ded9d668, type: 3} 87 | m_TextColor: {r: 1, g: 1, b: 1, a: 1} 88 | m_OnNormal: 89 | m_Background: {fileID: 2800000, guid: 33cfd0245ea97475f9cdfff3a86ddfce, type: 3} 90 | m_TextColor: {r: 0, g: .450980395, b: .65882355, a: 1} 91 | m_OnHover: 92 | m_Background: {fileID: 2800000, guid: aa363a8f65df74a90b43e6a9ded9d668, type: 3} 93 | m_TextColor: {r: 1, g: 1, b: 1, a: 1} 94 | m_OnActive: 95 | m_Background: {fileID: 2800000, guid: aa363a8f65df74a90b43e6a9ded9d668, type: 3} 96 | m_TextColor: {r: 1, g: 1, b: 1, a: 1} 97 | m_OnFocused: 98 | m_Background: {fileID: 2800000, guid: aa363a8f65df74a90b43e6a9ded9d668, type: 3} 99 | m_TextColor: {r: 1, g: 1, b: 1, a: 1} 100 | m_Border: 101 | m_Left: 32 102 | m_Right: 32 103 | m_Top: 32 104 | m_Bottom: 32 105 | m_Margin: 106 | m_Left: 0 107 | m_Right: 0 108 | m_Top: 0 109 | m_Bottom: 0 110 | m_Padding: 111 | m_Left: 0 112 | m_Right: 0 113 | m_Top: 0 114 | m_Bottom: 0 115 | m_Overflow: 116 | m_Left: 0 117 | m_Right: 0 118 | m_Top: 0 119 | m_Bottom: 0 120 | m_Font: {fileID: 0} 121 | m_FontSize: 30 122 | m_FontStyle: 0 123 | m_Alignment: 4 124 | m_WordWrap: 1 125 | m_RichText: 0 126 | m_TextClipping: 1 127 | m_ImagePosition: 0 128 | m_ContentOffset: {x: 0, y: 0} 129 | m_FixedWidth: 0 130 | m_FixedHeight: 0 131 | m_StretchWidth: 0 132 | m_StretchHeight: 0 133 | m_toggle: 134 | m_Name: toggle 135 | m_Normal: 136 | m_Background: {fileID: 11018, guid: 0000000000000000e000000000000000, type: 0} 137 | m_TextColor: {r: .891128957, g: .891128957, b: .891128957, a: 1} 138 | m_Hover: 139 | m_Background: {fileID: 11014, guid: 0000000000000000e000000000000000, type: 0} 140 | m_TextColor: {r: 1, g: 1, b: 1, a: 1} 141 | m_Active: 142 | m_Background: {fileID: 11013, guid: 0000000000000000e000000000000000, type: 0} 143 | m_TextColor: {r: 1, g: 1, b: 1, a: 1} 144 | m_Focused: 145 | m_Background: {fileID: 0} 146 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 147 | m_OnNormal: 148 | m_Background: {fileID: 11016, guid: 0000000000000000e000000000000000, type: 0} 149 | m_TextColor: {r: .890196085, g: .890196085, b: .890196085, a: 1} 150 | m_OnHover: 151 | m_Background: {fileID: 11015, guid: 0000000000000000e000000000000000, type: 0} 152 | m_TextColor: {r: 1, g: 1, b: 1, a: 1} 153 | m_OnActive: 154 | m_Background: {fileID: 11017, guid: 0000000000000000e000000000000000, type: 0} 155 | m_TextColor: {r: 1, g: 1, b: 1, a: 1} 156 | m_OnFocused: 157 | m_Background: {fileID: 0} 158 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 159 | m_Border: 160 | m_Left: 14 161 | m_Right: 0 162 | m_Top: 14 163 | m_Bottom: 0 164 | m_Margin: 165 | m_Left: 4 166 | m_Right: 4 167 | m_Top: 4 168 | m_Bottom: 4 169 | m_Padding: 170 | m_Left: 15 171 | m_Right: 0 172 | m_Top: 3 173 | m_Bottom: 0 174 | m_Overflow: 175 | m_Left: -1 176 | m_Right: 0 177 | m_Top: -4 178 | m_Bottom: 0 179 | m_Font: {fileID: 0} 180 | m_FontSize: 0 181 | m_FontStyle: 0 182 | m_Alignment: 0 183 | m_WordWrap: 0 184 | m_RichText: 1 185 | m_TextClipping: 1 186 | m_ImagePosition: 0 187 | m_ContentOffset: {x: 0, y: 0} 188 | m_FixedWidth: 0 189 | m_FixedHeight: 0 190 | m_StretchWidth: 1 191 | m_StretchHeight: 0 192 | m_label: 193 | m_Name: label 194 | m_Normal: 195 | m_Background: {fileID: 0} 196 | m_TextColor: {r: 0, g: .568627477, b: .811764717, a: 1} 197 | m_Hover: 198 | m_Background: {fileID: 0} 199 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 200 | m_Active: 201 | m_Background: {fileID: 0} 202 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 203 | m_Focused: 204 | m_Background: {fileID: 0} 205 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 206 | m_OnNormal: 207 | m_Background: {fileID: 0} 208 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 209 | m_OnHover: 210 | m_Background: {fileID: 0} 211 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 212 | m_OnActive: 213 | m_Background: {fileID: 0} 214 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 215 | m_OnFocused: 216 | m_Background: {fileID: 0} 217 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 218 | m_Border: 219 | m_Left: 0 220 | m_Right: 0 221 | m_Top: 0 222 | m_Bottom: 0 223 | m_Margin: 224 | m_Left: 4 225 | m_Right: 4 226 | m_Top: 4 227 | m_Bottom: 4 228 | m_Padding: 229 | m_Left: 0 230 | m_Right: 0 231 | m_Top: 10 232 | m_Bottom: 3 233 | m_Overflow: 234 | m_Left: 0 235 | m_Right: 0 236 | m_Top: 0 237 | m_Bottom: 0 238 | m_Font: {fileID: 0} 239 | m_FontSize: 40 240 | m_FontStyle: 1 241 | m_Alignment: 7 242 | m_WordWrap: 1 243 | m_RichText: 1 244 | m_TextClipping: 1 245 | m_ImagePosition: 0 246 | m_ContentOffset: {x: 0, y: 0} 247 | m_FixedWidth: 0 248 | m_FixedHeight: 0 249 | m_StretchWidth: 1 250 | m_StretchHeight: 0 251 | m_textField: 252 | m_Name: textfield 253 | m_Normal: 254 | m_Background: {fileID: 11024, guid: 0000000000000000e000000000000000, type: 0} 255 | m_TextColor: {r: .799999952, g: .799999952, b: .799999952, a: 1} 256 | m_Hover: 257 | m_Background: {fileID: 11026, guid: 0000000000000000e000000000000000, type: 0} 258 | m_TextColor: {r: .899999976, g: .899999976, b: .899999976, a: 1} 259 | m_Active: 260 | m_Background: {fileID: 0} 261 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 262 | m_Focused: 263 | m_Background: {fileID: 11026, guid: 0000000000000000e000000000000000, type: 0} 264 | m_TextColor: {r: 1, g: 1, b: 1, a: 1} 265 | m_OnNormal: 266 | m_Background: {fileID: 11025, guid: 0000000000000000e000000000000000, type: 0} 267 | m_TextColor: {r: 1, g: 1, b: 1, a: 1} 268 | m_OnHover: 269 | m_Background: {fileID: 0} 270 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 271 | m_OnActive: 272 | m_Background: {fileID: 0} 273 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 274 | m_OnFocused: 275 | m_Background: {fileID: 0} 276 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 277 | m_Border: 278 | m_Left: 4 279 | m_Right: 4 280 | m_Top: 4 281 | m_Bottom: 4 282 | m_Margin: 283 | m_Left: 4 284 | m_Right: 4 285 | m_Top: 4 286 | m_Bottom: 4 287 | m_Padding: 288 | m_Left: 3 289 | m_Right: 3 290 | m_Top: 3 291 | m_Bottom: 3 292 | m_Overflow: 293 | m_Left: 0 294 | m_Right: 0 295 | m_Top: 0 296 | m_Bottom: 0 297 | m_Font: {fileID: 0} 298 | m_FontSize: 0 299 | m_FontStyle: 0 300 | m_Alignment: 0 301 | m_WordWrap: 0 302 | m_RichText: 0 303 | m_TextClipping: 1 304 | m_ImagePosition: 3 305 | m_ContentOffset: {x: 0, y: 0} 306 | m_FixedWidth: 0 307 | m_FixedHeight: 0 308 | m_StretchWidth: 1 309 | m_StretchHeight: 0 310 | m_textArea: 311 | m_Name: textarea 312 | m_Normal: 313 | m_Background: {fileID: 11024, guid: 0000000000000000e000000000000000, type: 0} 314 | m_TextColor: {r: .90196079, g: .90196079, b: .90196079, a: 1} 315 | m_Hover: 316 | m_Background: {fileID: 11026, guid: 0000000000000000e000000000000000, type: 0} 317 | m_TextColor: {r: .799999952, g: .799999952, b: .799999952, a: 1} 318 | m_Active: 319 | m_Background: {fileID: 0} 320 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 321 | m_Focused: 322 | m_Background: {fileID: 0} 323 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 324 | m_OnNormal: 325 | m_Background: {fileID: 11025, guid: 0000000000000000e000000000000000, type: 0} 326 | m_TextColor: {r: 1, g: 1, b: 1, a: 1} 327 | m_OnHover: 328 | m_Background: {fileID: 0} 329 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 330 | m_OnActive: 331 | m_Background: {fileID: 0} 332 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 333 | m_OnFocused: 334 | m_Background: {fileID: 0} 335 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 336 | m_Border: 337 | m_Left: 4 338 | m_Right: 4 339 | m_Top: 4 340 | m_Bottom: 4 341 | m_Margin: 342 | m_Left: 4 343 | m_Right: 4 344 | m_Top: 4 345 | m_Bottom: 4 346 | m_Padding: 347 | m_Left: 3 348 | m_Right: 3 349 | m_Top: 3 350 | m_Bottom: 3 351 | m_Overflow: 352 | m_Left: 0 353 | m_Right: 0 354 | m_Top: 0 355 | m_Bottom: 0 356 | m_Font: {fileID: 0} 357 | m_FontSize: 0 358 | m_FontStyle: 0 359 | m_Alignment: 0 360 | m_WordWrap: 1 361 | m_RichText: 0 362 | m_TextClipping: 1 363 | m_ImagePosition: 0 364 | m_ContentOffset: {x: 0, y: 0} 365 | m_FixedWidth: 0 366 | m_FixedHeight: 0 367 | m_StretchWidth: 1 368 | m_StretchHeight: 0 369 | m_window: 370 | m_Name: window 371 | m_Normal: 372 | m_Background: {fileID: 2800000, guid: 7e92b874cc525437c808e83fb3e31a4b, type: 3} 373 | m_TextColor: {r: 1, g: 1, b: 1, a: 1} 374 | m_Hover: 375 | m_Background: {fileID: 0} 376 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 377 | m_Active: 378 | m_Background: {fileID: 0} 379 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 380 | m_Focused: 381 | m_Background: {fileID: 0} 382 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 383 | m_OnNormal: 384 | m_Background: {fileID: 11022, guid: 0000000000000000e000000000000000, type: 0} 385 | m_TextColor: {r: 1, g: 1, b: 1, a: 1} 386 | m_OnHover: 387 | m_Background: {fileID: 0} 388 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 389 | m_OnActive: 390 | m_Background: {fileID: 0} 391 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 392 | m_OnFocused: 393 | m_Background: {fileID: 0} 394 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 395 | m_Border: 396 | m_Left: 8 397 | m_Right: 8 398 | m_Top: 18 399 | m_Bottom: 8 400 | m_Margin: 401 | m_Left: 0 402 | m_Right: 0 403 | m_Top: 0 404 | m_Bottom: 0 405 | m_Padding: 406 | m_Left: 10 407 | m_Right: 10 408 | m_Top: 20 409 | m_Bottom: 10 410 | m_Overflow: 411 | m_Left: 0 412 | m_Right: 0 413 | m_Top: 0 414 | m_Bottom: 0 415 | m_Font: {fileID: 0} 416 | m_FontSize: 0 417 | m_FontStyle: 0 418 | m_Alignment: 1 419 | m_WordWrap: 0 420 | m_RichText: 1 421 | m_TextClipping: 1 422 | m_ImagePosition: 0 423 | m_ContentOffset: {x: 0, y: -18} 424 | m_FixedWidth: 0 425 | m_FixedHeight: 0 426 | m_StretchWidth: 1 427 | m_StretchHeight: 0 428 | m_horizontalSlider: 429 | m_Name: horizontalslider 430 | m_Normal: 431 | m_Background: {fileID: 11009, guid: 0000000000000000e000000000000000, type: 0} 432 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 433 | m_Hover: 434 | m_Background: {fileID: 0} 435 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 436 | m_Active: 437 | m_Background: {fileID: 0} 438 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 439 | m_Focused: 440 | m_Background: {fileID: 0} 441 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 442 | m_OnNormal: 443 | m_Background: {fileID: 0} 444 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 445 | m_OnHover: 446 | m_Background: {fileID: 0} 447 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 448 | m_OnActive: 449 | m_Background: {fileID: 0} 450 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 451 | m_OnFocused: 452 | m_Background: {fileID: 0} 453 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 454 | m_Border: 455 | m_Left: 3 456 | m_Right: 3 457 | m_Top: 0 458 | m_Bottom: 0 459 | m_Margin: 460 | m_Left: 4 461 | m_Right: 4 462 | m_Top: 4 463 | m_Bottom: 4 464 | m_Padding: 465 | m_Left: -1 466 | m_Right: -1 467 | m_Top: 0 468 | m_Bottom: 0 469 | m_Overflow: 470 | m_Left: 0 471 | m_Right: 0 472 | m_Top: -2 473 | m_Bottom: -3 474 | m_Font: {fileID: 0} 475 | m_FontSize: 0 476 | m_FontStyle: 0 477 | m_Alignment: 0 478 | m_WordWrap: 0 479 | m_RichText: 1 480 | m_TextClipping: 1 481 | m_ImagePosition: 2 482 | m_ContentOffset: {x: 0, y: 0} 483 | m_FixedWidth: 0 484 | m_FixedHeight: 12 485 | m_StretchWidth: 1 486 | m_StretchHeight: 0 487 | m_horizontalSliderThumb: 488 | m_Name: horizontalsliderthumb 489 | m_Normal: 490 | m_Background: {fileID: 11011, guid: 0000000000000000e000000000000000, type: 0} 491 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 492 | m_Hover: 493 | m_Background: {fileID: 11012, guid: 0000000000000000e000000000000000, type: 0} 494 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 495 | m_Active: 496 | m_Background: {fileID: 11010, guid: 0000000000000000e000000000000000, type: 0} 497 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 498 | m_Focused: 499 | m_Background: {fileID: 0} 500 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 501 | m_OnNormal: 502 | m_Background: {fileID: 0} 503 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 504 | m_OnHover: 505 | m_Background: {fileID: 0} 506 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 507 | m_OnActive: 508 | m_Background: {fileID: 0} 509 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 510 | m_OnFocused: 511 | m_Background: {fileID: 0} 512 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 513 | m_Border: 514 | m_Left: 4 515 | m_Right: 4 516 | m_Top: 0 517 | m_Bottom: 0 518 | m_Margin: 519 | m_Left: 0 520 | m_Right: 0 521 | m_Top: 0 522 | m_Bottom: 0 523 | m_Padding: 524 | m_Left: 7 525 | m_Right: 7 526 | m_Top: 0 527 | m_Bottom: 0 528 | m_Overflow: 529 | m_Left: -1 530 | m_Right: -1 531 | m_Top: 0 532 | m_Bottom: 0 533 | m_Font: {fileID: 0} 534 | m_FontSize: 0 535 | m_FontStyle: 0 536 | m_Alignment: 0 537 | m_WordWrap: 0 538 | m_RichText: 1 539 | m_TextClipping: 1 540 | m_ImagePosition: 2 541 | m_ContentOffset: {x: 0, y: 0} 542 | m_FixedWidth: 0 543 | m_FixedHeight: 12 544 | m_StretchWidth: 1 545 | m_StretchHeight: 0 546 | m_verticalSlider: 547 | m_Name: verticalslider 548 | m_Normal: 549 | m_Background: {fileID: 11021, guid: 0000000000000000e000000000000000, type: 0} 550 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 551 | m_Hover: 552 | m_Background: {fileID: 0} 553 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 554 | m_Active: 555 | m_Background: {fileID: 0} 556 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 557 | m_Focused: 558 | m_Background: {fileID: 0} 559 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 560 | m_OnNormal: 561 | m_Background: {fileID: 0} 562 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 563 | m_OnHover: 564 | m_Background: {fileID: 0} 565 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 566 | m_OnActive: 567 | m_Background: {fileID: 0} 568 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 569 | m_OnFocused: 570 | m_Background: {fileID: 0} 571 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 572 | m_Border: 573 | m_Left: 0 574 | m_Right: 0 575 | m_Top: 3 576 | m_Bottom: 3 577 | m_Margin: 578 | m_Left: 4 579 | m_Right: 4 580 | m_Top: 4 581 | m_Bottom: 4 582 | m_Padding: 583 | m_Left: 0 584 | m_Right: 0 585 | m_Top: -1 586 | m_Bottom: -1 587 | m_Overflow: 588 | m_Left: -2 589 | m_Right: -3 590 | m_Top: 0 591 | m_Bottom: 0 592 | m_Font: {fileID: 0} 593 | m_FontSize: 0 594 | m_FontStyle: 0 595 | m_Alignment: 0 596 | m_WordWrap: 0 597 | m_RichText: 1 598 | m_TextClipping: 0 599 | m_ImagePosition: 0 600 | m_ContentOffset: {x: 0, y: 0} 601 | m_FixedWidth: 12 602 | m_FixedHeight: 0 603 | m_StretchWidth: 0 604 | m_StretchHeight: 1 605 | m_verticalSliderThumb: 606 | m_Name: verticalsliderthumb 607 | m_Normal: 608 | m_Background: {fileID: 11011, guid: 0000000000000000e000000000000000, type: 0} 609 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 610 | m_Hover: 611 | m_Background: {fileID: 11012, guid: 0000000000000000e000000000000000, type: 0} 612 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 613 | m_Active: 614 | m_Background: {fileID: 11010, guid: 0000000000000000e000000000000000, type: 0} 615 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 616 | m_Focused: 617 | m_Background: {fileID: 0} 618 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 619 | m_OnNormal: 620 | m_Background: {fileID: 0} 621 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 622 | m_OnHover: 623 | m_Background: {fileID: 0} 624 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 625 | m_OnActive: 626 | m_Background: {fileID: 0} 627 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 628 | m_OnFocused: 629 | m_Background: {fileID: 0} 630 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 631 | m_Border: 632 | m_Left: 0 633 | m_Right: 0 634 | m_Top: 0 635 | m_Bottom: 0 636 | m_Margin: 637 | m_Left: 0 638 | m_Right: 0 639 | m_Top: 0 640 | m_Bottom: 0 641 | m_Padding: 642 | m_Left: 0 643 | m_Right: 0 644 | m_Top: 7 645 | m_Bottom: 7 646 | m_Overflow: 647 | m_Left: 0 648 | m_Right: 0 649 | m_Top: -1 650 | m_Bottom: -1 651 | m_Font: {fileID: 0} 652 | m_FontSize: 0 653 | m_FontStyle: 0 654 | m_Alignment: 0 655 | m_WordWrap: 0 656 | m_RichText: 1 657 | m_TextClipping: 1 658 | m_ImagePosition: 0 659 | m_ContentOffset: {x: 0, y: 0} 660 | m_FixedWidth: 12 661 | m_FixedHeight: 0 662 | m_StretchWidth: 0 663 | m_StretchHeight: 1 664 | m_horizontalScrollbar: 665 | m_Name: horizontalscrollbar 666 | m_Normal: 667 | m_Background: {fileID: 11008, guid: 0000000000000000e000000000000000, type: 0} 668 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 669 | m_Hover: 670 | m_Background: {fileID: 0} 671 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 672 | m_Active: 673 | m_Background: {fileID: 0} 674 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 675 | m_Focused: 676 | m_Background: {fileID: 0} 677 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 678 | m_OnNormal: 679 | m_Background: {fileID: 0} 680 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 681 | m_OnHover: 682 | m_Background: {fileID: 0} 683 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 684 | m_OnActive: 685 | m_Background: {fileID: 0} 686 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 687 | m_OnFocused: 688 | m_Background: {fileID: 0} 689 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 690 | m_Border: 691 | m_Left: 9 692 | m_Right: 9 693 | m_Top: 0 694 | m_Bottom: 0 695 | m_Margin: 696 | m_Left: 4 697 | m_Right: 4 698 | m_Top: 1 699 | m_Bottom: 4 700 | m_Padding: 701 | m_Left: 0 702 | m_Right: 0 703 | m_Top: 0 704 | m_Bottom: 0 705 | m_Overflow: 706 | m_Left: 0 707 | m_Right: 0 708 | m_Top: 0 709 | m_Bottom: 0 710 | m_Font: {fileID: 0} 711 | m_FontSize: 0 712 | m_FontStyle: 0 713 | m_Alignment: 0 714 | m_WordWrap: 0 715 | m_RichText: 1 716 | m_TextClipping: 1 717 | m_ImagePosition: 2 718 | m_ContentOffset: {x: 0, y: 0} 719 | m_FixedWidth: 0 720 | m_FixedHeight: 15 721 | m_StretchWidth: 1 722 | m_StretchHeight: 0 723 | m_horizontalScrollbarThumb: 724 | m_Name: horizontalscrollbarthumb 725 | m_Normal: 726 | m_Background: {fileID: 11007, guid: 0000000000000000e000000000000000, type: 0} 727 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 728 | m_Hover: 729 | m_Background: {fileID: 0} 730 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 731 | m_Active: 732 | m_Background: {fileID: 0} 733 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 734 | m_Focused: 735 | m_Background: {fileID: 0} 736 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 737 | m_OnNormal: 738 | m_Background: {fileID: 0} 739 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 740 | m_OnHover: 741 | m_Background: {fileID: 0} 742 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 743 | m_OnActive: 744 | m_Background: {fileID: 0} 745 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 746 | m_OnFocused: 747 | m_Background: {fileID: 0} 748 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 749 | m_Border: 750 | m_Left: 6 751 | m_Right: 6 752 | m_Top: 6 753 | m_Bottom: 6 754 | m_Margin: 755 | m_Left: 0 756 | m_Right: 0 757 | m_Top: 0 758 | m_Bottom: 0 759 | m_Padding: 760 | m_Left: 6 761 | m_Right: 6 762 | m_Top: 0 763 | m_Bottom: 0 764 | m_Overflow: 765 | m_Left: 0 766 | m_Right: 0 767 | m_Top: -1 768 | m_Bottom: 1 769 | m_Font: {fileID: 0} 770 | m_FontSize: 0 771 | m_FontStyle: 0 772 | m_Alignment: 0 773 | m_WordWrap: 0 774 | m_RichText: 1 775 | m_TextClipping: 1 776 | m_ImagePosition: 0 777 | m_ContentOffset: {x: 0, y: 0} 778 | m_FixedWidth: 0 779 | m_FixedHeight: 13 780 | m_StretchWidth: 1 781 | m_StretchHeight: 0 782 | m_horizontalScrollbarLeftButton: 783 | m_Name: horizontalscrollbarleftbutton 784 | m_Normal: 785 | m_Background: {fileID: 0} 786 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 787 | m_Hover: 788 | m_Background: {fileID: 0} 789 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 790 | m_Active: 791 | m_Background: {fileID: 0} 792 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 793 | m_Focused: 794 | m_Background: {fileID: 0} 795 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 796 | m_OnNormal: 797 | m_Background: {fileID: 0} 798 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 799 | m_OnHover: 800 | m_Background: {fileID: 0} 801 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 802 | m_OnActive: 803 | m_Background: {fileID: 0} 804 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 805 | m_OnFocused: 806 | m_Background: {fileID: 0} 807 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 808 | m_Border: 809 | m_Left: 0 810 | m_Right: 0 811 | m_Top: 0 812 | m_Bottom: 0 813 | m_Margin: 814 | m_Left: 0 815 | m_Right: 0 816 | m_Top: 0 817 | m_Bottom: 0 818 | m_Padding: 819 | m_Left: 0 820 | m_Right: 0 821 | m_Top: 0 822 | m_Bottom: 0 823 | m_Overflow: 824 | m_Left: 0 825 | m_Right: 0 826 | m_Top: 0 827 | m_Bottom: 0 828 | m_Font: {fileID: 0} 829 | m_FontSize: 0 830 | m_FontStyle: 0 831 | m_Alignment: 0 832 | m_WordWrap: 0 833 | m_RichText: 1 834 | m_TextClipping: 1 835 | m_ImagePosition: 0 836 | m_ContentOffset: {x: 0, y: 0} 837 | m_FixedWidth: 0 838 | m_FixedHeight: 0 839 | m_StretchWidth: 1 840 | m_StretchHeight: 0 841 | m_horizontalScrollbarRightButton: 842 | m_Name: horizontalscrollbarrightbutton 843 | m_Normal: 844 | m_Background: {fileID: 0} 845 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 846 | m_Hover: 847 | m_Background: {fileID: 0} 848 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 849 | m_Active: 850 | m_Background: {fileID: 0} 851 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 852 | m_Focused: 853 | m_Background: {fileID: 0} 854 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 855 | m_OnNormal: 856 | m_Background: {fileID: 0} 857 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 858 | m_OnHover: 859 | m_Background: {fileID: 0} 860 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 861 | m_OnActive: 862 | m_Background: {fileID: 0} 863 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 864 | m_OnFocused: 865 | m_Background: {fileID: 0} 866 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 867 | m_Border: 868 | m_Left: 0 869 | m_Right: 0 870 | m_Top: 0 871 | m_Bottom: 0 872 | m_Margin: 873 | m_Left: 0 874 | m_Right: 0 875 | m_Top: 0 876 | m_Bottom: 0 877 | m_Padding: 878 | m_Left: 0 879 | m_Right: 0 880 | m_Top: 0 881 | m_Bottom: 0 882 | m_Overflow: 883 | m_Left: 0 884 | m_Right: 0 885 | m_Top: 0 886 | m_Bottom: 0 887 | m_Font: {fileID: 0} 888 | m_FontSize: 0 889 | m_FontStyle: 0 890 | m_Alignment: 0 891 | m_WordWrap: 0 892 | m_RichText: 1 893 | m_TextClipping: 1 894 | m_ImagePosition: 0 895 | m_ContentOffset: {x: 0, y: 0} 896 | m_FixedWidth: 0 897 | m_FixedHeight: 0 898 | m_StretchWidth: 1 899 | m_StretchHeight: 0 900 | m_verticalScrollbar: 901 | m_Name: verticalscrollbar 902 | m_Normal: 903 | m_Background: {fileID: 11020, guid: 0000000000000000e000000000000000, type: 0} 904 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 905 | m_Hover: 906 | m_Background: {fileID: 0} 907 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 908 | m_Active: 909 | m_Background: {fileID: 0} 910 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 911 | m_Focused: 912 | m_Background: {fileID: 0} 913 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 914 | m_OnNormal: 915 | m_Background: {fileID: 0} 916 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 917 | m_OnHover: 918 | m_Background: {fileID: 0} 919 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 920 | m_OnActive: 921 | m_Background: {fileID: 0} 922 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 923 | m_OnFocused: 924 | m_Background: {fileID: 0} 925 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 926 | m_Border: 927 | m_Left: 0 928 | m_Right: 0 929 | m_Top: 9 930 | m_Bottom: 9 931 | m_Margin: 932 | m_Left: 1 933 | m_Right: 4 934 | m_Top: 4 935 | m_Bottom: 4 936 | m_Padding: 937 | m_Left: 0 938 | m_Right: 0 939 | m_Top: 1 940 | m_Bottom: 1 941 | m_Overflow: 942 | m_Left: 0 943 | m_Right: 0 944 | m_Top: 0 945 | m_Bottom: 0 946 | m_Font: {fileID: 0} 947 | m_FontSize: 0 948 | m_FontStyle: 0 949 | m_Alignment: 0 950 | m_WordWrap: 0 951 | m_RichText: 1 952 | m_TextClipping: 1 953 | m_ImagePosition: 0 954 | m_ContentOffset: {x: 0, y: 0} 955 | m_FixedWidth: 15 956 | m_FixedHeight: 0 957 | m_StretchWidth: 1 958 | m_StretchHeight: 0 959 | m_verticalScrollbarThumb: 960 | m_Name: verticalscrollbarthumb 961 | m_Normal: 962 | m_Background: {fileID: 11019, guid: 0000000000000000e000000000000000, type: 0} 963 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 964 | m_Hover: 965 | m_Background: {fileID: 0} 966 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 967 | m_Active: 968 | m_Background: {fileID: 0} 969 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 970 | m_Focused: 971 | m_Background: {fileID: 0} 972 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 973 | m_OnNormal: 974 | m_Background: {fileID: 0} 975 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 976 | m_OnHover: 977 | m_Background: {fileID: 0} 978 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 979 | m_OnActive: 980 | m_Background: {fileID: 0} 981 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 982 | m_OnFocused: 983 | m_Background: {fileID: 0} 984 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 985 | m_Border: 986 | m_Left: 6 987 | m_Right: 6 988 | m_Top: 6 989 | m_Bottom: 6 990 | m_Margin: 991 | m_Left: 0 992 | m_Right: 0 993 | m_Top: 0 994 | m_Bottom: 0 995 | m_Padding: 996 | m_Left: 0 997 | m_Right: 0 998 | m_Top: 6 999 | m_Bottom: 6 1000 | m_Overflow: 1001 | m_Left: -1 1002 | m_Right: -1 1003 | m_Top: 0 1004 | m_Bottom: 0 1005 | m_Font: {fileID: 0} 1006 | m_FontSize: 0 1007 | m_FontStyle: 0 1008 | m_Alignment: 0 1009 | m_WordWrap: 0 1010 | m_RichText: 1 1011 | m_TextClipping: 1 1012 | m_ImagePosition: 2 1013 | m_ContentOffset: {x: 0, y: 0} 1014 | m_FixedWidth: 15 1015 | m_FixedHeight: 0 1016 | m_StretchWidth: 0 1017 | m_StretchHeight: 1 1018 | m_verticalScrollbarUpButton: 1019 | m_Name: verticalscrollbarupbutton 1020 | m_Normal: 1021 | m_Background: {fileID: 0} 1022 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1023 | m_Hover: 1024 | m_Background: {fileID: 0} 1025 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1026 | m_Active: 1027 | m_Background: {fileID: 0} 1028 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1029 | m_Focused: 1030 | m_Background: {fileID: 0} 1031 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1032 | m_OnNormal: 1033 | m_Background: {fileID: 0} 1034 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1035 | m_OnHover: 1036 | m_Background: {fileID: 0} 1037 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1038 | m_OnActive: 1039 | m_Background: {fileID: 0} 1040 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1041 | m_OnFocused: 1042 | m_Background: {fileID: 0} 1043 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1044 | m_Border: 1045 | m_Left: 0 1046 | m_Right: 0 1047 | m_Top: 0 1048 | m_Bottom: 0 1049 | m_Margin: 1050 | m_Left: 0 1051 | m_Right: 0 1052 | m_Top: 0 1053 | m_Bottom: 0 1054 | m_Padding: 1055 | m_Left: 0 1056 | m_Right: 0 1057 | m_Top: 0 1058 | m_Bottom: 0 1059 | m_Overflow: 1060 | m_Left: 0 1061 | m_Right: 0 1062 | m_Top: 0 1063 | m_Bottom: 0 1064 | m_Font: {fileID: 0} 1065 | m_FontSize: 0 1066 | m_FontStyle: 0 1067 | m_Alignment: 0 1068 | m_WordWrap: 0 1069 | m_RichText: 1 1070 | m_TextClipping: 1 1071 | m_ImagePosition: 0 1072 | m_ContentOffset: {x: 0, y: 0} 1073 | m_FixedWidth: 0 1074 | m_FixedHeight: 0 1075 | m_StretchWidth: 1 1076 | m_StretchHeight: 0 1077 | m_verticalScrollbarDownButton: 1078 | m_Name: verticalscrollbardownbutton 1079 | m_Normal: 1080 | m_Background: {fileID: 0} 1081 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1082 | m_Hover: 1083 | m_Background: {fileID: 0} 1084 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1085 | m_Active: 1086 | m_Background: {fileID: 0} 1087 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1088 | m_Focused: 1089 | m_Background: {fileID: 0} 1090 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1091 | m_OnNormal: 1092 | m_Background: {fileID: 0} 1093 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1094 | m_OnHover: 1095 | m_Background: {fileID: 0} 1096 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1097 | m_OnActive: 1098 | m_Background: {fileID: 0} 1099 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1100 | m_OnFocused: 1101 | m_Background: {fileID: 0} 1102 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1103 | m_Border: 1104 | m_Left: 0 1105 | m_Right: 0 1106 | m_Top: 0 1107 | m_Bottom: 0 1108 | m_Margin: 1109 | m_Left: 0 1110 | m_Right: 0 1111 | m_Top: 0 1112 | m_Bottom: 0 1113 | m_Padding: 1114 | m_Left: 0 1115 | m_Right: 0 1116 | m_Top: 0 1117 | m_Bottom: 0 1118 | m_Overflow: 1119 | m_Left: 0 1120 | m_Right: 0 1121 | m_Top: 0 1122 | m_Bottom: 0 1123 | m_Font: {fileID: 0} 1124 | m_FontSize: 0 1125 | m_FontStyle: 0 1126 | m_Alignment: 0 1127 | m_WordWrap: 0 1128 | m_RichText: 1 1129 | m_TextClipping: 1 1130 | m_ImagePosition: 0 1131 | m_ContentOffset: {x: 0, y: 0} 1132 | m_FixedWidth: 0 1133 | m_FixedHeight: 0 1134 | m_StretchWidth: 1 1135 | m_StretchHeight: 0 1136 | m_ScrollView: 1137 | m_Name: scrollview 1138 | m_Normal: 1139 | m_Background: {fileID: 0} 1140 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1141 | m_Hover: 1142 | m_Background: {fileID: 0} 1143 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1144 | m_Active: 1145 | m_Background: {fileID: 0} 1146 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1147 | m_Focused: 1148 | m_Background: {fileID: 0} 1149 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1150 | m_OnNormal: 1151 | m_Background: {fileID: 0} 1152 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1153 | m_OnHover: 1154 | m_Background: {fileID: 0} 1155 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1156 | m_OnActive: 1157 | m_Background: {fileID: 0} 1158 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1159 | m_OnFocused: 1160 | m_Background: {fileID: 0} 1161 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1162 | m_Border: 1163 | m_Left: 0 1164 | m_Right: 0 1165 | m_Top: 0 1166 | m_Bottom: 0 1167 | m_Margin: 1168 | m_Left: 0 1169 | m_Right: 0 1170 | m_Top: 0 1171 | m_Bottom: 0 1172 | m_Padding: 1173 | m_Left: 0 1174 | m_Right: 0 1175 | m_Top: 0 1176 | m_Bottom: 0 1177 | m_Overflow: 1178 | m_Left: 0 1179 | m_Right: 0 1180 | m_Top: 0 1181 | m_Bottom: 0 1182 | m_Font: {fileID: 0} 1183 | m_FontSize: 0 1184 | m_FontStyle: 0 1185 | m_Alignment: 0 1186 | m_WordWrap: 0 1187 | m_RichText: 1 1188 | m_TextClipping: 1 1189 | m_ImagePosition: 0 1190 | m_ContentOffset: {x: 0, y: 0} 1191 | m_FixedWidth: 0 1192 | m_FixedHeight: 0 1193 | m_StretchWidth: 1 1194 | m_StretchHeight: 0 1195 | m_CustomStyles: 1196 | - m_Name: 1197 | m_Normal: 1198 | m_Background: {fileID: 0} 1199 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1200 | m_Hover: 1201 | m_Background: {fileID: 0} 1202 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1203 | m_Active: 1204 | m_Background: {fileID: 0} 1205 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1206 | m_Focused: 1207 | m_Background: {fileID: 0} 1208 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1209 | m_OnNormal: 1210 | m_Background: {fileID: 0} 1211 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1212 | m_OnHover: 1213 | m_Background: {fileID: 0} 1214 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1215 | m_OnActive: 1216 | m_Background: {fileID: 0} 1217 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1218 | m_OnFocused: 1219 | m_Background: {fileID: 0} 1220 | m_TextColor: {r: 0, g: 0, b: 0, a: 1} 1221 | m_Border: 1222 | m_Left: 0 1223 | m_Right: 0 1224 | m_Top: 0 1225 | m_Bottom: 0 1226 | m_Margin: 1227 | m_Left: 0 1228 | m_Right: 0 1229 | m_Top: 0 1230 | m_Bottom: 0 1231 | m_Padding: 1232 | m_Left: 0 1233 | m_Right: 0 1234 | m_Top: 0 1235 | m_Bottom: 0 1236 | m_Overflow: 1237 | m_Left: 0 1238 | m_Right: 0 1239 | m_Top: 0 1240 | m_Bottom: 0 1241 | m_Font: {fileID: 0} 1242 | m_FontSize: 0 1243 | m_FontStyle: 0 1244 | m_Alignment: 0 1245 | m_WordWrap: 0 1246 | m_RichText: 1 1247 | m_TextClipping: 0 1248 | m_ImagePosition: 0 1249 | m_ContentOffset: {x: 0, y: 0} 1250 | m_FixedWidth: 0 1251 | m_FixedHeight: 0 1252 | m_StretchWidth: 1 1253 | m_StretchHeight: 0 1254 | m_Settings: 1255 | m_DoubleClickSelectsWord: 1 1256 | m_TripleClickSelectsLine: 1 1257 | m_CursorColor: {r: 1, g: 1, b: 1, a: 1} 1258 | m_CursorFlashSpeed: -1 1259 | m_SelectionColor: {r: 0, g: .564705908, b: .823529422, a: .698039234} 1260 | -------------------------------------------------------------------------------- /ExampleGame/Assets/TestUI/TestUISkin.guiskin.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d7fb91a8c54f149948c667b9f0e70c96 3 | NativeFormatImporter: 4 | userData: 5 | assetBundleName: 6 | assetBundleVariant: 7 | -------------------------------------------------------------------------------- /ExampleGame/ProjectSettings/AudioManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!11 &1 4 | AudioManager: 5 | m_ObjectHideFlags: 0 6 | m_Volume: 1 7 | Rolloff Scale: 1 8 | Doppler Factor: 1 9 | Default Speaker Mode: 2 10 | m_SampleRate: 0 11 | m_DSPBufferSize: 0 12 | m_VirtualVoiceCount: 512 13 | m_RealVoiceCount: 32 14 | m_SpatializerPlugin: 15 | m_AmbisonicDecoderPlugin: 16 | m_DisableAudio: 0 17 | m_VirtualizeEffects: 1 18 | -------------------------------------------------------------------------------- /ExampleGame/ProjectSettings/ClusterInputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!236 &1 4 | ClusterInputManager: 5 | m_ObjectHideFlags: 0 6 | m_Inputs: [] 7 | -------------------------------------------------------------------------------- /ExampleGame/ProjectSettings/DynamicsManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!55 &1 4 | PhysicsManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 3 7 | m_Gravity: {x: 0, y: -9.81, z: 0} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_BounceThreshold: 2 10 | m_SleepThreshold: 0.005 11 | m_DefaultContactOffset: 0.01 12 | m_DefaultSolverIterations: 6 13 | m_DefaultSolverVelocityIterations: 1 14 | m_QueriesHitBackfaces: 0 15 | m_QueriesHitTriggers: 1 16 | m_EnableAdaptiveForce: 0 17 | m_EnablePCM: 1 18 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 19 | m_AutoSimulation: 1 20 | -------------------------------------------------------------------------------- /ExampleGame/ProjectSettings/EditorBuildSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1045 &1 4 | EditorBuildSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Scenes: [] 8 | -------------------------------------------------------------------------------- /ExampleGame/ProjectSettings/EditorSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!159 &1 4 | EditorSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 4 7 | m_ExternalVersionControlSupport: Hidden Meta Files 8 | m_SerializationMode: 2 9 | m_DefaultBehaviorMode: 0 10 | m_SpritePackerMode: 0 11 | m_SpritePackerPaddingPower: 1 12 | m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd 13 | m_ProjectGenerationRootNamespace: 14 | m_UserGeneratedProjectSuffix: 15 | m_CollabEditorSettings: 16 | inProgressEnabled: 1 17 | -------------------------------------------------------------------------------- /ExampleGame/ProjectSettings/GraphicsSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!30 &1 4 | GraphicsSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 12 7 | m_Deferred: 8 | m_Mode: 1 9 | m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} 10 | m_DeferredReflections: 11 | m_Mode: 1 12 | m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} 13 | m_ScreenSpaceShadows: 14 | m_Mode: 1 15 | m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} 16 | m_LegacyDeferred: 17 | m_Mode: 1 18 | m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} 19 | m_DepthNormals: 20 | m_Mode: 1 21 | m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} 22 | m_MotionVectors: 23 | m_Mode: 1 24 | m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} 25 | m_LightHalo: 26 | m_Mode: 1 27 | m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} 28 | m_LensFlare: 29 | m_Mode: 1 30 | m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} 31 | m_AlwaysIncludedShaders: [] 32 | m_PreloadedShaders: [] 33 | m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, 34 | type: 0} 35 | m_CustomRenderPipeline: {fileID: 0} 36 | m_TransparencySortMode: 0 37 | m_TransparencySortAxis: {x: 0, y: 0, z: 1} 38 | m_DefaultRenderingPath: 1 39 | m_DefaultMobileRenderingPath: 1 40 | m_TierSettings: [] 41 | m_LightmapStripping: 0 42 | m_FogStripping: 0 43 | m_InstancingStripping: 0 44 | m_LightmapKeepPlain: 1 45 | m_LightmapKeepDirCombined: 1 46 | m_LightmapKeepDynamicPlain: 1 47 | m_LightmapKeepDynamicDirCombined: 1 48 | m_LightmapKeepShadowMask: 1 49 | m_LightmapKeepSubtractive: 1 50 | m_FogKeepLinear: 1 51 | m_FogKeepExp: 1 52 | m_FogKeepExp2: 1 53 | m_AlbedoSwatchInfos: [] 54 | m_LightsUseLinearIntensity: 0 55 | m_LightsUseColorTemperature: 0 56 | -------------------------------------------------------------------------------- /ExampleGame/ProjectSettings/InputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!13 &1 4 | InputManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Axes: 8 | - serializedVersion: 3 9 | m_Name: Horizontal 10 | descriptiveName: 11 | descriptiveNegativeName: 12 | negativeButton: left 13 | positiveButton: right 14 | altNegativeButton: a 15 | altPositiveButton: d 16 | gravity: 3 17 | dead: 0.001 18 | sensitivity: 3 19 | snap: 1 20 | invert: 0 21 | type: 0 22 | axis: 0 23 | joyNum: 0 24 | - serializedVersion: 3 25 | m_Name: Vertical 26 | descriptiveName: 27 | descriptiveNegativeName: 28 | negativeButton: down 29 | positiveButton: up 30 | altNegativeButton: s 31 | altPositiveButton: w 32 | gravity: 3 33 | dead: 0.001 34 | sensitivity: 3 35 | snap: 1 36 | invert: 0 37 | type: 0 38 | axis: 0 39 | joyNum: 0 40 | - serializedVersion: 3 41 | m_Name: Fire1 42 | descriptiveName: 43 | descriptiveNegativeName: 44 | negativeButton: 45 | positiveButton: left ctrl 46 | altNegativeButton: 47 | altPositiveButton: mouse 0 48 | gravity: 1000 49 | dead: 0.001 50 | sensitivity: 1000 51 | snap: 0 52 | invert: 0 53 | type: 0 54 | axis: 0 55 | joyNum: 0 56 | - serializedVersion: 3 57 | m_Name: Fire2 58 | descriptiveName: 59 | descriptiveNegativeName: 60 | negativeButton: 61 | positiveButton: left alt 62 | altNegativeButton: 63 | altPositiveButton: mouse 1 64 | gravity: 1000 65 | dead: 0.001 66 | sensitivity: 1000 67 | snap: 0 68 | invert: 0 69 | type: 0 70 | axis: 0 71 | joyNum: 0 72 | - serializedVersion: 3 73 | m_Name: Fire3 74 | descriptiveName: 75 | descriptiveNegativeName: 76 | negativeButton: 77 | positiveButton: left cmd 78 | altNegativeButton: 79 | altPositiveButton: mouse 2 80 | gravity: 1000 81 | dead: 0.001 82 | sensitivity: 1000 83 | snap: 0 84 | invert: 0 85 | type: 0 86 | axis: 0 87 | joyNum: 0 88 | - serializedVersion: 3 89 | m_Name: Jump 90 | descriptiveName: 91 | descriptiveNegativeName: 92 | negativeButton: 93 | positiveButton: space 94 | altNegativeButton: 95 | altPositiveButton: 96 | gravity: 1000 97 | dead: 0.001 98 | sensitivity: 1000 99 | snap: 0 100 | invert: 0 101 | type: 0 102 | axis: 0 103 | joyNum: 0 104 | - serializedVersion: 3 105 | m_Name: Mouse X 106 | descriptiveName: 107 | descriptiveNegativeName: 108 | negativeButton: 109 | positiveButton: 110 | altNegativeButton: 111 | altPositiveButton: 112 | gravity: 0 113 | dead: 0 114 | sensitivity: 0.1 115 | snap: 0 116 | invert: 0 117 | type: 1 118 | axis: 0 119 | joyNum: 0 120 | - serializedVersion: 3 121 | m_Name: Mouse Y 122 | descriptiveName: 123 | descriptiveNegativeName: 124 | negativeButton: 125 | positiveButton: 126 | altNegativeButton: 127 | altPositiveButton: 128 | gravity: 0 129 | dead: 0 130 | sensitivity: 0.1 131 | snap: 0 132 | invert: 0 133 | type: 1 134 | axis: 1 135 | joyNum: 0 136 | - serializedVersion: 3 137 | m_Name: Mouse ScrollWheel 138 | descriptiveName: 139 | descriptiveNegativeName: 140 | negativeButton: 141 | positiveButton: 142 | altNegativeButton: 143 | altPositiveButton: 144 | gravity: 0 145 | dead: 0 146 | sensitivity: 0.1 147 | snap: 0 148 | invert: 0 149 | type: 1 150 | axis: 2 151 | joyNum: 0 152 | - serializedVersion: 3 153 | m_Name: Horizontal 154 | descriptiveName: 155 | descriptiveNegativeName: 156 | negativeButton: 157 | positiveButton: 158 | altNegativeButton: 159 | altPositiveButton: 160 | gravity: 0 161 | dead: 0.19 162 | sensitivity: 1 163 | snap: 0 164 | invert: 0 165 | type: 2 166 | axis: 0 167 | joyNum: 0 168 | - serializedVersion: 3 169 | m_Name: Vertical 170 | descriptiveName: 171 | descriptiveNegativeName: 172 | negativeButton: 173 | positiveButton: 174 | altNegativeButton: 175 | altPositiveButton: 176 | gravity: 0 177 | dead: 0.19 178 | sensitivity: 1 179 | snap: 0 180 | invert: 1 181 | type: 2 182 | axis: 1 183 | joyNum: 0 184 | - serializedVersion: 3 185 | m_Name: Fire1 186 | descriptiveName: 187 | descriptiveNegativeName: 188 | negativeButton: 189 | positiveButton: joystick button 0 190 | altNegativeButton: 191 | altPositiveButton: 192 | gravity: 1000 193 | dead: 0.001 194 | sensitivity: 1000 195 | snap: 0 196 | invert: 0 197 | type: 0 198 | axis: 0 199 | joyNum: 0 200 | - serializedVersion: 3 201 | m_Name: Fire2 202 | descriptiveName: 203 | descriptiveNegativeName: 204 | negativeButton: 205 | positiveButton: joystick button 1 206 | altNegativeButton: 207 | altPositiveButton: 208 | gravity: 1000 209 | dead: 0.001 210 | sensitivity: 1000 211 | snap: 0 212 | invert: 0 213 | type: 0 214 | axis: 0 215 | joyNum: 0 216 | - serializedVersion: 3 217 | m_Name: Fire3 218 | descriptiveName: 219 | descriptiveNegativeName: 220 | negativeButton: 221 | positiveButton: joystick button 2 222 | altNegativeButton: 223 | altPositiveButton: 224 | gravity: 1000 225 | dead: 0.001 226 | sensitivity: 1000 227 | snap: 0 228 | invert: 0 229 | type: 0 230 | axis: 0 231 | joyNum: 0 232 | - serializedVersion: 3 233 | m_Name: Jump 234 | descriptiveName: 235 | descriptiveNegativeName: 236 | negativeButton: 237 | positiveButton: joystick button 3 238 | altNegativeButton: 239 | altPositiveButton: 240 | gravity: 1000 241 | dead: 0.001 242 | sensitivity: 1000 243 | snap: 0 244 | invert: 0 245 | type: 0 246 | axis: 0 247 | joyNum: 0 248 | - serializedVersion: 3 249 | m_Name: Submit 250 | descriptiveName: 251 | descriptiveNegativeName: 252 | negativeButton: 253 | positiveButton: return 254 | altNegativeButton: 255 | altPositiveButton: joystick button 0 256 | gravity: 1000 257 | dead: 0.001 258 | sensitivity: 1000 259 | snap: 0 260 | invert: 0 261 | type: 0 262 | axis: 0 263 | joyNum: 0 264 | - serializedVersion: 3 265 | m_Name: Submit 266 | descriptiveName: 267 | descriptiveNegativeName: 268 | negativeButton: 269 | positiveButton: enter 270 | altNegativeButton: 271 | altPositiveButton: space 272 | gravity: 1000 273 | dead: 0.001 274 | sensitivity: 1000 275 | snap: 0 276 | invert: 0 277 | type: 0 278 | axis: 0 279 | joyNum: 0 280 | - serializedVersion: 3 281 | m_Name: Cancel 282 | descriptiveName: 283 | descriptiveNegativeName: 284 | negativeButton: 285 | positiveButton: escape 286 | altNegativeButton: 287 | altPositiveButton: joystick button 1 288 | gravity: 1000 289 | dead: 0.001 290 | sensitivity: 1000 291 | snap: 0 292 | invert: 0 293 | type: 0 294 | axis: 0 295 | joyNum: 0 296 | -------------------------------------------------------------------------------- /ExampleGame/ProjectSettings/NavMeshAreas.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!126 &1 4 | NavMeshProjectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | areas: 8 | - name: Walkable 9 | cost: 1 10 | - name: Not Walkable 11 | cost: 1 12 | - name: Jump 13 | cost: 2 14 | - name: 15 | cost: 1 16 | - name: 17 | cost: 1 18 | - name: 19 | cost: 1 20 | - name: 21 | cost: 1 22 | - name: 23 | cost: 1 24 | - name: 25 | cost: 1 26 | - name: 27 | cost: 1 28 | - name: 29 | cost: 1 30 | - name: 31 | cost: 1 32 | - name: 33 | cost: 1 34 | - name: 35 | cost: 1 36 | - name: 37 | cost: 1 38 | - name: 39 | cost: 1 40 | - name: 41 | cost: 1 42 | - name: 43 | cost: 1 44 | - name: 45 | cost: 1 46 | - name: 47 | cost: 1 48 | - name: 49 | cost: 1 50 | - name: 51 | cost: 1 52 | - name: 53 | cost: 1 54 | - name: 55 | cost: 1 56 | - name: 57 | cost: 1 58 | - name: 59 | cost: 1 60 | - name: 61 | cost: 1 62 | - name: 63 | cost: 1 64 | - name: 65 | cost: 1 66 | - name: 67 | cost: 1 68 | - name: 69 | cost: 1 70 | - name: 71 | cost: 1 72 | m_LastAgentTypeID: -887442657 73 | m_Settings: 74 | - serializedVersion: 2 75 | agentTypeID: 0 76 | agentRadius: 0.5 77 | agentHeight: 2 78 | agentSlope: 45 79 | agentClimb: 0.75 80 | ledgeDropHeight: 0 81 | maxJumpAcrossDistance: 0 82 | minRegionArea: 2 83 | manualCellSize: 0 84 | cellSize: 0.16666667 85 | manualTileSize: 0 86 | tileSize: 256 87 | accuratePlacement: 0 88 | m_SettingNames: 89 | - Humanoid 90 | -------------------------------------------------------------------------------- /ExampleGame/ProjectSettings/NavMeshLayers.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/ExampleGame/ProjectSettings/NavMeshLayers.asset -------------------------------------------------------------------------------- /ExampleGame/ProjectSettings/NetworkManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!149 &1 4 | NetworkManager: 5 | m_ObjectHideFlags: 0 6 | m_DebugLevel: 0 7 | m_Sendrate: 15 8 | m_AssetToPrefab: {} 9 | -------------------------------------------------------------------------------- /ExampleGame/ProjectSettings/Physics2DSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!19 &1 4 | Physics2DSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 3 7 | m_Gravity: {x: 0, y: -9.81} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_VelocityIterations: 8 10 | m_PositionIterations: 3 11 | m_VelocityThreshold: 1 12 | m_MaxLinearCorrection: 0.2 13 | m_MaxAngularCorrection: 8 14 | m_MaxTranslationSpeed: 100 15 | m_MaxRotationSpeed: 360 16 | m_BaumgarteScale: 0.2 17 | m_BaumgarteTimeOfImpactScale: 0.75 18 | m_TimeToSleep: 0.5 19 | m_LinearSleepTolerance: 0.01 20 | m_AngularSleepTolerance: 2 21 | m_DefaultContactOffset: 0.01 22 | m_AutoSimulation: 1 23 | m_QueriesHitTriggers: 1 24 | m_QueriesStartInColliders: 1 25 | m_ChangeStopsCallbacks: 0 26 | m_CallbacksOnDisable: 1 27 | m_AlwaysShowColliders: 0 28 | m_ShowColliderSleep: 1 29 | m_ShowColliderContacts: 0 30 | m_ShowColliderAABB: 0 31 | m_ContactArrowScale: 0.2 32 | m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} 33 | m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} 34 | m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} 35 | m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} 36 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 37 | -------------------------------------------------------------------------------- /ExampleGame/ProjectSettings/ProjectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!129 &1 4 | PlayerSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 12 7 | productGUID: 730ed430fcb9342ce9e02324477fc1f7 8 | AndroidProfiler: 0 9 | defaultScreenOrientation: 4 10 | targetDevice: 2 11 | useOnDemandResources: 0 12 | accelerometerFrequency: 60 13 | companyName: DefaultCompany 14 | productName: ExampleGame 15 | defaultCursor: {fileID: 0} 16 | cursorHotspot: {x: 0, y: 0} 17 | m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} 18 | m_ShowUnitySplashScreen: 1 19 | m_ShowUnitySplashLogo: 1 20 | m_SplashScreenOverlayOpacity: 1 21 | m_SplashScreenAnimation: 1 22 | m_SplashScreenLogoStyle: 1 23 | m_SplashScreenDrawMode: 0 24 | m_SplashScreenBackgroundAnimationZoom: 1 25 | m_SplashScreenLogoAnimationZoom: 1 26 | m_SplashScreenBackgroundLandscapeAspect: 1 27 | m_SplashScreenBackgroundPortraitAspect: 1 28 | m_SplashScreenBackgroundLandscapeUvs: 29 | serializedVersion: 2 30 | x: 0 31 | y: 0 32 | width: 1 33 | height: 1 34 | m_SplashScreenBackgroundPortraitUvs: 35 | serializedVersion: 2 36 | x: 0 37 | y: 0 38 | width: 1 39 | height: 1 40 | m_SplashScreenLogos: [] 41 | m_SplashScreenBackgroundLandscape: {fileID: 0} 42 | m_SplashScreenBackgroundPortrait: {fileID: 0} 43 | m_VirtualRealitySplashScreen: {fileID: 0} 44 | m_HolographicTrackingLossScreen: {fileID: 0} 45 | defaultScreenWidth: 1024 46 | defaultScreenHeight: 768 47 | defaultScreenWidthWeb: 960 48 | defaultScreenHeightWeb: 600 49 | m_StereoRenderingPath: 0 50 | m_ActiveColorSpace: 0 51 | m_MTRendering: 1 52 | m_MobileMTRendering: 0 53 | m_StackTraceTypes: 010000000100000001000000010000000100000001000000 54 | iosShowActivityIndicatorOnLoading: -1 55 | androidShowActivityIndicatorOnLoading: -1 56 | tizenShowActivityIndicatorOnLoading: -1 57 | iosAppInBackgroundBehavior: 0 58 | displayResolutionDialog: 1 59 | iosAllowHTTPDownload: 1 60 | allowedAutorotateToPortrait: 1 61 | allowedAutorotateToPortraitUpsideDown: 1 62 | allowedAutorotateToLandscapeRight: 1 63 | allowedAutorotateToLandscapeLeft: 1 64 | useOSAutorotation: 1 65 | use32BitDisplayBuffer: 1 66 | disableDepthAndStencilBuffers: 0 67 | defaultIsFullScreen: 1 68 | defaultIsNativeResolution: 1 69 | runInBackground: 0 70 | captureSingleScreen: 0 71 | muteOtherAudioSources: 0 72 | Prepare IOS For Recording: 0 73 | Force IOS Speakers When Recording: 0 74 | submitAnalytics: 1 75 | usePlayerLog: 1 76 | bakeCollisionMeshes: 0 77 | forceSingleInstance: 0 78 | resizableWindow: 0 79 | useMacAppStoreValidation: 0 80 | macAppStoreCategory: public.app-category.games 81 | gpuSkinning: 0 82 | graphicsJobs: 0 83 | xboxPIXTextureCapture: 0 84 | xboxEnableAvatar: 0 85 | xboxEnableKinect: 0 86 | xboxEnableKinectAutoTracking: 0 87 | xboxEnableFitness: 0 88 | visibleInBackground: 0 89 | allowFullscreenSwitch: 1 90 | graphicsJobMode: 0 91 | macFullscreenMode: 2 92 | d3d9FullscreenMode: 1 93 | d3d11FullscreenMode: 1 94 | xboxSpeechDB: 0 95 | xboxEnableHeadOrientation: 0 96 | xboxEnableGuest: 0 97 | xboxEnablePIXSampling: 0 98 | n3dsDisableStereoscopicView: 0 99 | n3dsEnableSharedListOpt: 1 100 | n3dsEnableVSync: 0 101 | ignoreAlphaClear: 0 102 | xboxOneResolution: 0 103 | xboxOneMonoLoggingLevel: 0 104 | xboxOneLoggingLevel: 1 105 | xboxOneDisableEsram: 0 106 | videoMemoryForVertexBuffers: 0 107 | psp2PowerMode: 0 108 | psp2AcquireBGM: 1 109 | wiiUTVResolution: 0 110 | wiiUGamePadMSAA: 1 111 | wiiUSupportsNunchuk: 0 112 | wiiUSupportsClassicController: 0 113 | wiiUSupportsBalanceBoard: 0 114 | wiiUSupportsMotionPlus: 0 115 | wiiUSupportsProController: 0 116 | wiiUAllowScreenCapture: 1 117 | wiiUControllerCount: 0 118 | m_SupportedAspectRatios: 119 | 4:3: 1 120 | 5:4: 1 121 | 16:10: 1 122 | 16:9: 1 123 | Others: 1 124 | bundleVersion: 5.0.1 125 | preloadedAssets: [] 126 | metroInputSource: 0 127 | m_HolographicPauseOnTrackingLoss: 1 128 | xboxOneDisableKinectGpuReservation: 0 129 | xboxOneEnable7thCore: 0 130 | vrSettings: 131 | cardboard: 132 | depthFormat: 0 133 | enableTransitionView: 0 134 | daydream: 135 | depthFormat: 0 136 | useSustainedPerformanceMode: 0 137 | hololens: 138 | depthFormat: 1 139 | protectGraphicsMemory: 0 140 | useHDRDisplay: 0 141 | targetPixelDensity: 0 142 | resolutionScalingMode: 0 143 | applicationIdentifier: 144 | Android: com.Company.ProductName 145 | Standalone: unity.DefaultCompany.ExampleGame 146 | Tizen: com.Company.ProductName 147 | iOS: com.Company.ProductName 148 | tvOS: com.Company.ProductName 149 | buildNumber: 150 | iOS: 151 | AndroidBundleVersionCode: 18 152 | AndroidMinSdkVersion: 16 153 | AndroidTargetSdkVersion: 0 154 | AndroidPreferredInstallLocation: 1 155 | aotOptions: 156 | stripEngineCode: 1 157 | iPhoneStrippingLevel: 0 158 | iPhoneScriptCallOptimization: 0 159 | ForceInternetPermission: 0 160 | ForceSDCardPermission: 0 161 | CreateWallpaper: 0 162 | APKExpansionFiles: 0 163 | keepLoadedShadersAlive: 0 164 | StripUnusedMeshComponents: 0 165 | VertexChannelCompressionMask: 166 | serializedVersion: 2 167 | m_Bits: 238 168 | iPhoneSdkVersion: 988 169 | iOSTargetOSVersionString: 6.0 170 | tvOSSdkVersion: 0 171 | tvOSRequireExtendedGameController: 0 172 | tvOSTargetOSVersionString: 173 | uIPrerenderedIcon: 0 174 | uIRequiresPersistentWiFi: 0 175 | uIRequiresFullScreen: 1 176 | uIStatusBarHidden: 1 177 | uIExitOnSuspend: 0 178 | uIStatusBarStyle: 0 179 | iPhoneSplashScreen: {fileID: 0} 180 | iPhoneHighResSplashScreen: {fileID: 0} 181 | iPhoneTallHighResSplashScreen: {fileID: 0} 182 | iPhone47inSplashScreen: {fileID: 0} 183 | iPhone55inPortraitSplashScreen: {fileID: 0} 184 | iPhone55inLandscapeSplashScreen: {fileID: 0} 185 | iPadPortraitSplashScreen: {fileID: 0} 186 | iPadHighResPortraitSplashScreen: {fileID: 0} 187 | iPadLandscapeSplashScreen: {fileID: 0} 188 | iPadHighResLandscapeSplashScreen: {fileID: 0} 189 | appleTVSplashScreen: {fileID: 0} 190 | tvOSSmallIconLayers: [] 191 | tvOSLargeIconLayers: [] 192 | tvOSTopShelfImageLayers: [] 193 | tvOSTopShelfImageWideLayers: [] 194 | iOSLaunchScreenType: 0 195 | iOSLaunchScreenPortrait: {fileID: 0} 196 | iOSLaunchScreenLandscape: {fileID: 0} 197 | iOSLaunchScreenBackgroundColor: 198 | serializedVersion: 2 199 | rgba: 0 200 | iOSLaunchScreenFillPct: 1 201 | iOSLaunchScreenSize: 100 202 | iOSLaunchScreenCustomXibPath: 203 | iOSLaunchScreeniPadType: 0 204 | iOSLaunchScreeniPadImage: {fileID: 0} 205 | iOSLaunchScreeniPadBackgroundColor: 206 | serializedVersion: 2 207 | rgba: 0 208 | iOSLaunchScreeniPadFillPct: 100 209 | iOSLaunchScreeniPadSize: 100 210 | iOSLaunchScreeniPadCustomXibPath: 211 | iOSDeviceRequirements: [] 212 | iOSURLSchemes: [] 213 | iOSBackgroundModes: 0 214 | iOSMetalForceHardShadows: 0 215 | metalEditorSupport: 0 216 | metalAPIValidation: 1 217 | iOSRenderExtraFrameOnPause: 1 218 | appleDeveloperTeamID: 219 | iOSManualSigningProvisioningProfileID: 220 | tvOSManualSigningProvisioningProfileID: 221 | appleEnableAutomaticSigning: 0 222 | AndroidTargetDevice: 0 223 | AndroidSplashScreenScale: 0 224 | androidSplashScreen: {fileID: 0} 225 | AndroidKeystoreName: 226 | AndroidKeyaliasName: 227 | AndroidTVCompatibility: 1 228 | AndroidIsGame: 1 229 | androidEnableBanner: 1 230 | m_AndroidBanners: 231 | - width: 320 232 | height: 180 233 | banner: {fileID: 0} 234 | androidGamepadSupportLevel: 0 235 | resolutionDialogBanner: {fileID: 0} 236 | m_BuildTargetIcons: 237 | - m_BuildTarget: 238 | m_Icons: 239 | - serializedVersion: 2 240 | m_Icon: {fileID: 0} 241 | m_Width: 128 242 | m_Height: 128 243 | m_BuildTargetBatching: [] 244 | m_BuildTargetGraphicsAPIs: [] 245 | m_BuildTargetVRSettings: 246 | - m_BuildTarget: Android 247 | m_Enabled: 0 248 | m_Devices: [] 249 | openGLRequireES31: 0 250 | openGLRequireES31AEP: 0 251 | webPlayerTemplate: APPLICATION:Default 252 | m_TemplateCustomTags: {} 253 | wiiUTitleID: 0005000011000000 254 | wiiUGroupID: 00010000 255 | wiiUCommonSaveSize: 4096 256 | wiiUAccountSaveSize: 2048 257 | wiiUOlvAccessKey: 0 258 | wiiUTinCode: 0 259 | wiiUJoinGameId: 0 260 | wiiUJoinGameModeMask: 0000000000000000 261 | wiiUCommonBossSize: 0 262 | wiiUAccountBossSize: 0 263 | wiiUAddOnUniqueIDs: [] 264 | wiiUMainThreadStackSize: 3072 265 | wiiULoaderThreadStackSize: 1024 266 | wiiUSystemHeapSize: 128 267 | wiiUTVStartupScreen: {fileID: 0} 268 | wiiUGamePadStartupScreen: {fileID: 0} 269 | wiiUDrcBufferDisabled: 0 270 | wiiUProfilerLibPath: 271 | playModeTestRunnerEnabled: 0 272 | actionOnDotNetUnhandledException: 1 273 | enableInternalProfiler: 0 274 | logObjCUncaughtExceptions: 1 275 | enableCrashReportAPI: 0 276 | cameraUsageDescription: 277 | locationUsageDescription: 278 | microphoneUsageDescription: 279 | switchNetLibKey: 280 | switchSocketMemoryPoolSize: 6144 281 | switchSocketAllocatorPoolSize: 128 282 | switchSocketConcurrencyLimit: 14 283 | switchScreenResolutionBehavior: 2 284 | switchUseCPUProfiler: 0 285 | switchApplicationID: 0x01004b9000490000 286 | switchNSODependencies: 287 | switchTitleNames_0: 288 | switchTitleNames_1: 289 | switchTitleNames_2: 290 | switchTitleNames_3: 291 | switchTitleNames_4: 292 | switchTitleNames_5: 293 | switchTitleNames_6: 294 | switchTitleNames_7: 295 | switchTitleNames_8: 296 | switchTitleNames_9: 297 | switchTitleNames_10: 298 | switchTitleNames_11: 299 | switchPublisherNames_0: 300 | switchPublisherNames_1: 301 | switchPublisherNames_2: 302 | switchPublisherNames_3: 303 | switchPublisherNames_4: 304 | switchPublisherNames_5: 305 | switchPublisherNames_6: 306 | switchPublisherNames_7: 307 | switchPublisherNames_8: 308 | switchPublisherNames_9: 309 | switchPublisherNames_10: 310 | switchPublisherNames_11: 311 | switchIcons_0: {fileID: 0} 312 | switchIcons_1: {fileID: 0} 313 | switchIcons_2: {fileID: 0} 314 | switchIcons_3: {fileID: 0} 315 | switchIcons_4: {fileID: 0} 316 | switchIcons_5: {fileID: 0} 317 | switchIcons_6: {fileID: 0} 318 | switchIcons_7: {fileID: 0} 319 | switchIcons_8: {fileID: 0} 320 | switchIcons_9: {fileID: 0} 321 | switchIcons_10: {fileID: 0} 322 | switchIcons_11: {fileID: 0} 323 | switchSmallIcons_0: {fileID: 0} 324 | switchSmallIcons_1: {fileID: 0} 325 | switchSmallIcons_2: {fileID: 0} 326 | switchSmallIcons_3: {fileID: 0} 327 | switchSmallIcons_4: {fileID: 0} 328 | switchSmallIcons_5: {fileID: 0} 329 | switchSmallIcons_6: {fileID: 0} 330 | switchSmallIcons_7: {fileID: 0} 331 | switchSmallIcons_8: {fileID: 0} 332 | switchSmallIcons_9: {fileID: 0} 333 | switchSmallIcons_10: {fileID: 0} 334 | switchSmallIcons_11: {fileID: 0} 335 | switchManualHTML: 336 | switchAccessibleURLs: 337 | switchLegalInformation: 338 | switchMainThreadStackSize: 1048576 339 | switchPresenceGroupId: 340 | switchLogoHandling: 0 341 | switchReleaseVersion: 0 342 | switchDisplayVersion: 1.0.0 343 | switchStartupUserAccount: 0 344 | switchTouchScreenUsage: 0 345 | switchSupportedLanguagesMask: 0 346 | switchLogoType: 0 347 | switchApplicationErrorCodeCategory: 348 | switchUserAccountSaveDataSize: 0 349 | switchUserAccountSaveDataJournalSize: 0 350 | switchApplicationAttribute: 0 351 | switchCardSpecSize: -1 352 | switchCardSpecClock: -1 353 | switchRatingsMask: 0 354 | switchRatingsInt_0: 0 355 | switchRatingsInt_1: 0 356 | switchRatingsInt_2: 0 357 | switchRatingsInt_3: 0 358 | switchRatingsInt_4: 0 359 | switchRatingsInt_5: 0 360 | switchRatingsInt_6: 0 361 | switchRatingsInt_7: 0 362 | switchRatingsInt_8: 0 363 | switchRatingsInt_9: 0 364 | switchRatingsInt_10: 0 365 | switchRatingsInt_11: 0 366 | switchLocalCommunicationIds_0: 367 | switchLocalCommunicationIds_1: 368 | switchLocalCommunicationIds_2: 369 | switchLocalCommunicationIds_3: 370 | switchLocalCommunicationIds_4: 371 | switchLocalCommunicationIds_5: 372 | switchLocalCommunicationIds_6: 373 | switchLocalCommunicationIds_7: 374 | switchParentalControl: 0 375 | switchAllowsScreenshot: 1 376 | switchDataLossConfirmation: 0 377 | switchSupportedNpadStyles: 3 378 | switchSocketConfigEnabled: 0 379 | switchTcpInitialSendBufferSize: 32 380 | switchTcpInitialReceiveBufferSize: 64 381 | switchTcpAutoSendBufferSizeMax: 256 382 | switchTcpAutoReceiveBufferSizeMax: 256 383 | switchUdpSendBufferSize: 9 384 | switchUdpReceiveBufferSize: 42 385 | switchSocketBufferEfficiency: 4 386 | ps4NPAgeRating: 12 387 | ps4NPTitleSecret: 388 | ps4NPTrophyPackPath: 389 | ps4ParentalLevel: 1 390 | ps4ContentID: ED1633-NPXX51362_00-0000000000000000 391 | ps4Category: 0 392 | ps4MasterVersion: 01.00 393 | ps4AppVersion: 01.00 394 | ps4AppType: 0 395 | ps4ParamSfxPath: 396 | ps4VideoOutPixelFormat: 0 397 | ps4VideoOutInitialWidth: 1920 398 | ps4VideoOutBaseModeInitialWidth: 1920 399 | ps4VideoOutReprojectionRate: 120 400 | ps4PronunciationXMLPath: 401 | ps4PronunciationSIGPath: 402 | ps4BackgroundImagePath: 403 | ps4StartupImagePath: 404 | ps4SaveDataImagePath: 405 | ps4SdkOverride: 406 | ps4BGMPath: 407 | ps4ShareFilePath: 408 | ps4ShareOverlayImagePath: 409 | ps4PrivacyGuardImagePath: 410 | ps4NPtitleDatPath: 411 | ps4RemotePlayKeyAssignment: -1 412 | ps4RemotePlayKeyMappingDir: 413 | ps4PlayTogetherPlayerCount: 0 414 | ps4EnterButtonAssignment: 1 415 | ps4ApplicationParam1: 0 416 | ps4ApplicationParam2: 0 417 | ps4ApplicationParam3: 0 418 | ps4ApplicationParam4: 0 419 | ps4DownloadDataSize: 0 420 | ps4GarlicHeapSize: 2048 421 | ps4ProGarlicHeapSize: 2560 422 | ps4Passcode: 15SyFFYzQzudR6JQDGnnl7UutNHhZECv 423 | ps4pnSessions: 1 424 | ps4pnPresence: 1 425 | ps4pnFriends: 1 426 | ps4pnGameCustomData: 1 427 | playerPrefsSupport: 0 428 | restrictedAudioUsageRights: 0 429 | ps4UseResolutionFallback: 0 430 | ps4ReprojectionSupport: 0 431 | ps4UseAudio3dBackend: 0 432 | ps4SocialScreenEnabled: 0 433 | ps4ScriptOptimizationLevel: 3 434 | ps4Audio3dVirtualSpeakerCount: 14 435 | ps4attribCpuUsage: 0 436 | ps4PatchPkgPath: 437 | ps4PatchLatestPkgPath: 438 | ps4PatchChangeinfoPath: 439 | ps4PatchDayOne: 0 440 | ps4attribUserManagement: 0 441 | ps4attribMoveSupport: 0 442 | ps4attrib3DSupport: 0 443 | ps4attribShareSupport: 0 444 | ps4attribExclusiveVR: 0 445 | ps4disableAutoHideSplash: 0 446 | ps4videoRecordingFeaturesUsed: 0 447 | ps4contentSearchFeaturesUsed: 0 448 | ps4attribEyeToEyeDistanceSettingVR: 0 449 | ps4IncludedModules: [] 450 | monoEnv: 451 | psp2Splashimage: {fileID: 0} 452 | psp2NPTrophyPackPath: 453 | psp2NPSupportGBMorGJP: 0 454 | psp2NPAgeRating: 12 455 | psp2NPTitleDatPath: 456 | psp2NPCommsID: 457 | psp2NPCommunicationsID: 458 | psp2NPCommsPassphrase: 459 | psp2NPCommsSig: 460 | psp2ParamSfxPath: 461 | psp2ManualPath: 462 | psp2LiveAreaGatePath: 463 | psp2LiveAreaBackroundPath: 464 | psp2LiveAreaPath: 465 | psp2LiveAreaTrialPath: 466 | psp2PatchChangeInfoPath: 467 | psp2PatchOriginalPackage: 468 | psp2PackagePassword: vnj9rgXqbQNm9xjd7HD0xRC5QpyhKMPs 469 | psp2KeystoneFile: 470 | psp2MemoryExpansionMode: 0 471 | psp2DRMType: 0 472 | psp2StorageType: 0 473 | psp2MediaCapacity: 0 474 | psp2DLCConfigPath: 475 | psp2ThumbnailPath: 476 | psp2BackgroundPath: 477 | psp2SoundPath: 478 | psp2TrophyCommId: 479 | psp2TrophyPackagePath: 480 | psp2PackagedResourcesPath: 481 | psp2SaveDataQuota: 10240 482 | psp2ParentalLevel: 1 483 | psp2ShortTitle: Not Set 484 | psp2ContentID: IV0000-ABCD12345_00-0123456789ABCDEF 485 | psp2Category: 0 486 | psp2MasterVersion: 01.00 487 | psp2AppVersion: 01.00 488 | psp2TVBootMode: 0 489 | psp2EnterButtonAssignment: 2 490 | psp2TVDisableEmu: 0 491 | psp2AllowTwitterDialog: 1 492 | psp2Upgradable: 0 493 | psp2HealthWarning: 0 494 | psp2UseLibLocation: 0 495 | psp2InfoBarOnStartup: 0 496 | psp2InfoBarColor: 0 497 | psp2ScriptOptimizationLevel: 0 498 | psmSplashimage: {fileID: 0} 499 | splashScreenBackgroundSourceLandscape: {fileID: 0} 500 | splashScreenBackgroundSourcePortrait: {fileID: 0} 501 | spritePackerPolicy: 502 | webGLMemorySize: 256 503 | webGLExceptionSupport: 0 504 | webGLNameFilesAsHashes: 0 505 | webGLDataCaching: 0 506 | webGLDebugSymbols: 0 507 | webGLEmscriptenArgs: 508 | webGLModulesDirectory: 509 | webGLTemplate: APPLICATION:Default 510 | webGLAnalyzeBuildSize: 0 511 | webGLUseEmbeddedResources: 0 512 | webGLUseWasm: 0 513 | webGLCompressionFormat: 1 514 | scriptingDefineSymbols: {} 515 | platformArchitecture: 516 | iOS: 0 517 | scriptingBackend: 518 | WebGL: 1 519 | iOS: 0 520 | incrementalIl2cppBuild: {} 521 | additionalIl2CppArgs: 522 | scriptingRuntimeVersion: 0 523 | apiCompatibilityLevelPerPlatform: {} 524 | m_RenderingPath: 1 525 | m_MobileRenderingPath: 1 526 | metroPackageName: ExampleGame 527 | metroPackageVersion: 528 | metroCertificatePath: 529 | metroCertificatePassword: 530 | metroCertificateSubject: 531 | metroCertificateIssuer: 532 | metroCertificateNotAfter: 0000000000000000 533 | metroApplicationDescription: ExampleGame 534 | wsaImages: {} 535 | metroTileShortName: 536 | metroCommandLineArgsFile: 537 | metroTileShowName: 0 538 | metroMediumTileShowName: 0 539 | metroLargeTileShowName: 0 540 | metroWideTileShowName: 0 541 | metroDefaultTileSize: 1 542 | metroTileForegroundText: 1 543 | metroTileBackgroundColor: {r: 0, g: 0, b: 0, a: 1} 544 | metroSplashScreenBackgroundColor: {r: 0, g: 0, b: 0, a: 1} 545 | metroSplashScreenUseBackgroundColor: 0 546 | platformCapabilities: {} 547 | metroFTAName: 548 | metroFTAFileTypes: [] 549 | metroProtocolName: 550 | metroCompilationOverrides: 1 551 | tizenProductDescription: 552 | tizenProductURL: 553 | tizenSigningProfileName: 554 | tizenGPSPermissions: 0 555 | tizenMicrophonePermissions: 0 556 | tizenDeploymentTarget: 557 | tizenDeploymentTargetType: -1 558 | tizenMinOSVersion: 1 559 | n3dsUseExtSaveData: 0 560 | n3dsCompressStaticMem: 1 561 | n3dsExtSaveDataNumber: 0x12345 562 | n3dsStackSize: 131072 563 | n3dsTargetPlatform: 2 564 | n3dsRegion: 7 565 | n3dsMediaSize: 0 566 | n3dsLogoStyle: 3 567 | n3dsTitle: GameName 568 | n3dsProductCode: 569 | n3dsApplicationId: 0xFF3FF 570 | stvDeviceAddress: 571 | stvProductDescription: 572 | stvProductAuthor: 573 | stvProductAuthorEmail: 574 | stvProductLink: 575 | stvProductCategory: 0 576 | XboxOneProductId: 577 | XboxOneUpdateKey: 578 | XboxOneSandboxId: 579 | XboxOneContentId: 580 | XboxOneTitleId: 581 | XboxOneSCId: 582 | XboxOneGameOsOverridePath: 583 | XboxOnePackagingOverridePath: 584 | XboxOneAppManifestOverridePath: 585 | XboxOnePackageEncryption: 0 586 | XboxOnePackageUpdateGranularity: 2 587 | XboxOneDescription: 588 | XboxOneLanguage: 589 | - enus 590 | XboxOneCapability: [] 591 | XboxOneGameRating: {} 592 | XboxOneIsContentPackage: 0 593 | XboxOneEnableGPUVariability: 0 594 | XboxOneSockets: {} 595 | XboxOneSplashScreen: {fileID: 0} 596 | XboxOneAllowedProductIds: [] 597 | XboxOnePersistentLocalStorageSize: 0 598 | xboxOneScriptCompiler: 0 599 | vrEditorSettings: 600 | daydream: 601 | daydreamIconForeground: {fileID: 0} 602 | daydreamIconBackground: {fileID: 0} 603 | cloudServicesEnabled: {} 604 | facebookSdkVersion: 7.9.1 605 | apiCompatibilityLevel: 2 606 | cloudProjectId: 607 | projectName: 608 | organizationId: 609 | cloudEnabled: 0 610 | enableNativePlatformBackendsForNewInputSystem: 0 611 | disableOldInputManagerSupport: 0 612 | -------------------------------------------------------------------------------- /ExampleGame/ProjectSettings/ProjectVersion.txt: -------------------------------------------------------------------------------- 1 | m_EditorVersion: 2017.1.0f3 2 | -------------------------------------------------------------------------------- /ExampleGame/ProjectSettings/QualitySettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!47 &1 4 | QualitySettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 5 7 | m_CurrentQuality: 3 8 | m_QualitySettings: 9 | - serializedVersion: 2 10 | name: Fastest 11 | pixelLightCount: 0 12 | shadows: 0 13 | shadowResolution: 0 14 | shadowProjection: 1 15 | shadowCascades: 1 16 | shadowDistance: 15 17 | shadowNearPlaneOffset: 3 18 | shadowCascade2Split: 0.33333334 19 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 20 | shadowmaskMode: 0 21 | blendWeights: 1 22 | textureQuality: 1 23 | anisotropicTextures: 0 24 | antiAliasing: 0 25 | softParticles: 0 26 | softVegetation: 0 27 | realtimeReflectionProbes: 0 28 | billboardsFaceCameraPosition: 0 29 | vSyncCount: 0 30 | lodBias: 0.3 31 | maximumLODLevel: 0 32 | particleRaycastBudget: 4 33 | asyncUploadTimeSlice: 2 34 | asyncUploadBufferSize: 4 35 | resolutionScalingFixedDPIFactor: 1 36 | excludedTargetPlatforms: [] 37 | - serializedVersion: 2 38 | name: Fast 39 | pixelLightCount: 0 40 | shadows: 0 41 | shadowResolution: 0 42 | shadowProjection: 1 43 | shadowCascades: 1 44 | shadowDistance: 20 45 | shadowNearPlaneOffset: 3 46 | shadowCascade2Split: 0.33333334 47 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 48 | shadowmaskMode: 0 49 | blendWeights: 2 50 | textureQuality: 0 51 | anisotropicTextures: 0 52 | antiAliasing: 0 53 | softParticles: 0 54 | softVegetation: 0 55 | realtimeReflectionProbes: 0 56 | billboardsFaceCameraPosition: 0 57 | vSyncCount: 0 58 | lodBias: 0.4 59 | maximumLODLevel: 0 60 | particleRaycastBudget: 16 61 | asyncUploadTimeSlice: 2 62 | asyncUploadBufferSize: 4 63 | resolutionScalingFixedDPIFactor: 1 64 | excludedTargetPlatforms: [] 65 | - serializedVersion: 2 66 | name: Simple 67 | pixelLightCount: 1 68 | shadows: 1 69 | shadowResolution: 0 70 | shadowProjection: 1 71 | shadowCascades: 1 72 | shadowDistance: 20 73 | shadowNearPlaneOffset: 3 74 | shadowCascade2Split: 0.33333334 75 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 76 | shadowmaskMode: 0 77 | blendWeights: 2 78 | textureQuality: 0 79 | anisotropicTextures: 1 80 | antiAliasing: 0 81 | softParticles: 0 82 | softVegetation: 0 83 | realtimeReflectionProbes: 0 84 | billboardsFaceCameraPosition: 0 85 | vSyncCount: 0 86 | lodBias: 0.7 87 | maximumLODLevel: 0 88 | particleRaycastBudget: 64 89 | asyncUploadTimeSlice: 2 90 | asyncUploadBufferSize: 4 91 | resolutionScalingFixedDPIFactor: 1 92 | excludedTargetPlatforms: [] 93 | - serializedVersion: 2 94 | name: Good 95 | pixelLightCount: 2 96 | shadows: 2 97 | shadowResolution: 1 98 | shadowProjection: 1 99 | shadowCascades: 2 100 | shadowDistance: 40 101 | shadowNearPlaneOffset: 3 102 | shadowCascade2Split: 0.33333334 103 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 104 | shadowmaskMode: 1 105 | blendWeights: 2 106 | textureQuality: 0 107 | anisotropicTextures: 1 108 | antiAliasing: 0 109 | softParticles: 0 110 | softVegetation: 1 111 | realtimeReflectionProbes: 1 112 | billboardsFaceCameraPosition: 1 113 | vSyncCount: 1 114 | lodBias: 1 115 | maximumLODLevel: 0 116 | particleRaycastBudget: 256 117 | asyncUploadTimeSlice: 2 118 | asyncUploadBufferSize: 4 119 | resolutionScalingFixedDPIFactor: 1 120 | excludedTargetPlatforms: [] 121 | - serializedVersion: 2 122 | name: Beautiful 123 | pixelLightCount: 3 124 | shadows: 2 125 | shadowResolution: 2 126 | shadowProjection: 1 127 | shadowCascades: 2 128 | shadowDistance: 70 129 | shadowNearPlaneOffset: 3 130 | shadowCascade2Split: 0.33333334 131 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 132 | shadowmaskMode: 1 133 | blendWeights: 4 134 | textureQuality: 0 135 | anisotropicTextures: 2 136 | antiAliasing: 2 137 | softParticles: 1 138 | softVegetation: 1 139 | realtimeReflectionProbes: 1 140 | billboardsFaceCameraPosition: 1 141 | vSyncCount: 1 142 | lodBias: 1.5 143 | maximumLODLevel: 0 144 | particleRaycastBudget: 1024 145 | asyncUploadTimeSlice: 2 146 | asyncUploadBufferSize: 4 147 | resolutionScalingFixedDPIFactor: 1 148 | excludedTargetPlatforms: [] 149 | - serializedVersion: 2 150 | name: Fantastic 151 | pixelLightCount: 4 152 | shadows: 2 153 | shadowResolution: 2 154 | shadowProjection: 1 155 | shadowCascades: 4 156 | shadowDistance: 150 157 | shadowNearPlaneOffset: 3 158 | shadowCascade2Split: 0.33333334 159 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 160 | shadowmaskMode: 1 161 | blendWeights: 4 162 | textureQuality: 0 163 | anisotropicTextures: 2 164 | antiAliasing: 2 165 | softParticles: 1 166 | softVegetation: 1 167 | realtimeReflectionProbes: 1 168 | billboardsFaceCameraPosition: 1 169 | vSyncCount: 1 170 | lodBias: 2 171 | maximumLODLevel: 0 172 | particleRaycastBudget: 4096 173 | asyncUploadTimeSlice: 2 174 | asyncUploadBufferSize: 4 175 | resolutionScalingFixedDPIFactor: 1 176 | excludedTargetPlatforms: [] 177 | m_PerPlatformDefaultQuality: 178 | Android: 2 179 | BlackBerry: 2 180 | FlashPlayer: 3 181 | GLES Emulation: 3 182 | PS3: 3 183 | Standalone: 3 184 | Tizen: 2 185 | WP8: 3 186 | Web: 3 187 | Wii: 3 188 | Windows Store Apps: 3 189 | XBOX360: 3 190 | iPhone: 2 191 | -------------------------------------------------------------------------------- /ExampleGame/ProjectSettings/TagManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!78 &1 4 | TagManager: 5 | serializedVersion: 2 6 | tags: [] 7 | layers: 8 | - Default 9 | - TransparentFX 10 | - Ignore Raycast 11 | - 12 | - Water 13 | - UI 14 | - 15 | - 16 | - 17 | - 18 | - 19 | - 20 | - 21 | - 22 | - 23 | - 24 | - 25 | - 26 | - 27 | - 28 | - 29 | - 30 | - 31 | - 32 | - 33 | - 34 | - 35 | - 36 | - 37 | - 38 | - 39 | - 40 | m_SortingLayers: 41 | - name: Default 42 | uniqueID: 0 43 | locked: 0 44 | -------------------------------------------------------------------------------- /ExampleGame/ProjectSettings/TimeManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!5 &1 4 | TimeManager: 5 | m_ObjectHideFlags: 0 6 | Fixed Timestep: 0.02 7 | Maximum Allowed Timestep: 0.33333334 8 | m_TimeScale: 1 9 | Maximum Particle Timestep: 0.03 10 | -------------------------------------------------------------------------------- /ExampleGame/ProjectSettings/UnityAdsSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/ExampleGame/ProjectSettings/UnityAdsSettings.asset -------------------------------------------------------------------------------- /ExampleGame/ProjectSettings/UnityConnectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!310 &1 4 | UnityConnectSettings: 5 | m_ObjectHideFlags: 0 6 | m_Enabled: 0 7 | m_TestMode: 0 8 | m_TestEventUrl: 9 | m_TestConfigUrl: 10 | m_TestInitMode: 0 11 | CrashReportingSettings: 12 | m_EventUrl: https://perf-events.cloud.unity3d.com/api/events/crashes 13 | m_Enabled: 0 14 | m_CaptureEditorExceptions: 1 15 | UnityPurchasingSettings: 16 | m_Enabled: 0 17 | m_TestMode: 0 18 | UnityAnalyticsSettings: 19 | m_Enabled: 0 20 | m_InitializeOnStartup: 1 21 | m_TestMode: 0 22 | m_TestEventUrl: 23 | m_TestConfigUrl: 24 | UnityAdsSettings: 25 | m_Enabled: 0 26 | m_InitializeOnStartup: 1 27 | m_TestMode: 0 28 | m_EnabledPlatforms: 4294967295 29 | m_IosGameId: 30 | m_AndroidGameId: 31 | m_GameIds: {} 32 | m_GameId: 33 | PerformanceReportingSettings: 34 | m_Enabled: 0 35 | -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | buildscript { 3 | repositories { 4 | jcenter() 5 | google() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:3.0.1' 9 | } 10 | } 11 | 12 | allprojects { 13 | repositories { 14 | jcenter() 15 | google() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/HockeyAppUnityPlugin/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Wed Nov 22 12:44:27 MSK 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip 7 | -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # Attempt to set APP_HOME 46 | # Resolve links: $0 may be a link 47 | PRG="$0" 48 | # Need this for relative symlinks. 49 | while [ -h "$PRG" ] ; do 50 | ls=`ls -ld "$PRG"` 51 | link=`expr "$ls" : '.*-> \(.*\)$'` 52 | if expr "$link" : '/.*' > /dev/null; then 53 | PRG="$link" 54 | else 55 | PRG=`dirname "$PRG"`"/$link" 56 | fi 57 | done 58 | SAVED="`pwd`" 59 | cd "`dirname \"$PRG\"`/" >/dev/null 60 | APP_HOME="`pwd -P`" 61 | cd "$SAVED" >/dev/null 62 | 63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 64 | 65 | # Determine the Java command to use to start the JVM. 66 | if [ -n "$JAVA_HOME" ] ; then 67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 68 | # IBM's JDK on AIX uses strange locations for the executables 69 | JAVACMD="$JAVA_HOME/jre/sh/java" 70 | else 71 | JAVACMD="$JAVA_HOME/bin/java" 72 | fi 73 | if [ ! -x "$JAVACMD" ] ; then 74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 75 | 76 | Please set the JAVA_HOME variable in your environment to match the 77 | location of your Java installation." 78 | fi 79 | else 80 | JAVACMD="java" 81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 82 | 83 | Please set the JAVA_HOME variable in your environment to match the 84 | location of your Java installation." 85 | fi 86 | 87 | # Increase the maximum file descriptors if we can. 88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 89 | MAX_FD_LIMIT=`ulimit -H -n` 90 | if [ $? -eq 0 ] ; then 91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 92 | MAX_FD="$MAX_FD_LIMIT" 93 | fi 94 | ulimit -n $MAX_FD 95 | if [ $? -ne 0 ] ; then 96 | warn "Could not set maximum file descriptor limit: $MAX_FD" 97 | fi 98 | else 99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 100 | fi 101 | fi 102 | 103 | # For Darwin, add options to specify how the application appears in the dock 104 | if $darwin; then 105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 106 | fi 107 | 108 | # For Cygwin, switch paths to Windows format before running java 109 | if $cygwin ; then 110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 112 | JAVACMD=`cygpath --unix "$JAVACMD"` 113 | 114 | # We build the pattern for arguments to be converted via cygpath 115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 116 | SEP="" 117 | for dir in $ROOTDIRSRAW ; do 118 | ROOTDIRS="$ROOTDIRS$SEP$dir" 119 | SEP="|" 120 | done 121 | OURCYGPATTERN="(^($ROOTDIRS))" 122 | # Add a user-defined pattern to the cygpath arguments 123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 125 | fi 126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 127 | i=0 128 | for arg in "$@" ; do 129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 131 | 132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 134 | else 135 | eval `echo args$i`="\"$arg\"" 136 | fi 137 | i=$((i+1)) 138 | done 139 | case $i in 140 | (0) set -- ;; 141 | (1) set -- "$args0" ;; 142 | (2) set -- "$args0" "$args1" ;; 143 | (3) set -- "$args0" "$args1" "$args2" ;; 144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 150 | esac 151 | fi 152 | 153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 154 | function splitJvmOpts() { 155 | JVM_OPTS=("$@") 156 | } 157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 159 | 160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 161 | -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/hockeysdk-unity/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion 27 5 | 6 | defaultConfig { 7 | minSdkVersion 16 8 | targetSdkVersion 27 9 | } 10 | 11 | buildTypes { 12 | release { 13 | minifyEnabled false 14 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 15 | } 16 | } 17 | } 18 | 19 | repositories { 20 | mavenCentral() 21 | flatDir { 22 | dirs 'libs' 23 | } 24 | } 25 | 26 | dependencies { 27 | compile(name:'HockeySDK-5.2.0', ext:'aar') 28 | } 29 | -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/hockeysdk-unity/libs/HockeySDK-5.2.0.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/HockeyAppUnityPlugin/hockeysdk-unity/libs/HockeySDK-5.2.0.aar -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/hockeysdk-unity/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/hockeysdk-unity/src/main/java/net/hockeyapp/unity/HockeyUnityPlugin.java: -------------------------------------------------------------------------------- 1 | package net.hockeyapp.unity; 2 | 3 | import android.app.Activity; 4 | 5 | import net.hockeyapp.android.Constants; 6 | import net.hockeyapp.android.CrashManager; 7 | import net.hockeyapp.android.CrashManagerListener; 8 | import net.hockeyapp.android.FeedbackManager; 9 | import net.hockeyapp.android.LoginManager; 10 | import net.hockeyapp.android.UpdateManager; 11 | import net.hockeyapp.android.metrics.MetricsManager; 12 | import net.hockeyapp.android.utils.HockeyLog; 13 | 14 | import java.lang.reflect.Method; 15 | import java.util.Map; 16 | import java.util.concurrent.ExecutionException; 17 | 18 | @SuppressWarnings({"unused", "WeakerAccess"}) 19 | public class HockeyUnityPlugin { 20 | 21 | //region CONFIGURE AND START MODULES 22 | //--------------------------------------------------------------------------------------- 23 | 24 | /** 25 | * Enables crash reporting, feedback, user metrics, login, and app updates. 26 | * 27 | * @param currentActivity the context needed for starting this manager. 28 | * @param serverURL the URL of the HockeyApp instance. 29 | * @param appID the app identifier of your app. 30 | * @param secret the app secret of your app used for authentication. 31 | * @param loginMode the login mode used for authentication. 32 | * @param updateManagerEnabled if true, the update manager is enabled. 33 | * @param userMetricsEnabled if true, the metrics manager is enabled. 34 | * @param autoSendEnabled if true, crashes will be sent without presenting a confirmation dialog. 35 | */ 36 | public static void startHockeyAppManager(final Activity currentActivity, final String serverURL, 37 | final String appID, final String secret, final int loginMode, 38 | final boolean updateManagerEnabled, final boolean userMetricsEnabled, final boolean autoSendEnabled) { 39 | currentActivity.runOnUiThread(new Runnable() { 40 | @Override 41 | public void run() { 42 | if (updateManagerEnabled) { 43 | registerUpdateManager(currentActivity, serverURL, appID); 44 | } 45 | if (userMetricsEnabled) { 46 | registerMetricsManager(currentActivity, appID); 47 | } 48 | registerCrashManager(currentActivity, serverURL, appID, autoSendEnabled); 49 | registerFeedbackManager(currentActivity, serverURL, appID); 50 | registerLoginManager(currentActivity, serverURL, appID, secret, loginMode); 51 | } 52 | }); 53 | } 54 | 55 | /** 56 | * Configures and starts the UpdateManager module. 57 | * 58 | * @param currentActivity the context needed for starting this manager. 59 | * @param serverURL the URL of the HockeyApp instance. 60 | * @param appID the app identifier of your app. 61 | */ 62 | public static void registerUpdateManager(final Activity currentActivity, final String serverURL, final String appID) { 63 | currentActivity.runOnUiThread(new Runnable() { 64 | @Override 65 | public void run() { 66 | UpdateManager.register(currentActivity, serverURL, appID, null, true); 67 | } 68 | }); 69 | } 70 | 71 | /** 72 | * Configures and starts the crash reporting module. 73 | * 74 | * @param currentActivity the context needed for starting this manager. 75 | * @param serverURL the URL of the HockeyApp instance. 76 | * @param appID the app identifier of your app. 77 | * @param autoSendEnabled if true, crashes will be sent without presenting a confirmation dialog. 78 | */ 79 | public static void registerCrashManager(final Activity currentActivity, final String serverURL, 80 | final String appID, final boolean autoSendEnabled) { 81 | currentActivity.runOnUiThread(new Runnable() { 82 | @Override 83 | public void run() { 84 | CrashManager.register(currentActivity, serverURL, appID, 85 | new CrashManagerListener() { 86 | public boolean shouldAutoUploadCrashes() { 87 | return autoSendEnabled; 88 | } 89 | }); 90 | } 91 | }); 92 | } 93 | 94 | /** 95 | * Configures the login module. 96 | * 97 | * @param currentActivity the context needed for starting this manager. 98 | * @param serverURL the URL of the HockeyApp instance. 99 | * @param appID the app identifier of your app. 100 | * @param secret the URL of the HockeyApp instance. 101 | * @param loginMode the app identifier of your app. 102 | */ 103 | public static void registerLoginManager(final Activity currentActivity, final String serverURL, 104 | final String appID, final String secret, final int loginMode) { 105 | currentActivity.runOnUiThread(new Runnable() { 106 | @Override 107 | public void run() { 108 | LoginManager.register(currentActivity, appID, secret, serverURL, loginMode, currentActivity.getClass()); 109 | } 110 | }); 111 | } 112 | 113 | /** 114 | * Starts the login module. 115 | * 116 | * @param currentActivity the context needed for starting this manager. 117 | */ 118 | public static void performAuthentication(final Activity currentActivity) { 119 | currentActivity.runOnUiThread(new Runnable() { 120 | @Override 121 | public void run() { 122 | LoginManager.verifyLogin(currentActivity, currentActivity.getIntent()); 123 | } 124 | }); 125 | } 126 | 127 | /** 128 | * Configures and starts the feedback module. 129 | * 130 | * @param currentActivity the context needed for starting this manager. 131 | * @param serverURL the URL of the HockeyApp instance. 132 | * @param appID the app identifier of your app. 133 | */ 134 | public static void registerFeedbackManager(final Activity currentActivity, final String serverURL, final String appID) { 135 | currentActivity.runOnUiThread(new Runnable() { 136 | @Override 137 | public void run() { 138 | FeedbackManager.register(currentActivity, serverURL, appID, null); 139 | } 140 | }); 141 | } 142 | 143 | /** 144 | * Configures and starts the metrics module. 145 | * 146 | * @param currentActivity the context needed for starting this manager. 147 | * @param appID the app identifier of your app. 148 | */ 149 | public static void registerMetricsManager(final Activity currentActivity, final String appID) { 150 | currentActivity.runOnUiThread(new Runnable() { 151 | @Override 152 | public void run() { 153 | MetricsManager.register(currentActivity.getApplication(), appID); 154 | 155 | // Unity's awake calls after android activity shown. 156 | // We force start session to avoid missing it. 157 | try { 158 | Method getInstance = MetricsManager.class.getDeclaredMethod("getInstance"); 159 | getInstance.setAccessible(true); 160 | MetricsManager instance = (MetricsManager) getInstance.invoke(null); 161 | Method updateSession = MetricsManager.class.getDeclaredMethod("updateSession"); 162 | updateSession.setAccessible(true); 163 | updateSession.invoke(instance); 164 | } catch (Throwable ignored) { 165 | } 166 | } 167 | }); 168 | } 169 | 170 | /** 171 | * Enables crash reporting, feedback, and app updates. If you don't want to enable all features 172 | * or if you need more options to configure them, use specific register methods instead. 173 | * 174 | * @param currentActivity the context needed for starting this manager. 175 | * @param serverURL the URL of the HockeyApp instance. 176 | * @param appID the app identifier of your app. 177 | */ 178 | public static void registerAll(final Activity currentActivity, final String serverURL, 179 | final String appID) { 180 | currentActivity.runOnUiThread(new Runnable() { 181 | @Override 182 | public void run() { 183 | registerUpdateManager(currentActivity, serverURL, appID); 184 | registerCrashManager(currentActivity, serverURL, appID, true); 185 | registerFeedbackManager(currentActivity, serverURL, appID); 186 | registerMetricsManager(currentActivity, appID); 187 | } 188 | }); 189 | } 190 | //--------------------------------------------------------------------------------------- 191 | //endregion 192 | 193 | //region METADATA 194 | //--------------------------------------------------------------------------------------- 195 | 196 | /** 197 | * @return the version of your app. 198 | */ 199 | public static String getVersionCode() { 200 | return Constants.APP_VERSION; 201 | } 202 | 203 | /** 204 | * @return the version name of your app 205 | */ 206 | public static String getVersionName() { 207 | return Constants.APP_VERSION_NAME; 208 | } 209 | 210 | /** 211 | * @return the name of the base HockeyApp SDK. 212 | */ 213 | public static String getSdkName() { 214 | return Constants.SDK_NAME; 215 | } 216 | 217 | /** 218 | * @return the device's model manufacturer name. 219 | */ 220 | public static String getManufacturer() { 221 | return Constants.PHONE_MANUFACTURER; 222 | } 223 | 224 | /** 225 | * @return the device's model name. 226 | */ 227 | public static String getModel() { 228 | return Constants.PHONE_MODEL; 229 | } 230 | 231 | /** 232 | * @return the unique identifier for device, not dependent on package or device. 233 | */ 234 | public static String getDeviceIdentifier() { 235 | try { 236 | return Constants.getDeviceIdentifier().get(); 237 | } catch (InterruptedException | ExecutionException e) { 238 | HockeyLog.error("Couldn't get device identifier", e); 239 | return null; 240 | } 241 | } 242 | //--------------------------------------------------------------------------------------- 243 | //endregion 244 | 245 | //region METRICS MANAGER 246 | //--------------------------------------------------------------------------------------- 247 | 248 | /** 249 | * This method allows to track an event that happened in your app. 250 | * Remember to choose meaningful event names to have the best experience when diagnosing your app 251 | * in the web portal. 252 | * 253 | * @param eventName the name of the event, which should be tracked. 254 | */ 255 | public static void trackEvent(final String eventName) { 256 | MetricsManager.trackEvent(eventName); 257 | } 258 | 259 | /** 260 | * This method allows to track an event that happened in your app. 261 | * Remember to choose meaningful event names to have the best experience when diagnosing your app 262 | * in the web portal. 263 | * 264 | * @param eventName the name of the event, which should be tracked. 265 | * @param properties key value pairs with additional info about the event. 266 | */ 267 | public static void trackEvent(final String eventName, final Map properties) { 268 | MetricsManager.trackEvent(eventName, properties); 269 | } 270 | 271 | /** 272 | * This method allows to track an event that happened in your app. 273 | * Remember to choose meaningful event names to have the best experience when diagnosing your app 274 | * in the web portal. 275 | * 276 | * @param eventName the name of the event, which should be tracked. 277 | * @param properties key value pairs with additional info about the event. 278 | * @param measurements key value pairs, which contain custom metrics. 279 | */ 280 | public static void trackEvent(final String eventName, final Map properties, final Map measurements) { 281 | MetricsManager.trackEvent(eventName, properties, measurements); 282 | } 283 | //--------------------------------------------------------------------------------------- 284 | //endregion 285 | 286 | //region FEEDBACK MANAGER 287 | //--------------------------------------------------------------------------------------- 288 | 289 | /** 290 | * Shows a feedback form. This should be called after {@link HockeyUnityPlugin#registerFeedbackManager(Activity, String, String)}. 291 | * 292 | * @param currentActivity the context needed for starting this manager. 293 | */ 294 | public static void startFeedbackForm(final Activity currentActivity) { 295 | currentActivity.runOnUiThread(new Runnable() { 296 | @Override 297 | public void run() { 298 | FeedbackManager.showFeedbackActivity(currentActivity); 299 | } 300 | }); 301 | } 302 | //--------------------------------------------------------------------------------------- 303 | //endregion 304 | 305 | //region UPDATE MANAGER 306 | //--------------------------------------------------------------------------------------- 307 | 308 | /** 309 | * Checks for version update and presents update alert if newer version is available. 310 | * 311 | * @param currentActivity the context needed to show update alert. 312 | * @param serverURL the URL of the HockeyApp instance. 313 | * @param appID the app identifier of your app. 314 | */ 315 | public static void checkForUpdate(final Activity currentActivity, final String serverURL, final String appID) { 316 | UpdateManager.unregister(); 317 | registerUpdateManager(currentActivity, serverURL, appID); 318 | } 319 | //--------------------------------------------------------------------------------------- 320 | //endregion 321 | } 322 | -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/hockeysdk-unity/src/main/res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/HockeyAppUnityPlugin/hockeysdk-unity/src/main/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/hockeysdk-unity/src/main/res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/HockeyAppUnityPlugin/hockeysdk-unity/src/main/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/hockeysdk-unity/src/main/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/HockeyAppUnityPlugin/hockeysdk-unity/src/main/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/hockeysdk-unity/src/main/res/drawable-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/HockeyAppUnityPlugin/hockeysdk-unity/src/main/res/drawable-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/hockeysdk-unity/src/main/res/layout/activity_plugin.xml: -------------------------------------------------------------------------------- 1 | 10 | 11 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/hockeysdk-unity/src/main/res/menu/plugin.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/hockeysdk-unity/src/main/res/values-sw600dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/hockeysdk-unity/src/main/res/values-sw720dp-land/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 128dp 8 | 9 | 10 | -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/hockeysdk-unity/src/main/res/values-v11/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/hockeysdk-unity/src/main/res/values-v14/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/hockeysdk-unity/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 16dp 5 | 16dp 6 | 7 | 8 | -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/hockeysdk-unity/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | HockeyAppUnity 5 | Settings 6 | Hello world! 7 | 8 | 9 | -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/hockeysdk-unity/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 14 | 15 | 16 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/import-summary.txt: -------------------------------------------------------------------------------- 1 | ECLIPSE ANDROID PROJECT IMPORT SUMMARY 2 | ====================================== 3 | 4 | Ignored Files: 5 | -------------- 6 | The following files were *not* copied into the new Gradle project; you 7 | should evaluate whether these are still needed in your project and if 8 | so manually move them: 9 | 10 | * ic_launcher-web.png 11 | * proguard-project.txt 12 | 13 | Moved Files: 14 | ------------ 15 | Android Gradle projects use a different directory structure than ADT 16 | Eclipse projects. Here's how the projects were restructured: 17 | 18 | * AndroidManifest.xml => app/src/main/AndroidManifest.xml 19 | * libs/HockeySDK-3.6.2.jar => app/libs/HockeySDK-3.6.2.jar 20 | * res/ => app/src/main/res/ 21 | * src/ => app/src/main/java/ 22 | 23 | Next Steps: 24 | ----------- 25 | You can now build the project. The Gradle project needs network 26 | connectivity to download dependencies. 27 | 28 | Bugs: 29 | ----- 30 | If for some reason your project does not build, and you determine that 31 | it is due to a bug or limitation of the Eclipse to Gradle importer, 32 | please file a bug at http://b.android.com with category 33 | Component-Tools. 34 | 35 | (This import summary is for your information only, and can be deleted 36 | after import once you are satisfied with the results.) 37 | -------------------------------------------------------------------------------- /HockeyAppUnityPlugin/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':hockeysdk-unity' 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | ********************************************************************** 2 | LICENSE INFORMATION (I/III) 3 | ********************************************************************** 4 | 5 | The Hockey SDK is provided under the following license: 6 | 7 | Copyright (c) Microsoft Corporation. All rights reserved. 8 | 9 | Permission is hereby granted, free of charge, to any person 10 | obtaining a copy of this software and associated documentation 11 | files (the "Software"), to deal in the Software without 12 | restriction, including without limitation the rights to use, 13 | copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | copies of the Software, and to permit persons to whom the 15 | Software is furnished to do so, subject to the following 16 | conditions: 17 | 18 | The above copyright notice and this permission notice shall be 19 | included in all copies or substantial portions of the Software. 20 | 21 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 22 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 23 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 24 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 25 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 26 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 27 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 28 | OTHER DEALINGS IN THE SOFTWARE. 29 | 30 | ********************************************************************** 31 | LICENSE INFORMATION (II/III) 32 | ********************************************************************** 33 | 34 | The following classes are based on code from the project 35 | android-remote-stacktrace: 36 | 37 | + Constants 38 | + CrashManager 39 | + ExceptionHandler 40 | 41 | Source: http://code.google.com/p/android-remote-stacktrace/ 42 | 43 | The original license of these classes is: 44 | 45 | Copyright (c) 2009 nullwire aps 46 | 47 | Permission is hereby granted, free of charge, to any person 48 | obtaining a copy of this software and associated documentation 49 | files (the "Software"), to deal in the Software without 50 | restriction, including without limitation the rights to use, 51 | copy, modify, merge, publish, distribute, sublicense, and/or sell 52 | copies of the Software, and to permit persons to whom the 53 | Software is furnished to do so, subject to the following 54 | conditions: 55 | 56 | The above copyright notice and this permission notice shall be 57 | included in all copies or substantial portions of the Software. 58 | 59 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 60 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 61 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 62 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 63 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 64 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 65 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 66 | OTHER DEALINGS IN THE SOFTWARE. 67 | 68 | Contributors: 69 | + Mads Kristiansen, mads.kristiansen@nullwire.com 70 | + Glen Humphrey 71 | + Evan Charlton 72 | + Peter Hewitt 73 | 74 | ********************************************************************** 75 | LICENSE INFORMATION (III/III) 76 | ********************************************************************** 77 | 78 | The following class is based on code from the 79 | Android Open Source Project 80 | 81 | + Base64 82 | 83 | Copyright (C) 2010 The Android Open Source Project 84 | 85 | Licensed under the Apache License, Version 2.0 (the "License"); 86 | you may not use this file except in compliance with the License. 87 | You may obtain a copy of the License at 88 | 89 | http://www.apache.org/licenses/LICENSE-2.0 90 | 91 | Unless required by applicable law or agreed to in writing, software 92 | distributed under the License is distributed on an "AS IS" BASIS, 93 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 94 | See the License for the specific language governing permissions and 95 | limitations under the License. -------------------------------------------------------------------------------- /Plugins/HockeyAppUnityAndroid/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Plugins/HockeyAppUnityAndroid/HockeyAppUnity-Scripts/HockeyAppAndroid.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * Version: 5.2.0 3 | */ 4 | 5 | using UnityEngine; 6 | using System.Collections; 7 | using System.Collections.Generic; 8 | using System; 9 | using System.IO; 10 | using System.Runtime.InteropServices; 11 | #if UNITY_2017_1_OR_NEWER 12 | using UnityEngine.Networking; 13 | #endif 14 | 15 | public class HockeyAppAndroid : MonoBehaviour 16 | { 17 | private const string JAVA_UNITYPLAYER_CLASS = "com.unity3d.player.UnityPlayer"; 18 | private const string JAVA_HOCKEYUNITYPLUGIN_CLASS = "net.hockeyapp.unity.HockeyUnityPlugin"; 19 | 20 | protected const string HOCKEYAPP_BASEURL = "https://rink.hockeyapp.net/"; 21 | protected const string HOCKEYAPP_CRASHESPATH = "api/2/apps/[APPID]/crashes/upload"; 22 | protected const int MAX_CHARS = 199800; 23 | protected const string LOG_FILE_DIR = "/logs/"; 24 | private const string SERVER_URL_PLACEHOLDER = "your-custom-server-url"; 25 | private static HockeyAppAndroid instance; 26 | 27 | public enum AuthenticatorType 28 | { 29 | Anonymous, 30 | HockeyAppEmail, 31 | HockeyAppUser, 32 | Validate 33 | } 34 | 35 | [Header("HockeyApp Setup")] 36 | public string appID = "your-hockey-app-id"; 37 | public string packageID = "your-package-identifier"; 38 | public string serverURL = SERVER_URL_PLACEHOLDER; 39 | 40 | [Header("Authentication")] 41 | public AuthenticatorType authenticatorType; 42 | public string secret = "your-hockey-app-secret"; 43 | 44 | [Header("Crashes & Exceptions")] 45 | public bool autoUploadCrashes = false; 46 | public bool exceptionLogging = true; 47 | 48 | [Header("Metrics")] 49 | public bool userMetrics = true; 50 | 51 | [Header("Version Updates")] 52 | public bool updateAlert = true; 53 | 54 | void Awake () 55 | { 56 | #if (UNITY_ANDROID && !UNITY_EDITOR) 57 | if (instance != null) { 58 | Destroy(gameObject); 59 | return; 60 | } 61 | 62 | DontDestroyOnLoad(gameObject); 63 | CreateLogDirectory(); 64 | 65 | if(exceptionLogging == true && IsConnected() == true) { 66 | List logFileDirs = GetLogFiles(); 67 | if(logFileDirs.Count > 0) { 68 | Debug.Log("Found files: " + logFileDirs.Count); 69 | StartCoroutine(SendLogs(logFileDirs)); 70 | } 71 | } 72 | serverURL = GetBaseURL(); 73 | int authType = (int)authenticatorType; 74 | StartCrashManager(serverURL, appID, secret, authType, updateAlert, userMetrics, autoUploadCrashes); 75 | #endif 76 | } 77 | 78 | void OnEnable () 79 | { 80 | 81 | #if (UNITY_ANDROID && !UNITY_EDITOR) 82 | if(exceptionLogging == true) { 83 | System.AppDomain.CurrentDomain.UnhandledException += OnHandleUnresolvedException; 84 | Application.logMessageReceived += OnHandleLogCallback; 85 | } 86 | #endif 87 | } 88 | 89 | void OnDisable () 90 | { 91 | #if (UNITY_ANDROID && !UNITY_EDITOR) 92 | if (exceptionLogging == true) { 93 | System.AppDomain.CurrentDomain.UnhandledException -= OnHandleUnresolvedException; 94 | Application.logMessageReceived -= OnHandleLogCallback; 95 | } 96 | #endif 97 | } 98 | 99 | void OnApplicationPause(bool pause) 100 | { 101 | if (!pause) { 102 | PerformAuthentication(); 103 | } 104 | } 105 | 106 | /// 107 | /// Start HockeyApp for Unity. 108 | /// 109 | /// The url of the endpoint used for sending data. 110 | /// The app specific Identifier provided by HockeyApp. 111 | /// The app secret used for authenticating users. 112 | /// Auth type used for authentication: Anonymous, email, email& password, or check if user was explicitly added to use this app. 113 | /// True, if user should be notified about newer versions of the app. 114 | /// True, app should send user and session information. 115 | /// True, if crashes should be sent without asking the user for approval. 116 | protected void StartCrashManager (string urlString, string appID, string secret, int authType, bool updateManagerEnabled, bool userMetricsEnabled, bool autoSendEnabled) 117 | { 118 | #if (UNITY_ANDROID && !UNITY_EDITOR) 119 | using (var unityPlayer = new AndroidJavaClass(JAVA_UNITYPLAYER_CLASS)) 120 | using (var pluginClass = new AndroidJavaClass(JAVA_HOCKEYUNITYPLUGIN_CLASS)) 121 | { 122 | var currentActivity = unityPlayer.GetStatic("currentActivity"); 123 | pluginClass.CallStatic("startHockeyAppManager", currentActivity, urlString, appID, secret, authType, updateManagerEnabled, userMetricsEnabled, autoSendEnabled); 124 | } 125 | instance = this; 126 | #endif 127 | } 128 | 129 | /// 130 | /// This method allows to track an event that happened in your app. 131 | /// Remember to choose meaningful event names to have the best experience when diagnosing your app 132 | /// in the web portal. 133 | /// 134 | /// The name of the event, which should be tracked. 135 | public static void TrackEvent(string eventName) 136 | { 137 | #if (UNITY_ANDROID && !UNITY_EDITOR) 138 | if (instance != null) 139 | { 140 | using (var pluginClass = new AndroidJavaClass(JAVA_HOCKEYUNITYPLUGIN_CLASS)) 141 | { 142 | pluginClass.CallStatic("trackEvent", eventName); 143 | } 144 | } 145 | else 146 | { 147 | Debug.Log("Failed to track event. SDK has not been initialized, yet."); 148 | } 149 | #endif 150 | } 151 | 152 | /// 153 | /// This method allows to track an event that happened in your app. 154 | /// Remember to choose meaningful event names to have the best experience when diagnosing your app 155 | /// in the web portal. 156 | /// 157 | /// The name of the event, which should be tracked. 158 | /// Key value pairs, which contain custom metrics. 159 | public static void TrackEvent(string eventName, IDictionary properties) 160 | { 161 | #if (UNITY_ANDROID && !UNITY_EDITOR) 162 | if (instance != null) 163 | { 164 | using (var pluginClass = new AndroidJavaClass(JAVA_HOCKEYUNITYPLUGIN_CLASS)) 165 | { 166 | pluginClass.CallStatic("trackEvent", eventName, 167 | DictainaryToJavaMap(properties, "java.lang.String", "java.lang.String")); 168 | } 169 | } 170 | else 171 | { 172 | Debug.Log("Failed to track event. SDK has not been initialized, yet."); 173 | } 174 | #endif 175 | } 176 | 177 | /// 178 | /// This method allows to track an event that happened in your app. 179 | /// Remember to choose meaningful event names to have the best experience when diagnosing your app 180 | /// in the web portal. 181 | /// 182 | /// The name of the event, which should be tracked. 183 | /// Key value pairs with additional info about the event. 184 | /// Key value pairs, which contain custom metrics. 185 | public static void TrackEvent(string eventName, IDictionary properties, IDictionary measurements) 186 | { 187 | #if (UNITY_ANDROID && !UNITY_EDITOR) 188 | if (instance != null) 189 | { 190 | using (var pluginClass = new AndroidJavaClass(JAVA_HOCKEYUNITYPLUGIN_CLASS)) 191 | { 192 | pluginClass.CallStatic("trackEvent", eventName, 193 | DictainaryToJavaMap(properties, "java.lang.String", "java.lang.String"), 194 | DictainaryToJavaMap(measurements, "java.lang.String", "java.lang.Double")); 195 | } 196 | } 197 | else 198 | { 199 | Debug.Log("Failed to track event. SDK has not been initialized, yet."); 200 | } 201 | #endif 202 | } 203 | 204 | /// 205 | /// Performs user authentication. 206 | /// 207 | public static void PerformAuthentication() 208 | { 209 | #if (UNITY_ANDROID && !UNITY_EDITOR) 210 | using (var unityPlayer = new AndroidJavaClass(JAVA_UNITYPLAYER_CLASS)) 211 | using (var pluginClass = new AndroidJavaClass(JAVA_HOCKEYUNITYPLUGIN_CLASS)) 212 | { 213 | var currentActivity = unityPlayer.GetStatic("currentActivity"); 214 | pluginClass.CallStatic("performAuthentication", currentActivity); 215 | } 216 | #endif 217 | } 218 | 219 | /// 220 | /// Check for version update and present alert if newer version is available. 221 | /// 222 | public static void CheckForUpdate() 223 | { 224 | #if (UNITY_ANDROID && !UNITY_EDITOR) 225 | if (instance != null) 226 | { 227 | using (var unityPlayer = new AndroidJavaClass(JAVA_UNITYPLAYER_CLASS)) 228 | using (var pluginClass = new AndroidJavaClass(JAVA_HOCKEYUNITYPLUGIN_CLASS)) 229 | { 230 | var currentActivity = unityPlayer.GetStatic("currentActivity"); 231 | pluginClass.CallStatic("checkForUpdate", currentActivity, instance.serverURL, instance.appID); 232 | } 233 | } 234 | else 235 | { 236 | Debug.Log("Failed to check for update. SDK has not been initialized, yet."); 237 | } 238 | #endif 239 | } 240 | 241 | /// 242 | /// Display a feedback form. 243 | /// 244 | public static void ShowFeedbackForm() 245 | { 246 | #if (UNITY_ANDROID && !UNITY_EDITOR) 247 | if (instance != null) 248 | { 249 | using (var unityPlayer = new AndroidJavaClass(JAVA_UNITYPLAYER_CLASS)) 250 | using (var pluginClass = new AndroidJavaClass(JAVA_HOCKEYUNITYPLUGIN_CLASS)) 251 | { 252 | var currentActivity = unityPlayer.GetStatic("currentActivity"); 253 | pluginClass.CallStatic("startFeedbackForm", currentActivity); 254 | } 255 | } 256 | else 257 | { 258 | Debug.Log("Failed to present feedback form. SDK has not been initialized, yet."); 259 | } 260 | #endif 261 | } 262 | 263 | /// 264 | /// Collect all header fields for the custom exception report. 265 | /// 266 | /// A list which contains the header fields for a log file. 267 | protected virtual List GetLogHeaders () 268 | { 269 | List list = new List (); 270 | 271 | #if (UNITY_ANDROID && !UNITY_EDITOR) 272 | using (var pluginClass = new AndroidJavaClass(JAVA_HOCKEYUNITYPLUGIN_CLASS)) 273 | { 274 | var versionCode = pluginClass.CallStatic("getVersionCode"); 275 | var versionName = pluginClass.CallStatic("getVersionName"); 276 | var manufacturer = pluginClass.CallStatic("getManufacturer"); 277 | var model = pluginClass.CallStatic("getModel"); 278 | var deviceIdentifier = pluginClass.CallStatic("getDeviceIdentifier"); 279 | 280 | list.Add("Package: " + packageID); 281 | list.Add("Version Code: " + versionCode); 282 | list.Add("Version Name: " + versionName); 283 | 284 | var versionComponents = SystemInfo.operatingSystem.Split('/'); 285 | var osVersion = "Android: " + versionComponents[0].Replace("Android OS ", ""); 286 | list.Add (osVersion); 287 | 288 | list.Add("Manufacturer: " + manufacturer); 289 | list.Add("Model: " + model); 290 | list.Add("CrashReporter Key: " + deviceIdentifier); 291 | list.Add("Date: " + DateTime.UtcNow.ToString("ddd MMM dd HH:mm:ss {}zzzz yyyy").Replace("{}", "GMT")); 292 | } 293 | #endif 294 | 295 | return list; 296 | } 297 | 298 | /// 299 | /// Create the form data for a single exception report. 300 | /// 301 | /// A string that contains information about the exception. 302 | /// The form data for the current crash report. 303 | protected virtual WWWForm CreateForm (string log) 304 | { 305 | WWWForm form = new WWWForm (); 306 | 307 | #if (UNITY_ANDROID && !UNITY_EDITOR) 308 | byte[] bytes = null; 309 | using(FileStream fs = File.OpenRead(log)){ 310 | 311 | if (fs.Length > MAX_CHARS) { 312 | string resizedLog = null; 313 | 314 | using(StreamReader reader = new StreamReader(fs)) { 315 | 316 | reader.BaseStream.Seek( fs.Length - MAX_CHARS, SeekOrigin.Begin ); 317 | resizedLog = reader.ReadToEnd(); 318 | } 319 | 320 | List logHeaders = GetLogHeaders(); 321 | string logHeader = ""; 322 | 323 | foreach (string header in logHeaders) { 324 | logHeader += header + "\n"; 325 | } 326 | resizedLog = logHeader + "\n" + "[...]" + resizedLog; 327 | 328 | try { 329 | bytes = System.Text.Encoding.Default.GetBytes(resizedLog); 330 | } catch(ArgumentException ae) { 331 | if (Debug.isDebugBuild) { 332 | Debug.Log("Failed to read bytes of log file: " + ae); 333 | } 334 | } 335 | } else { 336 | try { 337 | bytes = File.ReadAllBytes(log); 338 | } catch(SystemException se) { 339 | if (Debug.isDebugBuild) { 340 | Debug.Log("Failed to read bytes of log file: " + se); 341 | } 342 | } 343 | } 344 | } 345 | 346 | if(bytes != null) { 347 | form.AddBinaryData("log", bytes, log, "text/plain"); 348 | } 349 | 350 | #endif 351 | 352 | return form; 353 | } 354 | 355 | /// 356 | /// Create the log directory if needed. 357 | /// 358 | protected virtual void CreateLogDirectory () 359 | { 360 | #if (UNITY_ANDROID && !UNITY_EDITOR) 361 | string logsDirectoryPath = Application.persistentDataPath + LOG_FILE_DIR; 362 | 363 | try { 364 | Directory.CreateDirectory (logsDirectoryPath); 365 | } catch (Exception e) { 366 | if (Debug.isDebugBuild) Debug.Log ("Failed to create log directory at " + logsDirectoryPath + ": " + e); 367 | } 368 | #endif 369 | } 370 | 371 | /// 372 | /// Get a list of all existing exception reports. 373 | /// 374 | /// A list which contains the filenames of the log files. 375 | protected virtual List GetLogFiles () 376 | { 377 | List logs = new List (); 378 | 379 | #if (UNITY_ANDROID && !UNITY_EDITOR) 380 | string logsDirectoryPath = Application.persistentDataPath + LOG_FILE_DIR; 381 | 382 | try { 383 | DirectoryInfo info = new DirectoryInfo(logsDirectoryPath); 384 | FileInfo[] files = info.GetFiles(); 385 | 386 | if (files.Length > 0) { 387 | foreach (FileInfo file in files) { 388 | if (file.Extension == ".log") { 389 | logs.Add(file.FullName); 390 | } else { 391 | File.Delete(file.FullName); 392 | } 393 | } 394 | } 395 | } catch(Exception e) { 396 | if (Debug.isDebugBuild) { 397 | Debug.Log("Failed to write exception log to file: " + e); 398 | } 399 | } 400 | #endif 401 | 402 | return logs; 403 | } 404 | 405 | /// 406 | /// Upload existing reports to HockeyApp and delete delete them locally. 407 | /// 408 | protected virtual IEnumerator SendLogs (List logs) 409 | { 410 | string crashPath = HOCKEYAPP_CRASHESPATH; 411 | string url = GetBaseURL () + crashPath.Replace ("[APPID]", appID); 412 | 413 | #if (UNITY_ANDROID && !UNITY_EDITOR) 414 | using (var pluginClass = new AndroidJavaClass(JAVA_HOCKEYUNITYPLUGIN_CLASS)) 415 | { 416 | var sdkName = pluginClass.CallStatic("getSdkName"); 417 | if (sdkName != null) { 418 | #if UNITY_2017_1_OR_NEWER 419 | url += "?sdk=" + UnityWebRequest.EscapeURL(sdkName); 420 | #else 421 | url += "?sdk=" + WWW.EscapeURL(sdkName); 422 | #endif 423 | 424 | } 425 | } 426 | #endif 427 | 428 | foreach (string log in logs) { 429 | WWWForm postForm = CreateForm (log); 430 | string lContent = postForm.headers ["Content-Type"].ToString (); 431 | lContent = lContent.Replace ("\"", ""); 432 | 433 | #if UNITY_2017_1_OR_NEWER 434 | UnityWebRequest postRequest = new UnityWebRequest(url, "POST"); 435 | postRequest.SetRequestHeader("Content-Type", lContent); 436 | postRequest.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer(); 437 | postRequest.uploadHandler = (UploadHandler)new UploadHandlerRaw(postForm.data); 438 | 439 | yield return postRequest.SendWebRequest(); 440 | 441 | if (!postRequest.isNetworkError) { 442 | #else 443 | Dictionary headers = new Dictionary(); 444 | headers.Add("Content-Type", lContent); 445 | WWW www = new WWW(url, postForm.data, headers); 446 | yield return www; 447 | 448 | if (String.IsNullOrEmpty(www.error)) { 449 | #endif 450 | try { 451 | File.Delete (log); 452 | } catch (Exception e) { 453 | if (Debug.isDebugBuild) 454 | Debug.Log ("Failed to delete exception log: " + e); 455 | } 456 | } else { 457 | if (Debug.isDebugBuild) 458 | #if UNITY_2017_1_OR_NEWER 459 | Debug.Log ("Crash sending error: " + postRequest.error); 460 | #else 461 | Debug.Log("Crash sending error: " + www.error); 462 | #endif 463 | } 464 | } 465 | } 466 | 467 | /// 468 | /// Write a single exception report to disk. 469 | /// 470 | /// A string that contains the reason for the exception. 471 | /// The stacktrace for the exception. 472 | protected virtual void WriteLogToDisk (string logString, string stackTrace) 473 | { 474 | #if (UNITY_ANDROID && !UNITY_EDITOR) 475 | string logSession = DateTime.Now.ToString("yyyy-MM-dd-HH_mm_ss_fff"); 476 | string log = logString.Replace("\n", " "); 477 | string[]stacktraceLines = stackTrace.Split('\n'); 478 | 479 | log = "\n" + log + "\n"; 480 | foreach (string line in stacktraceLines) { 481 | if(line.Length > 0) { 482 | log +=" at " + line + "\n"; 483 | } 484 | } 485 | 486 | List logHeaders = GetLogHeaders(); 487 | using (StreamWriter file = new StreamWriter(Application.persistentDataPath + LOG_FILE_DIR + "LogFile_" + logSession + ".log", true)) { 488 | foreach (string header in logHeaders) { 489 | file.WriteLine(header); 490 | } 491 | file.WriteLine(log); 492 | } 493 | #endif 494 | } 495 | 496 | /// 497 | /// Get the base url used for custom exception reports. 498 | /// 499 | /// A formatted base url. 500 | protected virtual string GetBaseURL () 501 | { 502 | string baseURL = ""; 503 | 504 | #if (UNITY_ANDROID && !UNITY_EDITOR) 505 | 506 | string urlString = serverURL.Trim(); 507 | if(urlString.Length > 0 && urlString != SERVER_URL_PLACEHOLDER) { 508 | baseURL = urlString; 509 | 510 | if(baseURL[baseURL.Length -1].Equals("/") != true) { 511 | baseURL += "/"; 512 | } 513 | } else { 514 | baseURL = HOCKEYAPP_BASEURL; 515 | } 516 | #endif 517 | 518 | return baseURL; 519 | } 520 | 521 | /// 522 | /// Checks whether internet is reachable 523 | /// 524 | protected virtual bool IsConnected () 525 | { 526 | bool connected = false; 527 | 528 | #if (UNITY_ANDROID && !UNITY_EDITOR) 529 | 530 | if (Application.internetReachability == NetworkReachability.ReachableViaLocalAreaNetwork || 531 | (Application.internetReachability == NetworkReachability.ReachableViaCarrierDataNetwork)) { 532 | connected = true; 533 | } 534 | #endif 535 | 536 | return connected; 537 | } 538 | 539 | /// 540 | /// Handle a single exception. By default the exception and its stacktrace gets written to disk. 541 | /// 542 | /// A string that contains the reason for the exception. 543 | /// The stacktrace for the exception. 544 | protected virtual void HandleException (string logString, string stackTrace) 545 | { 546 | 547 | #if (UNITY_ANDROID && !UNITY_EDITOR) 548 | try 549 | { 550 | WriteLogToDisk(logString, stackTrace); 551 | } 552 | catch (Exception e) 553 | { 554 | AndroidLog(e.ToString()); 555 | } 556 | #endif 557 | } 558 | 559 | /// 560 | /// Callback for handling log messages. 561 | /// 562 | /// A string that contains the reason for the exception. 563 | /// The stacktrace for the exception. 564 | /// The type of the log message. 565 | public void OnHandleLogCallback (string logString, string stackTrace, LogType type) 566 | { 567 | #if (UNITY_ANDROID && !UNITY_EDITOR) 568 | if(LogType.Assert == type || LogType.Exception == type || LogType.Error == type) { 569 | HandleException(logString, stackTrace); 570 | } 571 | #endif 572 | } 573 | 574 | /// 575 | /// Callback for handling unresolved exceptions. 576 | /// 577 | public void OnHandleUnresolvedException (object sender, System.UnhandledExceptionEventArgs args) 578 | { 579 | #if (UNITY_ANDROID && !UNITY_EDITOR) 580 | if(args == null || args.ExceptionObject == null) { 581 | return; 582 | } 583 | 584 | if(args.ExceptionObject.GetType() == typeof(System.Exception)) { 585 | System.Exception e = (System.Exception)args.ExceptionObject; 586 | HandleException(e.Source, e.StackTrace); 587 | } 588 | #endif 589 | } 590 | 591 | #region Android Binding Helpers 592 | #if (UNITY_ANDROID && !UNITY_EDITOR) 593 | 594 | private static AndroidJavaObject DictainaryToJavaMap(IDictionary parameters, string javaKeyClass, string javaValueClass) 595 | { 596 | if (parameters == null) 597 | { 598 | return null; 599 | } 600 | var javaMap = new AndroidJavaObject("java.util.HashMap"); 601 | var putMethod = AndroidJNIHelper.GetMethodID(javaMap.GetRawClass(), "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); 602 | foreach (var kvp in parameters) 603 | { 604 | AndroidJNI.CallObjectMethod(javaMap.GetRawObject(), putMethod, AndroidJNIHelper.CreateJNIArgArray(new object[] 605 | { 606 | new AndroidJavaObject(javaKeyClass, kvp.Key), 607 | new AndroidJavaObject(javaValueClass, kvp.Value) 608 | })); 609 | } 610 | return javaMap; 611 | } 612 | 613 | private static void AndroidLog(string message) 614 | { 615 | var logClass = new AndroidJavaObject("android.util.Log"); 616 | logClass.CallStatic("d", "HockeyApp", message); 617 | } 618 | 619 | #endif 620 | #endregion 621 | } 622 | -------------------------------------------------------------------------------- /Plugins/HockeyAppUnityAndroid/HockeySDK-5.2.0.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/Plugins/HockeyAppUnityAndroid/HockeySDK-5.2.0.aar -------------------------------------------------------------------------------- /Plugins/HockeyAppUnityAndroid/README.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/Plugins/HockeyAppUnityAndroid/README.pdf -------------------------------------------------------------------------------- /Plugins/HockeyAppUnityAndroid/hockeysdk-unity-5.2.0.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bitstadium/HockeySDK-Unity-Android/eabf07dd7786de4dfb2b9be6b04f75eb6cdb66cc/Plugins/HockeyAppUnityAndroid/hockeysdk-unity-5.2.0.aar -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Version 5.2.0 2 | 3 | ## Introduction 4 | 5 | The HockeyAppUnity-Android plugin implements support for using HockeyApp in your Unity-Android builds. 6 | 7 | The following features are currently supported: 8 | 9 | 1. **Collect crash reports:** If your app crashes, a crash log is written to the device's storage. If the user starts the app again, they will be asked asked to submit the crash report to HockeyApp. This works for both beta and live apps, i.e. those submitted to Google Play or other app stores. Crash logs contain viable information for you to help resolve the issue. 10 | 11 | 2. **Collect exceptions** The HockeySDK-Unity-Android can automatically report uncaught managed exceptions coming from your C# code. Just like crashes, those exceptions will be sent on the next app start and are displayed on HockeyApp. 12 | 13 | 2. **User metrics:** Understand user behavior to improve your app. Track usage through daily and monthly active users. Monitor crash impacted users. Measure customer engagement through session count. 14 | 15 | 3. **Update alpha/beta apps:** The app will check with HockeyApp if a new version for your alpha/beta build is available. If yes, it will show a dialog to users and let them see the release notes, the version history and start the installation process right away. You can even force the installation of certain updates. 16 | 17 | 4. **Feedback:** Besides crash reports, collecting feedback from your users from within your app is a great option to help with improving your app. You act on and answer feedback directly from the HockeyApp backend. 18 | 19 | 5. **Authenticate:** To help you stay in control of closed tester groups, you can identify and authenticate users against your registered testers with the HockeyApp backend. The authentication feature supports several ways of authentication. 20 | 21 | This document contains the following sections: 22 | 23 | 1. [Requirements](#1) 24 | 2. [Installation & Setup](#2) 25 | 3. [Examples](#3) 26 | 4. [Troubleshooting](#4) 27 | 5. [Code of Conduct](#5) 28 | 6. [Contributor License](#6) 29 | 7. [Licenses](#7) 30 | 31 | ## Requirements 32 | 33 | * [Changelog](Documentation/Changelog.md) 34 | * Unity 5.0 or newer (SDK versions with Unity 4 support can be found at the [Unity Asset Store](https://www.assetstore.unity3d.com/en/?gclid=CO) or by switching to the 1.0.3 tag on GitHub). 35 | * Android API level 16 or later. 36 | 37 | ## Installation & Setup 38 | 39 | The following steps illustrate how to integrate the HockeyAppUnity-Android plugin: 40 | 41 | ### 1) Import plugin 42 | You can either import the plugin [from the Asset Store](https://www.assetstore.unity3d.com/en/#!/content/17759) or download the *.unitypackage* from our [GitHub releases page](https://github.com/bitstadium/HockeySDK-Unity-Android/releases) and install it by double-clicking the file. That's it! 43 | 44 | **Note:** In case you've cloned the repo, simply copy the **HockeyAppUnityAndroid** folder into the **Assets** directory of your Unity project. 45 | 46 | ![alt text](Documentation/01_add_plugin.png "Add HockeyAppUnityAndroid folders") 47 | 48 | ### 2) Modify AndroidManifest.xml 49 | Change the value for **package** inside the AndroidManifest.xml (*Assets/HockeyAppUnityAndroid*) to the package identifier of your project. 50 | 51 | ![alt text](Documentation/02_modify_manifest.png "Modify manifest") 52 | 53 | ### 3) Create plugin-GameObject 54 | Create an empty game object (*GameObject -> Create Empty*) and add the **HockeyAppAndroid.cs** as one of its components. 55 | 56 | ![alt text](Documentation/03_add_component.png "Add component to script") 57 | 58 | Select the game object in the **Hierarchy** pane and fill in some additional informations inside the Inspector window. 59 | 60 | * **App ID** - the app ID provided by HockeyApp 61 | * **Package ID** equals the package name of your HockeyApp app 62 | * **Server URL** - if you have your own server instance, please type in its url. In most cases this field should be left blank. 63 | * **Authenticator Type** - an authentication type (see [Authenticating Users on Android](http://hockeyapp.net/help/sdk/android/4.0.0-beta.1/net/hockeyapp/android/LoginManager.html)). By default **BITAuthenticatorIdentificationTypeAnonymous** will be used. 64 | * **Secret** - the secret provided by HockeyApp (only for authentication using email address) 65 | * **Auto Upload Crashes** - this option defines if the crash reporting feature should send crash reports automatically without asking the user on the next app start. 66 | * **Exception Logging** - by checking this option you will get more precise information about exceptions in your Unity scripts 67 | * **Update Alert** - check this option if users should be informed about app updates from inside your app 68 | * **User Metrics** - activating this feature will automatically usage data such as daily/monthly unique users and number of sessions per day 69 | 70 | ![alt text](Documentation/04_config_script.png "Configure script") 71 | 72 | ### 4) Configure build settings 73 | You are now ready to build the project: Select **File -> Build Settings...** and switch to **Android** in the platform section. Check **Development Build** (see Build Settings section). 74 | 75 | ![alt text](Documentation/05_config_build_settings.png "Configure build settings") 76 | 77 | That's it: Build your app / Android project as usual. 78 | 79 | Your app will now send crash reports and user metrics (e.g. daily/monthly unique users, # of sessions per day) to the server without doing any additional work. To see those statistics just visit your app on the portal. 80 | 81 | ![alt text](Documentation/07_portal_metrics.png "View crashes and user metrics in the portal.") 82 | 83 | ## Build Settings ## 84 | 85 | The **Development Build** option affects the exception handling in C#. You will get a crash report in any case, but the data quality differs. It is recommend to enable it for alpha and beta builds, but to disable this option for production. 86 | 87 | **Disabled Development Build**: 88 | 89 | IndexOutOfRangeException: Array index is out of range. 90 | at (wrapper stelemref) object:stelemref (object,intptr,object) 91 | at TestUI.OnGUI () 92 | 93 | **Enabled Development Build**: 94 | 95 | IndexOutOfRangeException: Array index is out of range. 96 | at (wrapper stelemref) object:stelemref (object,intptr,object) 97 | at TestUI.OnGUI () (at /Users/name/Documents/Workspace/HockeyAppUnity-Android/ExampleGame/Assets/TestUI/TestUI.cs:67) 98 | 99 | ## Examples 100 | 101 | ### Feedback Form 102 | 103 | In order to provide your users with a feedback form, just call the following static method: 104 | 105 | HockeyAppAndroid.ShowFeedbackForm(); 106 | 107 | ### Explicitly check for updates 108 | 109 | Usually, the update check happens everytime the app enters the foreground. If you'd like to explicitly trigger this check, please add the following to your code: 110 | 111 | HockeyAppAndroid.CheckForUpdate(); 112 | 113 | ## Troubleshooting 114 | 115 | If you have any problems with compiling or running the Unity Android project, please check the following points: 116 | 117 | ### Crash: Unable to find explicit activity class (UpdateActivity/FeedbackActivity) 118 | 119 | If you get an exception with the following reason 120 | 121 | Unable to find explicit activity class {net.hockeyapp.ExampleGame/net.hockeyapp.android.UpdateActivity} 122 | 123 | it is most likely caused by a corrupted manifest file merge. To fix that issue, please check the **Google Android Project** box inside the Android Build Settings and click the **Export** button. 124 | 125 | ![alt text](Documentation/06_trouble_manifest_merge.png "Export Android Studio project") 126 | 127 | Next, open the Android Studio project and define the missing activities inside the manifest file: 128 | 129 | ```xml 130 | 131 | ... 132 | 133 | 134 | 135 | ``` 136 | 137 | Build and run the project inside Android Studio. 138 | 139 | ## Code of Conduct 140 | 141 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. 142 | 143 | ## Contributor License 144 | 145 | You must sign a [Contributor License Agreement](https://cla.microsoft.com/) before submitting your pull request. To complete the Contributor License Agreement (CLA), you will need to submit a request via the [form](https://cla.microsoft.com/) and then electronically sign the CLA when you receive the email containing the link to the document. You need to sign the CLA only once to cover submission to any Microsoft OSS project. 146 | 147 | ## Licenses 148 | 149 | The Hockey SDK is provided under the following license: 150 | 151 | Copyright (c) Microsoft Corporation. All rights reserved. 152 | 153 | Permission is hereby granted, free of charge, to any person 154 | obtaining a copy of this software and associated documentation 155 | files (the "Software"), to deal in the Software without 156 | restriction, including without limitation the rights to use, 157 | copy, modify, merge, publish, distribute, sublicense, and/or sell 158 | copies of the Software, and to permit persons to whom the 159 | Software is furnished to do so, subject to the following 160 | conditions: 161 | 162 | The above copyright notice and this permission notice shall be 163 | included in all copies or substantial portions of the Software. 164 | 165 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 166 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 167 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 168 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 169 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 170 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 171 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 172 | OTHER DEALINGS IN THE SOFTWARE. 173 | 174 | The following classes are based on code from the project 175 | android-remote-stacktrace: 176 | 177 | + Constants 178 | + CrashManager 179 | + ExceptionHandler 180 | 181 | Source: http://code.google.com/p/android-remote-stacktrace/ 182 | 183 | The original license of these classes is: 184 | 185 | Copyright (c) 2009 nullwire aps 186 | 187 | Permission is hereby granted, free of charge, to any person 188 | obtaining a copy of this software and associated documentation 189 | files (the "Software"), to deal in the Software without 190 | restriction, including without limitation the rights to use, 191 | copy, modify, merge, publish, distribute, sublicense, and/or sell 192 | copies of the Software, and to permit persons to whom the 193 | Software is furnished to do so, subject to the following 194 | conditions: 195 | 196 | The above copyright notice and this permission notice shall be 197 | included in all copies or substantial portions of the Software. 198 | 199 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 200 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 201 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 202 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 203 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 204 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 205 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 206 | OTHER DEALINGS IN THE SOFTWARE. 207 | 208 | Contributors: 209 | + Mads Kristiansen, mads.kristiansen@nullwire.com 210 | + Glen Humphrey 211 | + Evan Charlton 212 | + Peter Hewitt 213 | 214 | The following class is based on code from the Android Open Source Project 215 | 216 | Base64 217 | 218 | Copyright (C) 2010 The Android Open Source Project 219 | 220 | Licensed under the Apache License, Version 2.0 (the "License"); 221 | you may not use this file except in compliance with the License. 222 | You may obtain a copy of the License at 223 | 224 | http://www.apache.org/licenses/LICENSE-2.0 225 | 226 | Unless required by applicable law or agreed to in writing, software 227 | distributed under the License is distributed on an "AS IS" BASIS, 228 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 229 | See the License for the specific language governing permissions and 230 | limitations under the License. 231 | --------------------------------------------------------------------------------