From 52c157a734eca7f03bb7e519acb7f831841c2167 Mon Sep 17 00:00:00 2001 From: Mohsin Khan Date: Thu, 6 Jul 2017 00:46:57 +0500 Subject: [PATCH] basic unity project code --- .gitignore | 36 ++ LICENSE.md | 24 + README.md | 38 ++ Unity Project/Assets/MK Assets.meta | 9 + Unity Project/Assets/MK Assets/Common.meta | 9 + .../Assets/MK Assets/Common/Editor.meta | 9 + .../MK Assets/Common/Editor/Extension.meta | 9 + .../Editor/Extension/TextExtensionEditor.cs | 30 ++ .../Extension/TextExtensionEditor.cs.meta | 12 + .../Editor/Extension/ToggleExtensionEditor.cs | 36 ++ .../Extension/ToggleExtensionEditor.cs.meta | 12 + .../Common/Editor/Miscellaneous.meta | 9 + .../Common/Editor/Miscellaneous/Anchor.cs | 28 ++ .../Editor/Miscellaneous/Anchor.cs.meta | 12 + .../Miscellaneous/FindMissingScripts.cs | 48 ++ .../Miscellaneous/FindMissingScripts.cs.meta | 12 + .../FindMissingScriptsRecursively.cs | 61 +++ .../FindMissingScriptsRecursively.cs.meta | 12 + .../Common/Editor/Miscellaneous/SetPivot.cs | 150 ++++++ .../Editor/Miscellaneous/SetPivot.cs.meta | 12 + .../Assets/MK Assets/Common/Extensions.meta | 9 + .../Common/Extensions/MonoExtension.cs | 321 +++++++++++++ .../Common/Extensions/MonoExtension.cs.meta | 12 + .../Common/Extensions/TextExtension.cs | 28 ++ .../Common/Extensions/TextExtension.cs.meta | 12 + .../Common/Extensions/ToggleExtension.cs | 79 ++++ .../Common/Extensions/ToggleExtension.cs.meta | 12 + .../Assets/MK Assets/Common/GameLogger.cs | 424 +++++++++++++++++ .../MK Assets/Common/GameLogger.cs.meta | 12 + .../Assets/MK Assets/Common/Helpers.meta | 9 + .../MK Assets/Common/Helpers/WebAudioClip.cs | 75 +++ .../Common/Helpers/WebAudioClip.cs.meta | 12 + .../MK Assets/Common/Helpers/WebData.cs | 52 +++ .../MK Assets/Common/Helpers/WebData.cs.meta | 12 + .../Assets/MK Assets/Common/MK-256.png | Bin 0 -> 38266 bytes .../Assets/MK Assets/Common/MK-256.png.meta | 68 +++ .../Assets/MK Assets/Common/Managers.meta | 9 + .../Common/Managers/SceneController.cs | 236 ++++++++++ .../Common/Managers/SceneController.cs.meta | 12 + .../MK Assets/Common/Miscellaneous.meta | 9 + .../Common/Miscellaneous/BringToFront.cs | 13 + .../Common/Miscellaneous/BringToFront.cs.meta | 12 + .../Common/Miscellaneous/DeactivateOnAwake.cs | 13 + .../Miscellaneous/DeactivateOnAwake.cs.meta | 12 + .../Common/Miscellaneous/DontDestroyOnLoad.cs | 12 + .../Miscellaneous/DontDestroyOnLoad.cs.meta | 12 + .../Common/Miscellaneous/FPSDisplay.cs | 38 ++ .../Common/Miscellaneous/FPSDisplay.cs.meta | 12 + .../Common/Miscellaneous/SelfDestroy.cs | 14 + .../Common/Miscellaneous/SelfDestroy.cs.meta | 12 + .../Assets/MK Assets/Common/Utilities.meta | 9 + .../Common/Utilities/GameUtilities.cs | 104 +++++ .../Common/Utilities/GameUtilities.cs.meta | 12 + .../MK Assets/Common/Utilities/ReportEmail.cs | 189 ++++++++ .../Common/Utilities/ReportEmail.cs.meta | 12 + .../MK Assets/Common/Utilities/Singleton.cs | 101 +++++ .../Common/Utilities/Singleton.cs.meta | 12 + .../Assets/MK Assets/Mono Direct.meta | 9 + .../MK Assets/Mono Direct/MonoDirect.cs | 427 ++++++++++++++++++ .../MK Assets/Mono Direct/MonoDirect.cs.meta | 12 + .../Mono Direct/MonoDirectDemo.unity | Bin 0 -> 12308 bytes .../Mono Direct/MonoDirectDemo.unity.meta | 8 + .../Mono Direct/MonoDirectExample.cs | 193 ++++++++ .../Mono Direct/MonoDirectExample.cs.meta | 12 + Unity Project/Assets/MK Assets/Sample.unity | Bin 0 -> 36572 bytes .../Assets/MK Assets/Sample.unity.meta | 8 + .../ProjectSettings/AudioManager.asset | Bin 0 -> 4140 bytes .../ProjectSettings/ClusterInputManager.asset | Bin 0 -> 4104 bytes .../ProjectSettings/DynamicsManager.asset | Bin 0 -> 4280 bytes .../ProjectSettings/EditorBuildSettings.asset | Bin 0 -> 4172 bytes .../ProjectSettings/EditorSettings.asset | Bin 0 -> 4168 bytes .../ProjectSettings/GraphicsSettings.asset | Bin 0 -> 4390 bytes .../ProjectSettings/InputManager.asset | Bin 0 -> 5520 bytes .../ProjectSettings/NavMeshAreas.asset | Bin 0 -> 4460 bytes .../ProjectSettings/NetworkManager.asset | Bin 0 -> 4112 bytes .../ProjectSettings/Physics2DSettings.asset | Bin 0 -> 4380 bytes .../ProjectSettings/ProjectSettings.asset | Bin 0 -> 51918 bytes .../ProjectSettings/ProjectVersion.txt | 1 + .../ProjectSettings/QualitySettings.asset | Bin 0 -> 4976 bytes .../ProjectSettings/TagManager.asset | Bin 0 -> 4308 bytes .../ProjectSettings/TimeManager.asset | Bin 0 -> 4116 bytes .../UnityConnectSettings.asset | Bin 0 -> 4216 bytes 82 files changed, 3230 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 Unity Project/Assets/MK Assets.meta create mode 100644 Unity Project/Assets/MK Assets/Common.meta create mode 100644 Unity Project/Assets/MK Assets/Common/Editor.meta create mode 100644 Unity Project/Assets/MK Assets/Common/Editor/Extension.meta create mode 100644 Unity Project/Assets/MK Assets/Common/Editor/Extension/TextExtensionEditor.cs create mode 100644 Unity Project/Assets/MK Assets/Common/Editor/Extension/TextExtensionEditor.cs.meta create mode 100644 Unity Project/Assets/MK Assets/Common/Editor/Extension/ToggleExtensionEditor.cs create mode 100644 Unity Project/Assets/MK Assets/Common/Editor/Extension/ToggleExtensionEditor.cs.meta create mode 100644 Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous.meta create mode 100755 Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/Anchor.cs create mode 100644 Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/Anchor.cs.meta create mode 100755 Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/FindMissingScripts.cs create mode 100644 Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/FindMissingScripts.cs.meta create mode 100755 Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/FindMissingScriptsRecursively.cs create mode 100644 Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/FindMissingScriptsRecursively.cs.meta create mode 100755 Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/SetPivot.cs create mode 100644 Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/SetPivot.cs.meta create mode 100644 Unity Project/Assets/MK Assets/Common/Extensions.meta create mode 100644 Unity Project/Assets/MK Assets/Common/Extensions/MonoExtension.cs create mode 100644 Unity Project/Assets/MK Assets/Common/Extensions/MonoExtension.cs.meta create mode 100755 Unity Project/Assets/MK Assets/Common/Extensions/TextExtension.cs create mode 100644 Unity Project/Assets/MK Assets/Common/Extensions/TextExtension.cs.meta create mode 100755 Unity Project/Assets/MK Assets/Common/Extensions/ToggleExtension.cs create mode 100644 Unity Project/Assets/MK Assets/Common/Extensions/ToggleExtension.cs.meta create mode 100644 Unity Project/Assets/MK Assets/Common/GameLogger.cs create mode 100644 Unity Project/Assets/MK Assets/Common/GameLogger.cs.meta create mode 100644 Unity Project/Assets/MK Assets/Common/Helpers.meta create mode 100644 Unity Project/Assets/MK Assets/Common/Helpers/WebAudioClip.cs create mode 100644 Unity Project/Assets/MK Assets/Common/Helpers/WebAudioClip.cs.meta create mode 100644 Unity Project/Assets/MK Assets/Common/Helpers/WebData.cs create mode 100644 Unity Project/Assets/MK Assets/Common/Helpers/WebData.cs.meta create mode 100644 Unity Project/Assets/MK Assets/Common/MK-256.png create mode 100644 Unity Project/Assets/MK Assets/Common/MK-256.png.meta create mode 100644 Unity Project/Assets/MK Assets/Common/Managers.meta create mode 100644 Unity Project/Assets/MK Assets/Common/Managers/SceneController.cs create mode 100644 Unity Project/Assets/MK Assets/Common/Managers/SceneController.cs.meta create mode 100644 Unity Project/Assets/MK Assets/Common/Miscellaneous.meta create mode 100644 Unity Project/Assets/MK Assets/Common/Miscellaneous/BringToFront.cs create mode 100644 Unity Project/Assets/MK Assets/Common/Miscellaneous/BringToFront.cs.meta create mode 100644 Unity Project/Assets/MK Assets/Common/Miscellaneous/DeactivateOnAwake.cs create mode 100644 Unity Project/Assets/MK Assets/Common/Miscellaneous/DeactivateOnAwake.cs.meta create mode 100644 Unity Project/Assets/MK Assets/Common/Miscellaneous/DontDestroyOnLoad.cs create mode 100644 Unity Project/Assets/MK Assets/Common/Miscellaneous/DontDestroyOnLoad.cs.meta create mode 100644 Unity Project/Assets/MK Assets/Common/Miscellaneous/FPSDisplay.cs create mode 100644 Unity Project/Assets/MK Assets/Common/Miscellaneous/FPSDisplay.cs.meta create mode 100644 Unity Project/Assets/MK Assets/Common/Miscellaneous/SelfDestroy.cs create mode 100644 Unity Project/Assets/MK Assets/Common/Miscellaneous/SelfDestroy.cs.meta create mode 100644 Unity Project/Assets/MK Assets/Common/Utilities.meta create mode 100644 Unity Project/Assets/MK Assets/Common/Utilities/GameUtilities.cs create mode 100644 Unity Project/Assets/MK Assets/Common/Utilities/GameUtilities.cs.meta create mode 100644 Unity Project/Assets/MK Assets/Common/Utilities/ReportEmail.cs create mode 100644 Unity Project/Assets/MK Assets/Common/Utilities/ReportEmail.cs.meta create mode 100644 Unity Project/Assets/MK Assets/Common/Utilities/Singleton.cs create mode 100644 Unity Project/Assets/MK Assets/Common/Utilities/Singleton.cs.meta create mode 100644 Unity Project/Assets/MK Assets/Mono Direct.meta create mode 100644 Unity Project/Assets/MK Assets/Mono Direct/MonoDirect.cs create mode 100644 Unity Project/Assets/MK Assets/Mono Direct/MonoDirect.cs.meta create mode 100644 Unity Project/Assets/MK Assets/Mono Direct/MonoDirectDemo.unity create mode 100644 Unity Project/Assets/MK Assets/Mono Direct/MonoDirectDemo.unity.meta create mode 100644 Unity Project/Assets/MK Assets/Mono Direct/MonoDirectExample.cs create mode 100644 Unity Project/Assets/MK Assets/Mono Direct/MonoDirectExample.cs.meta create mode 100644 Unity Project/Assets/MK Assets/Sample.unity create mode 100644 Unity Project/Assets/MK Assets/Sample.unity.meta create mode 100755 Unity Project/ProjectSettings/AudioManager.asset create mode 100755 Unity Project/ProjectSettings/ClusterInputManager.asset create mode 100755 Unity Project/ProjectSettings/DynamicsManager.asset create mode 100755 Unity Project/ProjectSettings/EditorBuildSettings.asset create mode 100755 Unity Project/ProjectSettings/EditorSettings.asset create mode 100755 Unity Project/ProjectSettings/GraphicsSettings.asset create mode 100755 Unity Project/ProjectSettings/InputManager.asset create mode 100755 Unity Project/ProjectSettings/NavMeshAreas.asset create mode 100755 Unity Project/ProjectSettings/NetworkManager.asset create mode 100755 Unity Project/ProjectSettings/Physics2DSettings.asset create mode 100755 Unity Project/ProjectSettings/ProjectSettings.asset create mode 100755 Unity Project/ProjectSettings/ProjectVersion.txt create mode 100755 Unity Project/ProjectSettings/QualitySettings.asset create mode 100755 Unity Project/ProjectSettings/TagManager.asset create mode 100755 Unity Project/ProjectSettings/TimeManager.asset create mode 100755 Unity Project/ProjectSettings/UnityConnectSettings.asset diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6859ffd --- /dev/null +++ b/.gitignore @@ -0,0 +1,36 @@ +# =============== # +# Unity generated # +# =============== # +Temp/ +Obj/ +UnityGenerated/ +Library/ + +Unity Project/Assets/AssetStoreTools/ +Unity Project/Assets/AssetStoreTools.meta + +# ===================================== # +# Visual Studio / MonoDevelop generated # +# ===================================== # +ExportedObj/ +*.svd +*.userprefs +*.csproj +*.pidb +*.suo +*.sln +*.user +*.unityproj +*.booproj + +# ============ # +# OS generated # +# ============ # +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +Icon? +ehthumbs.db +Thumbs.db \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..a07392d --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,24 @@ +The MIT License (MIT) + +Copyright (c) 2017 Mohsin Khan + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..fbc4e31 --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +# Unity Basic Project # + +A boilerplate project that many games could take advantage of. As it is a basic Unity project to start with. I used some portions of it in my game projects, now writing it so that it's more usable in projects to come. + +Also, It is structured properly with the namespace that it would not conflict with your code at any time. + +### Module/Feature list: ### +* Singleton - generic singleton which can be used to implement managers +* MonoDirect - solution to Monobehavoiur function callbacks (called through reflections) which can be slow in most cases and could be the reason of lag +* SceneController - which should be used to switch scenes +* ReportEmail - email reporting module which allows you to mail console data to given email address +* GameLogger - allows you to log with a lot of features like color, timestamp, italics, bold etc. +* MonoExtension - includes a lot of extension methods like InvokeExtension, UpdateExtension, AlphaFade etc. +* WebAudioClip - allows you to download audio file from given URL +* WebData - allows you to download text data from given URL + +### Editor Module/Feature list: ### +* Text component extension - text Id field added +* Toggle component extension - added support for Text and TextExtension to edit text of toggle, animator +* Anchors selected UI to corners +* Find gameObjects which have missing scripts +* Find nested gameObjects which have missing scripts - recursively +* Pivot set + +### Usage ### +* Just download project or released plugin version +* put/import it in your project +* And start using the basic listed features + +### TODO ### +* A lot to come, stay tuned + +### Special Thanks ### +* All the users who point mistakes and reported issues +* All the users who provide feedback and suggestions to improve + + +## Thanks for your support! ## \ No newline at end of file diff --git a/Unity Project/Assets/MK Assets.meta b/Unity Project/Assets/MK Assets.meta new file mode 100644 index 0000000..5ce3851 --- /dev/null +++ b/Unity Project/Assets/MK Assets.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a4e2cc1b1c7734371af2cd7b69492a7c +folderAsset: yes +timeCreated: 1493492191 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common.meta b/Unity Project/Assets/MK Assets/Common.meta new file mode 100644 index 0000000..22ff4c3 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6e89e4b13a22a4340bad8c8d04988750 +folderAsset: yes +timeCreated: 1499069366 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Editor.meta b/Unity Project/Assets/MK Assets/Common/Editor.meta new file mode 100644 index 0000000..94341da --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 52a5129b558564133951e19724f9aef4 +folderAsset: yes +timeCreated: 1499089170 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Editor/Extension.meta b/Unity Project/Assets/MK Assets/Common/Editor/Extension.meta new file mode 100644 index 0000000..d83c27a --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Editor/Extension.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9353caabec3c3468982726db9361a561 +folderAsset: yes +timeCreated: 1482175927 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Editor/Extension/TextExtensionEditor.cs b/Unity Project/Assets/MK Assets/Common/Editor/Extension/TextExtensionEditor.cs new file mode 100644 index 0000000..7e43b70 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Editor/Extension/TextExtensionEditor.cs @@ -0,0 +1,30 @@ +using UnityEngine.UI; + +namespace UnityEditor.UI +{ + [CustomEditor(typeof(TextExtension), true)] + [CanEditMultipleObjects] + public class TextExtensionEditor : TextEditor + { + SerializedProperty m_TextId; + + protected override void OnEnable() + { + base.OnEnable(); + + m_TextId = serializedObject.FindProperty("m_textId"); + } + + public override void OnInspectorGUI() + { + base.OnInspectorGUI(); + + EditorGUILayout.Space(); + + serializedObject.Update(); + EditorGUILayout.PropertyField(m_TextId); + + serializedObject.ApplyModifiedProperties(); + } + } +} diff --git a/Unity Project/Assets/MK Assets/Common/Editor/Extension/TextExtensionEditor.cs.meta b/Unity Project/Assets/MK Assets/Common/Editor/Extension/TextExtensionEditor.cs.meta new file mode 100644 index 0000000..f0877f8 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Editor/Extension/TextExtensionEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8f86d9695488e4e35a21f863da4a2c5b +timeCreated: 1499089608 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: bc4399f29bda14c248011e5393287541, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Editor/Extension/ToggleExtensionEditor.cs b/Unity Project/Assets/MK Assets/Common/Editor/Extension/ToggleExtensionEditor.cs new file mode 100644 index 0000000..4b653b2 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Editor/Extension/ToggleExtensionEditor.cs @@ -0,0 +1,36 @@ +using UnityEngine.UI; + +namespace UnityEditor.UI +{ + [CustomEditor(typeof(ToggleExtension), true)] + [CanEditMultipleObjects] + public class ToggleExtensionEditor : ToggleEditor + { + SerializedProperty m_Text; + SerializedProperty m_TextExtension; + SerializedProperty m_Animator; + + protected override void OnEnable() + { + base.OnEnable(); + + m_Text = serializedObject.FindProperty("m_textComponent"); + m_TextExtension = serializedObject.FindProperty("m_textExtensionComponent"); + m_Animator = serializedObject.FindProperty("m_Animator"); + } + + public override void OnInspectorGUI() + { + base.OnInspectorGUI(); + + EditorGUILayout.Space(); + + serializedObject.Update(); + EditorGUILayout.PropertyField(m_Text); + EditorGUILayout.PropertyField(m_TextExtension); + EditorGUILayout.PropertyField(m_Animator); + + serializedObject.ApplyModifiedProperties(); + } + } +} diff --git a/Unity Project/Assets/MK Assets/Common/Editor/Extension/ToggleExtensionEditor.cs.meta b/Unity Project/Assets/MK Assets/Common/Editor/Extension/ToggleExtensionEditor.cs.meta new file mode 100644 index 0000000..258dacd --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Editor/Extension/ToggleExtensionEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 696d62554b2834c91963341542c39dee +timeCreated: 1499089627 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: bc4399f29bda14c248011e5393287541, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous.meta b/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous.meta new file mode 100644 index 0000000..5bcc3d8 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 82774300bd08b4ea3be7d19142fb9fb7 +folderAsset: yes +timeCreated: 1499088574 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/Anchor.cs b/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/Anchor.cs new file mode 100755 index 0000000..8ec1e57 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/Anchor.cs @@ -0,0 +1,28 @@ +using UnityEditor; + +namespace UnityEngine.UI.Extensions +{ + public static class Anchor + { + [MenuItem("Tools/UI/Anchors to Corners")] + static void AnchorsToCorners() + { + foreach (Transform transform in Selection.transforms) + { + RectTransform t = transform as RectTransform; + RectTransform pt = Selection.activeTransform.parent as RectTransform; + + if (t == null || pt == null) return; + + Vector2 newAnchorsMin = new Vector2(t.anchorMin.x + t.offsetMin.x / pt.rect.width, + t.anchorMin.y + t.offsetMin.y / pt.rect.height); + Vector2 newAnchorsMax = new Vector2(t.anchorMax.x + t.offsetMax.x / pt.rect.width, + t.anchorMax.y + t.offsetMax.y / pt.rect.height); + + t.anchorMin = newAnchorsMin; + t.anchorMax = newAnchorsMax; + t.offsetMin = t.offsetMax = new Vector2(0, 0); + } + } + } +} diff --git a/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/Anchor.cs.meta b/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/Anchor.cs.meta new file mode 100644 index 0000000..a2b0c47 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/Anchor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6770386a17ef44bf396a2e5749ba1cb1 +timeCreated: 1499089469 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/FindMissingScripts.cs b/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/FindMissingScripts.cs new file mode 100755 index 0000000..ff32dc5 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/FindMissingScripts.cs @@ -0,0 +1,48 @@ +using UnityEngine; +using UnityEditor; + +public class FindMissingScripts : EditorWindow +{ + [MenuItem("Tools/FindMissingScripts")] + public static void ShowWindow() + { + EditorWindow.GetWindow(typeof(FindMissingScripts)); + } + + public void OnGUI() + { + if (GUILayout.Button("Find Missing Scripts in selected prefabs")) + { + FindInSelected(); + } + } + + private static void FindInSelected() + { + GameObject[] go = Selection.gameObjects; + int go_count = 0, components_count = 0, missing_count = 0; + foreach (GameObject g in go) + { + go_count++; + Component[] components = g.GetComponents(); + for (int i = 0; i < components.Length; i++) + { + components_count++; + if (components[i] == null) + { + missing_count++; + string s = g.name; + Transform t = g.transform; + while (t.parent != null) + { + s = t.parent.name + "/" + s; + t = t.parent; + } + Debug.Log(s + " has an empty script attached in position: " + i, g); + } + } + } + + Debug.Log(string.Format("Searched {0} GameObjects, {1} components, found {2} missing", go_count, components_count, missing_count)); + } +} \ No newline at end of file diff --git a/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/FindMissingScripts.cs.meta b/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/FindMissingScripts.cs.meta new file mode 100644 index 0000000..bc23704 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/FindMissingScripts.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0f75e7afb8bc04e7e9fffd7e709f148f +timeCreated: 1499089478 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/FindMissingScriptsRecursively.cs b/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/FindMissingScriptsRecursively.cs new file mode 100755 index 0000000..606a0c5 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/FindMissingScriptsRecursively.cs @@ -0,0 +1,61 @@ +using UnityEngine; +using UnityEditor; + +public class FindMissingScriptsRecursively : EditorWindow +{ + static int go_count = 0, components_count = 0, missing_count = 0; + + [MenuItem("Tools/FindMissingScriptsRecursively")] + public static void ShowWindow() + { + EditorWindow.GetWindow(typeof(FindMissingScriptsRecursively)); + } + + public void OnGUI() + { + if (GUILayout.Button("Find Missing Scripts in selected GameObjects")) + { + FindInSelected(); + } + } + private static void FindInSelected() + { + GameObject[] go = Selection.gameObjects; + go_count = 0; + components_count = 0; + missing_count = 0; + foreach (GameObject g in go) + { + FindInGO(g); + } + Debug.Log(string.Format("Searched {0} GameObjects, {1} components, found {2} missing", go_count, components_count, missing_count)); + } + + private static void FindInGO(GameObject g) + { + go_count++; + Component[] components = g.GetComponents(); + for (int i = 0; i < components.Length; i++) + { + components_count++; + if (components[i] == null) + { + missing_count++; + string s = g.name; + Transform t = g.transform; + while (t.parent != null) + { + s = t.parent.name + "/" + s; + t = t.parent; + } + Debug.Log(s + " has an empty script attached in position: " + i, g); + } + } + // Now recurse through each child GO (if there are any): + foreach (Transform childT in g.transform) + { + //Debug.Log("Searching " + childT.name + " " ); + FindInGO(childT.gameObject); + } + } +} \ No newline at end of file diff --git a/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/FindMissingScriptsRecursively.cs.meta b/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/FindMissingScriptsRecursively.cs.meta new file mode 100644 index 0000000..ca011de --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/FindMissingScriptsRecursively.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 220e99759c6204de8ae23fe04bca16d5 +timeCreated: 1482175932 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/SetPivot.cs b/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/SetPivot.cs new file mode 100755 index 0000000..d1863f1 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/SetPivot.cs @@ -0,0 +1,150 @@ +/* + * Version: 1.0 + * Author: Yilmaz Kiymaz (@VoxelBoy) + * Purpose: To be able to change the pivot of Game Objects + * without needing to use a separate 3D application. + * License: Free to use and distribute, in both free and commercial projects. + * Do not try to sell as your own work. Simply put, play nice :) + * Contact: VoxelBoy on Unity Forums + */ + +/* + * TODO: + * - Doesn't work properly with rotated objects. + * - Can't compensate for the positioning of Mesh Colliders. + * - Need to figure out if the "Instantiating mesh" error in Editor is a big issue, if not, how to supress it. + * - Allowing the pivot to move outside the bounds of the mesh, ideally using the movement gizmo but only affecting the pivot. + */ + +using UnityEngine; +using UnityEditor; + +public class SetPivot : EditorWindow +{ + + Vector3 p; //Pivot value -1..1, calculated from Mesh bounds + Vector3 last_p; //Last used pivot + + GameObject obj; //Selected object in the Hierarchy + MeshFilter meshFilter; //Mesh Filter of the selected object + Mesh mesh; //Mesh of the selected object + Collider col; //Collider of the selected object + + bool pivotUnchanged; //Flag to decide when to instantiate a copy of the mesh + + [MenuItem("GameObject/Set Pivot")] //Place the Set Pivot menu item in the GameObject menu + static void Init() + { + SetPivot window = (SetPivot)EditorWindow.GetWindow(typeof(SetPivot)); + window.RecognizeSelectedObject(); //Initialize the variables by calling RecognizeSelectedObject on the class instance + window.Show(); + } + + void OnGUI() + { + if (obj) + { + if (mesh) + { + p.x = EditorGUILayout.Slider("X", p.x, -1.0f, 1.0f); + p.y = EditorGUILayout.Slider("Y", p.y, -1.0f, 1.0f); + p.z = EditorGUILayout.Slider("Z", p.z, -1.0f, 1.0f); + if (p != last_p) + { //Detects user input on any of the three sliders + //Only create instance of mesh when user changes pivot + //if(pivotUnchanged) mesh = meshFilter.mesh; pivotUnchanged = false; + if (pivotUnchanged) mesh = meshFilter.sharedMesh; pivotUnchanged = false; + UpdatePivot(); + last_p = p; + } + if (GUILayout.Button("Center")) + { //Set pivot to the center of the mesh bounds + //Only create instance of mesh when user changes pivot + if (pivotUnchanged) mesh = meshFilter.mesh; pivotUnchanged = false; + p = Vector3.zero; + UpdatePivot(); + last_p = p; + } + GUILayout.Label("Bounds " + mesh.bounds.ToString()); + } + else + { + GUILayout.Label("Selected object does not have a Mesh specified."); + } + } + else + { + GUILayout.Label("No object selected in Hierarchy."); + } + } + + //Achieve the movement of the pivot by moving the transform position in the specified direction + //and then moving all vertices of the mesh in the opposite direction back to where they were in world-space + void UpdatePivot() + { + Vector3 diff = Vector3.Scale(mesh.bounds.extents, last_p - p); //Calculate difference in 3d position + obj.transform.position -= Vector3.Scale(diff, obj.transform.localScale); //Move object position by taking localScale into account + //Iterate over all vertices and move them in the opposite direction of the object position movement + Vector3[] verts = mesh.vertices; + for (int i = 0; i < verts.Length; i++) + { + verts[i] += diff; + } + mesh.vertices = verts; //Assign the vertex array back to the mesh + mesh.RecalculateBounds(); //Recalculate bounds of the mesh, for the renderer's sake + //The 'center' parameter of certain colliders needs to be adjusted + //when the transform position is modified + if (col) + { + if (col is BoxCollider) + { + ((BoxCollider)col).center += diff; + } + else if (col is CapsuleCollider) + { + ((CapsuleCollider)col).center += diff; + } + else if (col is SphereCollider) + { + ((SphereCollider)col).center += diff; + } + } + } + + //Look at the object's transform position in comparison to the center of its mesh bounds + //and calculate the pivot values for xyz + void UpdatePivotVector() + { + Bounds b = mesh.bounds; + Vector3 offset = -1 * b.center; + p = last_p = new Vector3(offset.x / b.extents.x, offset.y / b.extents.y, offset.z / b.extents.z); + } + + //When a selection change notification is received + //recalculate the variables and references for the new object + void OnSelectionChange() + { + RecognizeSelectedObject(); + } + + //Gather references for the selected object and its components + //and update the pivot vector if the object has a Mesh specified + void RecognizeSelectedObject() + { + Transform t = Selection.activeTransform; + obj = t ? t.gameObject : null; + if (obj) + { + meshFilter = obj.GetComponent(typeof(MeshFilter)) as MeshFilter; + mesh = meshFilter ? meshFilter.sharedMesh : null; + if (mesh) + UpdatePivotVector(); + col = obj.GetComponent(typeof(Collider)) as Collider; + pivotUnchanged = true; + } + else + { + mesh = null; + } + } +} diff --git a/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/SetPivot.cs.meta b/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/SetPivot.cs.meta new file mode 100644 index 0000000..cd1da75 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Editor/Miscellaneous/SetPivot.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 10e3700b7c55444508858510de623344 +timeCreated: 1482175932 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Extensions.meta b/Unity Project/Assets/MK Assets/Common/Extensions.meta new file mode 100644 index 0000000..6f4fa61 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Extensions.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3cec5f48ad3c54d0cbf5097309c2fb07 +folderAsset: yes +timeCreated: 1499088566 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Extensions/MonoExtension.cs b/Unity Project/Assets/MK Assets/Common/Extensions/MonoExtension.cs new file mode 100644 index 0000000..de53080 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Extensions/MonoExtension.cs @@ -0,0 +1,321 @@ +using System; +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +namespace MK.Common.Extensions +{ + public static class MonoExtension + { + public static T[] AddItemToArray(this T[] original, T itemToAdd) + { + T[] finalArray = new T[original.Length + 1]; + for (int i = 0; i < original.Length; ++i) + { + finalArray[i] = original[i]; + } + finalArray[finalArray.Length - 1] = itemToAdd; + Debug.Log("Original: " + original.Length + " New: " + finalArray.Length); + return finalArray; + } + + /// + /// Execute action code only on certain types + /// + /// + /// Item. + /// Action. + /// The 1st type parameter. + public static void IfType(this object item, Action action) where T : class + { + if (item is T) + { + action(item as T); + } + } + + /// + /// allows an action to be taken on an object if it is castable as the given type, with no return value. + /// if the target does not match the type, does nothing + /// + /// + public static void IfIs(this object target, Action method) + where T : class + { + var cast = target as T; + if (cast != null) + { + method(cast); + } + } + + /// + /// allows an action to be taken on an object if it is castable as the given type, with a return value. + /// if the target does not match the type, returns default(T) + /// + /// + public static TResult IfIs(this object target, Func method) + where T : class + { + var cast = target as T; + if (cast != null) + { + return method(cast); + } + else + { + return default(TResult); + } + } + + /// + /// Determines whether a IEnumerable contains a specific value. + /// + /// + /// Value. + /// Values. + /// The 1st type parameter. + public static bool In(this T value, IEnumerable values) + { + if (values == null) + throw new ArgumentNullException("values"); + + return values.Contains(value); + } + + /// + /// Determines whether a collection is null or has no elements without having to enumerate the entire collection to get a count. Uses LINQ. + /// + /// The item type. + /// The items. + /// + /// true if this list is null or empty; otherwise, false. + /// + public static bool IsNullOrEmpty(this IList items) + { + return items == null || !items.Any(); + } + + /// + /// Swaps the list entries of defined indices with in single list. + /// + /// The list entries. + /// List. + /// Index a. + /// Index b. + /// The 1st type parameter. + public static IList SwapListEntries(this IList list, int indexA, int indexB) + { + if (list.Count > indexA && list.Count > indexB && indexA > -1 && indexB > -1) + { + T tmp = list[indexA]; + list[indexA] = list[indexB]; + list[indexB] = tmp; + } + return list; + } + + + #region Invoke extension method + + /* Sample usage is + * this.InvokeExtension(5f, + () => { Debug.Log("After delay...!"); }); + * this.InvokeExtension(5f, + () => { Debug.Log("After delay...!"); }, + () => { Debug.Log("This is callBack"); }); + */ + /// + /// Invoke extension method. + /// + /// Mono. + /// Delay. + /// Action. + /// Call back. + public static void InvokeExtension(this MonoBehaviour mono, float delay, Action action, Action callBack = null) + { + mono.StartCoroutine(mono.InvokeExtensionCoroutine(delay, action, callBack)); + } + + private static IEnumerator InvokeExtensionCoroutine(this MonoBehaviour mono, float delay, Action action, Action callBack = null) + { + yield return new WaitForSeconds(delay); + + action(); + + if (callBack != null) + callBack(); + } + + #endregion Invoke extension method + + #region Generic Parameterized Invoke extension method + + /* Sample usage is + * this.InvokeExtension(5f, + (parameterValue) => { Debug.Log("After delay: " + parameterValue); }, "This is the parameter"); + * this.InvokeExtension(5f, + (parameterValue) => { Debug.Log("After delay: " + parameterValue); }, "This is the parameter", + () => { Debug.Log("This is callBack"); }); + * this.InvokeExtension(5f, + (parameterValue) => { Debug.Log("After delay: " + parameterValue); }, 786, + () => { Debug.Log("This is callBack"); }); + * this.InvokeExtension(5f, + (parameterValue) => { Debug.Log("After delay: " + parameterValue); }, 786, + () => { Debug.Log("This is callBack"); }); + */ + /// + /// Generic Parameterized Invoke extension method. + /// + /// Mono. + /// Delay. + /// Action. + /// Action parameter. + /// Call back. + /// The 1st type parameter. + public static void InvokeExtension(this MonoBehaviour mono, float delay, Action action, T actionParameter, Action callBack = null) + { + mono.StartCoroutine(mono.InvokeExtensionCoroutine(delay, action, actionParameter, callBack)); + } + + private static IEnumerator InvokeExtensionCoroutine(this MonoBehaviour mono, float delay, Action action, T actionParameter, Action callBack = null) + { + yield return new WaitForSeconds(delay); + + action(actionParameter); + + if (callBack != null) + callBack(); + } + + #endregion Generic Parameterized Invoke extension method + + #region Generic Parameterized with Parameterized Callback Invoke extension method + + /* Sample usage is + * this.InvokeExtension(5f, + (actionParameterValue) => { Debug.Log("After delay: " + actionParameterValue); }, 786, + (callBackParameterValue) => { Debug.Log("This is callBack: " + callBackParameterValue); }, 564478); + * this.InvokeExtension(5f, + (actionParameterValue) => { Debug.Log("After delay: " + actionParameterValue); }, "Hello World", + (callBackParameterValue) => { Debug.Log("This is callBack: " + callBackParameterValue); }, "New Year"); + * this.InvokeExtension(5f, + (actionParameterValue) => { Debug.Log("After delay: " + actionParameterValue); }, "Hello World", + (callBackParameterValue) => { Debug.Log("This is callBack: " + callBackParameterValue); }, "New Year"); + */ + /// + /// Generic Parameterized with Parameterized Callback Invoke extension method. + /// + /// Mono. + /// Delay. + /// Action. + /// Action parameter. + /// Call back. + /// Call back parameter. + /// The 1st type parameter. + public static void InvokeExtension(this MonoBehaviour mono, float delay, Action action, T actionParameter, Action callBack, T callBackParameter) + { + mono.StartCoroutine(mono.InvokeExtensionCoroutine(delay, action, actionParameter, callBack, callBackParameter)); + } + + private static IEnumerator InvokeExtensionCoroutine(this MonoBehaviour mono, float delay, Action action, T actionParameter, Action callBack, T callBackParameter) + { + yield return new WaitForSeconds(delay); + + action(actionParameter); + + callBack(callBackParameter); + } + + #endregion Generic Parameterized with Parameterized Callback Invoke extension method + + + #region UPDATE EXTENSION + + public static void UpdateExtension(this MonoBehaviour mono, Action updateTask, float startDelay = 0f, float updateDelay = 0) + { + mono.StartCoroutine(mono.UpdateExtensionRoutine(updateTask, startDelay, updateDelay)); + } + + private static IEnumerator UpdateExtensionRoutine(this MonoBehaviour ienum, Action updateTask, float startDelay = 0f, float updateDelay = 0) + { + if (startDelay > 0f) + { + yield return new WaitForSeconds(startDelay); + } + + if (updateDelay > 0f) + { + while (true) + { + yield return new WaitForSeconds(updateDelay); + updateTask(); + } + } + else + { + while (true) + { + yield return new WaitForEndOfFrame(); + updateTask(); + } + } + } + + #endregion UPDATE EXTENSION + + #region ACTIVE ALPHA ANIMATION + + public static void SetActiveAnimated(this GameObject gObject, bool yesNo) + { + MonoBehaviour mono = gObject.GetComponent(); + if (mono == null) + mono = gObject.AddComponent(); + + mono.StopCoroutine("AlphaFade"); + + if (mono == null) + return; + + if (!gObject.activeInHierarchy && !yesNo) + return; + + if (yesNo && !gObject.activeInHierarchy) + gObject.SetActive(true); + + mono.StartCoroutine(AlphaFade(mono, yesNo)); + } + + private static IEnumerator AlphaFade(this MonoBehaviour mono, bool setActiveTrue) + { + Material meshMaterial = mono.GetComponent().material; + Color meshColor = meshMaterial.color; + + if (setActiveTrue) + { + mono.gameObject.SetActive(true); + + while (meshColor.a < 1) + { + meshColor = new Color(meshColor.r, meshColor.g, meshColor.b, meshColor.a += 0.05f); + meshMaterial.color = meshColor; + Debug.Log("meshColor > " + meshColor); + yield return new WaitForSeconds(0.05f); + } + } + else + { + while (meshColor.a > 0) + { + meshColor = new Color(meshColor.r, meshColor.g, meshColor.b, meshColor.a -= 0.05f); + meshMaterial.color = meshColor; + yield return new WaitForSeconds(0.05f); + } + mono.gameObject.SetActive(false); + } + } + + #endregion ACTIVE ALPHA ANIMATION + } +} diff --git a/Unity Project/Assets/MK Assets/Common/Extensions/MonoExtension.cs.meta b/Unity Project/Assets/MK Assets/Common/Extensions/MonoExtension.cs.meta new file mode 100644 index 0000000..ff436e6 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Extensions/MonoExtension.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 52731adeb144a42ac9a03fa79a7078de +timeCreated: 1499281084 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: bc4399f29bda14c248011e5393287541, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Extensions/TextExtension.cs b/Unity Project/Assets/MK Assets/Common/Extensions/TextExtension.cs new file mode 100755 index 0000000..50a3db3 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Extensions/TextExtension.cs @@ -0,0 +1,28 @@ +namespace UnityEngine.UI +{ + /// + /// It extends Toggle component makes accesible of its Text component + /// + [AddComponentMenu("UI/Extensions/Text Extended"), RequireComponent(typeof(RectTransform))] + public class TextExtension : Text + { + [Header("Extended Properties")] + [SerializeField] + string + m_textId; + + public string textId + { + get + { + return m_textId; + } + set + { + m_textId = value; + } + } + } +} + + diff --git a/Unity Project/Assets/MK Assets/Common/Extensions/TextExtension.cs.meta b/Unity Project/Assets/MK Assets/Common/Extensions/TextExtension.cs.meta new file mode 100644 index 0000000..3ab5a15 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Extensions/TextExtension.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 37717aaf672ce424f9f7d1c0c7747bdd +timeCreated: 1499089600 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: bc4399f29bda14c248011e5393287541, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Extensions/ToggleExtension.cs b/Unity Project/Assets/MK Assets/Common/Extensions/ToggleExtension.cs new file mode 100755 index 0000000..0bd8866 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Extensions/ToggleExtension.cs @@ -0,0 +1,79 @@ +namespace UnityEngine.UI +{ + /// + /// It extends Toggle component makes accesible of its Text component + /// + [AddComponentMenu("UI/Extensions/Toggle Extended"), RequireComponent(typeof(RectTransform))] + public class ToggleExtension : Toggle + { + [Header("Extended Properties")] + [SerializeField] + Text + m_textComponent; + [SerializeField] + TextExtension + m_textExtensionComponent; + + public Text TextComponent + { + get + { + return m_textComponent; + } + set + { + m_textComponent = value; + } + } + + public TextExtension TextExtensionComponent + { + get + { + return m_textExtensionComponent; + } + set + { + m_textExtensionComponent = value; + } + } + + public string text + { // to get Text or TextExtension component, you must have to assign one at a time + get + { + if (m_textComponent != null) + return m_textComponent.text; + else if (m_textExtensionComponent != null) + return m_textExtensionComponent.text; + else + return null; + } + set + { + if (m_textComponent != null) + m_textComponent.text = value; + else if (m_textExtensionComponent != null) + m_textExtensionComponent.text = value; + } + } + + [SerializeField] + Animator + m_Animator; + + public Animator AnimatorController + { + get + { + return m_Animator; + } + set + { + m_Animator = value; + } + } + } +} + + diff --git a/Unity Project/Assets/MK Assets/Common/Extensions/ToggleExtension.cs.meta b/Unity Project/Assets/MK Assets/Common/Extensions/ToggleExtension.cs.meta new file mode 100644 index 0000000..abdef94 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Extensions/ToggleExtension.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e18ce1349464f4d3292ccec01384d493 +timeCreated: 1499089617 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: bc4399f29bda14c248011e5393287541, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/GameLogger.cs b/Unity Project/Assets/MK Assets/Common/GameLogger.cs new file mode 100644 index 0000000..b091ac0 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/GameLogger.cs @@ -0,0 +1,424 @@ +using System; +using UnityEngine; + +namespace MK.Common +{ + public static class GameLogger + { + public static string StackTraceColor = Colors.yellow.ToString(); + + private static bool isLogging = true; + + public static bool IsLogging + { + get + { + return isLogging; + } + } + + /// + /// Clears the console programmatically at runtime. + /// + /// Sender. + /// The 1st type parameter. + public static void ClearConsole(this T sender) where T : class + { + // This simply does "LogEntries.Clear()" the long way: + var logEntries = System.Type.GetType("UnityEditorInternal.LogEntries,UnityEditor.dll"); + var clearMethod = logEntries.GetMethod("Clear", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public); + clearMethod.Invoke(null, null); + } + + + #region LOG + + public static void Log(this T sender, string message) where T : class + { + if (IsLogging) + { + Debug.Log(message); + } + } + + public static void Log(this T sender, string message, params object[] args) where T : class + { + sender.Log(string.Format(message, args)); + } + + /// + /// Logs the String with TimeStamp. + /// + /// Message. + /// Arguments. + public static void LogT(this T sender, string message, params object[] args) where T : class + { + sender.Log(DateTime.Now.ToString("[hh:mm:ss.fff] ") + string.Format(message, args)); + } + + /// + /// Logs the String with TimeStamp and Stack Traces. + /// + /// Message. + /// Arguments. + public static void LogTT(this T sender, string message, params object[] args) where T : class + { + sender.Log(DateTime.Now.ToString("[hh:mm:ss.fff] ") + string.Format(message, args) + + "\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + /// + /// Logs the sender class name. + /// + /// Sender. + /// Message. + /// Arguments. + /// The 1st type parameter. + public static void LogSender(this T sender, string message, params object[] args) where T : class + { + sender.Log("[" + sender.ToString() + "]: " + string.Format(message, args)); + } + + public static void LogAll(this T sender, string message, params object[] args) where T : class + { + sender.Log(DateTime.Now.ToString("[hh:mm:ss.fff]") + "[" + sender.ToString() + "]: " + string.Format(message, args) + + "\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + public static void LogWithColor(this T sender, Colors color, string message, params object[] args) where T : class + { + sender.Log("[" + sender.ToString() + "]: " + string.Format(message, args) + + "\n\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + public static void LogColorAll(this T sender, Colors color, string message, params object[] args) where T : class + { + sender.Log(DateTime.Now.ToString("[hh:mm:ss.fff]") + "[" + sender.ToString() + "]: " + string.Format(message, args) + + "\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + public static void LogItalicsColorAll(this T sender, Colors color, string message, params object[] args) where T : class + { + sender.Log(DateTime.Now.ToString("[hh:mm:ss.fff]") + "[" + sender.ToString() + "]: " + string.Format(message, args) + + "\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + public static void LogBoldColorAll(this T sender, Colors color, string message, params object[] args) where T : class + { + sender.Log(DateTime.Now.ToString("[hh:mm:ss.fff]") + "[" + sender.ToString() + "]: " + string.Format(message, args) + + "\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + #endregion LOG + + #region LOG ERROR + + /// + /// Logs the error. + /// + /// Message. + public static void LogError(this T sender, string message) where T : class + { + if (IsLogging) + { + Debug.LogError(message); + } + } + + /// + /// Logs the error. + /// + /// Message. + /// Arguments. + public static void LogError(this T sender, string message, params object[] args) where T : class + { + sender.LogError(string.Format(message, args)); + } + + /// + /// Logs the error with TimeStamp. + /// + /// Message. + /// Arguments. + public static void LogErrorT(this T sender, string message, params object[] args) where T : class + { + sender.LogError(DateTime.Now.ToString("[hh:mm:ss.fff] ") + string.Format(message, args)); + } + + /// + /// Logs the error with TimeStamp and Stack Traces. + /// + /// Message. + /// Arguments. + public static void LogErrorTT(this T sender, string message, params object[] args) where T : class + { + sender.LogError(DateTime.Now.ToString("[hh:mm:ss.fff] ") + string.Format(message, args) + + "\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + /// + /// Logs the error sender class name. + /// + /// Sender. + /// Message. + /// Arguments. + /// The 1st type parameter. + public static void LogErrorSender(this T sender, string message, params object[] args) where T : class + { + sender.LogError("[" + sender.ToString() + "]: " + string.Format(message, args)); + } + + public static void LogErrorAll(this T sender, string message, params object[] args) where T : class + { + sender.LogError(DateTime.Now.ToString("[hh:mm:ss.fff]") + "[" + sender.ToString() + "]: " + string.Format(message, args) + + "\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + public static void LogErrorWithColor(this T sender, Colors color, string message, params object[] args) where T : class + { + sender.LogError("[" + sender.ToString() + "]: " + string.Format(message, args) + + "\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + public static void LogErrorColorAll(this T sender, Colors color, string message, params object[] args) where T : class + { + sender.LogError(DateTime.Now.ToString("[hh:mm:ss.fff]") + "[" + sender.ToString() + "]: " + string.Format(message, args) + + "\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + public static void LogErrorItalicsColorAll(this T sender, Colors color, string message, params object[] args) where T : class + { + sender.LogError(DateTime.Now.ToString("[hh:mm:ss.fff]") + "[" + sender.ToString() + "]: " + string.Format(message, args) + + "\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + public static void LogErrorBoldColorAll(this T sender, Colors color, string message, params object[] args) where T : class + { + sender.LogError(DateTime.Now.ToString("[hh:mm:ss.fff]") + "[" + sender.ToString() + "]: " + string.Format(message, args) + + "\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + #endregion LOG ERROR + + #region LOG EXCEPTION + + public static void LogException(this T sender, Exception exception) where T : class + { + if (IsLogging) + { + Debug.LogException(exception); + } + } + + public static void LogException(this T sender, string message) where T : class + { + sender.LogException(new Exception(message)); + } + + public static void LogException(this T sender, string message, params object[] args) where T : class + { + sender.LogException(string.Format(message, args)); + } + + /// + /// Logs the exception with TimeStamp. + /// + /// Message. + /// Arguments. + public static void LogExceptionT(this T sender, string message, params object[] args) where T : class + { + sender.LogException(DateTime.Now.ToString("[hh:mm:ss.fff] ") + string.Format(message, args)); + } + + /// + /// Logs the exception with TimeStamp and Stack Traces. + /// + /// Message. + /// Arguments. + public static void LogExceptionTT(this T sender, string message, params object[] args) where T : class + { + sender.LogException(DateTime.Now.ToString("[hh:mm:ss.fff] ") + string.Format(message, args) + + "\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + /// + /// Logs the exception sender class name. + /// + /// Sender. + /// Message. + /// Arguments. + /// The 1st type parameter. + public static void LogExceptionSender(this T sender, string message, params object[] args) where T : class + { + sender.LogException("[" + sender.ToString() + "]: " + string.Format(message, args)); + } + + public static void LogExceptionAll(this T sender, string message, params object[] args) where T : class + { + sender.LogException(DateTime.Now.ToString("[hh:mm:ss.fff]") + "[" + sender.ToString() + "]: " + string.Format(message, args) + + "\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + public static void LogExceptionWithColor(this T sender, Colors color, string message, params object[] args) where T : class + { + sender.LogException("[" + sender.ToString() + "]: " + string.Format(message, args) + + "\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + public static void LogExceptionColorAll(this T sender, Colors color, string message, params object[] args) where T : class + { + sender.LogException(DateTime.Now.ToString("[hh:mm:ss.fff]") + "[" + sender.ToString() + "]: " + string.Format(message, args) + + "\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + public static void LogExceptionItalicsColorAll(this T sender, Colors color, string message, params object[] args) where T : class + { + sender.LogException(DateTime.Now.ToString("[hh:mm:ss.fff]") + "[" + sender.ToString() + "]: " + string.Format(message, args) + + "\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + public static void LogExceptionBoldColorAll(this T sender, Colors color, string message, params object[] args) where T : class + { + sender.LogException(DateTime.Now.ToString("[hh:mm:ss.fff]") + "[" + sender.ToString() + "]: " + string.Format(message, args) + + "\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + #endregion LOG EXCEPTION + + #region LOG WARNING + + public static void LogWarning(this T sender, string message) where T : class + { + if (IsLogging) + { + Debug.LogWarning(message); + } + } + + public static void LogWarning(this T sender, string message, params object[] args) where T : class + { + sender.LogWarning(string.Format(message, args)); + } + + /// + /// Logs the warning with TimeStamp. + /// + /// Message. + /// Arguments. + public static void LogWarningT(this T sender, string message, params object[] args) where T : class + { + sender.LogWarning(DateTime.Now.ToString("[hh:mm:ss.fff] ") + string.Format(message, args)); + } + + /// + /// Logs the warning with TimeStamp and Stack Traces. + /// + /// Message. + /// Arguments. + public static void LogWarningTT(this T sender, string message, params object[] args) where T : class + { + sender.LogWarning(DateTime.Now.ToString("[hh:mm:ss.fff] ") + string.Format(message, args) + + "\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + /// + /// Logs the warning sender class name. + /// + /// Sender. + /// Message. + /// Arguments. + /// The 1st type parameter. + public static void LogWarningSender(this T sender, string message, params object[] args) where T : class + { + sender.LogWarning("[" + sender.ToString() + "]: " + string.Format(message, args)); + } + + public static void LogWarningAll(this T sender, string message, params object[] args) where T : class + { + sender.LogWarning(DateTime.Now.ToString("[hh:mm:ss.fff]") + "[" + sender.ToString() + "]: " + string.Format(message, args) + + "\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + public static void LogWarningWithColor(this T sender, Colors color, string message, params object[] args) where T : class + { + sender.LogWarning("[" + sender.ToString() + "]: " + string.Format(message, args) + + "\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + public static void LogWarningColorAll(this T sender, Colors color, string message, params object[] args) where T : class + { + sender.LogWarning(DateTime.Now.ToString("[hh:mm:ss.fff]") + "[" + sender.ToString() + "]: " + string.Format(message, args) + + "\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + public static void LogWarningItalicsColorAll(this T sender, Colors color, string message, params object[] args) where T : class + { + sender.LogWarning(DateTime.Now.ToString("[hh:mm:ss.fff]") + "[" + sender.ToString() + "]: " + string.Format(message, args) + + "\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + public static void LogWarningBoldColorAll(this T sender, Colors color, string message, params object[] args) where T : class + { + sender.LogWarning(DateTime.Now.ToString("[hh:mm:ss.fff]") + "[" + sender.ToString() + "]: " + string.Format(message, args) + + "\nStack Traces: " + StackTraceUtility.ExtractStackTrace() + "\n"); + } + + #endregion LOG WARNING + + #region LOG GENERAL + + public static void LogGeneral(this T sender, LogType type, string message) where T : class + { + switch (type) + { + case LogType.Log: + sender.Log(message); + break; + case LogType.Error: + sender.LogError(message); + break; + case LogType.Warning: + sender.LogWarning(message); + break; + case LogType.Exception: + sender.LogException(message); + break; + default: + sender.Log(message); + break; + } + } + + public static void LogGeneral(this T sender, LogType type, string message, params object[] args) where T : class + { + sender.LogGeneral(type, string.Format(message, args)); + } + + #endregion LOG GENERAL + } + + public enum Colors + { + aqua, + black, + blue, + brown, + cyan, + darkblue, + fuchsia, + green, + grey, + lightblue, + lime, + magenta, + maroon, + navy, + olive, + purple, + red, + silver, + teal, + white, + yellow + } +} diff --git a/Unity Project/Assets/MK Assets/Common/GameLogger.cs.meta b/Unity Project/Assets/MK Assets/Common/GameLogger.cs.meta new file mode 100644 index 0000000..72c1268 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/GameLogger.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 124fbbabba5f44065b86356d168a1f9d +timeCreated: 1499089493 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: bc4399f29bda14c248011e5393287541, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Helpers.meta b/Unity Project/Assets/MK Assets/Common/Helpers.meta new file mode 100644 index 0000000..34601be --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Helpers.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d5becff6342c34e1e9a5b263624365de +folderAsset: yes +timeCreated: 1499088566 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Helpers/WebAudioClip.cs b/Unity Project/Assets/MK Assets/Common/Helpers/WebAudioClip.cs new file mode 100644 index 0000000..e97dec3 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Helpers/WebAudioClip.cs @@ -0,0 +1,75 @@ +using UnityEngine; +using System; +using System.Collections; + +namespace MK.Common.Helpers +{ + public static class WebAudioClip + { + /// + /// Gets the audio clip from URL. + /// + /// _mono. + /// Downloads the file from this _url. + /// Returns AudioClip in _callback, in success case + // / Returns message in _error, in error case + /// If set to true _save file. + /// _file path with name. + /// _progress message. + public static void GetAudioClipFromURL(this MonoBehaviour _mono, string _url, Action _callback, Action _error, bool _saveFile = false, string _filePathWithName = "", Action _progressMessage = null) + { + _mono.StartCoroutine(_mono.GetAudioClipFromURLCoroutine(_url, _callback, _error, _saveFile, _filePathWithName, _progressMessage)); + } + + /// + /// Gets the audio clip from URL coroutine. + /// + /// The audio clip from URL coroutine. + /// _mono. + /// Downloads the file from this _url. + /// Returns AudioClip in _callback, in success case + // / Returns message in _error, in error case + /// If set to true _save file. + /// _file path with name. + /// _progress message. + private static IEnumerator GetAudioClipFromURLCoroutine(this MonoBehaviour _mono, string _url, Action _callback, Action _error, bool _saveFile, string _filePathWithName, Action _progressMessage = null) + { + Debug.Log("GetAudioClipFromURLCoroutine-URL: " + _url + "\n"); + WWW www = new WWW(_url); + while (!www.isDone) + { + if (_progressMessage != null) + _progressMessage("Status: Downloading Audio file... " + String.Format("{0:N}%", (www.progress * 100))); + yield return null; + } + + if (string.IsNullOrEmpty(www.error)) + { + if (_callback != null) + _callback(www.GetAudioClip()); + if (_saveFile && !string.IsNullOrEmpty(_filePathWithName) && (_filePathWithName.Contains("\\") || _filePathWithName.Contains("/"))) + { + Debug.Log("WebAudioClip-GetAudioClipFromURLCoroutine-THREAD----START-FilePath: " + _filePathWithName + "\nBytesLength: " + www.bytes.Length + ""); + System.IO.File.WriteAllBytes(_filePathWithName, www.bytes); + Debug.Log("WebAudioClip-GetAudioClipFromURLCoroutine-THREAD----DONE-FilePath: " + _filePathWithName + "\nBytesLength: " + www.bytes.Length + ""); + //System.Threading.Thread timer = new System.Threading.Thread (() => + //{ + // System.IO.File.WriteAllBytes (_filePathWithName, www.bytes); + // Debug.Log ("WebAudioClip-GetAudioClipFromURLCoroutine-THREAD----DONE-FilePath: " + _filePathWithName + "\nBytesLength: " + www.bytes.Length + ""); + // System.Threading.Thread.CurrentThread.Abort (); + //}); + //timer.IsBackground = true; + //timer.Start (); + } + //System.IO.File.WriteAllBytes (pathToAudioData + "/" + "xy.ogg", www.bytes); + //_callback (www.GetAudioClip (true)); + } + else + { + Debug.Log("GetAudioClipFromURLCoroutine-Error: " + www.error + "\nSaveFile: " + _saveFile); + if (_error != null) + _error(www.error); + } + } + } +} diff --git a/Unity Project/Assets/MK Assets/Common/Helpers/WebAudioClip.cs.meta b/Unity Project/Assets/MK Assets/Common/Helpers/WebAudioClip.cs.meta new file mode 100644 index 0000000..5101675 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Helpers/WebAudioClip.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 293a4016cf5f94fc3a10f3e266e5c354 +timeCreated: 1499089639 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: bc4399f29bda14c248011e5393287541, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Helpers/WebData.cs b/Unity Project/Assets/MK Assets/Common/Helpers/WebData.cs new file mode 100644 index 0000000..24c2c68 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Helpers/WebData.cs @@ -0,0 +1,52 @@ +using UnityEngine; +using System; +using System.Collections; + +namespace MK.Common.Helpers +{ + public static class WebData + { + /// + /// Gets the text from URL. + /// + /// Monobehavior + /// URL. + /// Callback. + public static void GetTextFromURL(this MonoBehaviour _mono, string _url, Action _callback = null) + { + _mono.StartCoroutine(_mono.GetTextFromURLCoroutine(_url, _callback)); + } + + /// + /// Gets the text from URL coroutine. + /// + /// The text from URL coroutine. + /// Mono. + /// URL. + /// Callback. + private static IEnumerator GetTextFromURLCoroutine(this MonoBehaviour _mono, string _url, Action _callback) + { + Debug.Log("GetTextFromURL-URL: " + _url + "\n"); + UnityEngine.Networking.UnityWebRequest unityWebRequest = UnityEngine.Networking.UnityWebRequest.Get(_url); + yield return unityWebRequest.Send(); + + if (unityWebRequest.isError) + { + Debug.Log("GetTextFromURL-Error: " + unityWebRequest.error + "\n"); + if (_callback != null) + _callback(false, unityWebRequest.error); + } + else + { + // Show results as text + Debug.Log("GetTextFromURL-Result: " + unityWebRequest.downloadHandler.text + "\n"); + + // Or retrieve results as binary data + //byte[] results = www.downloadHandler.data; + + if (_callback != null) + _callback(true, unityWebRequest.downloadHandler.text); + } + } + } +} diff --git a/Unity Project/Assets/MK Assets/Common/Helpers/WebData.cs.meta b/Unity Project/Assets/MK Assets/Common/Helpers/WebData.cs.meta new file mode 100644 index 0000000..ae048fe --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Helpers/WebData.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b09cc0ea306d547489a40c21131acbff +timeCreated: 1499089647 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: bc4399f29bda14c248011e5393287541, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/MK-256.png b/Unity Project/Assets/MK Assets/Common/MK-256.png new file mode 100644 index 0000000000000000000000000000000000000000..c64faff30225866b2e09f7e5d1d525f9bb057318 GIT binary patch literal 38266 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 W2dv{`_3%rPPRGY;@53XmL;nv;@6am% literal 0 HcmV?d00001 diff --git a/Unity Project/Assets/MK Assets/Common/MK-256.png.meta b/Unity Project/Assets/MK Assets/Common/MK-256.png.meta new file mode 100644 index 0000000..7de2175 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/MK-256.png.meta @@ -0,0 +1,68 @@ +fileFormatVersion: 2 +guid: bc4399f29bda14c248011e5393287541 +timeCreated: 1499089305 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Managers.meta b/Unity Project/Assets/MK Assets/Common/Managers.meta new file mode 100644 index 0000000..6515129 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Managers.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c9e1ce692df1341afb8dc0f69f819156 +folderAsset: yes +timeCreated: 1499280391 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Managers/SceneController.cs b/Unity Project/Assets/MK Assets/Common/Managers/SceneController.cs new file mode 100644 index 0000000..a1334a2 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Managers/SceneController.cs @@ -0,0 +1,236 @@ +using UnityEngine; +using MK.Common.Utilities; + +#if UNITY_4_6 || UNITY_4_7 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 +#else +using UnityEngine.SceneManagement; +#endif + +/// +/// Reference: Architecting Games in Unity | Rus SCAMMELL +/// Reference Video: https://www.youtube.com/watch?v=64uOVmQ5R1k +/// Reference Content: http://goo.gl/8WZGxn +/// + +namespace Game.Managers +{ + // it would be better, if you name scenes according to scenes listed in build settings + public enum GameScene + { + MenuScene = 0, + GameScene + } + + public sealed class SceneController : Singleton + { + //static MainController mainController; // Singleton class does this + + int currentSceneName; + int nextSceneName; + AsyncOperation resourceUnloadTask; + AsyncOperation sceneLoadTask; + + enum SceneState + { + Reset, + Preload, + Load, + Unload, + Postload, + Ready, + Run, + + // tells total number of states, should be at the end + Count + } + + SceneState sceneState; + + delegate void UpdateDelegate(); + + UpdateDelegate[] updateDelegates; + + #region public static methods + + [System.Obsolete("Better to use with enum value")] + public void SwitchScene(int _nextScene) + { + SwitchScene(GameUtilities.ParseEnum(_nextScene)); + } + + public void SwitchScene(GameScene _nextScene) + { + if (HasInstance) + { + if (currentSceneName != ((int)_nextScene)) + { + nextSceneName = ((int)_nextScene); + } + } + } + + #endregion public static methods + + #region protected mono methods + + protected override void Awake() + { + base.Awake(); + + //Let's keep this alive between scene changes + //Object.DontDestroyOnLoad(gameObject); // Singleton class does this + + //Setup the singleton instance + //mainController = this; // Singleton class does this + + //Setup the array of updateDelegates + updateDelegates = new UpdateDelegate[(int)SceneState.Count]; + + //Set each updateDelegate + updateDelegates[(int)SceneState.Reset] = UpdateSceneReset; + updateDelegates[(int)SceneState.Preload] = UpdateScenePreload; + updateDelegates[(int)SceneState.Load] = UpdateSceneLoad; + updateDelegates[(int)SceneState.Unload] = UpdateSceneUnload; + updateDelegates[(int)SceneState.Postload] = UpdateScenePostload; + updateDelegates[(int)SceneState.Ready] = UpdateSceneReady; + updateDelegates[(int)SceneState.Run] = UpdateSceneRun; + + // TODO: name of first scene of your game + nextSceneName = (int)GameScene.MenuScene; + sceneState = SceneState.Reset; + + // if this script is attached to the camera + //camera.orthographicSize = Screen.height / 2; + } + + void OnEnable() + { + } + + protected override void Start() + { + base.Start(); + } + + void Update() + { + if (updateDelegates[(int)sceneState] != null) + { + updateDelegates[(int)sceneState](); + } + } + + protected override void OnDestroy() + { + //Clean up all the updateDelegates + if (updateDelegates != null) + { + for (int i = 0; i < (int)SceneState.Count; i++) + { + updateDelegates[i] = null; + } + updateDelegates = null; + } + + //Clean up the singleton instance + base.OnDestroy(); + //if (mainController != null) mainController = null; // Singleton class does this + } + + void OnDisable() + { + } + + #endregion protected mono methods + + #region private delegate methods + + // attach the new scene controller to start cascade of loading + void UpdateSceneReset() + { + Debug.Log("SceneController-UpdateSceneReset-Current: " + SceneManager.GetActiveScene().name); + // run a gc pass + System.GC.Collect(); + sceneState = SceneState.Preload; + } + + // handle anything that needs to happen before loading + void UpdateScenePreload() + { + string _nextSceneName = ((GameScene)nextSceneName).ToString(); + Debug.Log("SceneController-UpdateScenePreload-Current: " + SceneManager.GetActiveScene().name); +#if UNITY_4_6 || UNITY_4_7 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 + sceneLoadTask = Application.LoadLevelAsync(_nextSceneName); +#else + sceneLoadTask = SceneManager.LoadSceneAsync(_nextSceneName); +#endif + sceneState = SceneState.Load; + } + + // show the loading screen until it's loaded + void UpdateSceneLoad() + { + Debug.Log("SceneController-UpdateSceneLoad-Current: " + SceneManager.GetActiveScene().name); + // done loading? + if (sceneLoadTask.isDone == true) + { + sceneState = SceneState.Unload; + } + else + { // TODO: update scene loading progress - show loading slider/image + } + } + + // clean up unused resources by unloading them + void UpdateSceneUnload() + { + Debug.Log("SceneController-UpdateSceneUnload-Current: " + SceneManager.GetActiveScene().name); + // cleaning up resources yet? + if (resourceUnloadTask == null) + { + resourceUnloadTask = Resources.UnloadUnusedAssets(); + } + else + { + // done cleaning up? + if (resourceUnloadTask.isDone == true) + { + resourceUnloadTask = null; + sceneState = SceneState.Postload; + } + } + } + + // handle anything that needs to happen immediately after loading + void UpdateScenePostload() + { + Debug.Log("SceneController-UpdateScenePostload-Current: " + SceneManager.GetActiveScene().name); + currentSceneName = nextSceneName; + sceneState = SceneState.Ready; + } + + // handle anything that needs to happen immediately before running + void UpdateSceneReady() + { + Debug.Log("SceneController-UpdateSceneReady-Current: " + SceneManager.GetActiveScene().name); + // run a gc pass + // if you have assets loaded in the scene that are + // currently unused currently but may be used later + // DON'T do this here + System.GC.Collect(); + sceneState = SceneState.Run; + } + + // wait for scene change - it will keep running as it would change in update + void UpdateSceneRun() + { + //Debug.Log("SceneController-UpdateSceneRun-Current: " + SceneManager.GetActiveScene().name); + if (currentSceneName != nextSceneName) + { + sceneState = SceneState.Reset; + } + } + + #endregion private delegate methods + } +} diff --git a/Unity Project/Assets/MK Assets/Common/Managers/SceneController.cs.meta b/Unity Project/Assets/MK Assets/Common/Managers/SceneController.cs.meta new file mode 100644 index 0000000..dbdf6e5 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Managers/SceneController.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ddcb6dd185ab54324b8f33db13726dd5 +timeCreated: 1499281069 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: bc4399f29bda14c248011e5393287541, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Miscellaneous.meta b/Unity Project/Assets/MK Assets/Common/Miscellaneous.meta new file mode 100644 index 0000000..c22ec1d --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Miscellaneous.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f6ba1716174b642d89be5f1655784977 +folderAsset: yes +timeCreated: 1499088566 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Miscellaneous/BringToFront.cs b/Unity Project/Assets/MK Assets/Common/Miscellaneous/BringToFront.cs new file mode 100644 index 0000000..192b4c2 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Miscellaneous/BringToFront.cs @@ -0,0 +1,13 @@ +using UnityEngine; + +namespace MK.Common.Miscellaneous +{ + public class BringToFront : MonoBehaviour + { + + void OnEnable() + { + transform.SetAsLastSibling(); + } + } +} \ No newline at end of file diff --git a/Unity Project/Assets/MK Assets/Common/Miscellaneous/BringToFront.cs.meta b/Unity Project/Assets/MK Assets/Common/Miscellaneous/BringToFront.cs.meta new file mode 100644 index 0000000..04d9cf5 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Miscellaneous/BringToFront.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 158aecb150db04550ac32fcada80312e +timeCreated: 1499089395 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: bc4399f29bda14c248011e5393287541, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Miscellaneous/DeactivateOnAwake.cs b/Unity Project/Assets/MK Assets/Common/Miscellaneous/DeactivateOnAwake.cs new file mode 100644 index 0000000..e4f9ccb --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Miscellaneous/DeactivateOnAwake.cs @@ -0,0 +1,13 @@ +using UnityEngine; + +namespace MK.Common.Miscellaneous +{ + public class DeactivateOnAwake : MonoBehaviour + { + void Awake() + { + //Debug.Log("ActivationOnAwake-" + this.gameObject.name + ": " + activate.ToString()); + this.gameObject.SetActive(false); + } + } +} \ No newline at end of file diff --git a/Unity Project/Assets/MK Assets/Common/Miscellaneous/DeactivateOnAwake.cs.meta b/Unity Project/Assets/MK Assets/Common/Miscellaneous/DeactivateOnAwake.cs.meta new file mode 100644 index 0000000..7ebfb7d --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Miscellaneous/DeactivateOnAwake.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 30c8fdda926934496835d46af8b3557d +timeCreated: 1499089411 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: bc4399f29bda14c248011e5393287541, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Miscellaneous/DontDestroyOnLoad.cs b/Unity Project/Assets/MK Assets/Common/Miscellaneous/DontDestroyOnLoad.cs new file mode 100644 index 0000000..3798c5d --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Miscellaneous/DontDestroyOnLoad.cs @@ -0,0 +1,12 @@ +using UnityEngine; + +namespace MK.Common.Miscellaneous +{ + public class DontDestroyOnLoad : MonoBehaviour + { + void Start() + { + DontDestroyOnLoad(gameObject); + } + } +} diff --git a/Unity Project/Assets/MK Assets/Common/Miscellaneous/DontDestroyOnLoad.cs.meta b/Unity Project/Assets/MK Assets/Common/Miscellaneous/DontDestroyOnLoad.cs.meta new file mode 100644 index 0000000..e0c53ff --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Miscellaneous/DontDestroyOnLoad.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 79fb8ef0205d24a99b28d763ec21b59a +timeCreated: 1499089419 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: bc4399f29bda14c248011e5393287541, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Miscellaneous/FPSDisplay.cs b/Unity Project/Assets/MK Assets/Common/Miscellaneous/FPSDisplay.cs new file mode 100644 index 0000000..e639366 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Miscellaneous/FPSDisplay.cs @@ -0,0 +1,38 @@ +using UnityEngine; + +namespace MK.Common.Miscellaneous +{ + public class FPSDisplay : MonoBehaviour + { + float deltaTime = 0.0f; + + public Color textColor = new Color(1.0f, 0, 0); + GUIStyle style = new GUIStyle(); + int w = Screen.width, h = Screen.height; + Rect rect; + + void Start() + { + rect = new Rect(0, 0, w, h * 2 / 100); + style.alignment = TextAnchor.UpperLeft; + //style.fontSize = h * 2 / 100; + style.fontSize = h * 2 / 40; + //style.normal.textColor = new Color (0.0f, 0.0f, 0.5f, 1.0f); + style.normal.textColor = textColor; + } + + void Update() + { + deltaTime += (Time.deltaTime - deltaTime) * 0.1f; + } + + void OnGUI() + { + float msec = deltaTime * 1000.0f; + float fps = 1.0f / deltaTime; + string text = string.Format("{0:0.0} ms ({1:0.} fps)", msec, fps); + GUI.Label(rect, text, style); + } + } +} + diff --git a/Unity Project/Assets/MK Assets/Common/Miscellaneous/FPSDisplay.cs.meta b/Unity Project/Assets/MK Assets/Common/Miscellaneous/FPSDisplay.cs.meta new file mode 100644 index 0000000..0579f78 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Miscellaneous/FPSDisplay.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 122c6f43ab75646ea8dd7ae03cdb936c +timeCreated: 1499089698 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: bc4399f29bda14c248011e5393287541, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Miscellaneous/SelfDestroy.cs b/Unity Project/Assets/MK Assets/Common/Miscellaneous/SelfDestroy.cs new file mode 100644 index 0000000..92ac80d --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Miscellaneous/SelfDestroy.cs @@ -0,0 +1,14 @@ +using UnityEngine; + +namespace MK.Common.Miscellaneous +{ + public class SelfDestroy : MonoBehaviour + { + public float Life = 5.0f; + + protected virtual void Start() + { + Destroy(gameObject, Life); + } + } +} \ No newline at end of file diff --git a/Unity Project/Assets/MK Assets/Common/Miscellaneous/SelfDestroy.cs.meta b/Unity Project/Assets/MK Assets/Common/Miscellaneous/SelfDestroy.cs.meta new file mode 100644 index 0000000..64a5c44 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Miscellaneous/SelfDestroy.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 643af38053f6b407990bd2ac06b5d518 +timeCreated: 1499089581 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: bc4399f29bda14c248011e5393287541, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Utilities.meta b/Unity Project/Assets/MK Assets/Common/Utilities.meta new file mode 100644 index 0000000..7e5e75e --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Utilities.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7336fe67385d3455d83dc5b2dcb5508b +folderAsset: yes +timeCreated: 1499069383 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Utilities/GameUtilities.cs b/Unity Project/Assets/MK Assets/Common/Utilities/GameUtilities.cs new file mode 100644 index 0000000..712074c --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Utilities/GameUtilities.cs @@ -0,0 +1,104 @@ +using System; +using UnityEngine; + +namespace MK.Common.Utilities +{ + public class GameUtilities : MonoBehaviour + { + public static T ParseEnum(int _value) + { + return ParseEnum(_value.ToString()); + } + + public static T ParseEnum(string _value) + { + return (T)Enum.Parse(typeof(T), _value, true); + } + + public static void RemoveChildren(Transform _transform) + { + for (int i = _transform.childCount - 1; i >= 0; --i) + { + Destroy(_transform.GetChild(i).gameObject); + } + } + + public static void DisableChildren(Transform _transform) + { + for (int i = _transform.childCount - 1; i >= 0; --i) + { + _transform.GetChild(i).gameObject.SetActive(false); + } + } + + public static Vector3 FindMidPoint(Vector3 v1, Vector3 v2) + { // midpoint between v1 and v2 + return new Vector3((v1.x + v2.x) / 2.0f, (v1.y + v2.y) / 2.0f, (v1.z + v2.z) / 2.0f); + } + + public static Vector3[] ParabolicPath(Vector3 _source, Vector3 _destination, bool _fromRight) + { + Vector3[] waypoints = new Vector3[3]; + waypoints[0] = _source; + waypoints[1] = FindMidPoint(_source, _destination); + if (_fromRight) + waypoints[1] = new Vector3(waypoints[1].x, waypoints[1].y, waypoints[1].z + 10f); + else + waypoints[1] = new Vector3(waypoints[1].x, waypoints[1].y, waypoints[1].z - 10f); + waypoints[2] = _destination; + return waypoints; + } + + #region UnixTime + + /// + /// Convert froms the unix(Epoc) time to the DataDate. + /// + /// The unix DataTime. + /// Unix time. + public static DateTime FromUnixTime(long unixTime) + { + var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + return epoch.AddMilliseconds(unixTime); + } + + public static string Reverse(string s) + { + char[] charArray = s.ToCharArray(); + Array.Reverse(charArray); + return new string(charArray); + } + + public static long GetTimeFromNow(long _timeFromPast) + { + //Debug.Log("GetTimeFromNow: " + _timeFromPast + "\nUnixTime: " + GameUtils.FromUnixTime(_timeFromPast) + // + "\nNow: " + DateTime.Now.ToUniversalTime() + "\nReturn: " + ((long) (DateTime.Now.ToUniversalTime() - FromUnixTime(_timeFromPast)).TotalSeconds) ); + return ((long)(DateTime.Now.ToUniversalTime() - FromUnixTime(_timeFromPast)).TotalSeconds); + } + + public static long GetTimeDifferenceInSeconds(long _fromTime, long _toTime) + { + long _diff = _fromTime - _toTime; + return (_diff / 1000); // converting milliseconds to seconds + } + + /// + /// Gets the current time stamp with randomness. + /// + /// The current time stamp with randomness. + /// If set to true flag (Length=18), otherwise false (Length=14). + public static string GetCurrentTimeStampWithRandomness(bool flag = false) + { + //string timeStampNow = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"); + string timeStampNow = DateTime.Now.ToString("yyyyMMddHHmmss"); // makes the string of length 14 + if (flag) + { // adds 4 random digits to the end and total length becomes 18 + timeStampNow += UnityEngine.Random.Range(1000, 10000).ToString(); + //timeStampNow += SystemInfo.deviceUniqueIdentifier; + } + return timeStampNow; + } + + #endregion UnixTime + } +} diff --git a/Unity Project/Assets/MK Assets/Common/Utilities/GameUtilities.cs.meta b/Unity Project/Assets/MK Assets/Common/Utilities/GameUtilities.cs.meta new file mode 100644 index 0000000..f0bed0c --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Utilities/GameUtilities.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 07de5e7739c1f4510b4507408fc1415a +timeCreated: 1499281095 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: bc4399f29bda14c248011e5393287541, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Utilities/ReportEmail.cs b/Unity Project/Assets/MK Assets/Common/Utilities/ReportEmail.cs new file mode 100644 index 0000000..01c7ef8 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Utilities/ReportEmail.cs @@ -0,0 +1,189 @@ +using UnityEngine; +using System.Net.Mail; +using System.Net; +using System.Security.Cryptography.X509Certificates; +using System.Net.Security; +using UnityEngine.UI; + +//using System.Text; + +/* NOTE: Make the FROM email less secure (Turn On) on + * https://www.google.com/settings/security/lesssecureapps + * oterwise, it won't work +*/ + +namespace MK.Common.Utilities +{ + public class ReportEmail : MonoBehaviour + { + //[SerializeField] + //Text status; + + string fromEmail = "crash.report@gmail.com"; + string toEmail = "project.report@gmail.com"; + string password = "12345678"; + string logs = ""; + //StringBuilder sbLogs = new StringBuilder(); // TODO: better to use it after testing + + public string Log + { + get + { + return logs; + } + } + + //void Start() + //{ + // #if UNITY_EDITOR || UNITY_EDITOR_WIN || UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX || UNITY_STANDALONE_WIN + // fromEmail = fromEmail.Trim(); + // toEmail = toEmail.Trim(); + // password = password.Trim(); + // if (string.IsNullOrEmpty(fromEmail) || string.IsNullOrEmpty(toEmail) || string.IsNullOrEmpty(password)) + // { + // Debug.LogError("From/To email or password is NULL"); + // Debug.Log("System Information:\n" + GetSystemInformation()); + // } + // else if (!IsValidEmail(fromEmail) || !IsValidEmail(toEmail)) + // { + // Debug.LogError("From/To email is not valid"); + // Debug.Log("System Information:\n" + GetSystemInformation()); + // } + // else + // EmailToDevs("[PROJECT_NAME] - Report Email", "[PROJECT_NAME]\nSMTP mail from GMAIL"); + // Debug.LogWarning("Mail-From: " + fromEmail + " To: " + toEmail + " Password: " + password); + // #endif + //} + + void OnEnable() + { + Application.logMessageReceived += HandleLog; + } + + void OnDisable() + { + Application.logMessageReceived -= HandleLog; + } + + void HandleLog(string logString, string stackTrace, LogType type) + { + logs += logString + "\n" + stackTrace + "\n"; + //sbLogs.AppendLine(logString).AppendLine(stackTrace); + //if (type == LogType.Error) + // Report(); + } + + public void Report() + { + EmailToDevs("[PROJECT_NAME] - Report Email", "[PROJECT_NAME]\nSMTP mail from GMAIL"); + //status.text = "Reported!"; + } + + public void EmailToDevs(string _subject, string _messageBody) + { + //#if UNITY_EDITOR || UNITY_EDITOR_WIN || UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX || UNITY_STANDALONE_WIN + SmtpClient smtpServer = new SmtpClient("smtp.gmail.com"); + + smtpServer.Port = 587; + + smtpServer.EnableSsl = true; + + smtpServer.UseDefaultCredentials = false; + System.Net.NetworkCredential credentials = new System.Net.NetworkCredential(fromEmail, password); + smtpServer.Credentials = (System.Net.ICredentialsByHost)credentials; + + try + { + MailMessage mail = new MailMessage(); + + //For File Attachment, more files can also be attached + //tested only for files on local machine + //Attachment att = new Attachment(@"/*url of the file*/"); + //mail.Attachments.Add(att); + + mail.From = new MailAddress(fromEmail); + mail.To.Add(toEmail); + + mail.Subject = _subject; + mail.Body = GetSystemInformation() + _messageBody + "\n" + logs; + //mail.Body = GetSystemInformation() + _messageBody + "\n" + sbLogs.ToString(); + + ServicePointManager.ServerCertificateValidationCallback = + delegate (object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + { + return true; + }; + smtpServer.Send(mail); + Debug.Log("Success - Mail sent!"); + logs = ""; + //sbLogs = new StringBuilder(); + } + catch (System.Exception ex) + { + Debug.LogError("Mail Sending Error: " + ex.Message + "\n\nStack: " + ex.StackTrace); + } + //#endif + } + + bool IsValidEmail(string _emailaddress) + { // http://stackoverflow.com/questions/5342375/regex-email-validation + try + { + MailAddress m = new MailAddress(_emailaddress); + + return true; + } + catch (System.FormatException) + { + return false; + } + } + + string GetSystemInformation() + { + string str = "*********************************************************"; + str += "\nOperating System: " + SystemInfo.operatingSystem; + str += "\nDevice Model: " + SystemInfo.deviceModel; + str += "\nDevice Type: " + SystemInfo.deviceType.ToString(); + str += "\nDevice Name: " + SystemInfo.deviceName; + str += "\nDevice Unique Identifier: " + SystemInfo.deviceUniqueIdentifier; + str += "\nProcessor Name: " + SystemInfo.processorType; + str += "\nProcessor Frequency: " + SystemInfo.processorFrequency.ToString() + " MHz"; + str += "\nSystem Memory Size: " + SystemInfo.systemMemorySize.ToString() + " MB"; + str += "\nLogical Processors (number of hardware threads): " + SystemInfo.processorCount.ToString(); + str += "\nGraphics Device ID: " + SystemInfo.graphicsDeviceID.ToString(); + str += "\nGraphics Device Name: " + SystemInfo.graphicsDeviceName; + str += "\nGraphics Device Type: " + SystemInfo.graphicsDeviceType.ToString(); + str += "\nGraphics Device Vendor: " + SystemInfo.graphicsDeviceVendor; + str += "\nGraphics Device Vendor ID: " + SystemInfo.graphicsDeviceVendorID; + str += "\nGraphics Device Version: " + SystemInfo.graphicsDeviceVersion; + str += "\nGraphics Memory Size: " + SystemInfo.graphicsMemorySize.ToString(); + str += "\nGraphics Multi-Threaded: " + SystemInfo.graphicsMultiThreaded.ToString(); + str += "\nGraphics Shader Level: " + SystemInfo.graphicsShaderLevel.ToString(); + str += "\nMax Texture Size: " + SystemInfo.maxTextureSize.ToString(); + str += "\nNPOT (non-power of two size) texture support: " + SystemInfo.npotSupport.ToString(); + str += "\nCopy Texture Support: " + SystemInfo.copyTextureSupport.ToString(); + str += "\nSupported Render Target Count: " + SystemInfo.supportedRenderTargetCount.ToString() + " MRTs"; + str += "\nSupports 2D Array Textures: " + SystemInfo.supports2DArrayTextures.ToString(); + str += "\nSupports 3D Textures: " + SystemInfo.supports3DTextures.ToString(); + str += "\nSupports Accelerometer: " + SystemInfo.supportsAccelerometer.ToString(); + str += "\nSupports Audio: " + SystemInfo.supportsAudio.ToString(); + str += "\nSupports Compute Shaders: " + SystemInfo.supportsComputeShaders.ToString(); + str += "\nSupports Gyroscope: " + SystemInfo.supportsGyroscope.ToString(); + str += "\nSupports Image Effects: " + SystemInfo.supportsImageEffects.ToString(); + str += "\nSupports Instancing: " + SystemInfo.supportsInstancing.ToString(); + str += "\nSupports Location Service: " + SystemInfo.supportsLocationService.ToString(); + str += "\nSupports Motion Vectors: " + SystemInfo.supportsMotionVectors.ToString(); + str += "\nSupports Raw Shadow Depth Sampling: " + SystemInfo.supportsRawShadowDepthSampling.ToString(); + //str += "\nSupports Render Textures: " + SystemInfo.supportsRenderTextures.ToString(); + str += "\nSupports Render To Cubemap: " + SystemInfo.supportsRenderToCubemap.ToString(); + str += "\nSupports Shadows: " + SystemInfo.supportsShadows.ToString(); + str += "\nSupports Sparse Textures: " + SystemInfo.supportsSparseTextures.ToString(); + //str += "\nSupports Stencil: " + SystemInfo.supportsStencil.ToString(); + str += "\nSupports Vibration: " + SystemInfo.supportsVibration.ToString(); + str += "\nUnsupported Identifier: " + SystemInfo.unsupportedIdentifier; + str += "\n*********************************************************"; + return (str + "\n\n\n\n"); + } + } +} diff --git a/Unity Project/Assets/MK Assets/Common/Utilities/ReportEmail.cs.meta b/Unity Project/Assets/MK Assets/Common/Utilities/ReportEmail.cs.meta new file mode 100644 index 0000000..57ba5c3 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Utilities/ReportEmail.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1c7c63fec8d23480fa39fcbcda94f63e +timeCreated: 1499089572 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: bc4399f29bda14c248011e5393287541, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Common/Utilities/Singleton.cs b/Unity Project/Assets/MK Assets/Common/Utilities/Singleton.cs new file mode 100644 index 0000000..7fb54f8 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Utilities/Singleton.cs @@ -0,0 +1,101 @@ +using UnityEngine; + +/* Reference: https://blogs.unity3d.com/2016/07/26/il2cpp-optimizations-devirtualization/ + * write 'sealed' keyword with each singleton inheriting classes, if they are leaf nodes, + * so by 'sealed' keyword the overriding function calls become optimized, Devirtualization +*/ + +namespace MK.Common.Utilities +{ + public class Singleton : MonoBehaviour where T : MonoBehaviour + { + private static T _instance; + // use it for testing + public string InstanceID; + + private static object _lock = new object(); + + protected virtual void Start() + { + } + + protected virtual void Awake() + { + if (ReferenceEquals(_instance, null)) + { + //If I am the first instance, make me the Singleton + bool has = ReferenceEquals(Instance, null); // to access Instance, so it won't create new instance of same class. Important point: Don't comment this line + DontDestroyOnLoad(this); + InstanceID = this.GetInstanceID().ToString(); + //Debug.LogWarning(typeof(T) + " - " + has + " ID: " + InstanceID); + } + else + { + //If a Singleton already exists and you find + //another reference in scene, destroy it! + //if (!ReferenceEquals(_instance, null)) + // Debug.LogError("[Singelton]Destroying: " + this.gameObject.name + " New InstanceID: " + this.GetInstanceID() + " ->Old: " + _instance.GetInstanceID()); + Destroy(this.gameObject); + } + } + + public static bool HasInstance + { + get + { + return (!ReferenceEquals(_instance, null)); + } + } + + public static T Instance + { + get + { + lock (_lock) + { + if (ReferenceEquals(_instance, null)) + { + _instance = (T)FindObjectOfType(typeof(T)); + + if (FindObjectsOfType(typeof(T)).Length > 1) + { + Debug.LogError("[Singleton] Something went really wrong " + typeof(T) + + " - there should never be more than 1 singleton!" + + " Reopenning the scene might fix it."); + return _instance; + } + + if (ReferenceEquals(_instance, null)) + { + GameObject singleton = new GameObject(); + _instance = singleton.AddComponent(); + singleton.name = "(Singleton) " + typeof(T).ToString(); + + Debug.LogWarning("[Singleton] An instance of " + typeof(T) + + " is needed in the scene, so '" + singleton.name + + "' was created."); + } + else + { + Debug.LogWarning("[Singleton] " + typeof(T) + " - Using instance already created: " + + _instance.gameObject.name); + } + } + return _instance; + } + } + } + + protected virtual void OnApplicationQuit() + { + if (!ReferenceEquals(_instance, null)) + _instance = null; + } + + protected virtual void OnDestroy() + { + if (!ReferenceEquals(_instance, null)) + _instance = null; + } + } +} diff --git a/Unity Project/Assets/MK Assets/Common/Utilities/Singleton.cs.meta b/Unity Project/Assets/MK Assets/Common/Utilities/Singleton.cs.meta new file mode 100644 index 0000000..bdec810 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Common/Utilities/Singleton.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3ca80707f672a40648fd71f41ef38e81 +timeCreated: 1499089592 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: bc4399f29bda14c248011e5393287541, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Mono Direct.meta b/Unity Project/Assets/MK Assets/Mono Direct.meta new file mode 100644 index 0000000..1e055d1 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Mono Direct.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b5c92e725a39e400eb1b9da3725dca1f +folderAsset: yes +timeCreated: 1499082733 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Mono Direct/MonoDirect.cs b/Unity Project/Assets/MK Assets/Mono Direct/MonoDirect.cs new file mode 100644 index 0000000..00416ca --- /dev/null +++ b/Unity Project/Assets/MK Assets/Mono Direct/MonoDirect.cs @@ -0,0 +1,427 @@ +using UnityEngine; +using System; +using MK.Common.Utilities; + +/// +/// Mono Direct - Gives your game speed as Unity calls these functions using reflection. +/// So better to use reflection only in MonoDirect and implementing the callbacks in your monobehavious scripts +/// Usage: Register the required action in Awake of your script and also Unregister in onDestroyCallback +/// Remember: Use this class only to save recurring reflection calls like Update, FixedUpdate; not one time reflection calls like Start, OnEnable +/// For more details: +/// Summary Reference: https://docs.unity3d.com/Manual/ExecutionOrder.html +/// + +namespace MK.Direct +{ + public sealed class MonoDirect : Singleton + { + #region Actions declared + + /// + /// One time reflection call - Not recommended to use this. + /// First Scene Load - (only called if the Object is active): This function is called just after the object is enabled. + /// This happens when a MonoBehaviour instance is created, such as when a level is loaded or a + /// GameObject with the script component is instantiated + /// + public Action onEnableCallback; +#if UNITY_4_6 || UNITY_4_7 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 + /// + /// One time reflection call - Not recommended to use this. + /// First Scene Load - This function is executed to inform the game that a new level has been loaded + /// + public Action onLevelWasLoadedCallback; +#endif + + /// + /// One time reflection call - Not recommended to use this. + /// Before the first frame update - Start is called before the first frame update only if the script instance is enabled + /// + public Action startCallback; + + /// + /// Recurring reflection call - recommended to use this. + /// In between frames - This is called at the end of the frame where the pause is detected, effectively between the normal + /// frame updates. One extra frame will be issued after OnApplicationPause is called to allow the game + /// to show graphics that indicate the paused state + /// + public Action onApplicationPauseCallback; + /// + /// Recurring reflection call - recommended to use this. + /// In between frames - called when the application loses or gains focus. Alt-tabbing or Cmd-tabbing can take focus away + /// from the Unity application to another desktop application + /// + public Action onApplicationFocusCallback; + + /// + /// Recurring reflection call - recommended to use this. + /// Update Order - FixedUpdate is often called more frequently than Update. It can be called multiple times per frame, + /// if the frame rate is low and it may not be called between frames at all if the frame rate is high. All physics + /// calculations and updates occur immediately after FixedUpdate. When applying movement calculations inside FixedUpdate, + /// you do not need to multiply your values by Time.deltaTime. This is because FixedUpdate is called on a reliable timer, + /// independent of the frame rate. + /// + public Action fixedUpdateCallback; + /// + /// Recurring reflection call - recommended to use this. + /// Update Order - Update is called once per frame. It is the main workhorse function for frame updates. + /// + public Action updateCallback; + /// + /// Recurring reflection call - recommended to use this. + /// Update Order - LateUpdate is called once per frame, after Update has finished. Any calculations that are performed + /// in Update will have completed when LateUpdate begins. A common use for LateUpdate would be a following + /// third-person camera. If you make your character move and turn inside Update, you can perform all camera movement + /// and rotation calculations in LateUpdate. This will ensure that the character has moved completely + /// before the camera tracks its position. + /// + public Action lateUpdateCallback; + + /// + /// Recurring reflection call - recommended to use this. + /// Rendering - Called before the camera culls the scene. Culling determines which objects are visible to the camera. + /// OnPreCull is called just before culling takes place. + /// + public Action onPreCullCallback; + /// + /// Recurring reflection call - recommended to use this. + /// Rendering - Called when an object becomes visible to any camera + /// + public Action onBecameVisibleCallback; + /// + /// Recurring reflection call - recommended to use this. + /// Rendering - Called when an object becomes invisible to any camera + /// + public Action onBecameInvisibleCallback; + /// + /// Recurring reflection call - recommended to use this. + /// Rendering - Called once for each camera if the object is visible + /// + public Action onWillRenderObjectCallback; + /// + /// Recurring reflection call - recommended to use this. + /// Rendering - Called before the camera starts rendering the scene + /// + public Action onPreRenderCallback; + /// + /// Recurring reflection call - recommended to use this. + /// Rendering - Called after all regular scene rendering is done. You can use GL class or Graphics. + /// DrawMeshNow to draw custom geometry at this point + /// + public Action onRenderObjectCallback; + /// + /// Recurring reflection call - recommended to use this. + /// Rendering - Called after a camera finishes rendering the scene + /// + public Action onPostRenderCallback; + /// + /// Recurring reflection call - recommended to use this. + /// Rendering - Called after scene rendering is complete to allow postprocessing of the image + /// + public Action onRenderImageCallback; + /// + /// Recurring reflection call - recommended to use this. + /// Rendering - Called multiple times per frame in response to GUI events. The Layout and Repaint events + /// are processed first, followed by a Layout and keyboard/mouse event for each input event + /// + public Action onGUICallback; + /// + /// Recurring reflection call - recommended to use this. + /// Rendering - Used for drawing Gizmos in the scene view for visualisation purposes + /// + public Action onDrawGizmosCallback; + + /// + /// One time reflection call - Not recommended to use this. + /// When the Object is Destroyed - This function is called after all frame updates for the last frame of + /// the object’s existence (the object might be destroyed in response to Object.Destroy or at the closure of a scene) + /// + public Action onDestroyCallback; + + /// + /// One time reflection call - Not recommended to use this. + /// When Quitting - This function is called on all game objects before the application is quit. + /// In the editor it is called when the user stops playmode + /// + public Action onApplicationQuitCallback; + /// + /// One time reflection call - Not recommended to use this. + /// When Quitting - This function is called when the behaviour becomes disabled or inactive + /// + public Action onDisableCallback; + + #endregion Actions declared + + #region Actions called + + /// + /// First Scene Load - (only called if the Object is active): This function is called just after the object is enabled. + /// This happens when a MonoBehaviour instance is created, such as when a level is loaded or a + /// GameObject with the script component is instantiated + /// + void OnEnable() + { + if (onEnableCallback != null) + onEnableCallback(); + } + +#if UNITY_4_6 || UNITY_4_7 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 + /// + /// First Scene Load - This function is executed to inform the game that a new level has been loaded + /// + void OnLevelWasLoaded(int level) + { + if (onLevelWasLoadedCallback != null) + onLevelWasLoadedCallback(level); + } +#endif + + /// + /// Before the first frame update - Start is called before the first frame update only if the script instance is enabled + /// + protected override void Start() + { + base.Start(); + if (startCallback != null) + startCallback(); + } + + + /// + /// In between frames - This is called at the end of the frame where the pause is detected, effectively between the normal + /// frame updates. One extra frame will be issued after OnApplicationPause is called to allow the game + /// to show graphics that indicate the paused state + /// + void OnApplicationPause(bool pauseStatus) + { + if (onApplicationPauseCallback != null) + onApplicationPauseCallback(pauseStatus); + } + + void OnApplicationFocus(bool hasFocus) + { + if (onApplicationFocusCallback != null) + onApplicationFocusCallback(hasFocus); + } + + /// + /// Update Order - FixedUpdate is often called more frequently than Update. It can be called multiple times per frame, + /// if the frame rate is low and it may not be called between frames at all if the frame rate is high. All physics + /// calculations and updates occur immediately after FixedUpdate. When applying movement calculations inside FixedUpdate, + /// you do not need to multiply your values by Time.deltaTime. This is because FixedUpdate is called on a reliable timer, + /// independent of the frame rate. + /// + void FixedUpdate() + { + if (fixedUpdateCallback != null) + fixedUpdateCallback(); + } + + /// + /// Update Order - Update is called once per frame. It is the main workhorse function for frame updates. + /// + void Update() + { + if (updateCallback != null) + updateCallback(); + } + + /// + /// Update Order - LateUpdate is called once per frame, after Update has finished. Any calculations that are performed + /// in Update will have completed when LateUpdate begins. A common use for LateUpdate would be a following + /// third-person camera. If you make your character move and turn inside Update, you can perform all camera movement + /// and rotation calculations in LateUpdate. This will ensure that the character has moved completely + /// before the camera tracks its position. + /// + void LateUpdate() + { + if (lateUpdateCallback != null) + lateUpdateCallback(); + } + + /// + /// Rendering - Called before the camera culls the scene. Culling determines which objects are visible to the camera. + /// OnPreCull is called just before culling takes place. + /// + void OnPreCull() + { + if (onPreCullCallback != null) + onPreCullCallback(); + } + + /// + /// Rendering - Called when an object becomes visible to any camera + /// + void OnBecameVisible() + { + if (onBecameVisibleCallback != null) + onBecameVisibleCallback(); + } + + /// + /// Rendering - Called when an object becomes invisible to any camera + /// + void OnBecameInvisible() + { + if (onBecameInvisibleCallback != null) + onBecameInvisibleCallback(); + } + + /// + /// Rendering - Called once for each camera if the object is visible + /// + void OnWillRenderObject() + { + if (onWillRenderObjectCallback != null) + onWillRenderObjectCallback(); + } + + /// + /// Rendering - Called before the camera starts rendering the scene + /// + void OnPreRender() + { + if (onPreRenderCallback != null) + onPreRenderCallback(); + } + + /// + /// Rendering - Called after all regular scene rendering is done. You can use GL class or Graphics. + /// DrawMeshNow to draw custom geometry at this point + /// + void OnRenderObject() + { + if (onRenderObjectCallback != null) + onRenderObjectCallback(); + } + + /// + /// Rendering - Called after a camera finishes rendering the scene + /// + void OnPostRender() + { + if (onPostRenderCallback != null) + onPostRenderCallback(); + } + + /// + /// Rendering - Called after scene rendering is complete to allow postprocessing of the image + /// + void OnRenderImage(RenderTexture src, RenderTexture dest) + { + if (onRenderImageCallback != null) + onRenderImageCallback(src, dest); + } + + /// + /// Rendering - Called multiple times per frame in response to GUI events. The Layout and Repaint events + /// are processed first, followed by a Layout and keyboard/mouse event for each input event + /// + void OnGUI() + { + if (onGUICallback != null) + onGUICallback(); + } + + /// + /// Rendering - Used for drawing Gizmos in the scene view for visualisation purposes + /// + void OnDrawGizmos() + { + if (onDrawGizmosCallback != null) + onDrawGizmosCallback(); + } + + /// + /// When the Object is Destroyed - This function is called after all frame updates for the last frame of + /// the object’s existence (the object might be destroyed in response to Object.Destroy or at the closure of a scene) + /// + protected override void OnDestroy() + { + if (onDestroyCallback != null) + onDestroyCallback(); + + UnregisterActionsOnDestroy(); + base.OnDestroy(); + } + + /// + /// When Quitting - This function is called on all game objects before the application is quit. + /// In the editor it is called when the user stops playmode + /// + protected override void OnApplicationQuit() + { + base.OnApplicationQuit(); + if (onApplicationQuitCallback != null) + onApplicationQuitCallback(); + } + + /// + /// When Quitting - This function is called when the behaviour becomes disabled or inactive + /// + void OnDisable() + { + if (onDisableCallback != null) + onDisableCallback(); + } + + #endregion Actions called + + #region Unregister actions + + void UnregisterActionsOnDestroy() + { + if (onEnableCallback != null) + onEnableCallback(); + + //#if UNITY_4_6 || UNITY_4_7 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 + //if (onLevelWasLoadedCallback != null) + // onLevelWasLoadedCallback(level); + //#endif + + if (startCallback != null) + startCallback(); + //if (onApplicationPauseCallback != null) + // onApplicationPauseCallback(pauseStatus); + //if (onApplicationFocusCallback != null) + // onApplicationFocusCallback(hasFocus); + + if (fixedUpdateCallback != null) + fixedUpdateCallback(); + if (updateCallback != null) + updateCallback(); + if (lateUpdateCallback != null) + lateUpdateCallback(); + + if (onPreCullCallback != null) + onPreCullCallback(); + if (onBecameVisibleCallback != null) + onBecameVisibleCallback(); + if (onBecameInvisibleCallback != null) + onBecameInvisibleCallback(); + if (onWillRenderObjectCallback != null) + onWillRenderObjectCallback(); + if (onPreRenderCallback != null) + onPreRenderCallback(); + if (onRenderObjectCallback != null) + onRenderObjectCallback(); + if (onPostRenderCallback != null) + onPostRenderCallback(); + //if (onRenderImageCallback != null) + // onRenderImageCallback(src, dest); + + if (onGUICallback != null) + onGUICallback(); + + if (onDrawGizmosCallback != null) + onDrawGizmosCallback(); + + if (onApplicationQuitCallback != null) + onApplicationQuitCallback(); + + if (onDisableCallback != null) + onDisableCallback(); + } + + #endregion Unregister actions + } +} diff --git a/Unity Project/Assets/MK Assets/Mono Direct/MonoDirect.cs.meta b/Unity Project/Assets/MK Assets/Mono Direct/MonoDirect.cs.meta new file mode 100644 index 0000000..8b951a0 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Mono Direct/MonoDirect.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 866b9338f9acc42afb48fd441852f038 +timeCreated: 1499089505 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: bc4399f29bda14c248011e5393287541, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Mono Direct/MonoDirectDemo.unity b/Unity Project/Assets/MK Assets/Mono Direct/MonoDirectDemo.unity new file mode 100644 index 0000000000000000000000000000000000000000..ba2cbdbb7914ecbeaf9496922c7f374f48d48f81 GIT binary patch literal 12308 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 literal 0 HcmV?d00001 diff --git a/Unity Project/Assets/MK Assets/Mono Direct/MonoDirectDemo.unity.meta b/Unity Project/Assets/MK Assets/Mono Direct/MonoDirectDemo.unity.meta new file mode 100644 index 0000000..1646bcc --- /dev/null +++ b/Unity Project/Assets/MK Assets/Mono Direct/MonoDirectDemo.unity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8ba09a011843d4e39acd95cb590d27c0 +timeCreated: 1495294110 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Mono Direct/MonoDirectExample.cs b/Unity Project/Assets/MK Assets/Mono Direct/MonoDirectExample.cs new file mode 100644 index 0000000..c546e0b --- /dev/null +++ b/Unity Project/Assets/MK Assets/Mono Direct/MonoDirectExample.cs @@ -0,0 +1,193 @@ +using UnityEngine; +using MK.Direct; + +public class MonoDirectExample : MonoBehaviour +{ + void Awake() + { + MonoDirect.Instance.onEnableCallback += OnEnableCalled; +#if UNITY_4_6 || UNITY_4_7 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 + MonoDirect.Instance.onLevelWasLoadedCallback += OnLevelWasLoadedCalled; +#endif + + MonoDirect.Instance.startCallback += StartCalled; + + MonoDirect.Instance.onApplicationPauseCallback += OnApplicationPauseCalled; + MonoDirect.Instance.onApplicationFocusCallback += OnApplicationFocusCalled; + + MonoDirect.Instance.fixedUpdateCallback += FixedUpdateCalled; + MonoDirect.Instance.updateCallback += UpdateCalled; + MonoDirect.Instance.lateUpdateCallback += LateUpdateCalled; + + MonoDirect.Instance.onPreCullCallback += OnPreCullCalled; + MonoDirect.Instance.onBecameVisibleCallback += OnBecameVisibleCalled; + MonoDirect.Instance.onBecameInvisibleCallback += OnBecameInvisibleCalled; + MonoDirect.Instance.onWillRenderObjectCallback += OnWillRenderObjectCalled; + MonoDirect.Instance.onPreRenderCallback += OnPreRenderCalled; + MonoDirect.Instance.onRenderObjectCallback += OnRenderObjectCalled; + MonoDirect.Instance.onPostRenderCallback += OnPostRenderCalled; + MonoDirect.Instance.onRenderImageCallback += OnRenderImageCalled; + MonoDirect.Instance.onGUICallback += OnGUICalled; + MonoDirect.Instance.onDrawGizmosCallback += OnDrawGizmosCalled; + + MonoDirect.Instance.onDestroyCallback += OnDestroyCalled; + + MonoDirect.Instance.onApplicationQuitCallback += OnApplicationQuitCalled; + MonoDirect.Instance.onDisableCallback += OnDisableCalled; + } + + #region MonoDirect Actions called + + void OnEnableCalled() + { + Debug.Log("MonoDirectExample-OnEnableCalled"); + } +#if UNITY_4_6 || UNITY_4_7 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 + void OnLevelWasLoadedCalled() { } +#endif + + void StartCalled() + { + Debug.Log("MonoDirectExample-StartCalled"); + } + + void OnApplicationPauseCalled(bool pauseStatus) + { + Debug.Log("MonoDirectExample-OnApplicationPauseCalled: " + pauseStatus); + } + + void OnApplicationFocusCalled(bool hasFocus) + { + Debug.Log("MonoDirectExample-OnApplicationFocusCalled: " + hasFocus); + } + + void FixedUpdateCalled() + { + //Debug.Log("MonoDirectExample-FixedUpdateCalled"); + } + + void UpdateCalled() + { + //Debug.Log("MonoDirectExample-UpdateCalled"); + } + + void LateUpdateCalled() + { + //Debug.Log("MonoDirectExample-LateUpdateCalled"); + } + + void OnPreCullCalled() + { + //Debug.Log("MonoDirectExample-OnPreCullCalled"); + } + + void OnBecameVisibleCalled() + { + //Debug.Log("MonoDirectExample-OnBecameVisibleCalled"); + } + + void OnBecameInvisibleCalled() + { + //Debug.Log("MonoDirectExample-OnBecameInvisibleCalled"); + } + + void OnWillRenderObjectCalled() + { + //Debug.Log("MonoDirectExample-OnWillRenderObjectCalled"); + } + + void OnPreRenderCalled() + { + //Debug.Log("MonoDirectExample-OnPreRenderCalled"); + } + + void OnRenderObjectCalled() + { + //Debug.Log("MonoDirectExample-OnRenderObjectCalled"); + } + + void OnPostRenderCalled() + { + //Debug.Log("MonoDirectExample-OnPostRenderCalled"); + } + + void OnRenderImageCalled(RenderTexture src, RenderTexture dest) + { + //Debug.Log("MonoDirectExample-OnRenderImageCalled"); + } + + void OnGUICalled() + { + //Debug.Log("MonoDirectExample-OnGUICalled"); + } + + void OnDrawGizmosCalled() + { + //Debug.Log("MonoDirectExample-OnDrawGizmosCalled"); + } + + void OnDestroyCalled() + { + Debug.Log("MonoDirectExample-OnDestroyCalled"); + if (MonoDirect.HasInstance && MonoDirect.Instance.onEnableCallback != null) + MonoDirect.Instance.onEnableCallback -= OnEnableCalled; +#if UNITY_4_6 || UNITY_4_7 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 + if (MonoDirect.HasInstance && MonoDirect.Instance.onLevelWasLoadedCallback != null) + MonoDirect.Instance.onLevelWasLoadedCallback -= OnLevelWasLoadedCalled; +#endif + + if (MonoDirect.HasInstance && MonoDirect.Instance.startCallback != null) + MonoDirect.Instance.startCallback -= StartCalled; + + if (MonoDirect.HasInstance && MonoDirect.Instance.onApplicationPauseCallback != null) + MonoDirect.Instance.onApplicationPauseCallback -= OnApplicationPauseCalled; + + if (MonoDirect.HasInstance && MonoDirect.Instance.fixedUpdateCallback != null) + MonoDirect.Instance.fixedUpdateCallback -= FixedUpdateCalled; + if (MonoDirect.HasInstance && MonoDirect.Instance.updateCallback != null) + MonoDirect.Instance.updateCallback -= UpdateCalled; + if (MonoDirect.HasInstance && MonoDirect.Instance.lateUpdateCallback != null) + MonoDirect.Instance.lateUpdateCallback -= LateUpdateCalled; + + if (MonoDirect.HasInstance && MonoDirect.Instance.onPreCullCallback != null) + MonoDirect.Instance.onPreCullCallback -= OnPreCullCalled; + if (MonoDirect.HasInstance && MonoDirect.Instance.onBecameVisibleCallback != null) + MonoDirect.Instance.onBecameVisibleCallback -= OnBecameVisibleCalled; + if (MonoDirect.HasInstance && MonoDirect.Instance.onBecameInvisibleCallback != null) + MonoDirect.Instance.onBecameInvisibleCallback -= OnBecameInvisibleCalled; + if (MonoDirect.HasInstance && MonoDirect.Instance.onWillRenderObjectCallback != null) + MonoDirect.Instance.onWillRenderObjectCallback -= OnWillRenderObjectCalled; + if (MonoDirect.HasInstance && MonoDirect.Instance.onPreRenderCallback != null) + MonoDirect.Instance.onPreRenderCallback -= OnPreRenderCalled; + if (MonoDirect.HasInstance && MonoDirect.Instance.onRenderObjectCallback != null) + MonoDirect.Instance.onRenderObjectCallback -= OnRenderObjectCalled; + if (MonoDirect.HasInstance && MonoDirect.Instance.onPostRenderCallback != null) + MonoDirect.Instance.onPostRenderCallback -= OnPostRenderCalled; + if (MonoDirect.HasInstance && MonoDirect.Instance.onRenderImageCallback != null) + MonoDirect.Instance.onRenderImageCallback -= OnRenderImageCalled; + if (MonoDirect.HasInstance && MonoDirect.Instance.onGUICallback != null) + MonoDirect.Instance.onGUICallback -= OnGUICalled; + if (MonoDirect.HasInstance && MonoDirect.Instance.onDrawGizmosCallback != null) + MonoDirect.Instance.onDrawGizmosCallback -= OnDrawGizmosCalled; + + if (MonoDirect.HasInstance && MonoDirect.Instance.onApplicationQuitCallback != null) + MonoDirect.Instance.onApplicationQuitCallback -= OnApplicationQuitCalled; + if (MonoDirect.HasInstance && MonoDirect.Instance.onDisableCallback != null) + MonoDirect.Instance.onDisableCallback -= OnDisableCalled; + + if (MonoDirect.HasInstance && MonoDirect.Instance.onDestroyCallback != null) + MonoDirect.Instance.onDestroyCallback -= OnDestroyCalled; + } + + void OnApplicationQuitCalled() + { + Debug.Log("MonoDirectExample-OnApplicationQuitCalled"); + } + + void OnDisableCalled() + { + Debug.Log("MonoDirectExample-OnDisableCalled"); + } + + #endregion MonoDirect Actions called +} diff --git a/Unity Project/Assets/MK Assets/Mono Direct/MonoDirectExample.cs.meta b/Unity Project/Assets/MK Assets/Mono Direct/MonoDirectExample.cs.meta new file mode 100644 index 0000000..58de003 --- /dev/null +++ b/Unity Project/Assets/MK Assets/Mono Direct/MonoDirectExample.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: cca9651a0bf5140cc8a8ec9941ba3d25 +timeCreated: 1499089555 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: bc4399f29bda14c248011e5393287541, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/Assets/MK Assets/Sample.unity b/Unity Project/Assets/MK Assets/Sample.unity new file mode 100644 index 0000000000000000000000000000000000000000..aabb09f2a6c5cba82b0cc77571c39663466653a9 GIT binary patch literal 36572 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 literal 0 HcmV?d00001 diff --git a/Unity Project/Assets/MK Assets/Sample.unity.meta b/Unity Project/Assets/MK Assets/Sample.unity.meta new file mode 100644 index 0000000..5704cfb --- /dev/null +++ b/Unity Project/Assets/MK Assets/Sample.unity.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e95430c34fbdb4ba4afc3288e3b57da6 +timeCreated: 1499090204 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Unity Project/ProjectSettings/AudioManager.asset b/Unity Project/ProjectSettings/AudioManager.asset new file mode 100755 index 0000000000000000000000000000000000000000..bdf63071fd4f4e54bbc1ad758351e2f015381722 GIT binary patch literal 4140 zcmeH~y>1gh6ov2FNq~^whK6Q~C>64ZBA`r29AqIZ8L#3NhRtlW_Smyp?-o#P?LKXy zH0fw)sdxay8{`f03M}WWy+TTza*lL0_kOxFv-fD55ouhAY`qYXZLC;CUbSAgUPk-! zw=7G~19(bWmb;&4qj31%zq?wS{4qa&v-=l|- z8oleN$r}iY{p8P(lQ#*Wn(rVdXHev~=-)?9woC}syn~#4g%GOwDRS~hgiy^ja`MN7 zP|d$0Cx1c+k#{iH3_0grB`nAr-X1arIc@U}$(z-8KF1!OvqoM;Q$C`1h+s`W=G>DH zV3&(}11rUQ$-h^*$R^>T$lLrZwp}$*=Q@?~r-3#3SWDj;W249qLS?kHZIT$B`tMYj z*;Lv(Qn|_eAkk_B+_h&KTLU#lS6^i;+ClFqk0PB0@i*3kIL&fp1~v}$vCStLSYO`* zL87u)8SF@VCO?lSJSd*3FGg3N`TrcWoZ$2@n^r?FX5vT`e@G|ifOEh(;2dxcI0u{q h&H?9ubHF*^9C&C4iUT|=tEk`N)eR{8`YJq3{{dITfdc>l literal 0 HcmV?d00001 diff --git a/Unity Project/ProjectSettings/ClusterInputManager.asset b/Unity Project/ProjectSettings/ClusterInputManager.asset new file mode 100755 index 0000000000000000000000000000000000000000..3de5a6d933f8d0e55b0c519e81ff666aad7df03f GIT binary patch literal 4104 zcmeH^yGjE=6o$|2=HmTsCBA?~P(*D5vCu+6B(@S{6eS6=xzqz%r}Yg?VduMu5X44H zpTYJ2cb0`Esjbeys|Sc1t z>5TjQEv%V8gX+)C=g+dgI-WmAp3Hpye8zn~d?xt|sFU&+*ao_ijKJ~N)3eOFhQ$bCU{^gR(B!xImp zEA^}O3;regnWm}Z09<35rW2dzUd~QWr5oeVt~buR`V{CK@-C-gC>!9F)GP)>4*uS_ zG_j2%G{xE;FDM%hF9Q3Gssow6?&Y;itDq!C9mb2bEEasIp06z4xL4O8P5F= z7|wfF=nMKcvF09Q@NAw6)iKX1*5kPsbMib7z_|V(oQ==L{2^lIRfe#FKSj*^5JMPq z-uF3T<~$Qy!QUcgKEV*idCN#9{b6xL~4%jDN;? zYk+)T$ALKyeVmKfm!0{EA$QIEHN3-fPK|KBU+7@?$(*-4{Uq>`mI%eRjOp>lomlh& z-KSmZ(-Ug9bv&Qdw1k#%Ak>Bm6JAj17 z_y=jtDqt0`3RnfK0#*U5fK|XMU=^?m{0jv>en0c!FMSuPd#`U)_h#q$8=Ain@z0sT KgTD{|r~Lxy5H*5ET z8^M)s+A&!Kr7AIuhbM&^i%S%_ni@rKW&KPfO2o&YZtF0qt-DLP6$zQ-A>ETw-) zcqlyiYws|zRT7^1wRc3g_7skJQuazc`oj}=Bg?TCZN}(goUe5#GMC>zE|50hTg-(| z2&4^onYr*ufwTdyFc&^0kXClwpw-#wx(%nQg246aKAPv%OXVpaIzV~$MMF7g+rc&J zUDttQ2li?1tQYhBxZaP2GcMEC4?34Wi7}&qQNSo*6fg=H1&jhl0i%FXz$jo8_`eGD v-f4j~USZq!Rp4hU2ie+wy4vozfl60w&#tRZR=-MScU7~M>3VK(`}fA*8y#{x literal 0 HcmV?d00001 diff --git a/Unity Project/ProjectSettings/EditorSettings.asset b/Unity Project/ProjectSettings/EditorSettings.asset new file mode 100755 index 0000000000000000000000000000000000000000..c40bb1e18d7843255d94a6d3f8b016acdcd69b57 GIT binary patch literal 4168 zcmeH~zityj5XR?nK=>cPK!cF-1O|i%g&Qk>AQVOpCn8ay{#R3{q5Z6@n^YMqHsiXWt)huN|i$Npug6?o8G5i zRaFInfJ4x#djEar%W-f0_;#;2__q18e^clW$q>g94~a^7q^dV1Q6R6QkjhU1m8S$k zs>y)1g|EmS{Yz4*#Mx4CPgY29=mtaZkiH7LCC@lQsA`KnZZn|3TK6^E_Y)zBvB{!CmuT1g~>({!4#& zqyJI%(7!CTOCSDq>El=I(w85&<&FMl*+c)D)GqxV`iFRC(f{kE zZD};M+VNP$Z@CMNRg%bOj?DpE(HL8^$FY0NIon$MNgijjgcA&uV-!sHPuDYJ+*38- zVya?{^1NW%YH-qaN3%55^V){yO};wh)N7>0YoCW@j6{vaZPs33>|K@b!nKbw$978f?be`D`%Cp$1Zv(C(tM9Ol# zSVfiIsM3p7qLv5ClT~`+=)r>*tE5Uj=t;bI@~BnD_nq$P%+BJ?FZ6Er(_epYcYob8 zix6u+6=L0Xfe#^W!uyY9^y=PYxz_yxZR&19q2+b&)woA@v*q2o zJpOt=SBdPo+G4rZy@ED%x1!MUy7z0`qr1)WZrulx7`^L#&~mN&E!xz52!)o{<>jW4 zXYUd3A1!~69!^-V?oP`caTWLL2ef(Lcj23c_|9Xvk1XVmXl&ze!WiDu-5JjLoP|H{ z#G{rMy6*KLxZeLl*Z%LZT+inZw5hw-#_669=9O5w-gG{E-q6VT@Ji>iKcVE^^Lae+ z)jWG14p{Dpu|Cn+j7f7{2W=evd`q8KcwU-y^>wZ5kmZh;Mx28t4)=WyCGRBb>N;0N%k_Op^EgHhDVKK3mRKqGW^9HZy5ekj$btVRh>Omby;f7gAP19yh#Kak`ly)X0RNf{708y&`HyJ2}jAa|X0h|l+niz38U zjOiDb!8d^8ALj+O!Z#XzF2^?+?&bJq!<&{DlK5K;_rYmgFLiet9uN+Z>vM7#+yQEl z!%{wN`0E;rbtTH>I6R`g zj)LhLD&wxFCX1+)W!y+A>B!S+&QrD64g81$YN1kor6p^MV}k|4DK#%^OX&cBqH4vB zlR?;&9{WoHho3=|AWZz-`9?e;y&xIuN8_Fh73#y@f?SFw{hHUVtGb>W{mY^90xZm; z%qq^v(3O5X8hB=w$+B9Z8>uZk@YSv`LgNOt~*F~{r6aXCAhj=&`P@+hZ48wJdYbz zz&T7oT{4xXJ+|2DYV1R6*sH2~P+5?1tug7(1(C=Tf$1ty3p|{PP|S;}kfQ1OQ*C@; zU!W%!GY!4gXeLrxe$tPXAMwPPZD1E}QxHz8W=n-KZsTt9nZ%OX_DmyF6=H4bf$va7 zK|8FeXiwXRz-(1Nqh{42_9El=KU6sfmh|^i+Ftoxqx*-9R@$$B|LHz5{X21`z4H4< zGyVQp>F0ZiHh{wMEB_xygFjwjiB_iGm#I6uR(#f*dOD^r)7D=3&(5)Q9r+$7HQVto DUFo}f literal 0 HcmV?d00001 diff --git a/Unity Project/ProjectSettings/InputManager.asset b/Unity Project/ProjectSettings/InputManager.asset new file mode 100755 index 0000000000000000000000000000000000000000..b51d8d4e8d39e69ba91f6d17be4b5c40e253aab0 GIT binary patch literal 5520 zcmeI0%Wl&^6ow}xE%!T=(o!h*%c5$j00{|jOQ{N?6{zASAt5)JriR3hY^Sspi%4v` zf^K*KgwzdU(+xYG0K|$dLSn~55dME0$C<=w_sAz2&76Pcd^0{CM;;5&krLwIiV$M2 z5PMJwacSW4z~Jn#_*<=3Q|J{tsaC7Yzu&z2aI5S4ugssGzC+#S1*l(8HnAIaMTiPQ zs>-Pdk-~2^Eh=j%QOQ6gDkv%O13IxBuj1ACO{pO;Sg5DbFO;4ZKhf$%3^^>cG=2wA zKSv+OcTlWwj*OVV*pHZ(dS_kl(D<97rwoqo)c9MdtI{d%gGfI8t#v)%AB9i;Hq^nq zI)6LI8?F2u)K$^>%txRH`~mpn??N5N-_7wxE1!2Uj*lCx@yFqlzYldBe?P|?t$gM@ zj(@PO2kUU=7fKSdEn{Vv8M zM$LCxsgb@~)6Y;h0-ev%C%ELCMWK;HeGP5u=P1HL{WIFs&r^imwo7Gy(zMOIbVc#m z$b$3&ZDhgnL{55H*DCqeyqq$NQuAfrtm}5o87=$1V~djGS?sI1X2GA*2SB-}kIB2{ zyyY)q1~Vr-X)6E)&o)cKvgf7i3xBaBg~^3IcNVA0MU^RDTVyNhk0bJvR+51v14#yw z3?vyyGLU2-$v~2U|2YFZ|M3hv;kee4WBX~;X7v!wZS7g`9&-tkN?rhfT9BLdc z3}@f#tE?N}tJ%Y|^h3OdTiJ+8X3lwO^W0x91w0RJ#=b;ZkH>Y4Tdu@60?l|f=Q{hd zz8fx|=lh~l_GJGcT1#WW8kfejKsX`uVp9j#u9!G_uq)zm_KkVN3~DguSn<3$YgQ2( znVh{nlR3LnE+Sizaot|Y%*seYt38A3pH%sHtVP5*-@bmmM!oTVM)6PLLNu*0K4kFw zLookz)^!SnM{`n!_eu+HavE9cTM_!(?boJI8#%_VE!TF#6H+wEkLens&B%^Ku@1 R{4nvsL0Q~dhg45{_CMvLn!Nx3 literal 0 HcmV?d00001 diff --git a/Unity Project/ProjectSettings/NavMeshAreas.asset b/Unity Project/ProjectSettings/NavMeshAreas.asset new file mode 100755 index 0000000000000000000000000000000000000000..dfb811e9ffa630e93e6c2e2ae3abc0856610b485 GIT binary patch literal 4460 zcmeH~OKTKC5XWn>yNU1jD-TV497Hhqhr)pU5su zA{Rz4j-I)5Ue?>~w&MUiCT+KWe_E^k`Y?3s#k;YOkDh-HPJo`odJmT&mqcQ0X&WOJ zaq#!LAn|)g;vyiAN`@m}!4JZwzu9m6dz`a4gM++)buqjkKcEd_56|JCI8u8BcPH{B9Cw%W_<> zk(58Nd`}mDYWdzS{><`yUHp~h`@8t67t4A76vo54eS^;U4-rDrIDbMX?{4Z>3DX9V0iRl1s`vn?b{R`Re|amfx7HG=nfKyJ4j26)nD7pVu`vs54seRlTLWY3+Fn z?nA_!DhXe7J#BcDDymXxHC3dqd#a*+MD#D8IV2t08lq@cJQg*VyaIUz@(Sb?$SaUn zAg@4PfxH5F1u_*FfyFoPP37HHOP4Y7{crb6u)2w037<70AFl*a$6U~3g8XMeeiD#%Q3!g6b{ai%3&Dr= zeegNd%o7Z8n16sTpyv61vn-JV=U{G!TGl7R`Lnp2wIc(3-Xi}DdcI>c=1F=5dqD6v zjm6v!_s4e;&q)pO4b9U-d`t83A-<>iM9h=4jD6DBli6gt66KuE zOFHK(&~G+ds#HW#mfk4}z6?jFu#Wziurv?jfN{V$U>q1BcOG+q+631~=nkrQdwu%r)=*4}ux7~Qd?uNud zLJJ2t00$~@;Y2Q6sZbB$)~W|MKyL^RfK)DAIZz2MnD2MrdmDTE2XOHu>z(<`yqWR5 zXUi+H?Xt+OF~N(-Ex3tHPd+=jzj;9Z?e%(|2XGr{uQ&ecnNR9}y#Lze_TTUPoSs{n z2K{VAWRz~mL6H z@*4;tM_kxepY_E0$;5-p60J{Prx`#4n1Z5jg(kjspMC@;eKB!}7Zd zeADu~!Et1=ewhD~<@Xf$@0QpoTBuI^-kySn=d+|}Kmb5DN6 z=lxyO<@eIl8RuS(c+gW`6sYFM<3Z~{~5H+uxYBfk41Uc*ndSM<)RVD3AIiZ8F zfm91vs1iTyFnu+Qed+_yMb_Jqj@w~y5`o9m`l8>_DyoE0q#ImgXt~o`4X(!ZNOj^M zt5aLi+NO9VOa{=LT3v3bDABcs3N#Ytpzbg0g@AQ)#PC zOV^TcC9bF-SW=DCTu=_yR5z}*!?ph4e%p23&ulMD(2vXIxj7)~Ek{wf<|g2>m)F#3 z4I_*sl9nuq$`+VD%P}Wpyi8-LO;^M$=Gda@YV0rKV{9)DQ{=DXaA#s~nLgHU829jX zIDz2=h7%Z0U^s!{1cnoki&w@j^pAnhz~=coE&cHQ;tb5P$aixh=PJgYErFG`|Fq{2 z?z6n}`IA32=s)x6uF{pilG4W??I>M1KU?azzuDYGzLe`BY3b}&`=HY{?7cLdnSh7C I&HqpN4+o7N9RL6T literal 0 HcmV?d00001 diff --git a/Unity Project/ProjectSettings/ProjectSettings.asset b/Unity Project/ProjectSettings/ProjectSettings.asset new file mode 100755 index 0000000000000000000000000000000000000000..26da7e76436de4fa95abb7d57dd9c7038a5bed77 GIT binary patch literal 51918 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 P>@;a74t3#q1|$9tQyv#? literal 0 HcmV?d00001 diff --git a/Unity Project/ProjectSettings/ProjectVersion.txt b/Unity Project/ProjectSettings/ProjectVersion.txt new file mode 100755 index 0000000..ca09a3d --- /dev/null +++ b/Unity Project/ProjectSettings/ProjectVersion.txt @@ -0,0 +1 @@ +m_EditorVersion: 5.6.0f3 diff --git a/Unity Project/ProjectSettings/QualitySettings.asset b/Unity Project/ProjectSettings/QualitySettings.asset new file mode 100755 index 0000000000000000000000000000000000000000..d3410f33d373ad8ef2c275d81dad7145b38d6dce GIT binary patch literal 4976 zcmeI0%WoS+9LImon>Nrwpim0L<^2pLPC-IyaGWUN5E?h@B;2a8cbrVM-nI6TIz1qB zK}G5TE=Yv~^unQVs>F!{a70Rv6(>Llac${8fcbrAXV+en1Kc=x+R@H@=J%T4&Nwqm zG`>MJ)g+?(iH`Dv==99%GpFhW`m59FwqP34AC$ZxPQUOkEQY>^ft?uxDPwyDId+)pJ1LV!tYqd{ypHj zj?p=`4g2UHO8JPEU*SIDIm{I$$34tUJCeqfLs#(KDWV- z0CEApM%4a@+u-qA?DEeI=NGI?BL9uy5A^UqI6psfA2Cj8o@e``+Wybnhy4fp_^*aP z)W?4_{8-B4Jp69>!aG_&wgor#SiGkM{6YqIRA+|ECjue8%v{m}4Ay zfczQ5AMcajH2ewhVmHo!Is8t8b4l{~p5b{-yYe3xezK2$V)&DN{Af=8c{xoOeenYGToLjUnSJphxVAHq z*%vRRJV$rg(H#@#%c=eBzJ4X;*?m0&uI&%g^iaI-Fkk(%)J8noV}1C{&(nK-u>$$XX9r6hTecGErDkK`7js zG~#Ea@XL;HrOl!o>-OTs>*Sy zp78BpS=8hrXUG?2FHl-**V=Pyahe>@F0mtOh?Z(Zjn%cKRkeW2r{dk#X#>kMeK*B=U()p-^}W?IPD+KbYH!=hz zN50~*B&Sf~qUGD#2aG@lwo&lip(F)g0_u^&Z5%Bzjtafl-jxy^;486_%BQ}*kA1NK z#u7RBTIN$czaCXHJk?F*jxGK-UsPmO{b8cl7rtL$%`LdL??E$@Z6Loo&Z3crNrPR zX9+VpakJmxWw`_P5_?>vmfWK?BMxG0pWqM8#jhXKno!1bu{&bF43OdgKPx)61IzK0Fyjsw?mgBCR;~qB#QU?gY_+_M2%u7;Wh&=!sUxo^6|f3e1*`&A0jq#jz$#!B_@5M*$6?tEZ+b1& zZAZdBbT3dk{HX#@NAJENW)Ir%btmxVKdIin3L^k8_S|1pgcePNef*aOUjN9l9zNrp Gef9wwzo?r4 literal 0 HcmV?d00001 diff --git a/Unity Project/ProjectSettings/TimeManager.asset b/Unity Project/ProjectSettings/TimeManager.asset new file mode 100755 index 0000000000000000000000000000000000000000..96652b8c0f133bce51f13c1d36e3aa4a26ccb280 GIT binary patch literal 4116 zcmZQzV62p*h(nLs)uGdI;YF)uMawTQtjvm!M` z0VGmfl3Kvvn^=*VTbirjn3I!Vjx3QI4^k7HoS2geR}_#~RFavTlZwy|ay`TkU_5DknG?O7wDz1(w0biFy% z9ABEGKS`1p27@X5Nsu247!eI?9)D73~I5%(o<}h`|kdSEu-+ zL2-j2#_2HVE{}b}9CeKY4dcNNs+_0}*wTEKbw;>^KC~zXuNf1ZA;7mVHd^3y`oV0N z@4?ssa20iW$b6Lp^p zW^T|cP7&Cv103l*^ZST>LrZnieLMu%0ypR_rwFX~F!yCTN5HwII-gWdbX3s|p6VY1 zZ)u)?Plmx`@S<s zv)q^Ya}J!_zy6%pIOC~57rYo_h%}1~2+{nQ_^=u7Im3 zuIp;XwLU%!&>!W#OrJkQrTR^96-9mQgXRVeae_cS&Y|^-?>T=bln;xZE7xay&l9#> z5K_9{azx#yk3}T!`HtwP?dQUii(#i<^7tipd83|V5jA=yw4#+qBJe{9<@9m_Ggcsb zp=dj<^uzX=EduHKUPNjp^S#hsv7-FVicfo1XI;8>l+(mhU90215D&ZsX@#;EXpw0r zKdkLp&pN`H?^trl54%|1oFCn>x?;}ZeA;tD-*x)+ya+MK@@%nr8QNbMryKrJRIPHL za-edca-edca-edca^U}R;3h9;Mam$$WtssW4#xzJ!co)i_&ulD!|8d_Y1)3*v;x=E Z7fl<-U=gVUIPAc|F>RdV+@F@{{{lmRKhOXG literal 0 HcmV?d00001