├── .gitignore ├── Assets ├── AndroidIl2cppPatchDemo.meta ├── AndroidIl2cppPatchDemo │ ├── Art.meta │ ├── Art │ │ ├── Logo.meta │ │ └── Logo │ │ │ ├── icon.png │ │ │ └── icon.png.meta │ ├── Editor.meta │ ├── Editor │ │ ├── AndroidBuilder.cs │ │ ├── AndroidBuilder.cs.meta │ │ ├── Exe.meta │ │ └── Exe │ │ │ ├── unzip.exe │ │ │ ├── unzip.exe.meta │ │ │ ├── zip.exe │ │ │ └── zip.exe.meta │ ├── Plugins.meta │ ├── Plugins │ │ ├── Android.meta │ │ └── Android │ │ │ ├── java.meta │ │ │ ├── java │ │ │ ├── io.meta │ │ │ └── io │ │ │ │ ├── github.meta │ │ │ │ └── github │ │ │ │ ├── noodle1983.meta │ │ │ │ └── noodle1983 │ │ │ │ ├── Boostrap.java │ │ │ │ └── Boostrap.java.meta │ │ │ ├── libs.meta │ │ │ └── libs │ │ │ ├── arm64-v8a.meta │ │ │ ├── arm64-v8a │ │ │ ├── libbootstrap.so │ │ │ └── libbootstrap.so.meta │ │ │ ├── armeabi-v7a.meta │ │ │ ├── armeabi-v7a │ │ │ ├── libbootstrap.so │ │ │ └── libbootstrap.so.meta │ │ │ ├── x86.meta │ │ │ └── x86 │ │ │ ├── libbootstrap.so │ │ │ └── libbootstrap.so.meta │ ├── PrebuiltPatches.meta │ ├── PrebuiltPatches │ │ ├── null │ │ └── null.meta │ ├── Scene.meta │ ├── Scene │ │ ├── 0.unity │ │ └── 0.unity.meta │ ├── Script.meta │ ├── Script │ │ ├── Bootstrap.cs │ │ ├── Bootstrap.cs.meta │ │ ├── RunningArchABIController.cs │ │ ├── RunningArchABIController.cs.meta │ │ ├── TestStrInScripts.cs │ │ ├── TestStrInScripts.cs.meta │ │ ├── UI.meta │ │ ├── UI │ │ │ ├── MessageBoxUI.cs │ │ │ └── MessageBoxUI.cs.meta │ │ ├── UnityAssetStoreNavigator.cs │ │ ├── UnityAssetStoreNavigator.cs.meta │ │ ├── VersionSettor.cs │ │ └── VersionSettor.cs.meta │ ├── ZipLibrary.meta │ └── ZipLibrary │ │ ├── ICSharpCode.SharpZipLib.dll │ │ ├── ICSharpCode.SharpZipLib.dll.meta │ │ ├── ICSharpCode.SharpZipLib.pdb │ │ ├── ICSharpCode.SharpZipLib.pdb.meta │ │ ├── ICSharpCode.SharpZipLib.xml │ │ ├── ICSharpCode.SharpZipLib.xml.meta │ │ ├── ZipHelper.cs │ │ └── ZipHelper.cs.meta ├── Others.meta ├── Others │ └── Script.meta ├── Resources.meta └── Resources │ ├── BillingMode.json │ └── BillingMode.json.meta ├── Packages └── manifest.json ├── ProjectSettings ├── AudioManager.asset ├── ClusterInputManager.asset ├── DynamicsManager.asset ├── EditorBuildSettings.asset ├── EditorSettings.asset ├── GraphicsSettings.asset ├── InputManager.asset ├── NavMeshAreas.asset ├── NetworkManager.asset ├── Physics2DSettings.asset ├── ProjectSettings.asset ├── ProjectVersion.txt ├── QualitySettings.asset ├── TagManager.asset ├── TimeManager.asset └── UnityConnectSettings.asset ├── README.md ├── build_demo_apk.cmd ├── build_demo_apk_2017_not_support_by_zip_lib.cmd ├── build_demo_apk_2018.cmd ├── build_demo_apk_2019.4.cmd ├── build_demo_apk_2019.cmd ├── build_demo_apk_2020.3.cmd ├── build_demo_apk_2021.3.cmd └── build_demo_apk_2022.3.cmd /.gitignore: -------------------------------------------------------------------------------- 1 | .gitignore 2 | AndroidGradleProject* 3 | Library/ 4 | Temp/ 5 | UnityVS.* 6 | .vs 7 | *.csproj 8 | *.sln 9 | obj/ 10 | AllAndroidPatchFiles* 11 | UnityPackageManager 12 | *.apk 13 | AndroidKeystore 14 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 17c595f947721ad49b36d5c7ef619cc5 3 | folderAsset: yes 4 | timeCreated: 1541645977 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Art.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5fd70cb192b41dd4b8cd37ddba1fbcad 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Art/Logo.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 35e165acb8637d64ca621f2311f5bb67 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Art/Logo/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noodle1983/UnityAndroidIl2cppPatchDemo/10a4c303c31c74fa1be8e8305b266f013dd1b5db/Assets/AndroidIl2cppPatchDemo/Art/Logo/icon.png -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Art/Logo/icon.png.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 887ad593d68798a4cac68281e9abcd54 3 | TextureImporter: 4 | fileIDToRecycleName: {} 5 | externalObjects: {} 6 | serializedVersion: 9 7 | mipmaps: 8 | mipMapMode: 0 9 | enableMipMap: 1 10 | sRGBTexture: 1 11 | linearTexture: 0 12 | fadeOut: 0 13 | borderMipMap: 0 14 | mipMapsPreserveCoverage: 0 15 | alphaTestReferenceValue: 0.5 16 | mipMapFadeDistanceStart: 1 17 | mipMapFadeDistanceEnd: 3 18 | bumpmap: 19 | convertToNormalMap: 0 20 | externalNormalMap: 0 21 | heightScale: 0.25 22 | normalMapFilter: 0 23 | isReadable: 0 24 | streamingMipmaps: 0 25 | streamingMipmapsPriority: 0 26 | grayScaleToAlpha: 0 27 | generateCubemap: 6 28 | cubemapConvolution: 0 29 | seamlessCubemap: 0 30 | textureFormat: 1 31 | maxTextureSize: 2048 32 | textureSettings: 33 | serializedVersion: 2 34 | filterMode: -1 35 | aniso: -1 36 | mipBias: -100 37 | wrapU: -1 38 | wrapV: -1 39 | wrapW: -1 40 | nPOTScale: 1 41 | lightmap: 0 42 | compressionQuality: 50 43 | spriteMode: 0 44 | spriteExtrude: 1 45 | spriteMeshType: 1 46 | alignment: 0 47 | spritePivot: {x: 0.5, y: 0.5} 48 | spritePixelsToUnits: 100 49 | spriteBorder: {x: 0, y: 0, z: 0, w: 0} 50 | spriteGenerateFallbackPhysicsShape: 1 51 | alphaUsage: 1 52 | alphaIsTransparency: 1 53 | spriteTessellationDetail: -1 54 | textureType: 0 55 | textureShape: 1 56 | singleChannelComponent: 0 57 | maxTextureSizeSet: 0 58 | compressionQualitySet: 0 59 | textureFormatSet: 0 60 | platformSettings: 61 | - serializedVersion: 2 62 | buildTarget: DefaultTexturePlatform 63 | maxTextureSize: 2048 64 | resizeAlgorithm: 0 65 | textureFormat: -1 66 | textureCompression: 1 67 | compressionQuality: 50 68 | crunchedCompression: 0 69 | allowsAlphaSplitting: 0 70 | overridden: 0 71 | androidETC2FallbackOverride: 0 72 | - serializedVersion: 2 73 | buildTarget: Standalone 74 | maxTextureSize: 2048 75 | resizeAlgorithm: 0 76 | textureFormat: -1 77 | textureCompression: 1 78 | compressionQuality: 50 79 | crunchedCompression: 0 80 | allowsAlphaSplitting: 0 81 | overridden: 0 82 | androidETC2FallbackOverride: 0 83 | - serializedVersion: 2 84 | buildTarget: Android 85 | maxTextureSize: 2048 86 | resizeAlgorithm: 0 87 | textureFormat: -1 88 | textureCompression: 1 89 | compressionQuality: 50 90 | crunchedCompression: 0 91 | allowsAlphaSplitting: 0 92 | overridden: 0 93 | androidETC2FallbackOverride: 0 94 | spriteSheet: 95 | serializedVersion: 2 96 | sprites: [] 97 | outline: [] 98 | physicsShape: [] 99 | bones: [] 100 | spriteID: 101 | vertices: [] 102 | indices: 103 | edges: [] 104 | weights: [] 105 | spritePackingTag: 106 | pSDRemoveMatte: 0 107 | pSDShowRemoveMatteOption: 0 108 | userData: 109 | assetBundleName: 110 | assetBundleVariant: 111 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f1a14ce486a734c4e8c52d96b3eceb9d 3 | folderAsset: yes 4 | timeCreated: 1539307919 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Editor/AndroidBuilder.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using System.IO; 5 | using System.Linq; 6 | using System.Text; 7 | using UnityEditor; 8 | using UnityEngine; 9 | 10 | public class AndroidBuilder : MonoBehaviour { 11 | 12 | //----------------------------------------------------------------------------------- 13 | public static readonly string PROJECT_DIR = Application.dataPath.Substring(0, Application.dataPath.Length - 6); 14 | public static readonly string ANDROID_EXPORT_PATH = PROJECT_DIR + "/AndroidGradleProject_v1.0"; 15 | public static string ANDROID_PROJECT_PATH { get { return ANDROID_EXPORT_PATH; } } 16 | public static string ANDROID_UNITYLIBRARY_PATH = ANDROID_PROJECT_PATH + "/unityLibrary/"; 17 | public static string ANDROID_MANIFEST_PATH = ANDROID_PROJECT_PATH + "/unityLibrary/src/main/"; 18 | public static string JAVA_SRC_PATH = ANDROID_PROJECT_PATH + "/unityLibrary/src/main/java/"; 19 | public static string JAR_LIB_PATH = ANDROID_PROJECT_PATH + "/unityLibrary/libs/"; 20 | public static string SO_DIR_NAME = "jniLibs"; 21 | public static string SO_LIB_PATH = ANDROID_PROJECT_PATH + "/unityLibrary/src/main/jniLibs/"; 22 | public static string EXPORTED_ASSETS_PATH = ANDROID_PROJECT_PATH + "/unityLibrary/src/main/assets"; 23 | public static string R_JAVA_PATH = ANDROID_PROJECT_PATH + "/unityLibrary/src/main/gen/"; 24 | public static string LAUNCHER_RES_PATH = ANDROID_PROJECT_PATH + "/launcher/src/main/res"; 25 | public static string LAUNCHER_MANIFEST_XML_PATH = ANDROID_PROJECT_PATH + "/launcher/src/main/AndroidManifest.xml"; 26 | public static string RES_PATH = ANDROID_PROJECT_PATH + "/unityLibrary/src/main/res"; 27 | public static string MANIFEST_XML_PATH = ANDROID_PROJECT_PATH + "/unityLibrary/src/main/AndroidManifest.xml"; 28 | public static string JAVA_OBJ_PATH = ANDROID_PROJECT_PATH + "/unityLibrary/src/main/objs/"; 29 | public static string BUILD_SCRIPTS_PATH = ANDROID_PROJECT_PATH + "/unityLibrary/src/main/"; 30 | public static string ZIP_PATH = PROJECT_DIR + "/Assets/AndroidIl2cppPatchDemo/Editor/Exe/zip.exe"; 31 | 32 | public static string UNITY_EXE_PATH = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName; 33 | public static string UNITY_EXE_DIR = Path.GetDirectoryName(UNITY_EXE_PATH); 34 | public static string DEFAULT_SDK_PATH = UNITY_EXE_DIR + "/Data/PlaybackEngines/AndroidPlayer/SDK/"; 35 | public static string DEFAULT_JDK_PATH = UNITY_EXE_DIR + "/Data/PlaybackEngines/AndroidPlayer/OpenJDK/"; 36 | public static string DEFAULT_NDK_PATH = UNITY_EXE_DIR + "/Data/PlaybackEngines/AndroidPlayer/NDK/"; 37 | public static string GRADLE_PROXY_STRING = " \"-Dhttp.proxyHost=127.0.0.1\" \"-Dhttp.proxyPort=1080\" \"-Dhttps.proxyHost=127.0.0.1\" \"-Dhttps.proxyPort=1080\" "; 38 | //public static string GRADLE_PROXY_STRING = ""; 39 | 40 | static bool Exec(string filename, string args) 41 | { 42 | Debug.Log("========================================================"); 43 | Debug.LogFormat("exec:{0}, args:{1}", filename, args); 44 | System.Diagnostics.Process process = new System.Diagnostics.Process(); 45 | var startinfo = new System.Diagnostics.ProcessStartInfo("cmd.exe", "/C " + filename + " " + args); 46 | startinfo.RedirectStandardOutput = true; 47 | startinfo.RedirectStandardError = true; 48 | startinfo.UseShellExecute = false; 49 | startinfo.CreateNoWindow = true; 50 | process.StartInfo = startinfo; 51 | process.OutputDataReceived += (sender, args) => { if (args.Data != null) { Debug.Log(args.Data); } }; 52 | process.ErrorDataReceived += (sender, args) => { if (args.Data != null) { Debug.LogError(args.Data); } }; 53 | 54 | int exit_code = -1; 55 | 56 | try 57 | { 58 | process.Start(); 59 | process.BeginOutputReadLine(); 60 | } 61 | catch (Exception e) 62 | { 63 | Debug.LogException(e); 64 | Debug.Log("--------------------------------------------------------"); 65 | return false; 66 | } 67 | process.WaitForExit(); 68 | exit_code = process.ExitCode; 69 | process.Close(); 70 | Debug.LogFormat("exec:{0}, args:{1}, ret:{2}", filename, args, exit_code); 71 | Debug.Log("--------------------------------------------------------"); 72 | return exit_code == 0; 73 | } 74 | 75 | public static bool ValidateConfig() 76 | { 77 | string sdkPath = EditorPrefs.GetString("AndroidSdkRoot", ""); 78 | if (string.IsNullOrEmpty(sdkPath) || !Directory.Exists(sdkPath)) { sdkPath = DEFAULT_SDK_PATH; } 79 | if (string.IsNullOrEmpty(sdkPath) || !Directory.Exists(sdkPath)) 80 | { 81 | Debug.LogError("sdk path is empty! please config via menu path:Edit/Preference->External tools."); 82 | return false; 83 | } 84 | 85 | string jdkPath = EditorPrefs.GetString("JdkPath", ""); 86 | if (string.IsNullOrEmpty(jdkPath) || !Directory.Exists(jdkPath)) { jdkPath = DEFAULT_JDK_PATH; } 87 | if (string.IsNullOrEmpty(jdkPath) || !Directory.Exists(jdkPath)) 88 | { 89 | Debug.LogError("jdk path is empty! please config via menu path:Edit/Preference->External tools."); 90 | return false; 91 | } 92 | 93 | string ndkPath = EditorPrefs.GetString("AndroidNdkRootR16b", ""); 94 | if (string.IsNullOrEmpty(ndkPath)) { ndkPath = EditorPrefs.GetString("AndroidNdkRoot", ""); } 95 | if (string.IsNullOrEmpty(ndkPath) || !Directory.Exists(ndkPath)) { ndkPath = DEFAULT_NDK_PATH; } 96 | if (string.IsNullOrEmpty(ndkPath) || !Directory.Exists(ndkPath)) 97 | { 98 | Debug.LogError("ndk path is empty! please config via menu path:Edit/Preference->External tools."); 99 | return false; 100 | } 101 | 102 | Debug.Log("Build Env is ready!"); 103 | Debug.Log("Build Options:"); 104 | Debug.Log("SDK PATH=" + sdkPath); 105 | Debug.Log("JDK PATH=" + jdkPath); 106 | Debug.Log("NDK PATH=" + ndkPath); 107 | return true; 108 | } 109 | 110 | [MenuItem("AndroidBuilder/Step 1: Export Gradle Project", false, 101)] 111 | public static bool ExportGradleProject() 112 | { 113 | //build settings 114 | if (!ValidateConfig()) { return false; } 115 | 116 | PlayerSettings.applicationIdentifier = "cn.noodle1983.unitypatchdemo"; 117 | PlayerSettings.companyName = "noodle1983"; 118 | PlayerSettings.productName = "UnityAndroidIl2cppPatchDemo"; 119 | EditorUserBuildSettings.androidBuildSystem = AndroidBuildSystem.Gradle; 120 | PlayerSettings.SetScriptingBackend(BuildTargetGroup.Android, ScriptingImplementation.IL2CPP); 121 | PlayerSettings.stripEngineCode = false; 122 | PlayerSettings.Android.targetArchitectures = AndroidArchitecture.ARMv7 | AndroidArchitecture.ARM64; 123 | 124 | //export project 125 | string error_msg = string.Empty; 126 | string[] levels = new string[] { "Assets/AndroidIl2cppPatchDemo/Scene/0.unity" }; 127 | BuildOptions options = BuildOptions.None; 128 | EditorUserBuildSettings.exportAsGoogleAndroidProject = true; 129 | EditorUserBuildSettings.buildAppBundle = true; 130 | if (Directory.Exists(ANDROID_EXPORT_PATH)) { FileUtil.DeleteFileOrDirectory(ANDROID_EXPORT_PATH);} 131 | Directory.CreateDirectory(ANDROID_EXPORT_PATH); 132 | try 133 | { 134 | error_msg = BuildPipeline.BuildPlayer(levels, ANDROID_EXPORT_PATH, EditorUserBuildSettings.activeBuildTarget, options).summary.result == UnityEditor.Build.Reporting.BuildResult.Succeeded ? string.Empty : "Failed to export project!"; 135 | } 136 | catch (Exception e) 137 | { 138 | Debug.LogError(e.ToString()); 139 | return false; 140 | } 141 | 142 | if (!string.IsNullOrEmpty(error_msg)) 143 | { 144 | Debug.LogError(error_msg); 145 | return false; 146 | } 147 | 148 | //copy the prebuild patch to the assets directory instead of downloading. 149 | string androidProjectPatch1Zip = EXPORTED_ASSETS_PATH + "/AllAndroidPatchFiles_Version1.zip"; 150 | string androidProjectPatch2Zip = EXPORTED_ASSETS_PATH + "/AllAndroidPatchFiles_Version2.zip"; 151 | if (File.Exists(androidProjectPatch1Zip)) { FileUtil.DeleteFileOrDirectory(androidProjectPatch1Zip); } 152 | if (File.Exists(androidProjectPatch2Zip)) { FileUtil.DeleteFileOrDirectory(androidProjectPatch2Zip); } 153 | 154 | string patchVersion1Zip = PROJECT_DIR + "/Assets/AndroidIl2cppPatchDemo/PrebuiltPatches/AllAndroidPatchFiles_Version1.zip"; 155 | string patchVersion2Zip = PROJECT_DIR + "/Assets/AndroidIl2cppPatchDemo/PrebuiltPatches/AllAndroidPatchFiles_Version2.zip"; 156 | if (File.Exists(patchVersion1Zip)) { FileUtil.CopyFileOrDirectory(patchVersion1Zip, androidProjectPatch1Zip); } 157 | if (File.Exists(patchVersion2Zip)) { FileUtil.CopyFileOrDirectory(patchVersion2Zip, androidProjectPatch2Zip); } 158 | return true; 159 | } 160 | 161 | [MenuItem("AndroidBuilder/Step 2: Build Il2cpp So", false, 102)] 162 | public static bool BuildIl2cppSoLib() 163 | { 164 | string jdkPath = EditorPrefs.GetString("JdkPath", ""); 165 | if (string.IsNullOrEmpty(jdkPath) || !Directory.Exists(jdkPath)) { jdkPath = DEFAULT_JDK_PATH; } 166 | if (string.IsNullOrEmpty(jdkPath) || !Directory.Exists(jdkPath)) 167 | { 168 | Debug.LogError("jdk path is empty! please config via menu path:Edit/Preference->External tools."); 169 | return false; 170 | } 171 | 172 | //must use the jdk in Unity 173 | string gradlePath = jdkPath + "/../Tools/Gradle"; 174 | string[] gradleMainJarFiles = Directory.GetFiles(gradlePath + "/lib", "gradle-launcher*.jar", SearchOption.TopDirectoryOnly); 175 | if (gradleMainJarFiles.Length == 0) 176 | { 177 | Debug.LogError("gradle-launcher jar file not found in " + gradlePath + "/lib"); 178 | return false; 179 | } 180 | string gradleMainJarFile = gradleMainJarFiles[0]; 181 | 182 | StringBuilder allCmd = new StringBuilder(); 183 | allCmd.AppendFormat("cd \"{0}\"\n\n", ANDROID_UNITYLIBRARY_PATH); 184 | allCmd.AppendFormat("ping 127.0.0.1 -n 3 > nul\n\n"); 185 | allCmd.AppendFormat("call \"{0}\" " 186 | + " -classpath \"{1}\" org.gradle.launcher.GradleMain \"-Dorg.gradle.jvmargs=-Xmx4096m\" \"BuildIl2CppTask\"" 187 | + GRADLE_PROXY_STRING 188 | + " \n\n", 189 | jdkPath + "/bin/java.exe", 190 | gradleMainJarFile); 191 | 192 | string buildFile = ANDROID_UNITYLIBRARY_PATH + "/build_il2cpp.bat"; 193 | File.WriteAllText(ANDROID_UNITYLIBRARY_PATH + "/build_il2cpp.bat", allCmd.ToString()); 194 | 195 | if (!Exec(buildFile, "")) 196 | { 197 | Debug.LogError("exec failed:" + buildFile); 198 | return false; 199 | } 200 | 201 | string testSoPath = SO_LIB_PATH + "/arm64-v8a/libil2cpp.so"; 202 | if (!File.Exists(testSoPath)) 203 | { 204 | Debug.LogError("libil2cpp.so not found:" + testSoPath + ", exec failed:" + buildFile); 205 | return false; 206 | } 207 | return true; 208 | } 209 | 210 | [MenuItem("AndroidBuilder/Step 3: Patch Gradle Project", false, 102)] 211 | public static bool PatchAndroidProject() 212 | { 213 | //1. patch java file 214 | string[] javaEntranceFiles = Directory.GetFiles(JAVA_SRC_PATH, "UnityPlayerActivity.java", SearchOption.AllDirectories); 215 | if (javaEntranceFiles.Length != 1) 216 | { 217 | Debug.LogError("UnityPlayerActivity.java not found or more than one."); 218 | return false; 219 | } 220 | string javaEntranceFile = javaEntranceFiles[0]; 221 | string allJavaText = File.ReadAllText(javaEntranceFile); 222 | if (allJavaText.IndexOf("noodle1983") > 0) 223 | { 224 | Debug.Log("UnityPlayerActivity.java already patched."); 225 | return true; 226 | } 227 | allJavaText = allJavaText.Replace("import android.view.WindowManager;", 228 | @"import android.view.WindowManager; 229 | import io.github.noodle1983.Boostrap;"); 230 | 231 | allJavaText = allJavaText.Replace("mUnityPlayer = new UnityPlayer(this, this);", 232 | @"Boostrap.InitNativeLibBeforeUnityPlay(getApplication().getApplicationContext().getFilesDir().getPath()); 233 | mUnityPlayer = new UnityPlayer(this, this);"); 234 | File.WriteAllText(javaEntranceFile, allJavaText); 235 | 236 | // generate removal test file 237 | string assetBinDataPath = EXPORTED_ASSETS_PATH + "/bin/Data/"; 238 | string uselessFile1 = assetBinDataPath + "to_be_removed1.txt"; 239 | File.WriteAllText(uselessFile1, "useless1"); 240 | 241 | string uselessFile2 = assetBinDataPath + "to_be_removed2.txt"; 242 | File.WriteAllText(uselessFile2, "useless2"); 243 | 244 | return true; 245 | } 246 | 247 | 248 | [MenuItem("AndroidBuilder/Step 4: Generate Bin Patches", false, 103)] 249 | public static bool GenerateBinPatches() 250 | { 251 | string assetBinDataPath = EXPORTED_ASSETS_PATH + "/bin/Data/"; 252 | string patchTopPath = PROJECT_DIR + "/AllAndroidPatchFiles/"; 253 | string assertBinDataPatchPath = patchTopPath + "/assets_bin_Data/"; 254 | 255 | if (Directory.Exists(patchTopPath)) { FileUtil.DeleteFileOrDirectory(patchTopPath); } 256 | Directory.CreateDirectory(assertBinDataPatchPath); 257 | 258 | string[][] soPatchFile = 259 | { 260 | // path_in_android_project, filename inside zip, zip file anme 261 | new string[3]{ "/"+ SO_DIR_NAME + "/armeabi-v7a/libil2cpp.so", "libil2cpp.so.new", "lib_armeabi-v7a_libil2cpp.so.zip" }, 262 | new string[3]{ "/"+ SO_DIR_NAME + "/arm64-v8a/libil2cpp.so", "libil2cpp.so.new", "lib_arm64-v8a_libil2cpp.so.zip" }, 263 | }; 264 | 265 | for (int i = 0; i < soPatchFile.Length; i++) 266 | { 267 | string[] specialPaths = soPatchFile[i]; 268 | string projectRelativePath = specialPaths[0]; 269 | string pathInZipFile = specialPaths[1]; 270 | string zipFileName = specialPaths[2]; 271 | 272 | string projectFullPath = BUILD_SCRIPTS_PATH + projectRelativePath; 273 | ZipHelper.ZipFile(projectFullPath, pathInZipFile, patchTopPath + zipFileName, 9); 274 | } 275 | 276 | string[] allAssetsBinDataFiles = Directory.GetFiles(assetBinDataPath, "*", SearchOption.AllDirectories); 277 | StringBuilder allZipCmds = new StringBuilder(); 278 | allZipCmds.AppendFormat("if not exist \"{0}\" (MD \"{0}\") \n", PROJECT_DIR + "/AllAndroidPatchFiles/"); 279 | allZipCmds.AppendFormat("if not exist \"{0}\" (MD \"{0}\") \n", PROJECT_DIR + "/AllAndroidPatchFiles/assets_bin_Data/"); 280 | foreach (string apk_file in allAssetsBinDataFiles) 281 | { 282 | string relativePathHeader = "assets/bin/Data/"; 283 | int relativePathStart = apk_file.IndexOf(relativePathHeader); 284 | string filenameInZip = apk_file.Substring(relativePathStart); //file: assets/bin/Data/xxx/xxx 285 | string relativePath = apk_file.Substring(relativePathStart + relativePathHeader.Length).Replace('\\', '/'); //file: xxx/xxx 286 | string zipFileName = relativePath.Replace("/", "__").Replace("\\", "__") + ".bin"; //file: xxx__xxx.bin 287 | 288 | allZipCmds.AppendFormat("cd {0} && {1} -8 \"{2}\" \"{3}\"\n", BUILD_SCRIPTS_PATH, ZIP_PATH, PROJECT_DIR + "/AllAndroidPatchFiles/assets_bin_Data/" + zipFileName, filenameInZip); 289 | } 290 | allZipCmds.Append("ping 127.0.0.1 -n 1 > nul\n"); 291 | allZipCmds.AppendFormat("cd {0} && {1} -9 -r \"{2}\" \"{3}\"\n", patchTopPath, ZIP_PATH, PROJECT_DIR + "/AllAndroidPatchFiles_Versionx.zip", "*"); 292 | 293 | if (allZipCmds.Length > 0) 294 | { 295 | string zipPatchesFile = ANDROID_EXPORT_PATH + "/" + "zip_patches.bat"; 296 | File.WriteAllText(zipPatchesFile, allZipCmds.ToString()); 297 | File.WriteAllText(zipPatchesFile, allZipCmds.ToString()); 298 | if (!Exec(zipPatchesFile, zipPatchesFile)) 299 | { 300 | Debug.LogError("exec failed:" + zipPatchesFile); 301 | return false; 302 | } 303 | } 304 | return true; 305 | } 306 | 307 | [MenuItem("AndroidBuilder/Step 5: Generate Build Scripts", false, 104)] 308 | public static bool GenerateBuildScripts() 309 | { 310 | string jdkPath = EditorPrefs.GetString("JdkPath", ""); 311 | if (string.IsNullOrEmpty(jdkPath) || !Directory.Exists(jdkPath)) { jdkPath = DEFAULT_JDK_PATH; } 312 | if (string.IsNullOrEmpty(jdkPath) || !Directory.Exists(jdkPath)) 313 | { 314 | Debug.LogError("jdk path is empty! please config via menu path:Edit/Preference->External tools."); 315 | return false; 316 | } 317 | 318 | //must use the jdk in Unity 319 | string gradlePath = jdkPath + "/../Tools/Gradle"; 320 | string[] gradleMainJarFiles = Directory.GetFiles(gradlePath + "/lib", "gradle-launcher*.jar", SearchOption.TopDirectoryOnly); 321 | if (gradleMainJarFiles.Length == 0) 322 | { 323 | Debug.LogError("gradle-launcher jar file not found in " + gradlePath + "/lib"); 324 | return false; 325 | } 326 | string gradleMainJarFile = gradleMainJarFiles[0]; 327 | 328 | //sign 329 | string keystoreDir = PROJECT_DIR + "/AndroidKeystore"; 330 | if (!Directory.Exists(keystoreDir)) { Directory.CreateDirectory(keystoreDir); } 331 | string keystoreFile = keystoreDir + "/test.keystore"; 332 | StringBuilder genKeyCmd = new StringBuilder(); 333 | string keytoolPath = jdkPath + "/bin/keytool.exe"; 334 | string genKeyParam = "-genkey -alias test -validity 1000 -keyalg RSA -keystore " + keystoreFile + " -dname \"CN = Test, OU = Test, O = Test, L = Test, S = Test, C = Test\" -keysize 4096 -storepass testtest -keypass testtest"; 335 | genKeyCmd.AppendFormat("\"{0}\" {1}\n", keytoolPath, genKeyParam); 336 | File.WriteAllText(ANDROID_EXPORT_PATH + "/gen_key.bat", genKeyCmd.ToString()); 337 | if (!File.Exists(keystoreFile)) 338 | { 339 | if (!Exec(keytoolPath, genKeyParam)) 340 | { 341 | Debug.LogError("exec failed:" + keytoolPath + " " + genKeyParam); 342 | return false; 343 | } 344 | } 345 | 346 | StringBuilder allCmd = new StringBuilder(); 347 | allCmd.AppendFormat("cd \"{0}\"\n\n", ANDROID_EXPORT_PATH); 348 | allCmd.AppendFormat("call \"{0}\" " 349 | + " -classpath \"{1}\" org.gradle.launcher.GradleMain \"-Dorg.gradle.jvmargs=-Xmx4096m\" \"assembleRelease\"" 350 | + GRADLE_PROXY_STRING 351 | + " -Pandroid.injected.signing.store.file=\"{2}\"" 352 | + " -Pandroid.injected.signing.store.password=testtest " 353 | + " -Pandroid.injected.signing.key.alias=test " 354 | + " -Pandroid.injected.signing.key.password=testtest" 355 | + " \n\n", 356 | jdkPath + "/bin/java.exe", 357 | gradleMainJarFile, 358 | keystoreFile); 359 | 360 | allCmd.AppendFormat("copy /Y \"{0}\\launcher\\build\\outputs\\apk\\release\\launcher-release.apk\" \"{0}\\{1}.apk\" \n\n", 361 | ANDROID_EXPORT_PATH.Replace("//", "/").Replace("/", "\\"), 362 | Application.identifier); 363 | 364 | allCmd.AppendFormat("explorer.exe {0} \n\n", ANDROID_EXPORT_PATH.Replace("//", "/").Replace("/", "\\")); 365 | allCmd.AppendFormat("@echo on\n\n"); //explorer as the last line wont return success, so... 366 | File.WriteAllText(ANDROID_EXPORT_PATH + "/build_apk.bat", allCmd.ToString()); 367 | File.WriteAllText(ANDROID_EXPORT_PATH + "/build_aab.bat", allCmd.ToString() 368 | .Replace("assembleRelease", "bundleRelease") 369 | .Replace(".apk", ".aab") 370 | .Replace("apk", "bundle")); 371 | 372 | return true; 373 | } 374 | 375 | 376 | [MenuItem("AndroidBuilder/Step 6: Build Apk File", false, 105)] 377 | public static bool BuildApk() 378 | { 379 | string buildApkPath = ANDROID_EXPORT_PATH + "/build_apk.bat"; 380 | string alignedApkName = Application.identifier + ".apk"; 381 | string alignedApkPath = ANDROID_EXPORT_PATH + "/" + alignedApkName; 382 | 383 | if (!Exec(buildApkPath, "")) 384 | { 385 | Debug.LogError("exec failed:" + buildApkPath); 386 | return false; 387 | } 388 | 389 | if (!File.Exists(alignedApkPath)) 390 | { 391 | Debug.LogError("apk not found:" + alignedApkPath + ", exec failed:" + buildApkPath); 392 | return false; 393 | } 394 | return true; 395 | } 396 | 397 | [MenuItem("AndroidBuilder/Run Step 1-6", false, 1)] 398 | public static void BuildAll() 399 | { 400 | if (!ExportGradleProject()) 401 | { 402 | Debug.LogError("failed to ExportGradleProject"); 403 | return; 404 | } 405 | 406 | if (!BuildIl2cppSoLib()) 407 | { 408 | Debug.LogError("failed to BuildIl2cppSoLig"); 409 | return; 410 | } 411 | 412 | if (!PatchAndroidProject()) 413 | { 414 | Debug.LogError("failed to PatchAndroidProject"); 415 | return; 416 | } 417 | 418 | if (!GenerateBinPatches()) 419 | { 420 | Debug.LogError("failed to GenerateBinPatches"); 421 | return; 422 | } 423 | 424 | if (!GenerateBuildScripts()) 425 | { 426 | Debug.LogError("failed to GenerateBuildScripts"); 427 | return; 428 | } 429 | 430 | if (!BuildApk()) 431 | { 432 | Debug.LogError("failed to BuildApk"); 433 | return; 434 | } 435 | Debug.Log("Done!"); 436 | } 437 | 438 | [MenuItem("AndroidBuilder/Run Step 1, 2, 3, 5, 6 for base version", false, 2)] 439 | public static void BuildWithoutPatch() 440 | { 441 | if (!ExportGradleProject()) 442 | { 443 | Debug.LogError("failed to ExportGradleProject"); 444 | return; 445 | } 446 | 447 | if (!BuildIl2cppSoLib()) 448 | { 449 | Debug.LogError("failed to BuildIl2cppSoLig"); 450 | return; 451 | } 452 | 453 | 454 | if (!PatchAndroidProject()) 455 | { 456 | Debug.LogError("failed to PatchAndroidProject"); 457 | return; 458 | } 459 | 460 | if (!PatchAndroidProject()) 461 | { 462 | Debug.LogError("failed to PatchAndroidProject"); 463 | return; 464 | } 465 | 466 | if (!GenerateBuildScripts()) 467 | { 468 | Debug.LogError("failed to GenerateBuildScripts"); 469 | return; 470 | } 471 | 472 | if (!BuildApk()) 473 | { 474 | Debug.LogError("failed to BuildApk"); 475 | return; 476 | } 477 | Debug.Log("Done!"); 478 | } 479 | 480 | [MenuItem("AndroidBuilder/Run Step 1-5 for Patch Version", false, 3)] 481 | public static void BuildPatch() 482 | { 483 | if (!ExportGradleProject()) 484 | { 485 | Debug.LogError("failed to ExportGradleProject"); 486 | return; 487 | } 488 | 489 | if (!BuildIl2cppSoLib()) 490 | { 491 | Debug.LogError("failed to BuildIl2cppSoLig"); 492 | return; 493 | } 494 | 495 | 496 | if (!PatchAndroidProject()) 497 | { 498 | Debug.LogError("failed to PatchAndroidProject"); 499 | return; 500 | } 501 | 502 | if (!GenerateBinPatches()) 503 | { 504 | Debug.LogError("failed to GenerateBinPatches"); 505 | return; 506 | } 507 | 508 | if (!GenerateBuildScripts()) 509 | { 510 | Debug.LogError("failed to GenerateBuildScripts"); 511 | return; 512 | } 513 | 514 | Debug.Log("Done!"); 515 | } 516 | } 517 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Editor/AndroidBuilder.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: b27e02dff7ef5764ca9a862e95895896 3 | timeCreated: 1539310364 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Editor/Exe.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 74351551524e0994b966f568e0d41e56 3 | folderAsset: yes 4 | timeCreated: 1540969192 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Editor/Exe/unzip.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noodle1983/UnityAndroidIl2cppPatchDemo/10a4c303c31c74fa1be8e8305b266f013dd1b5db/Assets/AndroidIl2cppPatchDemo/Editor/Exe/unzip.exe -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Editor/Exe/unzip.exe.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5eabbb30894953f498ea96b52c6faf95 3 | timeCreated: 1543478900 4 | licenseType: Pro 5 | DefaultImporter: 6 | externalObjects: {} 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Editor/Exe/zip.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noodle1983/UnityAndroidIl2cppPatchDemo/10a4c303c31c74fa1be8e8305b266f013dd1b5db/Assets/AndroidIl2cppPatchDemo/Editor/Exe/zip.exe -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Editor/Exe/zip.exe.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e383c7ca3dd72a447930e31384570633 3 | timeCreated: 1539331554 4 | licenseType: Pro 5 | DefaultImporter: 6 | externalObjects: {} 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Plugins.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 88fb74b6d78a6df41a2f595e9a520c41 3 | folderAsset: yes 4 | timeCreated: 1539836049 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Plugins/Android.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 09681d20b6f8882478d0dde6d61b9dbf 3 | folderAsset: yes 4 | timeCreated: 1539836049 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Plugins/Android/java.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 41117f2fbd408cc41b864fda4cc185dc 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Plugins/Android/java/io.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 807569341e2fe6a41be99c66bbda5266 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Plugins/Android/java/io/github.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8310a0adf15aed845bb41275dd3d9185 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Plugins/Android/java/io/github/noodle1983.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 1bfc4194612251f4bb33b5ef46c53053 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Plugins/Android/java/io/github/noodle1983/Boostrap.java: -------------------------------------------------------------------------------- 1 | package io.github.noodle1983; 2 | 3 | public class Boostrap 4 | { 5 | public static native void init(String filePath); 6 | 7 | public static void InitNativeLibBeforeUnityPlay(String filePath) 8 | { 9 | System.loadLibrary("main"); 10 | System.loadLibrary("unity"); 11 | System.loadLibrary("bootstrap"); 12 | init(filePath); 13 | } 14 | } -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Plugins/Android/java/io/github/noodle1983/Boostrap.java.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a888f2dbeaf68884bb1eed6237220e01 3 | PluginImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | iconMap: {} 7 | executionOrder: {} 8 | defineConstraints: [] 9 | isPreloaded: 0 10 | isOverridable: 0 11 | isExplicitlyReferenced: 0 12 | validateReferences: 1 13 | platformData: 14 | - first: 15 | Android: Android 16 | second: 17 | enabled: 1 18 | settings: {} 19 | - first: 20 | Any: 21 | second: 22 | enabled: 0 23 | settings: {} 24 | - first: 25 | Editor: Editor 26 | second: 27 | enabled: 0 28 | settings: 29 | DefaultValueInitialized: true 30 | userData: 31 | assetBundleName: 32 | assetBundleVariant: 33 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Plugins/Android/libs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a2cf3f72aabc27c4894969ca82a85d2c 3 | folderAsset: yes 4 | timeCreated: 1539836049 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Plugins/Android/libs/arm64-v8a.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a9d7ff223900efd4d85573f0a5a45f62 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Plugins/Android/libs/arm64-v8a/libbootstrap.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noodle1983/UnityAndroidIl2cppPatchDemo/10a4c303c31c74fa1be8e8305b266f013dd1b5db/Assets/AndroidIl2cppPatchDemo/Plugins/Android/libs/arm64-v8a/libbootstrap.so -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Plugins/Android/libs/arm64-v8a/libbootstrap.so.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 51d8e4c07a2b44d459c26f182a498944 3 | PluginImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | iconMap: {} 7 | executionOrder: {} 8 | isPreloaded: 0 9 | isOverridable: 0 10 | platformData: 11 | - first: 12 | '': Any 13 | second: 14 | enabled: 0 15 | settings: 16 | Exclude Android: 0 17 | Exclude Editor: 1 18 | Exclude Linux: 1 19 | Exclude Linux64: 1 20 | Exclude LinuxUniversal: 1 21 | Exclude OSXUniversal: 1 22 | Exclude Win: 1 23 | Exclude Win64: 1 24 | - first: 25 | Android: Android 26 | second: 27 | enabled: 1 28 | settings: 29 | CPU: ARM64 30 | - first: 31 | Any: 32 | second: 33 | enabled: 0 34 | settings: {} 35 | - first: 36 | Editor: Editor 37 | second: 38 | enabled: 0 39 | settings: 40 | CPU: AnyCPU 41 | DefaultValueInitialized: true 42 | OS: AnyOS 43 | - first: 44 | Facebook: Win 45 | second: 46 | enabled: 0 47 | settings: 48 | CPU: AnyCPU 49 | - first: 50 | Facebook: Win64 51 | second: 52 | enabled: 0 53 | settings: 54 | CPU: AnyCPU 55 | - first: 56 | Standalone: Linux 57 | second: 58 | enabled: 0 59 | settings: 60 | CPU: x86 61 | - first: 62 | Standalone: Linux64 63 | second: 64 | enabled: 0 65 | settings: 66 | CPU: x86_64 67 | - first: 68 | Standalone: LinuxUniversal 69 | second: 70 | enabled: 0 71 | settings: 72 | CPU: None 73 | - first: 74 | Standalone: OSXUniversal 75 | second: 76 | enabled: 0 77 | settings: 78 | CPU: AnyCPU 79 | - first: 80 | Standalone: Win 81 | second: 82 | enabled: 0 83 | settings: 84 | CPU: AnyCPU 85 | - first: 86 | Standalone: Win64 87 | second: 88 | enabled: 0 89 | settings: 90 | CPU: AnyCPU 91 | userData: 92 | assetBundleName: 93 | assetBundleVariant: 94 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Plugins/Android/libs/armeabi-v7a.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c0f9e21bfc7da8249ac505b4a2672bbf 3 | folderAsset: yes 4 | timeCreated: 1539836049 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Plugins/Android/libs/armeabi-v7a/libbootstrap.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noodle1983/UnityAndroidIl2cppPatchDemo/10a4c303c31c74fa1be8e8305b266f013dd1b5db/Assets/AndroidIl2cppPatchDemo/Plugins/Android/libs/armeabi-v7a/libbootstrap.so -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Plugins/Android/libs/armeabi-v7a/libbootstrap.so.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 22ac312a7b1136e4a9ff6b81ba8bd647 3 | timeCreated: 1539836049 4 | licenseType: Pro 5 | PluginImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | iconMap: {} 9 | executionOrder: {} 10 | isPreloaded: 0 11 | isOverridable: 0 12 | platformData: 13 | - first: 14 | '': Any 15 | second: 16 | enabled: 0 17 | settings: 18 | Exclude Android: 0 19 | Exclude Editor: 1 20 | Exclude Linux: 1 21 | Exclude Linux64: 1 22 | Exclude LinuxUniversal: 1 23 | Exclude OSXIntel: 1 24 | Exclude OSXIntel64: 1 25 | Exclude OSXUniversal: 1 26 | Exclude Win: 1 27 | Exclude Win64: 1 28 | - first: 29 | Android: Android 30 | second: 31 | enabled: 1 32 | settings: 33 | CPU: ARMv7 34 | - first: 35 | Any: 36 | second: 37 | enabled: 0 38 | settings: {} 39 | - first: 40 | Editor: Editor 41 | second: 42 | enabled: 0 43 | settings: 44 | CPU: AnyCPU 45 | DefaultValueInitialized: true 46 | OS: AnyOS 47 | - first: 48 | Facebook: Win 49 | second: 50 | enabled: 0 51 | settings: 52 | CPU: AnyCPU 53 | - first: 54 | Facebook: Win64 55 | second: 56 | enabled: 0 57 | settings: 58 | CPU: AnyCPU 59 | - first: 60 | Standalone: Linux 61 | second: 62 | enabled: 0 63 | settings: 64 | CPU: x86 65 | - first: 66 | Standalone: Linux64 67 | second: 68 | enabled: 0 69 | settings: 70 | CPU: x86_64 71 | - first: 72 | Standalone: LinuxUniversal 73 | second: 74 | enabled: 0 75 | settings: 76 | CPU: None 77 | - first: 78 | Standalone: OSXIntel 79 | second: 80 | enabled: 0 81 | settings: 82 | CPU: AnyCPU 83 | - first: 84 | Standalone: OSXIntel64 85 | second: 86 | enabled: 0 87 | settings: 88 | CPU: AnyCPU 89 | - first: 90 | Standalone: OSXUniversal 91 | second: 92 | enabled: 0 93 | settings: 94 | CPU: None 95 | - first: 96 | Standalone: Win 97 | second: 98 | enabled: 0 99 | settings: 100 | CPU: AnyCPU 101 | - first: 102 | Standalone: Win64 103 | second: 104 | enabled: 0 105 | settings: 106 | CPU: AnyCPU 107 | userData: 108 | assetBundleName: 109 | assetBundleVariant: 110 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Plugins/Android/libs/x86.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ba7c79fb12e885547aa6b3236c75ff0e 3 | folderAsset: yes 4 | timeCreated: 1539836049 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Plugins/Android/libs/x86/libbootstrap.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noodle1983/UnityAndroidIl2cppPatchDemo/10a4c303c31c74fa1be8e8305b266f013dd1b5db/Assets/AndroidIl2cppPatchDemo/Plugins/Android/libs/x86/libbootstrap.so -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Plugins/Android/libs/x86/libbootstrap.so.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 485641bdd68709b4da96697c3703b737 3 | timeCreated: 1539836049 4 | licenseType: Pro 5 | PluginImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | iconMap: {} 9 | executionOrder: {} 10 | isPreloaded: 0 11 | isOverridable: 0 12 | platformData: 13 | - first: 14 | '': Any 15 | second: 16 | enabled: 0 17 | settings: 18 | Exclude Android: 0 19 | Exclude Editor: 1 20 | Exclude Linux: 1 21 | Exclude Linux64: 1 22 | Exclude LinuxUniversal: 1 23 | Exclude OSXIntel: 1 24 | Exclude OSXIntel64: 1 25 | Exclude OSXUniversal: 1 26 | Exclude Win: 1 27 | Exclude Win64: 1 28 | - first: 29 | Android: Android 30 | second: 31 | enabled: 1 32 | settings: 33 | CPU: x86 34 | - first: 35 | Any: 36 | second: 37 | enabled: 0 38 | settings: {} 39 | - first: 40 | Editor: Editor 41 | second: 42 | enabled: 0 43 | settings: 44 | CPU: AnyCPU 45 | DefaultValueInitialized: true 46 | OS: AnyOS 47 | - first: 48 | Facebook: Win 49 | second: 50 | enabled: 0 51 | settings: 52 | CPU: AnyCPU 53 | - first: 54 | Facebook: Win64 55 | second: 56 | enabled: 0 57 | settings: 58 | CPU: AnyCPU 59 | - first: 60 | Standalone: Linux 61 | second: 62 | enabled: 0 63 | settings: 64 | CPU: x86 65 | - first: 66 | Standalone: Linux64 67 | second: 68 | enabled: 0 69 | settings: 70 | CPU: x86_64 71 | - first: 72 | Standalone: LinuxUniversal 73 | second: 74 | enabled: 0 75 | settings: 76 | CPU: None 77 | - first: 78 | Standalone: OSXIntel 79 | second: 80 | enabled: 0 81 | settings: 82 | CPU: AnyCPU 83 | - first: 84 | Standalone: OSXIntel64 85 | second: 86 | enabled: 0 87 | settings: 88 | CPU: AnyCPU 89 | - first: 90 | Standalone: OSXUniversal 91 | second: 92 | enabled: 0 93 | settings: 94 | CPU: None 95 | - first: 96 | Standalone: Win 97 | second: 98 | enabled: 0 99 | settings: 100 | CPU: AnyCPU 101 | - first: 102 | Standalone: Win64 103 | second: 104 | enabled: 0 105 | settings: 106 | CPU: AnyCPU 107 | userData: 108 | assetBundleName: 109 | assetBundleVariant: 110 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/PrebuiltPatches.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: bfef756cb24816d4e9eac910c2413a90 3 | folderAsset: yes 4 | timeCreated: 1540975179 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/PrebuiltPatches/null: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noodle1983/UnityAndroidIl2cppPatchDemo/10a4c303c31c74fa1be8e8305b266f013dd1b5db/Assets/AndroidIl2cppPatchDemo/PrebuiltPatches/null -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/PrebuiltPatches/null.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: e608a9163c0421c47961842ed81424b3 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Scene.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: f16d0477cfe51c34f9c95c836ea68c36 3 | folderAsset: yes 4 | DefaultImporter: 5 | userData: 6 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Scene/0.unity: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!29 &1 4 | OcclusionCullingSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_OcclusionBakeSettings: 8 | smallestOccluder: 5 9 | smallestHole: 0.25 10 | backfaceThreshold: 100 11 | m_SceneGUID: 00000000000000000000000000000000 12 | m_OcclusionCullingData: {fileID: 0} 13 | --- !u!104 &2 14 | RenderSettings: 15 | m_ObjectHideFlags: 0 16 | serializedVersion: 9 17 | m_Fog: 0 18 | m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} 19 | m_FogMode: 3 20 | m_FogDensity: 0.01 21 | m_LinearFogStart: 0 22 | m_LinearFogEnd: 300 23 | m_AmbientSkyColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} 24 | m_AmbientEquatorColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} 25 | m_AmbientGroundColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} 26 | m_AmbientIntensity: 1 27 | m_AmbientMode: 3 28 | m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} 29 | m_SkyboxMaterial: {fileID: 0} 30 | m_HaloStrength: 0.5 31 | m_FlareStrength: 1 32 | m_FlareFadeSpeed: 3 33 | m_HaloTexture: {fileID: 0} 34 | m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} 35 | m_DefaultReflectionMode: 0 36 | m_DefaultReflectionResolution: 128 37 | m_ReflectionBounces: 1 38 | m_ReflectionIntensity: 1 39 | m_CustomReflection: {fileID: 0} 40 | m_Sun: {fileID: 0} 41 | m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} 42 | m_UseRadianceAmbientProbe: 0 43 | --- !u!157 &4 44 | LightmapSettings: 45 | m_ObjectHideFlags: 0 46 | serializedVersion: 12 47 | m_GIWorkflowMode: 1 48 | m_GISettings: 49 | serializedVersion: 2 50 | m_BounceScale: 1 51 | m_IndirectOutputScale: 1 52 | m_AlbedoBoost: 1 53 | m_EnvironmentLightingMode: 0 54 | m_EnableBakedLightmaps: 1 55 | m_EnableRealtimeLightmaps: 0 56 | m_LightmapEditorSettings: 57 | serializedVersion: 12 58 | m_Resolution: 1 59 | m_BakeResolution: 50 60 | m_AtlasSize: 1024 61 | m_AO: 1 62 | m_AOMaxDistance: 1 63 | m_CompAOExponent: 1 64 | m_CompAOExponentDirect: 0 65 | m_ExtractAmbientOcclusion: 0 66 | m_Padding: 2 67 | m_LightmapParameters: {fileID: 0} 68 | m_LightmapsBakeMode: 1 69 | m_TextureCompression: 0 70 | m_FinalGather: 0 71 | m_FinalGatherFiltering: 1 72 | m_FinalGatherRayCount: 256 73 | m_ReflectionCompression: 2 74 | m_MixedBakeMode: 1 75 | m_BakeBackend: 0 76 | m_PVRSampling: 1 77 | m_PVRDirectSampleCount: 32 78 | m_PVRSampleCount: 500 79 | m_PVRBounces: 2 80 | m_PVREnvironmentSampleCount: 500 81 | m_PVREnvironmentReferencePointCount: 2048 82 | m_PVRFilteringMode: 0 83 | m_PVRDenoiserTypeDirect: 0 84 | m_PVRDenoiserTypeIndirect: 0 85 | m_PVRDenoiserTypeAO: 0 86 | m_PVRFilterTypeDirect: 0 87 | m_PVRFilterTypeIndirect: 0 88 | m_PVRFilterTypeAO: 0 89 | m_PVREnvironmentMIS: 0 90 | m_PVRCulling: 1 91 | m_PVRFilteringGaussRadiusDirect: 1 92 | m_PVRFilteringGaussRadiusIndirect: 5 93 | m_PVRFilteringGaussRadiusAO: 2 94 | m_PVRFilteringAtrousPositionSigmaDirect: 0.5 95 | m_PVRFilteringAtrousPositionSigmaIndirect: 2 96 | m_PVRFilteringAtrousPositionSigmaAO: 1 97 | m_ExportTrainingData: 0 98 | m_TrainingDataDestination: TrainingData 99 | m_LightProbeSampleCountMultiplier: 4 100 | m_LightingDataAsset: {fileID: 0} 101 | m_LightingSettings: {fileID: 4890085278179872738, guid: 636aa02c4359f734283dc82214eb8442, 102 | type: 2} 103 | --- !u!196 &5 104 | NavMeshSettings: 105 | serializedVersion: 2 106 | m_ObjectHideFlags: 0 107 | m_BuildSettings: 108 | serializedVersion: 3 109 | agentTypeID: 0 110 | agentRadius: 0.5 111 | agentHeight: 2 112 | agentSlope: 45 113 | agentClimb: 0.4 114 | ledgeDropHeight: 0 115 | maxJumpAcrossDistance: 0 116 | minRegionArea: 2 117 | manualCellSize: 0 118 | cellSize: 0.16666666 119 | manualTileSize: 0 120 | tileSize: 256 121 | buildHeightMesh: 0 122 | maxJobWorkers: 0 123 | preserveTilesOutsideBounds: 0 124 | debug: 125 | m_Flags: 0 126 | m_NavMeshData: {fileID: 0} 127 | --- !u!1 &144275567 128 | GameObject: 129 | m_ObjectHideFlags: 0 130 | m_CorrespondingSourceObject: {fileID: 0} 131 | m_PrefabInstance: {fileID: 0} 132 | m_PrefabAsset: {fileID: 0} 133 | serializedVersion: 6 134 | m_Component: 135 | - component: {fileID: 144275570} 136 | - component: {fileID: 144275569} 137 | - component: {fileID: 144275568} 138 | m_Layer: 5 139 | m_Name: Message 140 | m_TagString: Untagged 141 | m_Icon: {fileID: 0} 142 | m_NavMeshLayer: 0 143 | m_StaticEditorFlags: 0 144 | m_IsActive: 1 145 | --- !u!114 &144275568 146 | MonoBehaviour: 147 | m_ObjectHideFlags: 0 148 | m_CorrespondingSourceObject: {fileID: 0} 149 | m_PrefabInstance: {fileID: 0} 150 | m_PrefabAsset: {fileID: 0} 151 | m_GameObject: {fileID: 144275567} 152 | m_Enabled: 1 153 | m_EditorHideFlags: 0 154 | m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} 155 | m_Name: 156 | m_EditorClassIdentifier: 157 | m_Material: {fileID: 0} 158 | m_Color: {r: 1, g: 1, b: 1, a: 1} 159 | m_RaycastTarget: 1 160 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 161 | m_Maskable: 1 162 | m_OnCullStateChanged: 163 | m_PersistentCalls: 164 | m_Calls: [] 165 | m_FontData: 166 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 167 | m_FontSize: 25 168 | m_FontStyle: 0 169 | m_BestFit: 0 170 | m_MinSize: 2 171 | m_MaxSize: 40 172 | m_Alignment: 4 173 | m_AlignByGeometry: 0 174 | m_RichText: 1 175 | m_HorizontalOverflow: 0 176 | m_VerticalOverflow: 0 177 | m_LineSpacing: 1 178 | m_Text: Tips 179 | --- !u!222 &144275569 180 | CanvasRenderer: 181 | m_ObjectHideFlags: 0 182 | m_CorrespondingSourceObject: {fileID: 0} 183 | m_PrefabInstance: {fileID: 0} 184 | m_PrefabAsset: {fileID: 0} 185 | m_GameObject: {fileID: 144275567} 186 | m_CullTransparentMesh: 0 187 | --- !u!224 &144275570 188 | RectTransform: 189 | m_ObjectHideFlags: 0 190 | m_CorrespondingSourceObject: {fileID: 0} 191 | m_PrefabInstance: {fileID: 0} 192 | m_PrefabAsset: {fileID: 0} 193 | m_GameObject: {fileID: 144275567} 194 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 195 | m_LocalPosition: {x: 0, y: 0, z: 0} 196 | m_LocalScale: {x: 1, y: 1, z: 1} 197 | m_ConstrainProportionsScale: 0 198 | m_Children: [] 199 | m_Father: {fileID: 897323543} 200 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 201 | m_AnchorMin: {x: 0.5, y: 0.5} 202 | m_AnchorMax: {x: 0.5, y: 0.5} 203 | m_AnchoredPosition: {x: 0, y: 60.9} 204 | m_SizeDelta: {x: 192.9, y: 151.4} 205 | m_Pivot: {x: 0.5, y: 0.5} 206 | --- !u!1 &150934078 207 | GameObject: 208 | m_ObjectHideFlags: 0 209 | m_CorrespondingSourceObject: {fileID: 0} 210 | m_PrefabInstance: {fileID: 0} 211 | m_PrefabAsset: {fileID: 0} 212 | serializedVersion: 6 213 | m_Component: 214 | - component: {fileID: 150934082} 215 | - component: {fileID: 150934081} 216 | - component: {fileID: 150934080} 217 | - component: {fileID: 150934079} 218 | m_Layer: 5 219 | m_Name: Canvas 220 | m_TagString: Untagged 221 | m_Icon: {fileID: 0} 222 | m_NavMeshLayer: 0 223 | m_StaticEditorFlags: 0 224 | m_IsActive: 1 225 | --- !u!114 &150934079 226 | MonoBehaviour: 227 | m_ObjectHideFlags: 0 228 | m_CorrespondingSourceObject: {fileID: 0} 229 | m_PrefabInstance: {fileID: 0} 230 | m_PrefabAsset: {fileID: 0} 231 | m_GameObject: {fileID: 150934078} 232 | m_Enabled: 1 233 | m_EditorHideFlags: 0 234 | m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} 235 | m_Name: 236 | m_EditorClassIdentifier: 237 | m_IgnoreReversedGraphics: 1 238 | m_BlockingObjects: 0 239 | m_BlockingMask: 240 | serializedVersion: 2 241 | m_Bits: 4294967295 242 | --- !u!114 &150934080 243 | MonoBehaviour: 244 | m_ObjectHideFlags: 0 245 | m_CorrespondingSourceObject: {fileID: 0} 246 | m_PrefabInstance: {fileID: 0} 247 | m_PrefabAsset: {fileID: 0} 248 | m_GameObject: {fileID: 150934078} 249 | m_Enabled: 1 250 | m_EditorHideFlags: 0 251 | m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} 252 | m_Name: 253 | m_EditorClassIdentifier: 254 | m_UiScaleMode: 1 255 | m_ReferencePixelsPerUnit: 100 256 | m_ScaleFactor: 1 257 | m_ReferenceResolution: {x: 600, y: 600} 258 | m_ScreenMatchMode: 0 259 | m_MatchWidthOrHeight: 1 260 | m_PhysicalUnit: 3 261 | m_FallbackScreenDPI: 96 262 | m_DefaultSpriteDPI: 96 263 | m_DynamicPixelsPerUnit: 1 264 | m_PresetInfoIsWorld: 0 265 | --- !u!223 &150934081 266 | Canvas: 267 | m_ObjectHideFlags: 0 268 | m_CorrespondingSourceObject: {fileID: 0} 269 | m_PrefabInstance: {fileID: 0} 270 | m_PrefabAsset: {fileID: 0} 271 | m_GameObject: {fileID: 150934078} 272 | m_Enabled: 1 273 | serializedVersion: 3 274 | m_RenderMode: 1 275 | m_Camera: {fileID: 821767653} 276 | m_PlaneDistance: 100 277 | m_PixelPerfect: 0 278 | m_ReceivesEvents: 1 279 | m_OverrideSorting: 0 280 | m_OverridePixelPerfect: 0 281 | m_SortingBucketNormalizedSize: 0 282 | m_VertexColorAlwaysGammaSpace: 0 283 | m_AdditionalShaderChannelsFlag: 0 284 | m_UpdateRectTransformForStandalone: 0 285 | m_SortingLayerID: 0 286 | m_SortingOrder: 0 287 | m_TargetDisplay: 0 288 | --- !u!224 &150934082 289 | RectTransform: 290 | m_ObjectHideFlags: 0 291 | m_CorrespondingSourceObject: {fileID: 0} 292 | m_PrefabInstance: {fileID: 0} 293 | m_PrefabAsset: {fileID: 0} 294 | m_GameObject: {fileID: 150934078} 295 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 296 | m_LocalPosition: {x: 0, y: 0, z: 0} 297 | m_LocalScale: {x: 0, y: 0, z: 0} 298 | m_ConstrainProportionsScale: 0 299 | m_Children: 300 | - {fileID: 1796625708} 301 | - {fileID: 1764894409} 302 | m_Father: {fileID: 0} 303 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 304 | m_AnchorMin: {x: 0, y: 0} 305 | m_AnchorMax: {x: 0, y: 0} 306 | m_AnchoredPosition: {x: 0, y: 0} 307 | m_SizeDelta: {x: 0, y: 0} 308 | m_Pivot: {x: 0, y: 0} 309 | --- !u!1 &182701252 310 | GameObject: 311 | m_ObjectHideFlags: 0 312 | m_CorrespondingSourceObject: {fileID: 0} 313 | m_PrefabInstance: {fileID: 0} 314 | m_PrefabAsset: {fileID: 0} 315 | serializedVersion: 6 316 | m_Component: 317 | - component: {fileID: 182701253} 318 | - component: {fileID: 182701257} 319 | - component: {fileID: 182701256} 320 | - component: {fileID: 182701255} 321 | - component: {fileID: 182701254} 322 | m_Layer: 5 323 | m_Name: UpdateButton2 324 | m_TagString: Untagged 325 | m_Icon: {fileID: 0} 326 | m_NavMeshLayer: 0 327 | m_StaticEditorFlags: 0 328 | m_IsActive: 1 329 | --- !u!224 &182701253 330 | RectTransform: 331 | m_ObjectHideFlags: 0 332 | m_CorrespondingSourceObject: {fileID: 0} 333 | m_PrefabInstance: {fileID: 0} 334 | m_PrefabAsset: {fileID: 0} 335 | m_GameObject: {fileID: 182701252} 336 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 337 | m_LocalPosition: {x: 0, y: 0, z: 0} 338 | m_LocalScale: {x: 1.0000113, y: 1.0000113, z: 1.0000113} 339 | m_ConstrainProportionsScale: 0 340 | m_Children: 341 | - {fileID: 818177442} 342 | m_Father: {fileID: 1796625708} 343 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 344 | m_AnchorMin: {x: 0.5, y: 0.5} 345 | m_AnchorMax: {x: 0.5, y: 0.5} 346 | m_AnchoredPosition: {x: 0, y: -49.97} 347 | m_SizeDelta: {x: 200, y: 30} 348 | m_Pivot: {x: 0.5, y: 0.5} 349 | --- !u!114 &182701254 350 | MonoBehaviour: 351 | m_ObjectHideFlags: 0 352 | m_CorrespondingSourceObject: {fileID: 0} 353 | m_PrefabInstance: {fileID: 0} 354 | m_PrefabAsset: {fileID: 0} 355 | m_GameObject: {fileID: 182701252} 356 | m_Enabled: 1 357 | m_EditorHideFlags: 0 358 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 359 | m_Name: 360 | m_EditorClassIdentifier: 361 | m_Material: {fileID: 0} 362 | m_Color: {r: 0.57281953, g: 0.4044118, b: 1, a: 1} 363 | m_RaycastTarget: 1 364 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 365 | m_Maskable: 1 366 | m_OnCullStateChanged: 367 | m_PersistentCalls: 368 | m_Calls: [] 369 | m_Sprite: {fileID: 0} 370 | m_Type: 0 371 | m_PreserveAspect: 0 372 | m_FillCenter: 1 373 | m_FillMethod: 4 374 | m_FillAmount: 1 375 | m_FillClockwise: 1 376 | m_FillOrigin: 0 377 | m_UseSpriteMesh: 0 378 | m_PixelsPerUnitMultiplier: 1 379 | --- !u!222 &182701255 380 | CanvasRenderer: 381 | m_ObjectHideFlags: 0 382 | m_CorrespondingSourceObject: {fileID: 0} 383 | m_PrefabInstance: {fileID: 0} 384 | m_PrefabAsset: {fileID: 0} 385 | m_GameObject: {fileID: 182701252} 386 | m_CullTransparentMesh: 0 387 | --- !u!114 &182701256 388 | MonoBehaviour: 389 | m_ObjectHideFlags: 0 390 | m_CorrespondingSourceObject: {fileID: 0} 391 | m_PrefabInstance: {fileID: 0} 392 | m_PrefabAsset: {fileID: 0} 393 | m_GameObject: {fileID: 182701252} 394 | m_Enabled: 1 395 | m_EditorHideFlags: 0 396 | m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} 397 | m_Name: 398 | m_EditorClassIdentifier: 399 | m_Navigation: 400 | m_Mode: 3 401 | m_WrapAround: 0 402 | m_SelectOnUp: {fileID: 0} 403 | m_SelectOnDown: {fileID: 0} 404 | m_SelectOnLeft: {fileID: 0} 405 | m_SelectOnRight: {fileID: 0} 406 | m_Transition: 1 407 | m_Colors: 408 | m_NormalColor: {r: 1, g: 1, b: 1, a: 1} 409 | m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 410 | m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} 411 | m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 412 | m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} 413 | m_ColorMultiplier: 1 414 | m_FadeDuration: 0.1 415 | m_SpriteState: 416 | m_HighlightedSprite: {fileID: 0} 417 | m_PressedSprite: {fileID: 0} 418 | m_SelectedSprite: {fileID: 0} 419 | m_DisabledSprite: {fileID: 0} 420 | m_AnimationTriggers: 421 | m_NormalTrigger: Normal 422 | m_HighlightedTrigger: Highlighted 423 | m_PressedTrigger: Pressed 424 | m_SelectedTrigger: Highlighted 425 | m_DisabledTrigger: Disabled 426 | m_Interactable: 1 427 | m_TargetGraphic: {fileID: 182701254} 428 | m_OnClick: 429 | m_PersistentCalls: 430 | m_Calls: 431 | - m_Target: {fileID: 182701257} 432 | m_TargetAssemblyTypeName: 433 | m_MethodName: OnClickSetVersion 434 | m_Mode: 1 435 | m_Arguments: 436 | m_ObjectArgument: {fileID: 0} 437 | m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine 438 | m_IntArgument: 0 439 | m_FloatArgument: 0 440 | m_StringArgument: 441 | m_BoolArgument: 0 442 | m_CallState: 2 443 | --- !u!114 &182701257 444 | MonoBehaviour: 445 | m_ObjectHideFlags: 0 446 | m_CorrespondingSourceObject: {fileID: 0} 447 | m_PrefabInstance: {fileID: 0} 448 | m_PrefabAsset: {fileID: 0} 449 | m_GameObject: {fileID: 182701252} 450 | m_Enabled: 1 451 | m_EditorHideFlags: 0 452 | m_Script: {fileID: 11500000, guid: 4ceb14ced64f31740af354d6e86b5f05, type: 3} 453 | m_Name: 454 | m_EditorClassIdentifier: 455 | updateVersion: 2 456 | messageBox: {fileID: 1369793249} 457 | --- !u!1 &818177441 458 | GameObject: 459 | m_ObjectHideFlags: 0 460 | m_CorrespondingSourceObject: {fileID: 0} 461 | m_PrefabInstance: {fileID: 0} 462 | m_PrefabAsset: {fileID: 0} 463 | serializedVersion: 6 464 | m_Component: 465 | - component: {fileID: 818177442} 466 | - component: {fileID: 818177444} 467 | - component: {fileID: 818177443} 468 | m_Layer: 5 469 | m_Name: Text 470 | m_TagString: Untagged 471 | m_Icon: {fileID: 0} 472 | m_NavMeshLayer: 0 473 | m_StaticEditorFlags: 0 474 | m_IsActive: 1 475 | --- !u!224 &818177442 476 | RectTransform: 477 | m_ObjectHideFlags: 0 478 | m_CorrespondingSourceObject: {fileID: 0} 479 | m_PrefabInstance: {fileID: 0} 480 | m_PrefabAsset: {fileID: 0} 481 | m_GameObject: {fileID: 818177441} 482 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 483 | m_LocalPosition: {x: 0, y: 0, z: 0} 484 | m_LocalScale: {x: 1, y: 1, z: 1} 485 | m_ConstrainProportionsScale: 0 486 | m_Children: [] 487 | m_Father: {fileID: 182701253} 488 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 489 | m_AnchorMin: {x: 0.5, y: 0.5} 490 | m_AnchorMax: {x: 0.5, y: 0.5} 491 | m_AnchoredPosition: {x: 0, y: 0} 492 | m_SizeDelta: {x: 200, y: 30} 493 | m_Pivot: {x: 0.5, y: 0.5} 494 | --- !u!114 &818177443 495 | MonoBehaviour: 496 | m_ObjectHideFlags: 0 497 | m_CorrespondingSourceObject: {fileID: 0} 498 | m_PrefabInstance: {fileID: 0} 499 | m_PrefabAsset: {fileID: 0} 500 | m_GameObject: {fileID: 818177441} 501 | m_Enabled: 1 502 | m_EditorHideFlags: 0 503 | m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} 504 | m_Name: 505 | m_EditorClassIdentifier: 506 | m_Material: {fileID: 0} 507 | m_Color: {r: 0, g: 0, b: 0, a: 1} 508 | m_RaycastTarget: 1 509 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 510 | m_Maskable: 1 511 | m_OnCullStateChanged: 512 | m_PersistentCalls: 513 | m_Calls: [] 514 | m_FontData: 515 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 516 | m_FontSize: 14 517 | m_FontStyle: 0 518 | m_BestFit: 0 519 | m_MinSize: 10 520 | m_MaxSize: 40 521 | m_Alignment: 4 522 | m_AlignByGeometry: 0 523 | m_RichText: 1 524 | m_HorizontalOverflow: 1 525 | m_VerticalOverflow: 1 526 | m_LineSpacing: 1 527 | m_Text: Upgrade To Version 2 528 | --- !u!222 &818177444 529 | CanvasRenderer: 530 | m_ObjectHideFlags: 0 531 | m_CorrespondingSourceObject: {fileID: 0} 532 | m_PrefabInstance: {fileID: 0} 533 | m_PrefabAsset: {fileID: 0} 534 | m_GameObject: {fileID: 818177441} 535 | m_CullTransparentMesh: 0 536 | --- !u!1 &821767650 537 | GameObject: 538 | m_ObjectHideFlags: 0 539 | m_CorrespondingSourceObject: {fileID: 0} 540 | m_PrefabInstance: {fileID: 0} 541 | m_PrefabAsset: {fileID: 0} 542 | serializedVersion: 6 543 | m_Component: 544 | - component: {fileID: 821767654} 545 | - component: {fileID: 821767653} 546 | - component: {fileID: 821767652} 547 | - component: {fileID: 821767651} 548 | m_Layer: 0 549 | m_Name: Camera 550 | m_TagString: Untagged 551 | m_Icon: {fileID: 0} 552 | m_NavMeshLayer: 0 553 | m_StaticEditorFlags: 0 554 | m_IsActive: 1 555 | --- !u!81 &821767651 556 | AudioListener: 557 | m_ObjectHideFlags: 0 558 | m_CorrespondingSourceObject: {fileID: 0} 559 | m_PrefabInstance: {fileID: 0} 560 | m_PrefabAsset: {fileID: 0} 561 | m_GameObject: {fileID: 821767650} 562 | m_Enabled: 1 563 | --- !u!124 &821767652 564 | Behaviour: 565 | m_ObjectHideFlags: 0 566 | m_CorrespondingSourceObject: {fileID: 0} 567 | m_PrefabInstance: {fileID: 0} 568 | m_PrefabAsset: {fileID: 0} 569 | m_GameObject: {fileID: 821767650} 570 | m_Enabled: 1 571 | --- !u!20 &821767653 572 | Camera: 573 | m_ObjectHideFlags: 0 574 | m_CorrespondingSourceObject: {fileID: 0} 575 | m_PrefabInstance: {fileID: 0} 576 | m_PrefabAsset: {fileID: 0} 577 | m_GameObject: {fileID: 821767650} 578 | m_Enabled: 1 579 | serializedVersion: 2 580 | m_ClearFlags: 1 581 | m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} 582 | m_projectionMatrixMode: 1 583 | m_GateFitMode: 2 584 | m_FOVAxisMode: 0 585 | m_Iso: 200 586 | m_ShutterSpeed: 0.005 587 | m_Aperture: 16 588 | m_FocusDistance: 10 589 | m_FocalLength: 50 590 | m_BladeCount: 5 591 | m_Curvature: {x: 2, y: 11} 592 | m_BarrelClipping: 0.25 593 | m_Anamorphism: 0 594 | m_SensorSize: {x: 36, y: 24} 595 | m_LensShift: {x: 0, y: 0} 596 | m_NormalizedViewPortRect: 597 | serializedVersion: 2 598 | x: 0 599 | y: 0 600 | width: 1 601 | height: 1 602 | near clip plane: 0.3 603 | far clip plane: 1000 604 | field of view: 60 605 | orthographic: 0 606 | orthographic size: 5 607 | m_Depth: 0 608 | m_CullingMask: 609 | serializedVersion: 2 610 | m_Bits: 4294967295 611 | m_RenderingPath: -1 612 | m_TargetTexture: {fileID: 0} 613 | m_TargetDisplay: 0 614 | m_TargetEye: 3 615 | m_HDR: 1 616 | m_AllowMSAA: 1 617 | m_AllowDynamicResolution: 0 618 | m_ForceIntoRT: 0 619 | m_OcclusionCulling: 1 620 | m_StereoConvergence: 10 621 | m_StereoSeparation: 0.022 622 | --- !u!4 &821767654 623 | Transform: 624 | m_ObjectHideFlags: 0 625 | m_CorrespondingSourceObject: {fileID: 0} 626 | m_PrefabInstance: {fileID: 0} 627 | m_PrefabAsset: {fileID: 0} 628 | m_GameObject: {fileID: 821767650} 629 | serializedVersion: 2 630 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 631 | m_LocalPosition: {x: 44.67128, y: 49.247566, z: 19.594803} 632 | m_LocalScale: {x: 1, y: 1, z: 1} 633 | m_ConstrainProportionsScale: 0 634 | m_Children: [] 635 | m_Father: {fileID: 0} 636 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 637 | --- !u!224 &897323543 638 | RectTransform: 639 | m_ObjectHideFlags: 0 640 | m_CorrespondingSourceObject: {fileID: 0} 641 | m_PrefabInstance: {fileID: 0} 642 | m_PrefabAsset: {fileID: 0} 643 | m_GameObject: {fileID: 1369793248} 644 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 645 | m_LocalPosition: {x: 0, y: 0, z: 0} 646 | m_LocalScale: {x: 1, y: 1, z: 1} 647 | m_ConstrainProportionsScale: 0 648 | m_Children: 649 | - {fileID: 144275570} 650 | - {fileID: 1595909463} 651 | m_Father: {fileID: 1796625708} 652 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 653 | m_AnchorMin: {x: 0.5, y: 0.5} 654 | m_AnchorMax: {x: 0.5, y: 0.5} 655 | m_AnchoredPosition: {x: 0, y: -31.3} 656 | m_SizeDelta: {x: 235.46, y: 324.49} 657 | m_Pivot: {x: 0.5, y: 0.5} 658 | --- !u!1 &957591100 659 | GameObject: 660 | m_ObjectHideFlags: 0 661 | m_CorrespondingSourceObject: {fileID: 0} 662 | m_PrefabInstance: {fileID: 0} 663 | m_PrefabAsset: {fileID: 0} 664 | serializedVersion: 6 665 | m_Component: 666 | - component: {fileID: 957591101} 667 | - component: {fileID: 957591103} 668 | - component: {fileID: 957591102} 669 | m_Layer: 5 670 | m_Name: CurrentVersionTips 671 | m_TagString: Untagged 672 | m_Icon: {fileID: 0} 673 | m_NavMeshLayer: 0 674 | m_StaticEditorFlags: 0 675 | m_IsActive: 1 676 | --- !u!224 &957591101 677 | RectTransform: 678 | m_ObjectHideFlags: 0 679 | m_CorrespondingSourceObject: {fileID: 0} 680 | m_PrefabInstance: {fileID: 0} 681 | m_PrefabAsset: {fileID: 0} 682 | m_GameObject: {fileID: 957591100} 683 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 684 | m_LocalPosition: {x: 0, y: 0, z: 0} 685 | m_LocalScale: {x: 1, y: 1, z: 1} 686 | m_ConstrainProportionsScale: 0 687 | m_Children: [] 688 | m_Father: {fileID: 1796625708} 689 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 690 | m_AnchorMin: {x: 0.5, y: 0.5} 691 | m_AnchorMax: {x: 0.5, y: 0.5} 692 | m_AnchoredPosition: {x: 0, y: 43.7} 693 | m_SizeDelta: {x: 160, y: 30} 694 | m_Pivot: {x: 0.5, y: 0.5} 695 | --- !u!114 &957591102 696 | MonoBehaviour: 697 | m_ObjectHideFlags: 0 698 | m_CorrespondingSourceObject: {fileID: 0} 699 | m_PrefabInstance: {fileID: 0} 700 | m_PrefabAsset: {fileID: 0} 701 | m_GameObject: {fileID: 957591100} 702 | m_Enabled: 1 703 | m_EditorHideFlags: 0 704 | m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} 705 | m_Name: 706 | m_EditorClassIdentifier: 707 | m_Material: {fileID: 0} 708 | m_Color: {r: 1, g: 1, b: 1, a: 0.991} 709 | m_RaycastTarget: 1 710 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 711 | m_Maskable: 1 712 | m_OnCullStateChanged: 713 | m_PersistentCalls: 714 | m_Calls: [] 715 | m_FontData: 716 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 717 | m_FontSize: 16 718 | m_FontStyle: 0 719 | m_BestFit: 1 720 | m_MinSize: 1 721 | m_MaxSize: 40 722 | m_Alignment: 4 723 | m_AlignByGeometry: 0 724 | m_RichText: 1 725 | m_HorizontalOverflow: 1 726 | m_VerticalOverflow: 1 727 | m_LineSpacing: 1 728 | m_Text: THIS IS THE BASE VERSION 729 | --- !u!222 &957591103 730 | CanvasRenderer: 731 | m_ObjectHideFlags: 0 732 | m_CorrespondingSourceObject: {fileID: 0} 733 | m_PrefabInstance: {fileID: 0} 734 | m_PrefabAsset: {fileID: 0} 735 | m_GameObject: {fileID: 957591100} 736 | m_CullTransparentMesh: 0 737 | --- !u!1 &1126477265 738 | GameObject: 739 | m_ObjectHideFlags: 0 740 | m_CorrespondingSourceObject: {fileID: 0} 741 | m_PrefabInstance: {fileID: 0} 742 | m_PrefabAsset: {fileID: 0} 743 | serializedVersion: 6 744 | m_Component: 745 | - component: {fileID: 1126477266} 746 | - component: {fileID: 1126477268} 747 | - component: {fileID: 1126477267} 748 | m_Layer: 5 749 | m_Name: Text 750 | m_TagString: Untagged 751 | m_Icon: {fileID: 0} 752 | m_NavMeshLayer: 0 753 | m_StaticEditorFlags: 0 754 | m_IsActive: 1 755 | --- !u!224 &1126477266 756 | RectTransform: 757 | m_ObjectHideFlags: 0 758 | m_CorrespondingSourceObject: {fileID: 0} 759 | m_PrefabInstance: {fileID: 0} 760 | m_PrefabAsset: {fileID: 0} 761 | m_GameObject: {fileID: 1126477265} 762 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 763 | m_LocalPosition: {x: 0, y: 0, z: 0} 764 | m_LocalScale: {x: 1, y: 1, z: 1} 765 | m_ConstrainProportionsScale: 0 766 | m_Children: [] 767 | m_Father: {fileID: 2048904141} 768 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 769 | m_AnchorMin: {x: 0.5, y: 0.5} 770 | m_AnchorMax: {x: 0.5, y: 0.5} 771 | m_AnchoredPosition: {x: 0, y: 0} 772 | m_SizeDelta: {x: 200, y: 30} 773 | m_Pivot: {x: 0.5, y: 0.5} 774 | --- !u!114 &1126477267 775 | MonoBehaviour: 776 | m_ObjectHideFlags: 0 777 | m_CorrespondingSourceObject: {fileID: 0} 778 | m_PrefabInstance: {fileID: 0} 779 | m_PrefabAsset: {fileID: 0} 780 | m_GameObject: {fileID: 1126477265} 781 | m_Enabled: 1 782 | m_EditorHideFlags: 0 783 | m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} 784 | m_Name: 785 | m_EditorClassIdentifier: 786 | m_Material: {fileID: 0} 787 | m_Color: {r: 0, g: 0, b: 0, a: 1} 788 | m_RaycastTarget: 1 789 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 790 | m_Maskable: 1 791 | m_OnCullStateChanged: 792 | m_PersistentCalls: 793 | m_Calls: [] 794 | m_FontData: 795 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 796 | m_FontSize: 14 797 | m_FontStyle: 0 798 | m_BestFit: 0 799 | m_MinSize: 10 800 | m_MaxSize: 40 801 | m_Alignment: 4 802 | m_AlignByGeometry: 0 803 | m_RichText: 1 804 | m_HorizontalOverflow: 1 805 | m_VerticalOverflow: 1 806 | m_LineSpacing: 1 807 | m_Text: Upgrade To Version 1 808 | --- !u!222 &1126477268 809 | CanvasRenderer: 810 | m_ObjectHideFlags: 0 811 | m_CorrespondingSourceObject: {fileID: 0} 812 | m_PrefabInstance: {fileID: 0} 813 | m_PrefabAsset: {fileID: 0} 814 | m_GameObject: {fileID: 1126477265} 815 | m_CullTransparentMesh: 0 816 | --- !u!1 &1134093610 817 | GameObject: 818 | m_ObjectHideFlags: 0 819 | m_CorrespondingSourceObject: {fileID: 0} 820 | m_PrefabInstance: {fileID: 0} 821 | m_PrefabAsset: {fileID: 0} 822 | serializedVersion: 6 823 | m_Component: 824 | - component: {fileID: 1134093611} 825 | - component: {fileID: 1134093613} 826 | - component: {fileID: 1134093612} 827 | m_Layer: 5 828 | m_Name: ButtonText 829 | m_TagString: Untagged 830 | m_Icon: {fileID: 0} 831 | m_NavMeshLayer: 0 832 | m_StaticEditorFlags: 0 833 | m_IsActive: 1 834 | --- !u!224 &1134093611 835 | RectTransform: 836 | m_ObjectHideFlags: 0 837 | m_CorrespondingSourceObject: {fileID: 0} 838 | m_PrefabInstance: {fileID: 0} 839 | m_PrefabAsset: {fileID: 0} 840 | m_GameObject: {fileID: 1134093610} 841 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 842 | m_LocalPosition: {x: 0, y: 0, z: 0} 843 | m_LocalScale: {x: 1, y: 1, z: 1} 844 | m_ConstrainProportionsScale: 0 845 | m_Children: [] 846 | m_Father: {fileID: 1595909463} 847 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 848 | m_AnchorMin: {x: 0.5, y: 0.5} 849 | m_AnchorMax: {x: 0.5, y: 0.5} 850 | m_AnchoredPosition: {x: 0, y: 0} 851 | m_SizeDelta: {x: 160, y: 50.92} 852 | m_Pivot: {x: 0.5, y: 0.5} 853 | --- !u!114 &1134093612 854 | MonoBehaviour: 855 | m_ObjectHideFlags: 0 856 | m_CorrespondingSourceObject: {fileID: 0} 857 | m_PrefabInstance: {fileID: 0} 858 | m_PrefabAsset: {fileID: 0} 859 | m_GameObject: {fileID: 1134093610} 860 | m_Enabled: 1 861 | m_EditorHideFlags: 0 862 | m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} 863 | m_Name: 864 | m_EditorClassIdentifier: 865 | m_Material: {fileID: 0} 866 | m_Color: {r: 1, g: 1, b: 1, a: 1} 867 | m_RaycastTarget: 1 868 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 869 | m_Maskable: 1 870 | m_OnCullStateChanged: 871 | m_PersistentCalls: 872 | m_Calls: [] 873 | m_FontData: 874 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 875 | m_FontSize: 25 876 | m_FontStyle: 0 877 | m_BestFit: 0 878 | m_MinSize: 2 879 | m_MaxSize: 40 880 | m_Alignment: 4 881 | m_AlignByGeometry: 0 882 | m_RichText: 1 883 | m_HorizontalOverflow: 0 884 | m_VerticalOverflow: 0 885 | m_LineSpacing: 1 886 | m_Text: exit 887 | --- !u!222 &1134093613 888 | CanvasRenderer: 889 | m_ObjectHideFlags: 0 890 | m_CorrespondingSourceObject: {fileID: 0} 891 | m_PrefabInstance: {fileID: 0} 892 | m_PrefabAsset: {fileID: 0} 893 | m_GameObject: {fileID: 1134093610} 894 | m_CullTransparentMesh: 0 895 | --- !u!1 &1369793248 896 | GameObject: 897 | m_ObjectHideFlags: 0 898 | m_CorrespondingSourceObject: {fileID: 0} 899 | m_PrefabInstance: {fileID: 0} 900 | m_PrefabAsset: {fileID: 0} 901 | serializedVersion: 6 902 | m_Component: 903 | - component: {fileID: 897323543} 904 | - component: {fileID: 1369793251} 905 | - component: {fileID: 1369793250} 906 | - component: {fileID: 1369793249} 907 | m_Layer: 5 908 | m_Name: MessageBox 909 | m_TagString: Untagged 910 | m_Icon: {fileID: 0} 911 | m_NavMeshLayer: 0 912 | m_StaticEditorFlags: 0 913 | m_IsActive: 0 914 | --- !u!114 &1369793249 915 | MonoBehaviour: 916 | m_ObjectHideFlags: 0 917 | m_CorrespondingSourceObject: {fileID: 0} 918 | m_PrefabInstance: {fileID: 0} 919 | m_PrefabAsset: {fileID: 0} 920 | m_GameObject: {fileID: 1369793248} 921 | m_Enabled: 1 922 | m_EditorHideFlags: 0 923 | m_Script: {fileID: 11500000, guid: 2951416da33e6684f86b155a99db2187, type: 3} 924 | m_Name: 925 | m_EditorClassIdentifier: 926 | message: {fileID: 144275568} 927 | button: {fileID: 1595909464} 928 | buttonText: {fileID: 1134093612} 929 | --- !u!114 &1369793250 930 | MonoBehaviour: 931 | m_ObjectHideFlags: 0 932 | m_CorrespondingSourceObject: {fileID: 0} 933 | m_PrefabInstance: {fileID: 0} 934 | m_PrefabAsset: {fileID: 0} 935 | m_GameObject: {fileID: 1369793248} 936 | m_Enabled: 1 937 | m_EditorHideFlags: 0 938 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 939 | m_Name: 940 | m_EditorClassIdentifier: 941 | m_Material: {fileID: 0} 942 | m_Color: {r: 0.4007353, g: 0.53615624, b: 0.8014706, a: 1} 943 | m_RaycastTarget: 1 944 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 945 | m_Maskable: 1 946 | m_OnCullStateChanged: 947 | m_PersistentCalls: 948 | m_Calls: [] 949 | m_Sprite: {fileID: 21300000, guid: d01486bc09d969645ab2fda68594a1be, type: 3} 950 | m_Type: 0 951 | m_PreserveAspect: 0 952 | m_FillCenter: 1 953 | m_FillMethod: 4 954 | m_FillAmount: 1 955 | m_FillClockwise: 1 956 | m_FillOrigin: 0 957 | m_UseSpriteMesh: 0 958 | m_PixelsPerUnitMultiplier: 1 959 | --- !u!222 &1369793251 960 | CanvasRenderer: 961 | m_ObjectHideFlags: 0 962 | m_CorrespondingSourceObject: {fileID: 0} 963 | m_PrefabInstance: {fileID: 0} 964 | m_PrefabAsset: {fileID: 0} 965 | m_GameObject: {fileID: 1369793248} 966 | m_CullTransparentMesh: 0 967 | --- !u!1 &1537698026 968 | GameObject: 969 | m_ObjectHideFlags: 0 970 | m_CorrespondingSourceObject: {fileID: 0} 971 | m_PrefabInstance: {fileID: 0} 972 | m_PrefabAsset: {fileID: 0} 973 | serializedVersion: 6 974 | m_Component: 975 | - component: {fileID: 1537698027} 976 | - component: {fileID: 1537698029} 977 | - component: {fileID: 1537698028} 978 | - component: {fileID: 1537698030} 979 | m_Layer: 5 980 | m_Name: RunningArchABI 981 | m_TagString: Untagged 982 | m_Icon: {fileID: 0} 983 | m_NavMeshLayer: 0 984 | m_StaticEditorFlags: 0 985 | m_IsActive: 1 986 | --- !u!224 &1537698027 987 | RectTransform: 988 | m_ObjectHideFlags: 0 989 | m_CorrespondingSourceObject: {fileID: 0} 990 | m_PrefabInstance: {fileID: 0} 991 | m_PrefabAsset: {fileID: 0} 992 | m_GameObject: {fileID: 1537698026} 993 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 994 | m_LocalPosition: {x: 0, y: 0, z: 0} 995 | m_LocalScale: {x: 1, y: 1, z: 1} 996 | m_ConstrainProportionsScale: 0 997 | m_Children: [] 998 | m_Father: {fileID: 1796625708} 999 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1000 | m_AnchorMin: {x: 0.5, y: 0.5} 1001 | m_AnchorMax: {x: 0.5, y: 0.5} 1002 | m_AnchoredPosition: {x: 0, y: 20.000027} 1003 | m_SizeDelta: {x: 160, y: 30} 1004 | m_Pivot: {x: 0.5, y: 0.5} 1005 | --- !u!114 &1537698028 1006 | MonoBehaviour: 1007 | m_ObjectHideFlags: 0 1008 | m_CorrespondingSourceObject: {fileID: 0} 1009 | m_PrefabInstance: {fileID: 0} 1010 | m_PrefabAsset: {fileID: 0} 1011 | m_GameObject: {fileID: 1537698026} 1012 | m_Enabled: 1 1013 | m_EditorHideFlags: 0 1014 | m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} 1015 | m_Name: 1016 | m_EditorClassIdentifier: 1017 | m_Material: {fileID: 0} 1018 | m_Color: {r: 1, g: 1, b: 1, a: 0.991} 1019 | m_RaycastTarget: 1 1020 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 1021 | m_Maskable: 1 1022 | m_OnCullStateChanged: 1023 | m_PersistentCalls: 1024 | m_Calls: [] 1025 | m_FontData: 1026 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 1027 | m_FontSize: 11 1028 | m_FontStyle: 0 1029 | m_BestFit: 1 1030 | m_MinSize: 0 1031 | m_MaxSize: 40 1032 | m_Alignment: 4 1033 | m_AlignByGeometry: 0 1034 | m_RichText: 1 1035 | m_HorizontalOverflow: 1 1036 | m_VerticalOverflow: 1 1037 | m_LineSpacing: 1 1038 | m_Text: ARCH_ABI:xxxxx 1039 | --- !u!222 &1537698029 1040 | CanvasRenderer: 1041 | m_ObjectHideFlags: 0 1042 | m_CorrespondingSourceObject: {fileID: 0} 1043 | m_PrefabInstance: {fileID: 0} 1044 | m_PrefabAsset: {fileID: 0} 1045 | m_GameObject: {fileID: 1537698026} 1046 | m_CullTransparentMesh: 0 1047 | --- !u!114 &1537698030 1048 | MonoBehaviour: 1049 | m_ObjectHideFlags: 0 1050 | m_CorrespondingSourceObject: {fileID: 0} 1051 | m_PrefabInstance: {fileID: 0} 1052 | m_PrefabAsset: {fileID: 0} 1053 | m_GameObject: {fileID: 1537698026} 1054 | m_Enabled: 1 1055 | m_EditorHideFlags: 0 1056 | m_Script: {fileID: 11500000, guid: c69ac0a3860c6ca4983ae3aa80675ff0, type: 3} 1057 | m_Name: 1058 | m_EditorClassIdentifier: 1059 | --- !u!1 &1587549587 1060 | GameObject: 1061 | m_ObjectHideFlags: 0 1062 | m_CorrespondingSourceObject: {fileID: 0} 1063 | m_PrefabInstance: {fileID: 0} 1064 | m_PrefabAsset: {fileID: 0} 1065 | serializedVersion: 6 1066 | m_Component: 1067 | - component: {fileID: 1587549590} 1068 | - component: {fileID: 1587549589} 1069 | - component: {fileID: 1587549588} 1070 | m_Layer: 0 1071 | m_Name: EventSystem 1072 | m_TagString: Untagged 1073 | m_Icon: {fileID: 0} 1074 | m_NavMeshLayer: 0 1075 | m_StaticEditorFlags: 0 1076 | m_IsActive: 1 1077 | --- !u!114 &1587549588 1078 | MonoBehaviour: 1079 | m_ObjectHideFlags: 0 1080 | m_CorrespondingSourceObject: {fileID: 0} 1081 | m_PrefabInstance: {fileID: 0} 1082 | m_PrefabAsset: {fileID: 0} 1083 | m_GameObject: {fileID: 1587549587} 1084 | m_Enabled: 1 1085 | m_EditorHideFlags: 0 1086 | m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} 1087 | m_Name: 1088 | m_EditorClassIdentifier: 1089 | m_SendPointerHoverToParent: 1 1090 | m_HorizontalAxis: Horizontal 1091 | m_VerticalAxis: Vertical 1092 | m_SubmitButton: Submit 1093 | m_CancelButton: Cancel 1094 | m_InputActionsPerSecond: 10 1095 | m_RepeatDelay: 0.5 1096 | m_ForceModuleActive: 0 1097 | --- !u!114 &1587549589 1098 | MonoBehaviour: 1099 | m_ObjectHideFlags: 0 1100 | m_CorrespondingSourceObject: {fileID: 0} 1101 | m_PrefabInstance: {fileID: 0} 1102 | m_PrefabAsset: {fileID: 0} 1103 | m_GameObject: {fileID: 1587549587} 1104 | m_Enabled: 1 1105 | m_EditorHideFlags: 0 1106 | m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} 1107 | m_Name: 1108 | m_EditorClassIdentifier: 1109 | m_FirstSelected: {fileID: 0} 1110 | m_sendNavigationEvents: 1 1111 | m_DragThreshold: 5 1112 | --- !u!4 &1587549590 1113 | Transform: 1114 | m_ObjectHideFlags: 0 1115 | m_CorrespondingSourceObject: {fileID: 0} 1116 | m_PrefabInstance: {fileID: 0} 1117 | m_PrefabAsset: {fileID: 0} 1118 | m_GameObject: {fileID: 1587549587} 1119 | serializedVersion: 2 1120 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 1121 | m_LocalPosition: {x: 0, y: 0, z: 0} 1122 | m_LocalScale: {x: 1, y: 1, z: 1} 1123 | m_ConstrainProportionsScale: 0 1124 | m_Children: [] 1125 | m_Father: {fileID: 0} 1126 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1127 | --- !u!1 &1595909462 1128 | GameObject: 1129 | m_ObjectHideFlags: 0 1130 | m_CorrespondingSourceObject: {fileID: 0} 1131 | m_PrefabInstance: {fileID: 0} 1132 | m_PrefabAsset: {fileID: 0} 1133 | serializedVersion: 6 1134 | m_Component: 1135 | - component: {fileID: 1595909463} 1136 | - component: {fileID: 1595909466} 1137 | - component: {fileID: 1595909465} 1138 | - component: {fileID: 1595909464} 1139 | m_Layer: 5 1140 | m_Name: Button 1141 | m_TagString: Untagged 1142 | m_Icon: {fileID: 0} 1143 | m_NavMeshLayer: 0 1144 | m_StaticEditorFlags: 0 1145 | m_IsActive: 1 1146 | --- !u!224 &1595909463 1147 | RectTransform: 1148 | m_ObjectHideFlags: 0 1149 | m_CorrespondingSourceObject: {fileID: 0} 1150 | m_PrefabInstance: {fileID: 0} 1151 | m_PrefabAsset: {fileID: 0} 1152 | m_GameObject: {fileID: 1595909462} 1153 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 1154 | m_LocalPosition: {x: 0, y: 0, z: 0} 1155 | m_LocalScale: {x: 1, y: 1, z: 1} 1156 | m_ConstrainProportionsScale: 0 1157 | m_Children: 1158 | - {fileID: 1134093611} 1159 | m_Father: {fileID: 897323543} 1160 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1161 | m_AnchorMin: {x: 0.5, y: 0.5} 1162 | m_AnchorMax: {x: 0.5, y: 0.5} 1163 | m_AnchoredPosition: {x: 0, y: -109} 1164 | m_SizeDelta: {x: 173, y: 50} 1165 | m_Pivot: {x: 0.5, y: 0.5} 1166 | --- !u!114 &1595909464 1167 | MonoBehaviour: 1168 | m_ObjectHideFlags: 0 1169 | m_CorrespondingSourceObject: {fileID: 0} 1170 | m_PrefabInstance: {fileID: 0} 1171 | m_PrefabAsset: {fileID: 0} 1172 | m_GameObject: {fileID: 1595909462} 1173 | m_Enabled: 1 1174 | m_EditorHideFlags: 0 1175 | m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} 1176 | m_Name: 1177 | m_EditorClassIdentifier: 1178 | m_Navigation: 1179 | m_Mode: 3 1180 | m_WrapAround: 0 1181 | m_SelectOnUp: {fileID: 0} 1182 | m_SelectOnDown: {fileID: 0} 1183 | m_SelectOnLeft: {fileID: 0} 1184 | m_SelectOnRight: {fileID: 0} 1185 | m_Transition: 1 1186 | m_Colors: 1187 | m_NormalColor: {r: 1, g: 1, b: 1, a: 1} 1188 | m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 1189 | m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} 1190 | m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 1191 | m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} 1192 | m_ColorMultiplier: 1 1193 | m_FadeDuration: 0.1 1194 | m_SpriteState: 1195 | m_HighlightedSprite: {fileID: 0} 1196 | m_PressedSprite: {fileID: 0} 1197 | m_SelectedSprite: {fileID: 0} 1198 | m_DisabledSprite: {fileID: 0} 1199 | m_AnimationTriggers: 1200 | m_NormalTrigger: Normal 1201 | m_HighlightedTrigger: Highlighted 1202 | m_PressedTrigger: Pressed 1203 | m_SelectedTrigger: Highlighted 1204 | m_DisabledTrigger: Disabled 1205 | m_Interactable: 1 1206 | m_TargetGraphic: {fileID: 1595909465} 1207 | m_OnClick: 1208 | m_PersistentCalls: 1209 | m_Calls: 1210 | - m_Target: {fileID: 1369793249} 1211 | m_TargetAssemblyTypeName: 1212 | m_MethodName: OnClick 1213 | m_Mode: 1 1214 | m_Arguments: 1215 | m_ObjectArgument: {fileID: 0} 1216 | m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine 1217 | m_IntArgument: 0 1218 | m_FloatArgument: 0 1219 | m_StringArgument: 1220 | m_BoolArgument: 0 1221 | m_CallState: 2 1222 | --- !u!114 &1595909465 1223 | MonoBehaviour: 1224 | m_ObjectHideFlags: 0 1225 | m_CorrespondingSourceObject: {fileID: 0} 1226 | m_PrefabInstance: {fileID: 0} 1227 | m_PrefabAsset: {fileID: 0} 1228 | m_GameObject: {fileID: 1595909462} 1229 | m_Enabled: 1 1230 | m_EditorHideFlags: 0 1231 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 1232 | m_Name: 1233 | m_EditorClassIdentifier: 1234 | m_Material: {fileID: 0} 1235 | m_Color: {r: 0.57281953, g: 0.4044118, b: 1, a: 1} 1236 | m_RaycastTarget: 1 1237 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 1238 | m_Maskable: 1 1239 | m_OnCullStateChanged: 1240 | m_PersistentCalls: 1241 | m_Calls: [] 1242 | m_Sprite: {fileID: 21300000, guid: 9a8f38b580999fb4db46e39d0ae06055, type: 3} 1243 | m_Type: 0 1244 | m_PreserveAspect: 0 1245 | m_FillCenter: 1 1246 | m_FillMethod: 4 1247 | m_FillAmount: 1 1248 | m_FillClockwise: 1 1249 | m_FillOrigin: 0 1250 | m_UseSpriteMesh: 0 1251 | m_PixelsPerUnitMultiplier: 1 1252 | --- !u!222 &1595909466 1253 | CanvasRenderer: 1254 | m_ObjectHideFlags: 0 1255 | m_CorrespondingSourceObject: {fileID: 0} 1256 | m_PrefabInstance: {fileID: 0} 1257 | m_PrefabAsset: {fileID: 0} 1258 | m_GameObject: {fileID: 1595909462} 1259 | m_CullTransparentMesh: 0 1260 | --- !u!1 &1626594288 1261 | GameObject: 1262 | m_ObjectHideFlags: 0 1263 | m_CorrespondingSourceObject: {fileID: 0} 1264 | m_PrefabInstance: {fileID: 0} 1265 | m_PrefabAsset: {fileID: 0} 1266 | serializedVersion: 6 1267 | m_Component: 1268 | - component: {fileID: 1626594289} 1269 | - component: {fileID: 1626594292} 1270 | - component: {fileID: 1626594291} 1271 | - component: {fileID: 1626594290} 1272 | m_Layer: 5 1273 | m_Name: TestStringInScript 1274 | m_TagString: Untagged 1275 | m_Icon: {fileID: 0} 1276 | m_NavMeshLayer: 0 1277 | m_StaticEditorFlags: 0 1278 | m_IsActive: 1 1279 | --- !u!224 &1626594289 1280 | RectTransform: 1281 | m_ObjectHideFlags: 0 1282 | m_CorrespondingSourceObject: {fileID: 0} 1283 | m_PrefabInstance: {fileID: 0} 1284 | m_PrefabAsset: {fileID: 0} 1285 | m_GameObject: {fileID: 1626594288} 1286 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 1287 | m_LocalPosition: {x: 0, y: 0, z: 0} 1288 | m_LocalScale: {x: 1, y: 1, z: 1} 1289 | m_ConstrainProportionsScale: 0 1290 | m_Children: [] 1291 | m_Father: {fileID: 1796625708} 1292 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1293 | m_AnchorMin: {x: 0.5, y: 0.5} 1294 | m_AnchorMax: {x: 0.5, y: 0.5} 1295 | m_AnchoredPosition: {x: 0, y: -84.12} 1296 | m_SizeDelta: {x: 160, y: 30} 1297 | m_Pivot: {x: 0.5, y: 0.5} 1298 | --- !u!114 &1626594290 1299 | MonoBehaviour: 1300 | m_ObjectHideFlags: 0 1301 | m_CorrespondingSourceObject: {fileID: 0} 1302 | m_PrefabInstance: {fileID: 0} 1303 | m_PrefabAsset: {fileID: 0} 1304 | m_GameObject: {fileID: 1626594288} 1305 | m_Enabled: 1 1306 | m_EditorHideFlags: 0 1307 | m_Script: {fileID: 11500000, guid: a044a61fa52eda843940b058c3ad11fa, type: 3} 1308 | m_Name: 1309 | m_EditorClassIdentifier: 1310 | text: {fileID: 1626594291} 1311 | --- !u!114 &1626594291 1312 | MonoBehaviour: 1313 | m_ObjectHideFlags: 0 1314 | m_CorrespondingSourceObject: {fileID: 0} 1315 | m_PrefabInstance: {fileID: 0} 1316 | m_PrefabAsset: {fileID: 0} 1317 | m_GameObject: {fileID: 1626594288} 1318 | m_Enabled: 1 1319 | m_EditorHideFlags: 0 1320 | m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} 1321 | m_Name: 1322 | m_EditorClassIdentifier: 1323 | m_Material: {fileID: 0} 1324 | m_Color: {r: 1, g: 1, b: 1, a: 0.991} 1325 | m_RaycastTarget: 1 1326 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 1327 | m_Maskable: 1 1328 | m_OnCullStateChanged: 1329 | m_PersistentCalls: 1330 | m_Calls: [] 1331 | m_FontData: 1332 | m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} 1333 | m_FontSize: 16 1334 | m_FontStyle: 0 1335 | m_BestFit: 1 1336 | m_MinSize: 1 1337 | m_MaxSize: 40 1338 | m_Alignment: 4 1339 | m_AlignByGeometry: 0 1340 | m_RichText: 1 1341 | m_HorizontalOverflow: 1 1342 | m_VerticalOverflow: 1 1343 | m_LineSpacing: 1 1344 | m_Text: THIS IS THE BASE VERSION 1345 | --- !u!222 &1626594292 1346 | CanvasRenderer: 1347 | m_ObjectHideFlags: 0 1348 | m_CorrespondingSourceObject: {fileID: 0} 1349 | m_PrefabInstance: {fileID: 0} 1350 | m_PrefabAsset: {fileID: 0} 1351 | m_GameObject: {fileID: 1626594288} 1352 | m_CullTransparentMesh: 0 1353 | --- !u!1 &1764894408 1354 | GameObject: 1355 | m_ObjectHideFlags: 0 1356 | m_CorrespondingSourceObject: {fileID: 0} 1357 | m_PrefabInstance: {fileID: 0} 1358 | m_PrefabAsset: {fileID: 0} 1359 | serializedVersion: 6 1360 | m_Component: 1361 | - component: {fileID: 1764894409} 1362 | - component: {fileID: 1764894413} 1363 | - component: {fileID: 1764894412} 1364 | - component: {fileID: 1764894411} 1365 | m_Layer: 5 1366 | m_Name: mask 1367 | m_TagString: Untagged 1368 | m_Icon: {fileID: 0} 1369 | m_NavMeshLayer: 0 1370 | m_StaticEditorFlags: 0 1371 | m_IsActive: 0 1372 | --- !u!224 &1764894409 1373 | RectTransform: 1374 | m_ObjectHideFlags: 0 1375 | m_CorrespondingSourceObject: {fileID: 0} 1376 | m_PrefabInstance: {fileID: 0} 1377 | m_PrefabAsset: {fileID: 0} 1378 | m_GameObject: {fileID: 1764894408} 1379 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 1380 | m_LocalPosition: {x: 0, y: 0, z: 0} 1381 | m_LocalScale: {x: 1, y: 1, z: 1} 1382 | m_ConstrainProportionsScale: 0 1383 | m_Children: [] 1384 | m_Father: {fileID: 150934082} 1385 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1386 | m_AnchorMin: {x: 0, y: 0} 1387 | m_AnchorMax: {x: 1, y: 1} 1388 | m_AnchoredPosition: {x: 0, y: 0} 1389 | m_SizeDelta: {x: 0, y: 0} 1390 | m_Pivot: {x: 0.5, y: 0.5} 1391 | --- !u!114 &1764894411 1392 | MonoBehaviour: 1393 | m_ObjectHideFlags: 0 1394 | m_CorrespondingSourceObject: {fileID: 0} 1395 | m_PrefabInstance: {fileID: 0} 1396 | m_PrefabAsset: {fileID: 0} 1397 | m_GameObject: {fileID: 1764894408} 1398 | m_Enabled: 1 1399 | m_EditorHideFlags: 0 1400 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 1401 | m_Name: 1402 | m_EditorClassIdentifier: 1403 | m_Material: {fileID: 0} 1404 | m_Color: {r: 0.18867922, g: 0.18867922, b: 0.18867922, a: 0.7137255} 1405 | m_RaycastTarget: 1 1406 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 1407 | m_Maskable: 1 1408 | m_OnCullStateChanged: 1409 | m_PersistentCalls: 1410 | m_Calls: [] 1411 | m_Sprite: {fileID: 0} 1412 | m_Type: 0 1413 | m_PreserveAspect: 0 1414 | m_FillCenter: 1 1415 | m_FillMethod: 4 1416 | m_FillAmount: 1 1417 | m_FillClockwise: 1 1418 | m_FillOrigin: 0 1419 | m_UseSpriteMesh: 0 1420 | m_PixelsPerUnitMultiplier: 1 1421 | --- !u!222 &1764894412 1422 | CanvasRenderer: 1423 | m_ObjectHideFlags: 0 1424 | m_CorrespondingSourceObject: {fileID: 0} 1425 | m_PrefabInstance: {fileID: 0} 1426 | m_PrefabAsset: {fileID: 0} 1427 | m_GameObject: {fileID: 1764894408} 1428 | m_CullTransparentMesh: 0 1429 | --- !u!114 &1764894413 1430 | MonoBehaviour: 1431 | m_ObjectHideFlags: 0 1432 | m_CorrespondingSourceObject: {fileID: 0} 1433 | m_PrefabInstance: {fileID: 0} 1434 | m_PrefabAsset: {fileID: 0} 1435 | m_GameObject: {fileID: 1764894408} 1436 | m_Enabled: 1 1437 | m_EditorHideFlags: 0 1438 | m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} 1439 | m_Name: 1440 | m_EditorClassIdentifier: 1441 | m_Navigation: 1442 | m_Mode: 3 1443 | m_WrapAround: 0 1444 | m_SelectOnUp: {fileID: 0} 1445 | m_SelectOnDown: {fileID: 0} 1446 | m_SelectOnLeft: {fileID: 0} 1447 | m_SelectOnRight: {fileID: 0} 1448 | m_Transition: 1 1449 | m_Colors: 1450 | m_NormalColor: {r: 1, g: 1, b: 1, a: 1} 1451 | m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 1452 | m_PressedColor: {r: 1, g: 1, b: 1, a: 1} 1453 | m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 1454 | m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} 1455 | m_ColorMultiplier: 1 1456 | m_FadeDuration: 0.1 1457 | m_SpriteState: 1458 | m_HighlightedSprite: {fileID: 0} 1459 | m_PressedSprite: {fileID: 0} 1460 | m_SelectedSprite: {fileID: 0} 1461 | m_DisabledSprite: {fileID: 0} 1462 | m_AnimationTriggers: 1463 | m_NormalTrigger: Normal 1464 | m_HighlightedTrigger: Highlighted 1465 | m_PressedTrigger: Pressed 1466 | m_SelectedTrigger: Highlighted 1467 | m_DisabledTrigger: Disabled 1468 | m_Interactable: 1 1469 | m_TargetGraphic: {fileID: 1764894411} 1470 | m_OnClick: 1471 | m_PersistentCalls: 1472 | m_Calls: 1473 | - m_Target: {fileID: 0} 1474 | m_TargetAssemblyTypeName: 1475 | m_MethodName: OnClickOpenURL 1476 | m_Mode: 1 1477 | m_Arguments: 1478 | m_ObjectArgument: {fileID: 0} 1479 | m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine 1480 | m_IntArgument: 0 1481 | m_FloatArgument: 0 1482 | m_StringArgument: 1483 | m_BoolArgument: 0 1484 | m_CallState: 2 1485 | --- !u!1 &1796625707 1486 | GameObject: 1487 | m_ObjectHideFlags: 0 1488 | m_CorrespondingSourceObject: {fileID: 0} 1489 | m_PrefabInstance: {fileID: 0} 1490 | m_PrefabAsset: {fileID: 0} 1491 | serializedVersion: 6 1492 | m_Component: 1493 | - component: {fileID: 1796625708} 1494 | m_Layer: 5 1495 | m_Name: GameObject 1496 | m_TagString: Untagged 1497 | m_Icon: {fileID: 0} 1498 | m_NavMeshLayer: 0 1499 | m_StaticEditorFlags: 0 1500 | m_IsActive: 1 1501 | --- !u!224 &1796625708 1502 | RectTransform: 1503 | m_ObjectHideFlags: 0 1504 | m_CorrespondingSourceObject: {fileID: 0} 1505 | m_PrefabInstance: {fileID: 0} 1506 | m_PrefabAsset: {fileID: 0} 1507 | m_GameObject: {fileID: 1796625707} 1508 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} 1509 | m_LocalPosition: {x: 0, y: 0, z: 0} 1510 | m_LocalScale: {x: 1, y: 1, z: 1} 1511 | m_ConstrainProportionsScale: 0 1512 | m_Children: 1513 | - {fileID: 957591101} 1514 | - {fileID: 1537698027} 1515 | - {fileID: 2048904141} 1516 | - {fileID: 182701253} 1517 | - {fileID: 1626594289} 1518 | - {fileID: 897323543} 1519 | m_Father: {fileID: 150934082} 1520 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1521 | m_AnchorMin: {x: 0.5, y: 0.5} 1522 | m_AnchorMax: {x: 0.5, y: 0.5} 1523 | m_AnchoredPosition: {x: 0, y: 36} 1524 | m_SizeDelta: {x: 100, y: 100} 1525 | m_Pivot: {x: 0.5, y: 0.5} 1526 | --- !u!1 &2048904140 1527 | GameObject: 1528 | m_ObjectHideFlags: 0 1529 | m_CorrespondingSourceObject: {fileID: 0} 1530 | m_PrefabInstance: {fileID: 0} 1531 | m_PrefabAsset: {fileID: 0} 1532 | serializedVersion: 6 1533 | m_Component: 1534 | - component: {fileID: 2048904141} 1535 | - component: {fileID: 2048904143} 1536 | - component: {fileID: 2048904144} 1537 | - component: {fileID: 2048904145} 1538 | - component: {fileID: 2048904142} 1539 | m_Layer: 5 1540 | m_Name: UpdateButton1 1541 | m_TagString: Untagged 1542 | m_Icon: {fileID: 0} 1543 | m_NavMeshLayer: 0 1544 | m_StaticEditorFlags: 0 1545 | m_IsActive: 1 1546 | --- !u!224 &2048904141 1547 | RectTransform: 1548 | m_ObjectHideFlags: 0 1549 | m_CorrespondingSourceObject: {fileID: 0} 1550 | m_PrefabInstance: {fileID: 0} 1551 | m_PrefabAsset: {fileID: 0} 1552 | m_GameObject: {fileID: 2048904140} 1553 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} 1554 | m_LocalPosition: {x: 0, y: 0, z: 0} 1555 | m_LocalScale: {x: 1, y: 1, z: 1} 1556 | m_ConstrainProportionsScale: 0 1557 | m_Children: 1558 | - {fileID: 1126477266} 1559 | m_Father: {fileID: 1796625708} 1560 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 1561 | m_AnchorMin: {x: 0.5, y: 0.5} 1562 | m_AnchorMax: {x: 0.5, y: 0.5} 1563 | m_AnchoredPosition: {x: 0, y: -12.17001} 1564 | m_SizeDelta: {x: 200, y: 30} 1565 | m_Pivot: {x: 0.5, y: 0.5} 1566 | --- !u!114 &2048904142 1567 | MonoBehaviour: 1568 | m_ObjectHideFlags: 0 1569 | m_CorrespondingSourceObject: {fileID: 0} 1570 | m_PrefabInstance: {fileID: 0} 1571 | m_PrefabAsset: {fileID: 0} 1572 | m_GameObject: {fileID: 2048904140} 1573 | m_Enabled: 1 1574 | m_EditorHideFlags: 0 1575 | m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} 1576 | m_Name: 1577 | m_EditorClassIdentifier: 1578 | m_Material: {fileID: 0} 1579 | m_Color: {r: 0.57281953, g: 0.4044118, b: 1, a: 1} 1580 | m_RaycastTarget: 1 1581 | m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} 1582 | m_Maskable: 1 1583 | m_OnCullStateChanged: 1584 | m_PersistentCalls: 1585 | m_Calls: [] 1586 | m_Sprite: {fileID: 0} 1587 | m_Type: 0 1588 | m_PreserveAspect: 0 1589 | m_FillCenter: 1 1590 | m_FillMethod: 4 1591 | m_FillAmount: 1 1592 | m_FillClockwise: 1 1593 | m_FillOrigin: 0 1594 | m_UseSpriteMesh: 0 1595 | m_PixelsPerUnitMultiplier: 1 1596 | --- !u!114 &2048904143 1597 | MonoBehaviour: 1598 | m_ObjectHideFlags: 0 1599 | m_CorrespondingSourceObject: {fileID: 0} 1600 | m_PrefabInstance: {fileID: 0} 1601 | m_PrefabAsset: {fileID: 0} 1602 | m_GameObject: {fileID: 2048904140} 1603 | m_Enabled: 1 1604 | m_EditorHideFlags: 0 1605 | m_Script: {fileID: 11500000, guid: 4ceb14ced64f31740af354d6e86b5f05, type: 3} 1606 | m_Name: 1607 | m_EditorClassIdentifier: 1608 | updateVersion: 1 1609 | messageBox: {fileID: 1369793249} 1610 | --- !u!114 &2048904144 1611 | MonoBehaviour: 1612 | m_ObjectHideFlags: 0 1613 | m_CorrespondingSourceObject: {fileID: 0} 1614 | m_PrefabInstance: {fileID: 0} 1615 | m_PrefabAsset: {fileID: 0} 1616 | m_GameObject: {fileID: 2048904140} 1617 | m_Enabled: 1 1618 | m_EditorHideFlags: 0 1619 | m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} 1620 | m_Name: 1621 | m_EditorClassIdentifier: 1622 | m_Navigation: 1623 | m_Mode: 3 1624 | m_WrapAround: 0 1625 | m_SelectOnUp: {fileID: 0} 1626 | m_SelectOnDown: {fileID: 0} 1627 | m_SelectOnLeft: {fileID: 0} 1628 | m_SelectOnRight: {fileID: 0} 1629 | m_Transition: 1 1630 | m_Colors: 1631 | m_NormalColor: {r: 1, g: 1, b: 1, a: 1} 1632 | m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 1633 | m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} 1634 | m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} 1635 | m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} 1636 | m_ColorMultiplier: 1 1637 | m_FadeDuration: 0.1 1638 | m_SpriteState: 1639 | m_HighlightedSprite: {fileID: 0} 1640 | m_PressedSprite: {fileID: 0} 1641 | m_SelectedSprite: {fileID: 0} 1642 | m_DisabledSprite: {fileID: 0} 1643 | m_AnimationTriggers: 1644 | m_NormalTrigger: Normal 1645 | m_HighlightedTrigger: Highlighted 1646 | m_PressedTrigger: Pressed 1647 | m_SelectedTrigger: Highlighted 1648 | m_DisabledTrigger: Disabled 1649 | m_Interactable: 1 1650 | m_TargetGraphic: {fileID: 2048904142} 1651 | m_OnClick: 1652 | m_PersistentCalls: 1653 | m_Calls: 1654 | - m_Target: {fileID: 2048904143} 1655 | m_TargetAssemblyTypeName: 1656 | m_MethodName: OnClickSetVersion 1657 | m_Mode: 1 1658 | m_Arguments: 1659 | m_ObjectArgument: {fileID: 0} 1660 | m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine 1661 | m_IntArgument: 0 1662 | m_FloatArgument: 0 1663 | m_StringArgument: 1664 | m_BoolArgument: 0 1665 | m_CallState: 2 1666 | --- !u!222 &2048904145 1667 | CanvasRenderer: 1668 | m_ObjectHideFlags: 0 1669 | m_CorrespondingSourceObject: {fileID: 0} 1670 | m_PrefabInstance: {fileID: 0} 1671 | m_PrefabAsset: {fileID: 0} 1672 | m_GameObject: {fileID: 2048904140} 1673 | m_CullTransparentMesh: 0 1674 | --- !u!1660057539 &9223372036854775807 1675 | SceneRoots: 1676 | m_ObjectHideFlags: 0 1677 | m_Roots: 1678 | - {fileID: 150934082} 1679 | - {fileID: 1587549590} 1680 | - {fileID: 821767654} 1681 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Scene/0.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ce9a24f39e901664fb07dac737fa43a8 3 | DefaultImporter: 4 | userData: 5 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Script.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4bc1aa068c1d04f41af987334a8b13aa 3 | folderAsset: yes 4 | DefaultImporter: 5 | userData: 6 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Script/Bootstrap.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using System.Runtime.InteropServices; 4 | using UnityEngine; 5 | 6 | public class Bootstrap 7 | { 8 | #if UNITY_ANDROID && !UNITY_EDITOR 9 | [DllImport("bootstrap")] 10 | public static extern string get_arch_abi(); 11 | 12 | [DllImport("bootstrap")] 13 | public static extern string use_data_dir(string _data_path, string _apk_path); 14 | #else 15 | public static string get_arch_abi() { return "armeabi-v7a"; } 16 | public static string use_data_dir(string _data_path, string _apk_path) { return ""; } 17 | #endif 18 | 19 | public static void reboot_app() 20 | { 21 | using (AndroidJavaClass unity_player = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) 22 | { 23 | AndroidJavaObject current_activity = unity_player.GetStatic("currentActivity"); 24 | 25 | AndroidJavaObject pm = current_activity.Call("getPackageManager"); 26 | AndroidJavaObject intent = pm.Call("getLaunchIntentForPackage", Application.identifier); 27 | //intent.Call("setFlags", 0x20000000);//Intent.FLAG_ACTIVITY_SINGLE_TOP 28 | intent.Call("setFlags", 0x04000000 | 0x00008000 | 0x10000000);//Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK 29 | 30 | AndroidJavaClass pending_intent = new AndroidJavaClass("android.app.PendingIntent"); 31 | AndroidJavaObject content_intent = pending_intent.CallStatic("getActivity", current_activity, 0, intent, 0x8000000); //PendingIntent.FLAG_UPDATE_CURRENT = 134217728 [0x8000000] 32 | AndroidJavaObject alarm_manager = current_activity.Call("getSystemService", "alarm"); 33 | AndroidJavaClass system = new AndroidJavaClass("java.lang.System"); 34 | long current_time = system.CallStatic("currentTimeMillis"); 35 | alarm_manager.Call("set", 1, current_time + 1000, content_intent); // android.app.AlarmManager.RTC = 1 [0x1] 36 | 37 | Debug.LogError("alarm_manager set time " + current_time + 1000); 38 | current_activity.Call("finish"); 39 | 40 | AndroidJavaClass process = new AndroidJavaClass("android.os.Process"); 41 | int pid = process.CallStatic("myPid"); 42 | process.CallStatic("killProcess", pid); 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Script/Bootstrap.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: fbaace970cdd44b4786d599ce96f1272 3 | timeCreated: 1540263679 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Script/RunningArchABIController.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using UnityEngine; 5 | using UnityEngine.EventSystems; 6 | 7 | public class RunningArchABIController : MonoBehaviour { 8 | 9 | // Use this for initialization 10 | void Start () { 11 | UnityEngine.UI.Text archABILabel = GetComponent(); 12 | if (archABILabel != null) { archABILabel.text = "ARCH_ABI: " + Bootstrap.get_arch_abi(); } 13 | } 14 | 15 | 16 | } 17 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Script/RunningArchABIController.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: c69ac0a3860c6ca4983ae3aa80675ff0 3 | timeCreated: 1543458107 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Script/TestStrInScripts.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | using UnityEngine.UI; 5 | 6 | public class TestStrInScripts : MonoBehaviour 7 | { 8 | public Text text; 9 | const string t = "string in scripts: base version"; 10 | 11 | // Start is called before the first frame update 12 | void Start() 13 | { 14 | text.text = t; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Script/TestStrInScripts.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a044a61fa52eda843940b058c3ad11fa 3 | MonoImporter: 4 | externalObjects: {} 5 | serializedVersion: 2 6 | defaultReferences: [] 7 | executionOrder: 0 8 | icon: {instanceID: 0} 9 | userData: 10 | assetBundleName: 11 | assetBundleVariant: 12 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Script/UI.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9d118f47c9857f14c92ea229449efe1f 3 | folderAsset: yes 4 | timeCreated: 1540281624 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Script/UI/MessageBoxUI.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using UnityEngine; 3 | using UnityEngine.UI; 4 | 5 | public class MessageBoxUI : MonoBehaviour 6 | { 7 | public Text message; 8 | public Button button; 9 | public Text buttonText; 10 | 11 | public delegate void OnClickDelegate(); 12 | private OnClickDelegate onClick; 13 | 14 | public void Show(string msgStr, string buttenStr, OnClickDelegate onClick) 15 | { 16 | this.onClick = onClick; 17 | Show(msgStr, buttenStr); 18 | } 19 | 20 | private void Show(string msgStr, string buttenStr) 21 | { 22 | Debug.LogError(msgStr); 23 | message.text = msgStr; 24 | buttonText.enabled = true; 25 | buttonText.text = buttenStr; 26 | gameObject.SetActive(true); 27 | } 28 | 29 | public void OnClick() 30 | { 31 | if (onClick != null) 32 | { 33 | onClick(); 34 | } 35 | } 36 | 37 | public void Close() 38 | { 39 | gameObject.SetActive(false); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Script/UI/MessageBoxUI.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2951416da33e6684f86b155a99db2187 3 | MonoImporter: 4 | serializedVersion: 2 5 | defaultReferences: [] 6 | executionOrder: 0 7 | icon: {instanceID: 0} 8 | userData: 9 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Script/UnityAssetStoreNavigator.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using UnityEngine; 5 | using UnityEngine.EventSystems; 6 | 7 | public class UnityAssetStoreNavigator : MonoBehaviour { 8 | 9 | // Use this for initialization 10 | void Start () { 11 | 12 | } 13 | 14 | public void OnClickOpenURL() 15 | { 16 | Application.OpenURL("http://u3d.as/1mmM"); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Script/UnityAssetStoreNavigator.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5f924dabb0fd2944cb7da86ee73f9b51 3 | timeCreated: 1543459647 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Script/VersionSettor.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using UnityEngine; 5 | using UnityEngine.EventSystems; 6 | 7 | public class VersionSettor : MonoBehaviour { 8 | public int updateVersion = 0; 9 | public MessageBoxUI messageBox; 10 | 11 | public static string ZIP_PATCH_FORMAT { get { return Application.streamingAssetsPath + "/AllAndroidPatchFiles_Version{0}.zip"; } } 12 | public static string RUNTIME_PATCH_PATH_FORMAT { get { return Application.persistentDataPath + "/Version_{0}"; } } 13 | public static string WWW_RUNTIME_PATCH_PATH_FORMAT { get { return "file://" + RUNTIME_PATCH_PATH_FORMAT; } } 14 | 15 | // Use this for initialization 16 | void Start () { 17 | 18 | } 19 | 20 | public void OnClickSetVersion() 21 | { 22 | if (messageBox.gameObject.activeInHierarchy) { return; } 23 | 24 | if (updateVersion <= 0) 25 | { 26 | string error = Bootstrap.use_data_dir("", ""); 27 | if (!string.IsNullOrEmpty(error)) 28 | { 29 | messageBox.Show("use failed. empty path error:" + error, "ok", ()=> { messageBox.Close(); }); 30 | return; 31 | } 32 | 33 | string cacheDir = Application.persistentDataPath + "/il2cpp"; 34 | if (Directory.Exists(cacheDir)) 35 | { 36 | DeleteDirectory(cacheDir); 37 | } 38 | 39 | if (Directory.Exists(cacheDir)) 40 | { 41 | messageBox.Show("failed to delete pre Unity cached file. path:" + cacheDir, "ok", () => { messageBox.Close(); }); 42 | return; 43 | } 44 | StartCoroutine(Restart()); 45 | return; 46 | } 47 | StartCoroutine(PreparePatchAndRestart()); 48 | } 49 | 50 | //----------------------------------------------------------------------------------------------- 51 | 52 | private IEnumerator PreparePatchAndRestart() 53 | { 54 | //1. clear files if exist 55 | string runtimePatchPath = string.Format(RUNTIME_PATCH_PATH_FORMAT, updateVersion); 56 | if (Directory.Exists(runtimePatchPath)) { Directory.Delete(runtimePatchPath, true); } 57 | Directory.CreateDirectory(runtimePatchPath); 58 | 59 | //2. extract files from zip 60 | string zipPatchFile = string.Format(ZIP_PATCH_FORMAT, updateVersion); 61 | WWW zipPatchFileReader = new WWW(zipPatchFile); 62 | while (!zipPatchFileReader.isDone) { yield return null; } 63 | if (zipPatchFileReader.error != null) 64 | { 65 | messageBox.Show("failed to get zip patch file:" + zipPatchFile, "ok", () => { messageBox.Close(); }); 66 | yield break; 67 | } 68 | byte[] zipContent = zipPatchFileReader.bytes; 69 | ZipHelper.UnZipBytes(zipContent, runtimePatchPath, "", true); 70 | 71 | //3. prepare libil2cpp, unzip with name: libil2cpp.so.new 72 | string zipLibil2cppPath = runtimePatchPath + "/lib_" + Bootstrap.get_arch_abi() + "_libil2cpp.so.zip"; 73 | if (!File.Exists(zipLibil2cppPath)) 74 | { 75 | messageBox.Show("file not found:" + zipLibil2cppPath, "ok", () => { messageBox.Close(); }); 76 | yield break; 77 | } 78 | ZipHelper.UnZip(zipLibil2cppPath, runtimePatchPath, "", true); 79 | 80 | //4. tell libboostrap.so to use the right patch after reboot 81 | 82 | //!!!! wrong streamingAssetsPath in Google aab 83 | //jar:file:///data/app/x.x.x/base.apk!/assets/ 84 | //int apkPathStart = Application.streamingAssetsPath.IndexOf("/data"); 85 | //int apkPathEnd = Application.streamingAssetsPath.IndexOf("!"); 86 | //string apkPath = Application.streamingAssetsPath.Substring(apkPathStart,apkPathEnd - apkPathStart); 87 | //if (string.IsNullOrEmpty(apkPath)) 88 | //{ 89 | // messageBox.Show("use failed. apk path not found in [" + Application.streamingAssetsPath + "]", "ok", () => { messageBox.Close(); }); 90 | // yield break; 91 | //} 92 | string apkPath = ""; 93 | string error = Bootstrap.use_data_dir(runtimePatchPath, apkPath); 94 | if (!string.IsNullOrEmpty(error)) 95 | { 96 | messageBox.Show("use failed. path:" + zipLibil2cppPath + ", error:" + error, "ok", () => { messageBox.Close(); }); 97 | yield break; 98 | } 99 | 100 | //5. clear unity cache 101 | string cacheDir = Application.persistentDataPath + "/il2cpp"; 102 | if (Directory.Exists(cacheDir)) { 103 | DeleteDirectory(cacheDir); 104 | } 105 | 106 | if (Directory.Exists(cacheDir)) 107 | { 108 | messageBox.Show("failed to delete pre Unity cached file. path:" + cacheDir, "ok", () => { messageBox.Close(); }); 109 | yield break; 110 | } 111 | 112 | //6. reboot app 113 | yield return StartCoroutine(Restart()); 114 | } 115 | 116 | private IEnumerator Restart() 117 | { 118 | messageBox.Show("The patch is ready.", "Reboot", Bootstrap.reboot_app); 119 | while (true) 120 | { 121 | yield return new WaitForSeconds(0.5f); 122 | } 123 | } 124 | 125 | //----------------------------------------------------------------------------------------------- 126 | 127 | public static void DeleteDirectory(string target_dir) 128 | { 129 | string[] files = Directory.GetFiles(target_dir); 130 | string[] dirs = Directory.GetDirectories(target_dir); 131 | 132 | foreach (string file in files) 133 | { 134 | try 135 | { 136 | Debug.Log("deleting file:" + file); 137 | File.SetAttributes(file, FileAttributes.Normal); 138 | File.Delete(file); 139 | Debug.Log("deleted file:" + file); 140 | } 141 | catch (System.Exception e) 142 | { 143 | Debug.LogException(e); 144 | } 145 | } 146 | 147 | foreach (string dir in dirs) 148 | { 149 | DeleteDirectory(dir); 150 | } 151 | 152 | try 153 | { 154 | Debug.Log("deleting dir:" + target_dir); 155 | Directory.Delete(target_dir, false); 156 | Debug.Log("deleted dir:" + target_dir); 157 | } 158 | catch (System.Exception e) 159 | { 160 | Debug.LogException(e); 161 | } 162 | } 163 | } 164 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/Script/VersionSettor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 4ceb14ced64f31740af354d6e86b5f05 3 | timeCreated: 1539241345 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/ZipLibrary.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 341a0acd45321d449915314038ba41a7 3 | folderAsset: yes 4 | timeCreated: 1540969192 5 | licenseType: Pro 6 | DefaultImporter: 7 | externalObjects: {} 8 | userData: 9 | assetBundleName: 10 | assetBundleVariant: 11 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/ZipLibrary/ICSharpCode.SharpZipLib.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noodle1983/UnityAndroidIl2cppPatchDemo/10a4c303c31c74fa1be8e8305b266f013dd1b5db/Assets/AndroidIl2cppPatchDemo/ZipLibrary/ICSharpCode.SharpZipLib.dll -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/ZipLibrary/ICSharpCode.SharpZipLib.dll.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8c393ee875b6ecc41913b9cfcf4f627d 3 | timeCreated: 1527158537 4 | licenseType: Pro 5 | PluginImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | iconMap: {} 9 | executionOrder: {} 10 | isPreloaded: 0 11 | isOverridable: 0 12 | platformData: 13 | - first: 14 | '': Any 15 | second: 16 | enabled: 0 17 | settings: 18 | Exclude Android: 0 19 | Exclude Editor: 0 20 | Exclude Linux: 1 21 | Exclude Linux64: 1 22 | Exclude LinuxUniversal: 1 23 | Exclude OSXIntel: 1 24 | Exclude OSXIntel64: 1 25 | Exclude OSXUniversal: 1 26 | Exclude Win: 1 27 | Exclude Win64: 1 28 | - first: 29 | Android: Android 30 | second: 31 | enabled: 1 32 | settings: 33 | CPU: ARMv7 34 | - first: 35 | Any: 36 | second: 37 | enabled: 0 38 | settings: {} 39 | - first: 40 | Editor: Editor 41 | second: 42 | enabled: 1 43 | settings: 44 | CPU: AnyCPU 45 | DefaultValueInitialized: true 46 | OS: AnyOS 47 | - first: 48 | Facebook: Win 49 | second: 50 | enabled: 0 51 | settings: 52 | CPU: AnyCPU 53 | - first: 54 | Facebook: Win64 55 | second: 56 | enabled: 0 57 | settings: 58 | CPU: AnyCPU 59 | - first: 60 | Standalone: Linux 61 | second: 62 | enabled: 0 63 | settings: 64 | CPU: x86 65 | - first: 66 | Standalone: Linux64 67 | second: 68 | enabled: 0 69 | settings: 70 | CPU: x86_64 71 | - first: 72 | Standalone: LinuxUniversal 73 | second: 74 | enabled: 0 75 | settings: 76 | CPU: None 77 | - first: 78 | Standalone: OSXIntel 79 | second: 80 | enabled: 0 81 | settings: 82 | CPU: AnyCPU 83 | - first: 84 | Standalone: OSXIntel64 85 | second: 86 | enabled: 0 87 | settings: 88 | CPU: AnyCPU 89 | - first: 90 | Standalone: OSXUniversal 91 | second: 92 | enabled: 0 93 | settings: 94 | CPU: None 95 | - first: 96 | Standalone: Win 97 | second: 98 | enabled: 0 99 | settings: 100 | CPU: AnyCPU 101 | - first: 102 | Standalone: Win64 103 | second: 104 | enabled: 0 105 | settings: 106 | CPU: AnyCPU 107 | - first: 108 | Windows Store Apps: WindowsStoreApps 109 | second: 110 | enabled: 0 111 | settings: 112 | CPU: AnyCPU 113 | userData: 114 | assetBundleName: 115 | assetBundleVariant: 116 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/ZipLibrary/ICSharpCode.SharpZipLib.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noodle1983/UnityAndroidIl2cppPatchDemo/10a4c303c31c74fa1be8e8305b266f013dd1b5db/Assets/AndroidIl2cppPatchDemo/ZipLibrary/ICSharpCode.SharpZipLib.pdb -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/ZipLibrary/ICSharpCode.SharpZipLib.pdb.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2242f09f46d708e4d953adacf75e47e1 3 | DefaultImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/ZipLibrary/ICSharpCode.SharpZipLib.xml.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 583881be29ec2144b8019246e05cba12 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/ZipLibrary/ZipHelper.cs: -------------------------------------------------------------------------------- 1 | #if UNITY_IPHONE 2 | using UnityEngine; 3 | public class ZipHelper 4 | { 5 | public static void ZipFile(string fileToZip, string filePathInZip, string zipedFile, int compressionLevel){Debug.LogError("[ZipHelper](ZipFile)you are in the hell");} 6 | public static void ZipFile(string fileToZip, string zipedFile){ Debug.LogError("[ZipHelper](ZipFile)you are in the hell");} 7 | public static void ZipFileDirectory(string strDirectory, string zipedFile){ Debug.LogError("[ZipHelper](ZipFileDirectory)you are in the hell");} 8 | public static void UnZip(string zipedFile, string strDirectory, string password, bool overWrite){ Debug.LogError("[ZipHelper](UnZip)you are in the hell");} 9 | 10 | } 11 | #else 12 | using ICSharpCode.SharpZipLib.Checksum; 13 | using ICSharpCode.SharpZipLib.Zip; 14 | using System; 15 | using System.IO; 16 | 17 | public class ZipHelper 18 | { 19 | 20 | public static void ZipFile(string fileToZip, string filePathInZip, string zipedFile, int compressionLevel) 21 | { 22 | if (!System.IO.File.Exists(fileToZip)) 23 | { 24 | throw new System.IO.FileNotFoundException("file not exist: " + fileToZip); 25 | } 26 | 27 | using (System.IO.FileStream ZipFile = System.IO.File.Create(zipedFile)) 28 | { 29 | using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile)) 30 | { 31 | using (System.IO.FileStream StreamToZip = new System.IO.FileStream(fileToZip, System.IO.FileMode.Open, System.IO.FileAccess.Read)) 32 | { 33 | ZipEntry ZipEntry = new ZipEntry(filePathInZip); 34 | 35 | ZipStream.PutNextEntry(ZipEntry); 36 | 37 | ZipStream.SetLevel(compressionLevel); 38 | 39 | byte[] buffer = new byte[4096]; 40 | 41 | int sizeRead = 0; 42 | 43 | try 44 | { 45 | do 46 | { 47 | sizeRead = StreamToZip.Read(buffer, 0, buffer.Length); 48 | ZipStream.Write(buffer, 0, sizeRead); 49 | } 50 | while (sizeRead > 0); 51 | } 52 | catch (System.Exception ex) 53 | { 54 | throw ex; 55 | } 56 | 57 | StreamToZip.Close(); 58 | } 59 | 60 | ZipStream.Finish(); 61 | ZipStream.Close(); 62 | } 63 | 64 | ZipFile.Close(); 65 | } 66 | } 67 | 68 | 69 | public static void ZipFile(string fileToZip, string zipedFile) 70 | { 71 | 72 | if (!File.Exists(fileToZip)) 73 | { 74 | throw new System.IO.FileNotFoundException("file not exist: " + fileToZip); 75 | } 76 | 77 | using (FileStream fs = File.OpenRead(fileToZip)) 78 | { 79 | byte[] buffer = new byte[fs.Length]; 80 | fs.Read(buffer, 0, buffer.Length); 81 | fs.Close(); 82 | 83 | using (FileStream ZipFile = File.Create(zipedFile)) 84 | { 85 | using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile)) 86 | { 87 | string fileName = fileToZip.Substring(fileToZip.LastIndexOf("/") + 1); 88 | ZipEntry ZipEntry = new ZipEntry(fileName); 89 | ZipStream.PutNextEntry(ZipEntry); 90 | ZipStream.SetLevel(5); 91 | 92 | ZipStream.Write(buffer, 0, buffer.Length); 93 | ZipStream.Finish(); 94 | ZipStream.Close(); 95 | } 96 | } 97 | } 98 | } 99 | 100 | 101 | public static void ZipFileDirectory(string strDirectory, string zipedFile) 102 | { 103 | using (System.IO.FileStream ZipFile = System.IO.File.Create(zipedFile)) 104 | { 105 | using (ZipOutputStream s = new ZipOutputStream(ZipFile)) 106 | { 107 | ZipSetp(strDirectory, s, ""); 108 | } 109 | } 110 | } 111 | 112 | 113 | private static void ZipSetp(string strDirectory, ZipOutputStream s, string parentPath) 114 | { 115 | if (strDirectory[strDirectory.Length - 1] != Path.DirectorySeparatorChar) 116 | { 117 | strDirectory += Path.DirectorySeparatorChar; 118 | } 119 | Crc32 crc = new Crc32(); 120 | 121 | string[] filenames = Directory.GetFileSystemEntries(strDirectory); 122 | 123 | foreach (string file in filenames) 124 | { 125 | 126 | if (Directory.Exists(file)) 127 | { 128 | string pPath = parentPath; 129 | pPath += file.Substring(file.LastIndexOf("/") + 1); 130 | pPath += "/"; 131 | ZipSetp(file, s, pPath); 132 | } 133 | 134 | else 135 | { 136 | 137 | using (FileStream fs = File.OpenRead(file)) 138 | { 139 | 140 | byte[] buffer = new byte[fs.Length]; 141 | fs.Read(buffer, 0, buffer.Length); 142 | 143 | string fileName = parentPath + file.Substring(file.LastIndexOf("/") + 1); 144 | ZipEntry entry = new ZipEntry(fileName); 145 | 146 | entry.DateTime = DateTime.Now; 147 | entry.Size = fs.Length; 148 | 149 | fs.Close(); 150 | 151 | crc.Reset(); 152 | crc.Update(buffer); 153 | 154 | entry.Crc = crc.Value; 155 | s.PutNextEntry(entry); 156 | 157 | s.Write(buffer, 0, buffer.Length); 158 | } 159 | } 160 | } 161 | } 162 | 163 | 164 | public static void UnZip(string zipedFile, string strDirectory, string password, bool overWrite) 165 | { 166 | 167 | if (strDirectory == "") 168 | strDirectory = Directory.GetCurrentDirectory(); 169 | if (!strDirectory.EndsWith("/")) 170 | strDirectory = strDirectory + "/"; 171 | 172 | using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipedFile))) 173 | { 174 | s.Password = password; 175 | ZipEntry theEntry; 176 | 177 | while ((theEntry = s.GetNextEntry()) != null) 178 | { 179 | string directoryName = ""; 180 | string pathToZip = ""; 181 | pathToZip = theEntry.Name; 182 | 183 | if (pathToZip != "") 184 | directoryName = Path.GetDirectoryName(pathToZip) + "/"; 185 | 186 | string fileName = Path.GetFileName(pathToZip); 187 | 188 | Directory.CreateDirectory(strDirectory + directoryName); 189 | 190 | if (fileName != "") 191 | { 192 | string file_path = strDirectory + directoryName + fileName; 193 | bool is_file_exist = File.Exists(file_path); 194 | if (is_file_exist && !overWrite) 195 | { 196 | continue; 197 | } 198 | 199 | using (FileStream streamWriter = File.Open(strDirectory + directoryName + fileName, FileMode.Create)) 200 | { 201 | int size = 2048; 202 | byte[] data = new byte[2048]; 203 | while (true) 204 | { 205 | size = s.Read(data, 0, data.Length); 206 | 207 | if (size > 0) 208 | streamWriter.Write(data, 0, size); 209 | else 210 | break; 211 | } 212 | streamWriter.Close(); 213 | } 214 | } 215 | } 216 | 217 | s.Close(); 218 | } 219 | } 220 | 221 | public static void UnZipBytes(byte[] zipedContent, string strDirectory, string password, bool overWrite) 222 | { 223 | 224 | if (strDirectory == "") 225 | strDirectory = Directory.GetCurrentDirectory(); 226 | if (!strDirectory.EndsWith("/")) 227 | strDirectory = strDirectory + "/"; 228 | 229 | using (ZipInputStream s = new ZipInputStream(new MemoryStream(zipedContent))) 230 | { 231 | s.Password = password; 232 | ZipEntry theEntry; 233 | 234 | while ((theEntry = s.GetNextEntry()) != null) 235 | { 236 | string directoryName = ""; 237 | string pathToZip = ""; 238 | pathToZip = theEntry.Name; 239 | 240 | if (pathToZip != "") 241 | directoryName = Path.GetDirectoryName(pathToZip) + "/"; 242 | 243 | string fileName = Path.GetFileName(pathToZip); 244 | 245 | Directory.CreateDirectory(strDirectory + directoryName); 246 | 247 | if (fileName != "") 248 | { 249 | string file_path = strDirectory + directoryName + fileName; 250 | bool is_file_exist = File.Exists(file_path); 251 | if (is_file_exist && !overWrite) 252 | { 253 | continue; 254 | } 255 | 256 | using (FileStream streamWriter = File.Open(strDirectory + directoryName + fileName, FileMode.Create)) 257 | { 258 | int size = 2048; 259 | byte[] data = new byte[2048]; 260 | while (true) 261 | { 262 | size = s.Read(data, 0, data.Length); 263 | 264 | if (size > 0) 265 | streamWriter.Write(data, 0, size); 266 | else 267 | break; 268 | } 269 | streamWriter.Close(); 270 | } 271 | } 272 | } 273 | 274 | s.Close(); 275 | } 276 | } 277 | 278 | } 279 | #endif -------------------------------------------------------------------------------- /Assets/AndroidIl2cppPatchDemo/ZipLibrary/ZipHelper.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: a47c8d5bf39c57f438a05121618d67db 3 | timeCreated: 1527158704 4 | licenseType: Pro 5 | MonoImporter: 6 | externalObjects: {} 7 | serializedVersion: 2 8 | defaultReferences: [] 9 | executionOrder: 0 10 | icon: {instanceID: 0} 11 | userData: 12 | assetBundleName: 13 | assetBundleVariant: 14 | -------------------------------------------------------------------------------- /Assets/Others.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: ad183055410ee57498ee5b3f88942c1d 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Others/Script.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: d1b513f5e47e0c4488213aec8823da31 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Resources.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9ed886b3890f9df4d889ef3d844b1a47 3 | folderAsset: yes 4 | DefaultImporter: 5 | externalObjects: {} 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/Resources/BillingMode.json: -------------------------------------------------------------------------------- 1 | {"androidStore":"GooglePlay"} -------------------------------------------------------------------------------- /Assets/Resources/BillingMode.json.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5f24e51202825654cbd8772beb5812c9 3 | TextScriptImporter: 4 | externalObjects: {} 5 | userData: 6 | assetBundleName: 7 | assetBundleVariant: 8 | -------------------------------------------------------------------------------- /Packages/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "com.unity.2d.sprite": "1.0.0", 4 | "com.unity.2d.tilemap": "1.0.0", 5 | "com.unity.ai.navigation": "1.1.5", 6 | "com.unity.analytics": "3.8.1", 7 | "com.unity.collab-proxy": "2.2.0", 8 | "com.unity.ide.rider": "3.0.27", 9 | "com.unity.ide.visualstudio": "2.0.22", 10 | "com.unity.ide.vscode": "1.2.5", 11 | "com.unity.purchasing": "4.12.2", 12 | "com.unity.test-framework": "1.1.33", 13 | "com.unity.textmeshpro": "3.0.6", 14 | "com.unity.timeline": "1.7.6", 15 | "com.unity.ugui": "1.0.0", 16 | "com.unity.xr.legacyinputhelpers": "2.1.10", 17 | "com.unity.modules.ai": "1.0.0", 18 | "com.unity.modules.androidjni": "1.0.0", 19 | "com.unity.modules.animation": "1.0.0", 20 | "com.unity.modules.assetbundle": "1.0.0", 21 | "com.unity.modules.audio": "1.0.0", 22 | "com.unity.modules.cloth": "1.0.0", 23 | "com.unity.modules.director": "1.0.0", 24 | "com.unity.modules.imageconversion": "1.0.0", 25 | "com.unity.modules.imgui": "1.0.0", 26 | "com.unity.modules.jsonserialize": "1.0.0", 27 | "com.unity.modules.particlesystem": "1.0.0", 28 | "com.unity.modules.physics": "1.0.0", 29 | "com.unity.modules.physics2d": "1.0.0", 30 | "com.unity.modules.screencapture": "1.0.0", 31 | "com.unity.modules.terrain": "1.0.0", 32 | "com.unity.modules.terrainphysics": "1.0.0", 33 | "com.unity.modules.tilemap": "1.0.0", 34 | "com.unity.modules.ui": "1.0.0", 35 | "com.unity.modules.uielements": "1.0.0", 36 | "com.unity.modules.umbra": "1.0.0", 37 | "com.unity.modules.unityanalytics": "1.0.0", 38 | "com.unity.modules.unitywebrequest": "1.0.0", 39 | "com.unity.modules.unitywebrequestwww": "1.0.0", 40 | "com.unity.modules.vehicles": "1.0.0", 41 | "com.unity.modules.video": "1.0.0", 42 | "com.unity.modules.vr": "1.0.0", 43 | "com.unity.modules.wind": "1.0.0", 44 | "com.unity.modules.xr": "1.0.0" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /ProjectSettings/AudioManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!11 &1 4 | AudioManager: 5 | m_ObjectHideFlags: 0 6 | m_Volume: 1 7 | Rolloff Scale: 1 8 | Doppler Factor: 1 9 | Default Speaker Mode: 2 10 | m_SampleRate: 0 11 | m_DSPBufferSize: 0 12 | m_VirtualVoiceCount: 512 13 | m_RealVoiceCount: 32 14 | m_SpatializerPlugin: 15 | m_AmbisonicDecoderPlugin: 16 | m_DisableAudio: 0 17 | m_VirtualizeEffects: 1 18 | -------------------------------------------------------------------------------- /ProjectSettings/ClusterInputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!236 &1 4 | ClusterInputManager: 5 | m_ObjectHideFlags: 0 6 | m_Inputs: [] 7 | -------------------------------------------------------------------------------- /ProjectSettings/DynamicsManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!55 &1 4 | PhysicsManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 3 7 | m_Gravity: {x: 0, y: -9.81, z: 0} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_BounceThreshold: 2 10 | m_SleepThreshold: 0.005 11 | m_DefaultContactOffset: 0.01 12 | m_DefaultSolverIterations: 6 13 | m_DefaultSolverVelocityIterations: 1 14 | m_QueriesHitBackfaces: 0 15 | m_QueriesHitTriggers: 1 16 | m_EnableAdaptiveForce: 0 17 | m_EnablePCM: 1 18 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 19 | m_AutoSimulation: 1 20 | m_AutoSyncTransforms: 1 21 | -------------------------------------------------------------------------------- /ProjectSettings/EditorBuildSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!1045 &1 4 | EditorBuildSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Scenes: [] 8 | -------------------------------------------------------------------------------- /ProjectSettings/EditorSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!159 &1 4 | EditorSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 9 7 | m_ExternalVersionControlSupport: Hidden Meta Files 8 | m_SerializationMode: 2 9 | m_LineEndingsForNewScripts: 1 10 | m_DefaultBehaviorMode: 0 11 | m_PrefabRegularEnvironment: {fileID: 0} 12 | m_PrefabUIEnvironment: {fileID: 0} 13 | m_SpritePackerMode: 0 14 | m_SpritePackerPaddingPower: 1 15 | m_EtcTextureCompressorBehavior: 1 16 | m_EtcTextureFastCompressor: 1 17 | m_EtcTextureNormalCompressor: 2 18 | m_EtcTextureBestCompressor: 4 19 | m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmref 20 | m_ProjectGenerationRootNamespace: 21 | m_CollabEditorSettings: 22 | inProgressEnabled: 1 23 | m_EnableTextureStreamingInEditMode: 1 24 | m_EnableTextureStreamingInPlayMode: 1 25 | m_AsyncShaderCompilation: 1 26 | m_EnterPlayModeOptionsEnabled: 0 27 | m_EnterPlayModeOptions: 3 28 | m_ShowLightmapResolutionOverlay: 1 29 | m_UseLegacyProbeSampleCount: 1 30 | m_AssetPipelineMode: 1 31 | m_CacheServerMode: 0 32 | m_CacheServerEndpoint: 33 | m_CacheServerNamespacePrefix: default 34 | m_CacheServerEnableDownload: 1 35 | m_CacheServerEnableUpload: 1 36 | -------------------------------------------------------------------------------- /ProjectSettings/GraphicsSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!30 &1 4 | GraphicsSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 13 7 | m_Deferred: 8 | m_Mode: 1 9 | m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} 10 | m_DeferredReflections: 11 | m_Mode: 1 12 | m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} 13 | m_ScreenSpaceShadows: 14 | m_Mode: 1 15 | m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} 16 | m_LegacyDeferred: 17 | m_Mode: 1 18 | m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} 19 | m_DepthNormals: 20 | m_Mode: 1 21 | m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} 22 | m_MotionVectors: 23 | m_Mode: 1 24 | m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} 25 | m_LightHalo: 26 | m_Mode: 1 27 | m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} 28 | m_LensFlare: 29 | m_Mode: 1 30 | m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} 31 | m_AlwaysIncludedShaders: 32 | - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} 33 | - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} 34 | - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} 35 | - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} 36 | - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} 37 | - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} 38 | - {fileID: 16000, guid: 0000000000000000f000000000000000, type: 0} 39 | - {fileID: 17000, guid: 0000000000000000f000000000000000, type: 0} 40 | - {fileID: 16001, guid: 0000000000000000f000000000000000, type: 0} 41 | - {fileID: 16003, guid: 0000000000000000f000000000000000, type: 0} 42 | m_PreloadedShaders: [] 43 | m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, 44 | type: 0} 45 | m_CustomRenderPipeline: {fileID: 0} 46 | m_TransparencySortMode: 0 47 | m_TransparencySortAxis: {x: 0, y: 0, z: 1} 48 | m_DefaultRenderingPath: 1 49 | m_DefaultMobileRenderingPath: 1 50 | m_TierSettings: [] 51 | m_LightmapStripping: 0 52 | m_FogStripping: 0 53 | m_InstancingStripping: 0 54 | m_LightmapKeepPlain: 1 55 | m_LightmapKeepDirCombined: 1 56 | m_LightmapKeepDynamicPlain: 1 57 | m_LightmapKeepDynamicDirCombined: 1 58 | m_LightmapKeepShadowMask: 1 59 | m_LightmapKeepSubtractive: 1 60 | m_FogKeepLinear: 1 61 | m_FogKeepExp: 1 62 | m_FogKeepExp2: 1 63 | m_AlbedoSwatchInfos: [] 64 | m_LightsUseLinearIntensity: 0 65 | m_LightsUseColorTemperature: 0 66 | m_LogWhenShaderIsCompiled: 0 67 | m_AllowEnlightenSupportForUpgradedProject: 1 68 | -------------------------------------------------------------------------------- /ProjectSettings/InputManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!13 &1 4 | InputManager: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | m_Axes: 8 | - serializedVersion: 3 9 | m_Name: Horizontal 10 | descriptiveName: 11 | descriptiveNegativeName: 12 | negativeButton: left 13 | positiveButton: right 14 | altNegativeButton: a 15 | altPositiveButton: d 16 | gravity: 3 17 | dead: 0.001 18 | sensitivity: 3 19 | snap: 1 20 | invert: 0 21 | type: 0 22 | axis: 0 23 | joyNum: 0 24 | - serializedVersion: 3 25 | m_Name: Vertical 26 | descriptiveName: 27 | descriptiveNegativeName: 28 | negativeButton: down 29 | positiveButton: up 30 | altNegativeButton: s 31 | altPositiveButton: w 32 | gravity: 3 33 | dead: 0.001 34 | sensitivity: 3 35 | snap: 1 36 | invert: 0 37 | type: 0 38 | axis: 0 39 | joyNum: 0 40 | - serializedVersion: 3 41 | m_Name: Fire1 42 | descriptiveName: 43 | descriptiveNegativeName: 44 | negativeButton: 45 | positiveButton: left ctrl 46 | altNegativeButton: 47 | altPositiveButton: mouse 0 48 | gravity: 1000 49 | dead: 0.001 50 | sensitivity: 1000 51 | snap: 0 52 | invert: 0 53 | type: 0 54 | axis: 0 55 | joyNum: 0 56 | - serializedVersion: 3 57 | m_Name: Fire2 58 | descriptiveName: 59 | descriptiveNegativeName: 60 | negativeButton: 61 | positiveButton: left alt 62 | altNegativeButton: 63 | altPositiveButton: mouse 1 64 | gravity: 1000 65 | dead: 0.001 66 | sensitivity: 1000 67 | snap: 0 68 | invert: 0 69 | type: 0 70 | axis: 0 71 | joyNum: 0 72 | - serializedVersion: 3 73 | m_Name: Fire3 74 | descriptiveName: 75 | descriptiveNegativeName: 76 | negativeButton: 77 | positiveButton: left shift 78 | altNegativeButton: 79 | altPositiveButton: mouse 2 80 | gravity: 1000 81 | dead: 0.001 82 | sensitivity: 1000 83 | snap: 0 84 | invert: 0 85 | type: 0 86 | axis: 0 87 | joyNum: 0 88 | - serializedVersion: 3 89 | m_Name: Jump 90 | descriptiveName: 91 | descriptiveNegativeName: 92 | negativeButton: 93 | positiveButton: space 94 | altNegativeButton: 95 | altPositiveButton: 96 | gravity: 1000 97 | dead: 0.001 98 | sensitivity: 1000 99 | snap: 0 100 | invert: 0 101 | type: 0 102 | axis: 0 103 | joyNum: 0 104 | - serializedVersion: 3 105 | m_Name: Mouse X 106 | descriptiveName: 107 | descriptiveNegativeName: 108 | negativeButton: 109 | positiveButton: 110 | altNegativeButton: 111 | altPositiveButton: 112 | gravity: 0 113 | dead: 0 114 | sensitivity: 0.1 115 | snap: 0 116 | invert: 0 117 | type: 1 118 | axis: 0 119 | joyNum: 0 120 | - serializedVersion: 3 121 | m_Name: Mouse Y 122 | descriptiveName: 123 | descriptiveNegativeName: 124 | negativeButton: 125 | positiveButton: 126 | altNegativeButton: 127 | altPositiveButton: 128 | gravity: 0 129 | dead: 0 130 | sensitivity: 0.1 131 | snap: 0 132 | invert: 0 133 | type: 1 134 | axis: 1 135 | joyNum: 0 136 | - serializedVersion: 3 137 | m_Name: Mouse ScrollWheel 138 | descriptiveName: 139 | descriptiveNegativeName: 140 | negativeButton: 141 | positiveButton: 142 | altNegativeButton: 143 | altPositiveButton: 144 | gravity: 0 145 | dead: 0 146 | sensitivity: 0.1 147 | snap: 0 148 | invert: 0 149 | type: 1 150 | axis: 2 151 | joyNum: 0 152 | - serializedVersion: 3 153 | m_Name: Horizontal 154 | descriptiveName: 155 | descriptiveNegativeName: 156 | negativeButton: 157 | positiveButton: 158 | altNegativeButton: 159 | altPositiveButton: 160 | gravity: 0 161 | dead: 0.19 162 | sensitivity: 1 163 | snap: 0 164 | invert: 0 165 | type: 2 166 | axis: 0 167 | joyNum: 0 168 | - serializedVersion: 3 169 | m_Name: Vertical 170 | descriptiveName: 171 | descriptiveNegativeName: 172 | negativeButton: 173 | positiveButton: 174 | altNegativeButton: 175 | altPositiveButton: 176 | gravity: 0 177 | dead: 0.19 178 | sensitivity: 1 179 | snap: 0 180 | invert: 1 181 | type: 2 182 | axis: 1 183 | joyNum: 0 184 | - serializedVersion: 3 185 | m_Name: Fire1 186 | descriptiveName: 187 | descriptiveNegativeName: 188 | negativeButton: 189 | positiveButton: joystick button 0 190 | altNegativeButton: 191 | altPositiveButton: 192 | gravity: 1000 193 | dead: 0.001 194 | sensitivity: 1000 195 | snap: 0 196 | invert: 0 197 | type: 0 198 | axis: 0 199 | joyNum: 0 200 | - serializedVersion: 3 201 | m_Name: Fire2 202 | descriptiveName: 203 | descriptiveNegativeName: 204 | negativeButton: 205 | positiveButton: joystick button 1 206 | altNegativeButton: 207 | altPositiveButton: 208 | gravity: 1000 209 | dead: 0.001 210 | sensitivity: 1000 211 | snap: 0 212 | invert: 0 213 | type: 0 214 | axis: 0 215 | joyNum: 0 216 | - serializedVersion: 3 217 | m_Name: Fire3 218 | descriptiveName: 219 | descriptiveNegativeName: 220 | negativeButton: 221 | positiveButton: joystick button 2 222 | altNegativeButton: 223 | altPositiveButton: 224 | gravity: 1000 225 | dead: 0.001 226 | sensitivity: 1000 227 | snap: 0 228 | invert: 0 229 | type: 0 230 | axis: 0 231 | joyNum: 0 232 | - serializedVersion: 3 233 | m_Name: Jump 234 | descriptiveName: 235 | descriptiveNegativeName: 236 | negativeButton: 237 | positiveButton: joystick button 3 238 | altNegativeButton: 239 | altPositiveButton: 240 | gravity: 1000 241 | dead: 0.001 242 | sensitivity: 1000 243 | snap: 0 244 | invert: 0 245 | type: 0 246 | axis: 0 247 | joyNum: 0 248 | - serializedVersion: 3 249 | m_Name: Submit 250 | descriptiveName: 251 | descriptiveNegativeName: 252 | negativeButton: 253 | positiveButton: return 254 | altNegativeButton: 255 | altPositiveButton: joystick button 0 256 | gravity: 1000 257 | dead: 0.001 258 | sensitivity: 1000 259 | snap: 0 260 | invert: 0 261 | type: 0 262 | axis: 0 263 | joyNum: 0 264 | - serializedVersion: 3 265 | m_Name: Submit 266 | descriptiveName: 267 | descriptiveNegativeName: 268 | negativeButton: 269 | positiveButton: enter 270 | altNegativeButton: 271 | altPositiveButton: space 272 | gravity: 1000 273 | dead: 0.001 274 | sensitivity: 1000 275 | snap: 0 276 | invert: 0 277 | type: 0 278 | axis: 0 279 | joyNum: 0 280 | - serializedVersion: 3 281 | m_Name: Cancel 282 | descriptiveName: 283 | descriptiveNegativeName: 284 | negativeButton: 285 | positiveButton: escape 286 | altNegativeButton: 287 | altPositiveButton: joystick button 1 288 | gravity: 1000 289 | dead: 0.001 290 | sensitivity: 1000 291 | snap: 0 292 | invert: 0 293 | type: 0 294 | axis: 0 295 | joyNum: 0 296 | -------------------------------------------------------------------------------- /ProjectSettings/NavMeshAreas.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!126 &1 4 | NavMeshProjectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 2 7 | areas: 8 | - name: Walkable 9 | cost: 1 10 | - name: Not Walkable 11 | cost: 1 12 | - name: Jump 13 | cost: 2 14 | - name: 15 | cost: 1 16 | - name: 17 | cost: 1 18 | - name: 19 | cost: 1 20 | - name: 21 | cost: 1 22 | - name: 23 | cost: 1 24 | - name: 25 | cost: 1 26 | - name: 27 | cost: 1 28 | - name: 29 | cost: 1 30 | - name: 31 | cost: 1 32 | - name: 33 | cost: 1 34 | - name: 35 | cost: 1 36 | - name: 37 | cost: 1 38 | - name: 39 | cost: 1 40 | - name: 41 | cost: 1 42 | - name: 43 | cost: 1 44 | - name: 45 | cost: 1 46 | - name: 47 | cost: 1 48 | - name: 49 | cost: 1 50 | - name: 51 | cost: 1 52 | - name: 53 | cost: 1 54 | - name: 55 | cost: 1 56 | - name: 57 | cost: 1 58 | - name: 59 | cost: 1 60 | - name: 61 | cost: 1 62 | - name: 63 | cost: 1 64 | - name: 65 | cost: 1 66 | - name: 67 | cost: 1 68 | - name: 69 | cost: 1 70 | - name: 71 | cost: 1 72 | m_LastAgentTypeID: -887442657 73 | m_Settings: 74 | - serializedVersion: 2 75 | agentTypeID: 0 76 | agentRadius: 0.5 77 | agentHeight: 2 78 | agentSlope: 45 79 | agentClimb: 0.75 80 | ledgeDropHeight: 0 81 | maxJumpAcrossDistance: 0 82 | minRegionArea: 2 83 | manualCellSize: 0 84 | cellSize: 0.16666667 85 | manualTileSize: 0 86 | tileSize: 256 87 | accuratePlacement: 0 88 | debug: 89 | m_Flags: 0 90 | m_SettingNames: 91 | - Humanoid 92 | -------------------------------------------------------------------------------- /ProjectSettings/NetworkManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!149 &1 4 | NetworkManager: 5 | m_ObjectHideFlags: 0 6 | m_DebugLevel: 0 7 | m_Sendrate: 15 8 | m_AssetToPrefab: {} 9 | -------------------------------------------------------------------------------- /ProjectSettings/Physics2DSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!19 &1 4 | Physics2DSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 3 7 | m_Gravity: {x: 0, y: -9.81} 8 | m_DefaultMaterial: {fileID: 0} 9 | m_VelocityIterations: 8 10 | m_PositionIterations: 3 11 | m_VelocityThreshold: 1 12 | m_MaxLinearCorrection: 0.2 13 | m_MaxAngularCorrection: 8 14 | m_MaxTranslationSpeed: 100 15 | m_MaxRotationSpeed: 360 16 | m_BaumgarteScale: 0.2 17 | m_BaumgarteTimeOfImpactScale: 0.75 18 | m_TimeToSleep: 0.5 19 | m_LinearSleepTolerance: 0.01 20 | m_AngularSleepTolerance: 2 21 | m_DefaultContactOffset: 0.01 22 | m_AutoSimulation: 1 23 | m_QueriesHitTriggers: 1 24 | m_QueriesStartInColliders: 1 25 | m_ChangeStopsCallbacks: 0 26 | m_CallbacksOnDisable: 1 27 | m_AutoSyncTransforms: 1 28 | m_AlwaysShowColliders: 0 29 | m_ShowColliderSleep: 1 30 | m_ShowColliderContacts: 0 31 | m_ShowColliderAABB: 0 32 | m_ContactArrowScale: 0.2 33 | m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} 34 | m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} 35 | m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} 36 | m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} 37 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 38 | -------------------------------------------------------------------------------- /ProjectSettings/ProjectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!129 &1 4 | PlayerSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 26 7 | productGUID: 19ecc7c7850bc3f48a2232de05a62cce 8 | AndroidProfiler: 0 9 | AndroidFilterTouchesWhenObscured: 0 10 | AndroidEnableSustainedPerformanceMode: 0 11 | defaultScreenOrientation: 4 12 | targetDevice: 2 13 | useOnDemandResources: 0 14 | accelerometerFrequency: 60 15 | companyName: noodle1983 16 | productName: UnityAndroidIl2cppPatchDemo 17 | defaultCursor: {fileID: 0} 18 | cursorHotspot: {x: 0, y: 0} 19 | m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} 20 | m_ShowUnitySplashScreen: 1 21 | m_ShowUnitySplashLogo: 1 22 | m_SplashScreenOverlayOpacity: 1 23 | m_SplashScreenAnimation: 1 24 | m_SplashScreenLogoStyle: 1 25 | m_SplashScreenDrawMode: 0 26 | m_SplashScreenBackgroundAnimationZoom: 1 27 | m_SplashScreenLogoAnimationZoom: 1 28 | m_SplashScreenBackgroundLandscapeAspect: 1 29 | m_SplashScreenBackgroundPortraitAspect: 1 30 | m_SplashScreenBackgroundLandscapeUvs: 31 | serializedVersion: 2 32 | x: 0 33 | y: 0 34 | width: 1 35 | height: 1 36 | m_SplashScreenBackgroundPortraitUvs: 37 | serializedVersion: 2 38 | x: 0 39 | y: 0 40 | width: 1 41 | height: 1 42 | m_SplashScreenLogos: [] 43 | m_VirtualRealitySplashScreen: {fileID: 0} 44 | m_HolographicTrackingLossScreen: {fileID: 0} 45 | defaultScreenWidth: 1024 46 | defaultScreenHeight: 768 47 | defaultScreenWidthWeb: 960 48 | defaultScreenHeightWeb: 600 49 | m_StereoRenderingPath: 0 50 | m_ActiveColorSpace: 0 51 | unsupportedMSAAFallback: 0 52 | m_SpriteBatchVertexThreshold: 300 53 | m_MTRendering: 1 54 | mipStripping: 0 55 | numberOfMipsStripped: 0 56 | numberOfMipsStrippedPerMipmapLimitGroup: {} 57 | m_StackTraceTypes: 010000000100000001000000010000000100000001000000 58 | iosShowActivityIndicatorOnLoading: -1 59 | androidShowActivityIndicatorOnLoading: -1 60 | iosUseCustomAppBackgroundBehavior: 0 61 | allowedAutorotateToPortrait: 1 62 | allowedAutorotateToPortraitUpsideDown: 1 63 | allowedAutorotateToLandscapeRight: 1 64 | allowedAutorotateToLandscapeLeft: 1 65 | useOSAutorotation: 1 66 | use32BitDisplayBuffer: 1 67 | preserveFramebufferAlpha: 0 68 | disableDepthAndStencilBuffers: 0 69 | androidStartInFullscreen: 1 70 | androidRenderOutsideSafeArea: 0 71 | androidUseSwappy: 0 72 | androidBlitType: 0 73 | androidResizableWindow: 0 74 | androidDefaultWindowWidth: 1920 75 | androidDefaultWindowHeight: 1080 76 | androidMinimumWindowWidth: 400 77 | androidMinimumWindowHeight: 300 78 | androidFullscreenMode: 1 79 | androidAutoRotationBehavior: 1 80 | defaultIsNativeResolution: 1 81 | macRetinaSupport: 1 82 | runInBackground: 0 83 | captureSingleScreen: 0 84 | muteOtherAudioSources: 0 85 | Prepare IOS For Recording: 0 86 | Force IOS Speakers When Recording: 0 87 | deferSystemGesturesMode: 0 88 | hideHomeButton: 0 89 | submitAnalytics: 1 90 | usePlayerLog: 1 91 | dedicatedServerOptimizations: 0 92 | bakeCollisionMeshes: 0 93 | forceSingleInstance: 0 94 | useFlipModelSwapchain: 1 95 | resizableWindow: 0 96 | useMacAppStoreValidation: 0 97 | macAppStoreCategory: public.app-category.games 98 | gpuSkinning: 0 99 | xboxPIXTextureCapture: 0 100 | xboxEnableAvatar: 0 101 | xboxEnableKinect: 0 102 | xboxEnableKinectAutoTracking: 0 103 | xboxEnableFitness: 0 104 | visibleInBackground: 1 105 | allowFullscreenSwitch: 1 106 | fullscreenMode: 1 107 | xboxSpeechDB: 0 108 | xboxEnableHeadOrientation: 0 109 | xboxEnableGuest: 0 110 | xboxEnablePIXSampling: 0 111 | metalFramebufferOnly: 0 112 | xboxOneResolution: 0 113 | xboxOneSResolution: 0 114 | xboxOneXResolution: 3 115 | xboxOneMonoLoggingLevel: 0 116 | xboxOneLoggingLevel: 1 117 | xboxOneDisableEsram: 0 118 | xboxOneEnableTypeOptimization: 0 119 | xboxOnePresentImmediateThreshold: 0 120 | switchQueueCommandMemory: 1048576 121 | switchQueueControlMemory: 16384 122 | switchQueueComputeMemory: 262144 123 | switchNVNShaderPoolsGranularity: 33554432 124 | switchNVNDefaultPoolsGranularity: 16777216 125 | switchNVNOtherPoolsGranularity: 16777216 126 | switchGpuScratchPoolGranularity: 2097152 127 | switchAllowGpuScratchShrinking: 0 128 | switchNVNMaxPublicTextureIDCount: 0 129 | switchNVNMaxPublicSamplerIDCount: 0 130 | switchNVNGraphicsFirmwareMemory: 32 131 | switchMaxWorkerMultiple: 8 132 | stadiaPresentMode: 0 133 | stadiaTargetFramerate: 0 134 | vulkanNumSwapchainBuffers: 3 135 | vulkanEnableSetSRGBWrite: 0 136 | vulkanEnablePreTransform: 0 137 | vulkanEnableLateAcquireNextImage: 0 138 | vulkanEnableCommandBufferRecycling: 1 139 | loadStoreDebugModeEnabled: 0 140 | visionOSBundleVersion: 1.0 141 | tvOSBundleVersion: 1.0 142 | bundleVersion: 1.1 143 | preloadedAssets: [] 144 | metroInputSource: 0 145 | wsaTransparentSwapchain: 0 146 | m_HolographicPauseOnTrackingLoss: 1 147 | xboxOneDisableKinectGpuReservation: 0 148 | xboxOneEnable7thCore: 0 149 | vrSettings: 150 | enable360StereoCapture: 0 151 | isWsaHolographicRemotingEnabled: 0 152 | enableFrameTimingStats: 0 153 | enableOpenGLProfilerGPURecorders: 1 154 | allowHDRDisplaySupport: 0 155 | useHDRDisplay: 0 156 | hdrBitDepth: 0 157 | m_ColorGamuts: 00000000 158 | targetPixelDensity: 30 159 | resolutionScalingMode: 0 160 | resetResolutionOnWindowResize: 0 161 | androidSupportedAspectRatio: 1 162 | androidMaxAspectRatio: 2.1 163 | applicationIdentifier: 164 | Android: cn.noodle1983.unitypatchdemo 165 | Standalone: cn.noodle1983.unitypatchdemo 166 | buildNumber: 167 | Standalone: 0 168 | VisionOS: 0 169 | iPhone: 0 170 | tvOS: 0 171 | overrideDefaultApplicationIdentifier: 1 172 | AndroidBundleVersionCode: 2 173 | AndroidMinSdkVersion: 22 174 | AndroidTargetSdkVersion: 0 175 | AndroidPreferredInstallLocation: 1 176 | aotOptions: 177 | stripEngineCode: 0 178 | iPhoneStrippingLevel: 0 179 | iPhoneScriptCallOptimization: 0 180 | ForceInternetPermission: 0 181 | ForceSDCardPermission: 0 182 | CreateWallpaper: 0 183 | APKExpansionFiles: 0 184 | keepLoadedShadersAlive: 0 185 | StripUnusedMeshComponents: 0 186 | strictShaderVariantMatching: 0 187 | VertexChannelCompressionMask: 214 188 | iPhoneSdkVersion: 988 189 | iOSTargetOSVersionString: 12.0 190 | tvOSSdkVersion: 0 191 | tvOSRequireExtendedGameController: 0 192 | tvOSTargetOSVersionString: 12.0 193 | VisionOSSdkVersion: 0 194 | VisionOSTargetOSVersionString: 1.0 195 | uIPrerenderedIcon: 0 196 | uIRequiresPersistentWiFi: 0 197 | uIRequiresFullScreen: 1 198 | uIStatusBarHidden: 1 199 | uIExitOnSuspend: 0 200 | uIStatusBarStyle: 0 201 | appleTVSplashScreen: {fileID: 0} 202 | appleTVSplashScreen2x: {fileID: 0} 203 | tvOSSmallIconLayers: [] 204 | tvOSSmallIconLayers2x: [] 205 | tvOSLargeIconLayers: [] 206 | tvOSLargeIconLayers2x: [] 207 | tvOSTopShelfImageLayers: [] 208 | tvOSTopShelfImageLayers2x: [] 209 | tvOSTopShelfImageWideLayers: [] 210 | tvOSTopShelfImageWideLayers2x: [] 211 | iOSLaunchScreenType: 0 212 | iOSLaunchScreenPortrait: {fileID: 0} 213 | iOSLaunchScreenLandscape: {fileID: 0} 214 | iOSLaunchScreenBackgroundColor: 215 | serializedVersion: 2 216 | rgba: 0 217 | iOSLaunchScreenFillPct: 100 218 | iOSLaunchScreenSize: 100 219 | iOSLaunchScreenCustomXibPath: 220 | iOSLaunchScreeniPadType: 0 221 | iOSLaunchScreeniPadImage: {fileID: 0} 222 | iOSLaunchScreeniPadBackgroundColor: 223 | serializedVersion: 2 224 | rgba: 0 225 | iOSLaunchScreeniPadFillPct: 100 226 | iOSLaunchScreeniPadSize: 100 227 | iOSLaunchScreeniPadCustomXibPath: 228 | iOSLaunchScreenCustomStoryboardPath: 229 | iOSLaunchScreeniPadCustomStoryboardPath: 230 | iOSDeviceRequirements: [] 231 | iOSURLSchemes: [] 232 | macOSURLSchemes: [] 233 | iOSBackgroundModes: 0 234 | iOSMetalForceHardShadows: 0 235 | metalEditorSupport: 1 236 | metalAPIValidation: 1 237 | iOSRenderExtraFrameOnPause: 0 238 | iosCopyPluginsCodeInsteadOfSymlink: 0 239 | appleDeveloperTeamID: 240 | iOSManualSigningProvisioningProfileID: 241 | tvOSManualSigningProvisioningProfileID: 242 | VisionOSManualSigningProvisioningProfileID: 243 | iOSManualSigningProvisioningProfileType: 0 244 | tvOSManualSigningProvisioningProfileType: 0 245 | VisionOSManualSigningProvisioningProfileType: 0 246 | appleEnableAutomaticSigning: 0 247 | iOSRequireARKit: 0 248 | iOSAutomaticallyDetectAndAddCapabilities: 1 249 | appleEnableProMotion: 0 250 | shaderPrecisionModel: 0 251 | clonedFromGUID: 00000000000000000000000000000000 252 | templatePackageId: 253 | templateDefaultScene: 254 | useCustomMainManifest: 0 255 | useCustomLauncherManifest: 0 256 | useCustomMainGradleTemplate: 0 257 | useCustomLauncherGradleManifest: 0 258 | useCustomBaseGradleTemplate: 0 259 | useCustomGradlePropertiesTemplate: 0 260 | useCustomGradleSettingsTemplate: 0 261 | useCustomProguardFile: 0 262 | AndroidTargetArchitectures: 3 263 | AndroidTargetDevices: 0 264 | AndroidSplashScreenScale: 0 265 | androidSplashScreen: {fileID: 0} 266 | AndroidKeystoreName: '{inproject}: ' 267 | AndroidKeyaliasName: 268 | AndroidEnableArmv9SecurityFeatures: 0 269 | AndroidBuildApkPerCpuArchitecture: 0 270 | AndroidTVCompatibility: 1 271 | AndroidIsGame: 1 272 | AndroidEnableTango: 0 273 | androidEnableBanner: 0 274 | androidUseLowAccuracyLocation: 0 275 | androidUseCustomKeystore: 0 276 | m_AndroidBanners: 277 | - width: 320 278 | height: 180 279 | banner: {fileID: 0} 280 | androidGamepadSupportLevel: 0 281 | chromeosInputEmulation: 1 282 | AndroidMinifyRelease: 0 283 | AndroidMinifyDebug: 0 284 | AndroidValidateAppBundleSize: 1 285 | AndroidAppBundleSizeToValidate: 150 286 | m_BuildTargetIcons: 287 | - m_BuildTarget: 288 | m_Icons: 289 | - serializedVersion: 2 290 | m_Icon: {fileID: 2800000, guid: 887ad593d68798a4cac68281e9abcd54, type: 3} 291 | m_Width: 128 292 | m_Height: 128 293 | m_Kind: 0 294 | m_BuildTargetPlatformIcons: 295 | - m_BuildTarget: Android 296 | m_Icons: 297 | - m_Textures: 298 | - {fileID: 0} 299 | m_Width: 192 300 | m_Height: 192 301 | m_Kind: 1 302 | m_SubKind: 303 | - m_Textures: 304 | - {fileID: 0} 305 | m_Width: 144 306 | m_Height: 144 307 | m_Kind: 1 308 | m_SubKind: 309 | - m_Textures: 310 | - {fileID: 0} 311 | m_Width: 96 312 | m_Height: 96 313 | m_Kind: 1 314 | m_SubKind: 315 | - m_Textures: 316 | - {fileID: 0} 317 | m_Width: 72 318 | m_Height: 72 319 | m_Kind: 1 320 | m_SubKind: 321 | - m_Textures: 322 | - {fileID: 0} 323 | m_Width: 48 324 | m_Height: 48 325 | m_Kind: 1 326 | m_SubKind: 327 | - m_Textures: 328 | - {fileID: 0} 329 | m_Width: 36 330 | m_Height: 36 331 | m_Kind: 1 332 | m_SubKind: 333 | - m_Textures: [] 334 | m_Width: 432 335 | m_Height: 432 336 | m_Kind: 2 337 | m_SubKind: 338 | - m_Textures: [] 339 | m_Width: 324 340 | m_Height: 324 341 | m_Kind: 2 342 | m_SubKind: 343 | - m_Textures: [] 344 | m_Width: 216 345 | m_Height: 216 346 | m_Kind: 2 347 | m_SubKind: 348 | - m_Textures: [] 349 | m_Width: 162 350 | m_Height: 162 351 | m_Kind: 2 352 | m_SubKind: 353 | - m_Textures: [] 354 | m_Width: 108 355 | m_Height: 108 356 | m_Kind: 2 357 | m_SubKind: 358 | - m_Textures: [] 359 | m_Width: 81 360 | m_Height: 81 361 | m_Kind: 2 362 | m_SubKind: 363 | - m_Textures: 364 | - {fileID: 0} 365 | m_Width: 192 366 | m_Height: 192 367 | m_Kind: 0 368 | m_SubKind: 369 | - m_Textures: 370 | - {fileID: 0} 371 | m_Width: 144 372 | m_Height: 144 373 | m_Kind: 0 374 | m_SubKind: 375 | - m_Textures: 376 | - {fileID: 0} 377 | m_Width: 96 378 | m_Height: 96 379 | m_Kind: 0 380 | m_SubKind: 381 | - m_Textures: 382 | - {fileID: 0} 383 | m_Width: 72 384 | m_Height: 72 385 | m_Kind: 0 386 | m_SubKind: 387 | - m_Textures: 388 | - {fileID: 0} 389 | m_Width: 48 390 | m_Height: 48 391 | m_Kind: 0 392 | m_SubKind: 393 | - m_Textures: 394 | - {fileID: 0} 395 | m_Width: 36 396 | m_Height: 36 397 | m_Kind: 0 398 | m_SubKind: 399 | m_BuildTargetBatching: [] 400 | m_BuildTargetShaderSettings: [] 401 | m_BuildTargetGraphicsJobs: 402 | - m_BuildTarget: MacStandaloneSupport 403 | m_GraphicsJobs: 0 404 | - m_BuildTarget: Switch 405 | m_GraphicsJobs: 0 406 | - m_BuildTarget: MetroSupport 407 | m_GraphicsJobs: 0 408 | - m_BuildTarget: AppleTVSupport 409 | m_GraphicsJobs: 0 410 | - m_BuildTarget: BJMSupport 411 | m_GraphicsJobs: 0 412 | - m_BuildTarget: LinuxStandaloneSupport 413 | m_GraphicsJobs: 0 414 | - m_BuildTarget: PS4Player 415 | m_GraphicsJobs: 0 416 | - m_BuildTarget: iOSSupport 417 | m_GraphicsJobs: 0 418 | - m_BuildTarget: WindowsStandaloneSupport 419 | m_GraphicsJobs: 0 420 | - m_BuildTarget: XboxOnePlayer 421 | m_GraphicsJobs: 0 422 | - m_BuildTarget: LuminSupport 423 | m_GraphicsJobs: 0 424 | - m_BuildTarget: AndroidPlayer 425 | m_GraphicsJobs: 0 426 | - m_BuildTarget: WebGLSupport 427 | m_GraphicsJobs: 0 428 | m_BuildTargetGraphicsJobMode: 429 | - m_BuildTarget: PS4Player 430 | m_GraphicsJobMode: 0 431 | - m_BuildTarget: XboxOnePlayer 432 | m_GraphicsJobMode: 0 433 | m_BuildTargetGraphicsAPIs: 434 | - m_BuildTarget: iOSSupport 435 | m_APIs: 10000000 436 | m_Automatic: 1 437 | - m_BuildTarget: AndroidPlayer 438 | m_APIs: 0b00000008000000 439 | m_Automatic: 0 440 | m_BuildTargetVRSettings: [] 441 | m_DefaultShaderChunkSizeInMB: 16 442 | m_DefaultShaderChunkCount: 0 443 | openGLRequireES31: 0 444 | openGLRequireES31AEP: 0 445 | openGLRequireES32: 0 446 | m_TemplateCustomTags: {} 447 | mobileMTRendering: 448 | Android: 1 449 | iPhone: 1 450 | tvOS: 1 451 | m_BuildTargetGroupLightmapEncodingQuality: 452 | - m_BuildTarget: Standalone 453 | m_EncodingQuality: 1 454 | - m_BuildTarget: XboxOne 455 | m_EncodingQuality: 1 456 | - m_BuildTarget: PS4 457 | m_EncodingQuality: 1 458 | m_BuildTargetGroupHDRCubemapEncodingQuality: [] 459 | m_BuildTargetGroupLightmapSettings: [] 460 | m_BuildTargetGroupLoadStoreDebugModeSettings: [] 461 | m_BuildTargetNormalMapEncoding: [] 462 | m_BuildTargetDefaultTextureCompressionFormat: [] 463 | playModeTestRunnerEnabled: 0 464 | runPlayModeTestAsEditModeTest: 0 465 | actionOnDotNetUnhandledException: 1 466 | enableInternalProfiler: 0 467 | logObjCUncaughtExceptions: 1 468 | enableCrashReportAPI: 0 469 | cameraUsageDescription: 470 | locationUsageDescription: 471 | microphoneUsageDescription: 472 | bluetoothUsageDescription: 473 | macOSTargetOSVersion: 10.13.0 474 | switchNMETAOverride: 475 | switchNetLibKey: 476 | switchSocketMemoryPoolSize: 6144 477 | switchSocketAllocatorPoolSize: 128 478 | switchSocketConcurrencyLimit: 14 479 | switchScreenResolutionBehavior: 2 480 | switchUseCPUProfiler: 0 481 | switchEnableFileSystemTrace: 0 482 | switchLTOSetting: 0 483 | switchApplicationID: 0x01004b9000490000 484 | switchNSODependencies: 485 | switchCompilerFlags: 486 | switchTitleNames_0: 487 | switchTitleNames_1: 488 | switchTitleNames_2: 489 | switchTitleNames_3: 490 | switchTitleNames_4: 491 | switchTitleNames_5: 492 | switchTitleNames_6: 493 | switchTitleNames_7: 494 | switchTitleNames_8: 495 | switchTitleNames_9: 496 | switchTitleNames_10: 497 | switchTitleNames_11: 498 | switchTitleNames_12: 499 | switchTitleNames_13: 500 | switchTitleNames_14: 501 | switchTitleNames_15: 502 | switchPublisherNames_0: 503 | switchPublisherNames_1: 504 | switchPublisherNames_2: 505 | switchPublisherNames_3: 506 | switchPublisherNames_4: 507 | switchPublisherNames_5: 508 | switchPublisherNames_6: 509 | switchPublisherNames_7: 510 | switchPublisherNames_8: 511 | switchPublisherNames_9: 512 | switchPublisherNames_10: 513 | switchPublisherNames_11: 514 | switchPublisherNames_12: 515 | switchPublisherNames_13: 516 | switchPublisherNames_14: 517 | switchPublisherNames_15: 518 | switchIcons_0: {fileID: 0} 519 | switchIcons_1: {fileID: 0} 520 | switchIcons_2: {fileID: 0} 521 | switchIcons_3: {fileID: 0} 522 | switchIcons_4: {fileID: 0} 523 | switchIcons_5: {fileID: 0} 524 | switchIcons_6: {fileID: 0} 525 | switchIcons_7: {fileID: 0} 526 | switchIcons_8: {fileID: 0} 527 | switchIcons_9: {fileID: 0} 528 | switchIcons_10: {fileID: 0} 529 | switchIcons_11: {fileID: 0} 530 | switchIcons_12: {fileID: 0} 531 | switchIcons_13: {fileID: 0} 532 | switchIcons_14: {fileID: 0} 533 | switchIcons_15: {fileID: 0} 534 | switchSmallIcons_0: {fileID: 0} 535 | switchSmallIcons_1: {fileID: 0} 536 | switchSmallIcons_2: {fileID: 0} 537 | switchSmallIcons_3: {fileID: 0} 538 | switchSmallIcons_4: {fileID: 0} 539 | switchSmallIcons_5: {fileID: 0} 540 | switchSmallIcons_6: {fileID: 0} 541 | switchSmallIcons_7: {fileID: 0} 542 | switchSmallIcons_8: {fileID: 0} 543 | switchSmallIcons_9: {fileID: 0} 544 | switchSmallIcons_10: {fileID: 0} 545 | switchSmallIcons_11: {fileID: 0} 546 | switchSmallIcons_12: {fileID: 0} 547 | switchSmallIcons_13: {fileID: 0} 548 | switchSmallIcons_14: {fileID: 0} 549 | switchSmallIcons_15: {fileID: 0} 550 | switchManualHTML: 551 | switchAccessibleURLs: 552 | switchLegalInformation: 553 | switchMainThreadStackSize: 1048576 554 | switchPresenceGroupId: 555 | switchLogoHandling: 0 556 | switchReleaseVersion: 0 557 | switchDisplayVersion: 1.0.0 558 | switchStartupUserAccount: 0 559 | switchSupportedLanguagesMask: 0 560 | switchLogoType: 0 561 | switchApplicationErrorCodeCategory: 562 | switchUserAccountSaveDataSize: 0 563 | switchUserAccountSaveDataJournalSize: 0 564 | switchApplicationAttribute: 0 565 | switchCardSpecSize: -1 566 | switchCardSpecClock: -1 567 | switchRatingsMask: 0 568 | switchRatingsInt_0: 0 569 | switchRatingsInt_1: 0 570 | switchRatingsInt_2: 0 571 | switchRatingsInt_3: 0 572 | switchRatingsInt_4: 0 573 | switchRatingsInt_5: 0 574 | switchRatingsInt_6: 0 575 | switchRatingsInt_7: 0 576 | switchRatingsInt_8: 0 577 | switchRatingsInt_9: 0 578 | switchRatingsInt_10: 0 579 | switchRatingsInt_11: 0 580 | switchRatingsInt_12: 0 581 | switchLocalCommunicationIds_0: 582 | switchLocalCommunicationIds_1: 583 | switchLocalCommunicationIds_2: 584 | switchLocalCommunicationIds_3: 585 | switchLocalCommunicationIds_4: 586 | switchLocalCommunicationIds_5: 587 | switchLocalCommunicationIds_6: 588 | switchLocalCommunicationIds_7: 589 | switchParentalControl: 0 590 | switchAllowsScreenshot: 1 591 | switchAllowsVideoCapturing: 1 592 | switchAllowsRuntimeAddOnContentInstall: 0 593 | switchDataLossConfirmation: 0 594 | switchUserAccountLockEnabled: 0 595 | switchSystemResourceMemory: 16777216 596 | switchSupportedNpadStyles: 3 597 | switchNativeFsCacheSize: 32 598 | switchIsHoldTypeHorizontal: 0 599 | switchSupportedNpadCount: 8 600 | switchEnableTouchScreen: 1 601 | switchSocketConfigEnabled: 0 602 | switchTcpInitialSendBufferSize: 32 603 | switchTcpInitialReceiveBufferSize: 64 604 | switchTcpAutoSendBufferSizeMax: 256 605 | switchTcpAutoReceiveBufferSizeMax: 256 606 | switchUdpSendBufferSize: 9 607 | switchUdpReceiveBufferSize: 42 608 | switchSocketBufferEfficiency: 4 609 | switchSocketInitializeEnabled: 1 610 | switchNetworkInterfaceManagerInitializeEnabled: 1 611 | switchUseNewStyleFilepaths: 0 612 | switchUseLegacyFmodPriorities: 1 613 | switchUseMicroSleepForYield: 1 614 | switchEnableRamDiskSupport: 0 615 | switchMicroSleepForYieldTime: 25 616 | switchRamDiskSpaceSize: 12 617 | ps4NPAgeRating: 12 618 | ps4NPTitleSecret: 619 | ps4NPTrophyPackPath: 620 | ps4ParentalLevel: 11 621 | ps4ContentID: ED1633-NPXX51362_00-0000000000000000 622 | ps4Category: 0 623 | ps4MasterVersion: 01.00 624 | ps4AppVersion: 01.00 625 | ps4AppType: 0 626 | ps4ParamSfxPath: 627 | ps4VideoOutPixelFormat: 0 628 | ps4VideoOutInitialWidth: 1920 629 | ps4VideoOutBaseModeInitialWidth: 1920 630 | ps4VideoOutReprojectionRate: 60 631 | ps4PronunciationXMLPath: 632 | ps4PronunciationSIGPath: 633 | ps4BackgroundImagePath: 634 | ps4StartupImagePath: 635 | ps4StartupImagesFolder: 636 | ps4IconImagesFolder: 637 | ps4SaveDataImagePath: 638 | ps4SdkOverride: 639 | ps4BGMPath: 640 | ps4ShareFilePath: 641 | ps4ShareOverlayImagePath: 642 | ps4PrivacyGuardImagePath: 643 | ps4ExtraSceSysFile: 644 | ps4NPtitleDatPath: 645 | ps4RemotePlayKeyAssignment: -1 646 | ps4RemotePlayKeyMappingDir: 647 | ps4PlayTogetherPlayerCount: 0 648 | ps4EnterButtonAssignment: 1 649 | ps4ApplicationParam1: 0 650 | ps4ApplicationParam2: 0 651 | ps4ApplicationParam3: 0 652 | ps4ApplicationParam4: 0 653 | ps4DownloadDataSize: 0 654 | ps4GarlicHeapSize: 2048 655 | ps4ProGarlicHeapSize: 2560 656 | playerPrefsMaxSize: 32768 657 | ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ 658 | ps4pnSessions: 1 659 | ps4pnPresence: 1 660 | ps4pnFriends: 1 661 | ps4pnGameCustomData: 1 662 | playerPrefsSupport: 0 663 | enableApplicationExit: 0 664 | resetTempFolder: 1 665 | restrictedAudioUsageRights: 0 666 | ps4UseResolutionFallback: 0 667 | ps4ReprojectionSupport: 0 668 | ps4UseAudio3dBackend: 0 669 | ps4UseLowGarlicFragmentationMode: 1 670 | ps4SocialScreenEnabled: 0 671 | ps4ScriptOptimizationLevel: 0 672 | ps4Audio3dVirtualSpeakerCount: 14 673 | ps4attribCpuUsage: 0 674 | ps4PatchPkgPath: 675 | ps4PatchLatestPkgPath: 676 | ps4PatchChangeinfoPath: 677 | ps4PatchDayOne: 0 678 | ps4attribUserManagement: 0 679 | ps4attribMoveSupport: 0 680 | ps4attrib3DSupport: 0 681 | ps4attribShareSupport: 0 682 | ps4attribExclusiveVR: 0 683 | ps4disableAutoHideSplash: 0 684 | ps4videoRecordingFeaturesUsed: 0 685 | ps4contentSearchFeaturesUsed: 0 686 | ps4CompatibilityPS5: 0 687 | ps4AllowPS5Detection: 0 688 | ps4GPU800MHz: 1 689 | ps4attribEyeToEyeDistanceSettingVR: 0 690 | ps4IncludedModules: [] 691 | ps4attribVROutputEnabled: 0 692 | monoEnv: 693 | splashScreenBackgroundSourceLandscape: {fileID: 0} 694 | splashScreenBackgroundSourcePortrait: {fileID: 0} 695 | blurSplashScreenBackground: 1 696 | spritePackerPolicy: 697 | webGLMemorySize: 256 698 | webGLExceptionSupport: 1 699 | webGLNameFilesAsHashes: 0 700 | webGLShowDiagnostics: 0 701 | webGLDataCaching: 0 702 | webGLDebugSymbols: 0 703 | webGLEmscriptenArgs: 704 | webGLModulesDirectory: 705 | webGLTemplate: APPLICATION:Default 706 | webGLAnalyzeBuildSize: 0 707 | webGLUseEmbeddedResources: 0 708 | webGLCompressionFormat: 1 709 | webGLWasmArithmeticExceptions: 0 710 | webGLLinkerTarget: 1 711 | webGLThreadsSupport: 0 712 | webGLDecompressionFallback: 0 713 | webGLInitialMemorySize: 32 714 | webGLMaximumMemorySize: 2048 715 | webGLMemoryGrowthMode: 2 716 | webGLMemoryLinearGrowthStep: 16 717 | webGLMemoryGeometricGrowthStep: 0.2 718 | webGLMemoryGeometricGrowthCap: 96 719 | webGLPowerPreference: 2 720 | scriptingDefineSymbols: {} 721 | additionalCompilerArguments: {} 722 | platformArchitecture: {} 723 | scriptingBackend: 724 | Android: 1 725 | il2cppCompilerConfiguration: {} 726 | il2cppCodeGeneration: {} 727 | managedStrippingLevel: 728 | Android: 1 729 | EmbeddedLinux: 1 730 | GameCoreScarlett: 1 731 | GameCoreXboxOne: 1 732 | Lumin: 1 733 | Nintendo Switch: 1 734 | PS4: 1 735 | PS5: 1 736 | Stadia: 1 737 | WebGL: 1 738 | Windows Store Apps: 1 739 | XboxOne: 1 740 | iPhone: 1 741 | tvOS: 1 742 | incrementalIl2cppBuild: {} 743 | suppressCommonWarnings: 1 744 | allowUnsafeCode: 0 745 | useDeterministicCompilation: 1 746 | additionalIl2CppArgs: 747 | scriptingRuntimeVersion: 1 748 | gcIncremental: 0 749 | gcWBarrierValidation: 0 750 | apiCompatibilityLevelPerPlatform: {} 751 | m_RenderingPath: 1 752 | m_MobileRenderingPath: 1 753 | metroPackageName: UnityAndroidIl2cppPatchDemo 754 | metroPackageVersion: 755 | metroCertificatePath: 756 | metroCertificatePassword: 757 | metroCertificateSubject: 758 | metroCertificateIssuer: 759 | metroCertificateNotAfter: 0000000000000000 760 | metroApplicationDescription: UnityAndroidIl2cppPatchDemo 761 | wsaImages: {} 762 | metroTileShortName: 763 | metroTileShowName: 0 764 | metroMediumTileShowName: 0 765 | metroLargeTileShowName: 0 766 | metroWideTileShowName: 0 767 | metroSupportStreamingInstall: 0 768 | metroLastRequiredScene: 0 769 | metroDefaultTileSize: 1 770 | metroTileForegroundText: 2 771 | metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} 772 | metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, 773 | a: 1} 774 | metroSplashScreenUseBackgroundColor: 0 775 | platformCapabilities: {} 776 | metroTargetDeviceFamilies: {} 777 | metroFTAName: 778 | metroFTAFileTypes: [] 779 | metroProtocolName: 780 | vcxProjDefaultLanguage: 781 | XboxOneProductId: 782 | XboxOneUpdateKey: 783 | XboxOneSandboxId: 784 | XboxOneContentId: 785 | XboxOneTitleId: 786 | XboxOneSCId: 787 | XboxOneGameOsOverridePath: 788 | XboxOnePackagingOverridePath: 789 | XboxOneAppManifestOverridePath: 790 | XboxOneVersion: 1.0.0.0 791 | XboxOnePackageEncryption: 0 792 | XboxOnePackageUpdateGranularity: 2 793 | XboxOneDescription: 794 | XboxOneLanguage: 795 | - enus 796 | XboxOneCapability: [] 797 | XboxOneGameRating: {} 798 | XboxOneIsContentPackage: 0 799 | XboxOneEnhancedXboxCompatibilityMode: 0 800 | XboxOneEnableGPUVariability: 0 801 | XboxOneSockets: {} 802 | XboxOneSplashScreen: {fileID: 0} 803 | XboxOneAllowedProductIds: [] 804 | XboxOnePersistentLocalStorageSize: 0 805 | XboxOneXTitleMemory: 8 806 | XboxOneOverrideIdentityName: 807 | XboxOneOverrideIdentityPublisher: 808 | vrEditorSettings: {} 809 | cloudServicesEnabled: {} 810 | luminIcon: 811 | m_Name: 812 | m_ModelFolderPath: 813 | m_PortalFolderPath: 814 | luminCert: 815 | m_CertPath: 816 | m_SignPackage: 1 817 | luminIsChannelApp: 0 818 | luminVersion: 819 | m_VersionCode: 1 820 | m_VersionName: 821 | hmiPlayerDataPath: 822 | hmiForceSRGBBlit: 1 823 | embeddedLinuxEnableGamepadInput: 1 824 | hmiLogStartupTiming: 0 825 | hmiCpuConfiguration: 826 | apiCompatibilityLevel: 6 827 | activeInputHandler: 0 828 | windowsGamepadBackendHint: 0 829 | cloudProjectId: 830 | framebufferDepthMemorylessMode: 0 831 | qualitySettingsNames: [] 832 | projectName: 833 | organizationId: 834 | cloudEnabled: 0 835 | legacyClampBlendShapeWeights: 1 836 | hmiLoadingImage: {fileID: 0} 837 | platformRequiresReadableAssets: 0 838 | virtualTexturingSupportEnabled: 0 839 | insecureHttpOption: 0 840 | -------------------------------------------------------------------------------- /ProjectSettings/ProjectVersion.txt: -------------------------------------------------------------------------------- 1 | m_EditorVersion: 2022.3.19f1 2 | m_EditorVersionWithRevision: 2022.3.19f1 (244b723c30a6) 3 | -------------------------------------------------------------------------------- /ProjectSettings/QualitySettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!47 &1 4 | QualitySettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 5 7 | m_CurrentQuality: 5 8 | m_QualitySettings: 9 | - serializedVersion: 2 10 | name: Very Low 11 | pixelLightCount: 0 12 | shadows: 0 13 | shadowResolution: 0 14 | shadowProjection: 1 15 | shadowCascades: 1 16 | shadowDistance: 15 17 | shadowNearPlaneOffset: 3 18 | shadowCascade2Split: 0.33333334 19 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 20 | shadowmaskMode: 0 21 | blendWeights: 1 22 | textureQuality: 1 23 | anisotropicTextures: 0 24 | antiAliasing: 0 25 | softParticles: 0 26 | softVegetation: 0 27 | realtimeReflectionProbes: 0 28 | billboardsFaceCameraPosition: 0 29 | vSyncCount: 0 30 | lodBias: 0.3 31 | maximumLODLevel: 0 32 | particleRaycastBudget: 4 33 | asyncUploadTimeSlice: 2 34 | asyncUploadBufferSize: 4 35 | resolutionScalingFixedDPIFactor: 1 36 | excludedTargetPlatforms: [] 37 | - serializedVersion: 2 38 | name: Low 39 | pixelLightCount: 0 40 | shadows: 0 41 | shadowResolution: 0 42 | shadowProjection: 1 43 | shadowCascades: 1 44 | shadowDistance: 20 45 | shadowNearPlaneOffset: 3 46 | shadowCascade2Split: 0.33333334 47 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 48 | shadowmaskMode: 0 49 | blendWeights: 2 50 | textureQuality: 0 51 | anisotropicTextures: 0 52 | antiAliasing: 0 53 | softParticles: 0 54 | softVegetation: 0 55 | realtimeReflectionProbes: 0 56 | billboardsFaceCameraPosition: 0 57 | vSyncCount: 0 58 | lodBias: 0.4 59 | maximumLODLevel: 0 60 | particleRaycastBudget: 16 61 | asyncUploadTimeSlice: 2 62 | asyncUploadBufferSize: 4 63 | resolutionScalingFixedDPIFactor: 1 64 | excludedTargetPlatforms: [] 65 | - serializedVersion: 2 66 | name: Medium 67 | pixelLightCount: 1 68 | shadows: 1 69 | shadowResolution: 0 70 | shadowProjection: 1 71 | shadowCascades: 1 72 | shadowDistance: 20 73 | shadowNearPlaneOffset: 3 74 | shadowCascade2Split: 0.33333334 75 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 76 | shadowmaskMode: 0 77 | blendWeights: 2 78 | textureQuality: 0 79 | anisotropicTextures: 1 80 | antiAliasing: 0 81 | softParticles: 0 82 | softVegetation: 0 83 | realtimeReflectionProbes: 0 84 | billboardsFaceCameraPosition: 0 85 | vSyncCount: 1 86 | lodBias: 0.7 87 | maximumLODLevel: 0 88 | particleRaycastBudget: 64 89 | asyncUploadTimeSlice: 2 90 | asyncUploadBufferSize: 4 91 | resolutionScalingFixedDPIFactor: 1 92 | excludedTargetPlatforms: [] 93 | - serializedVersion: 2 94 | name: High 95 | pixelLightCount: 2 96 | shadows: 2 97 | shadowResolution: 1 98 | shadowProjection: 1 99 | shadowCascades: 2 100 | shadowDistance: 40 101 | shadowNearPlaneOffset: 3 102 | shadowCascade2Split: 0.33333334 103 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 104 | shadowmaskMode: 1 105 | blendWeights: 2 106 | textureQuality: 0 107 | anisotropicTextures: 1 108 | antiAliasing: 0 109 | softParticles: 0 110 | softVegetation: 1 111 | realtimeReflectionProbes: 1 112 | billboardsFaceCameraPosition: 1 113 | vSyncCount: 1 114 | lodBias: 1 115 | maximumLODLevel: 0 116 | particleRaycastBudget: 256 117 | asyncUploadTimeSlice: 2 118 | asyncUploadBufferSize: 4 119 | resolutionScalingFixedDPIFactor: 1 120 | excludedTargetPlatforms: [] 121 | - serializedVersion: 2 122 | name: Very High 123 | pixelLightCount: 3 124 | shadows: 2 125 | shadowResolution: 2 126 | shadowProjection: 1 127 | shadowCascades: 2 128 | shadowDistance: 70 129 | shadowNearPlaneOffset: 3 130 | shadowCascade2Split: 0.33333334 131 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 132 | shadowmaskMode: 1 133 | blendWeights: 4 134 | textureQuality: 0 135 | anisotropicTextures: 2 136 | antiAliasing: 2 137 | softParticles: 1 138 | softVegetation: 1 139 | realtimeReflectionProbes: 1 140 | billboardsFaceCameraPosition: 1 141 | vSyncCount: 1 142 | lodBias: 1.5 143 | maximumLODLevel: 0 144 | particleRaycastBudget: 1024 145 | asyncUploadTimeSlice: 2 146 | asyncUploadBufferSize: 4 147 | resolutionScalingFixedDPIFactor: 1 148 | excludedTargetPlatforms: [] 149 | - serializedVersion: 2 150 | name: Ultra 151 | pixelLightCount: 4 152 | shadows: 2 153 | shadowResolution: 2 154 | shadowProjection: 1 155 | shadowCascades: 4 156 | shadowDistance: 150 157 | shadowNearPlaneOffset: 3 158 | shadowCascade2Split: 0.33333334 159 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} 160 | shadowmaskMode: 1 161 | blendWeights: 4 162 | textureQuality: 0 163 | anisotropicTextures: 2 164 | antiAliasing: 2 165 | softParticles: 1 166 | softVegetation: 1 167 | realtimeReflectionProbes: 1 168 | billboardsFaceCameraPosition: 1 169 | vSyncCount: 1 170 | lodBias: 2 171 | maximumLODLevel: 0 172 | particleRaycastBudget: 4096 173 | asyncUploadTimeSlice: 2 174 | asyncUploadBufferSize: 4 175 | resolutionScalingFixedDPIFactor: 1 176 | excludedTargetPlatforms: [] 177 | m_PerPlatformDefaultQuality: 178 | Android: 2 179 | Nintendo 3DS: 5 180 | Nintendo Switch: 5 181 | PS4: 5 182 | PSM: 5 183 | PSP2: 2 184 | Samsung TV: 2 185 | Standalone: 5 186 | Tizen: 2 187 | WebGL: 3 188 | WiiU: 5 189 | Windows Store Apps: 5 190 | XboxOne: 5 191 | iPhone: 2 192 | tvOS: 2 193 | -------------------------------------------------------------------------------- /ProjectSettings/TagManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!78 &1 4 | TagManager: 5 | serializedVersion: 2 6 | tags: [] 7 | layers: 8 | - Default 9 | - TransparentFX 10 | - Ignore Raycast 11 | - 12 | - Water 13 | - UI 14 | - 15 | - 16 | - 17 | - 18 | - 19 | - 20 | - 21 | - 22 | - 23 | - 24 | - 25 | - 26 | - 27 | - 28 | - 29 | - 30 | - 31 | - 32 | - 33 | - 34 | - 35 | - 36 | - 37 | - 38 | - 39 | - 40 | m_SortingLayers: 41 | - name: Default 42 | uniqueID: 0 43 | locked: 0 44 | -------------------------------------------------------------------------------- /ProjectSettings/TimeManager.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!5 &1 4 | TimeManager: 5 | m_ObjectHideFlags: 0 6 | Fixed Timestep: 0.02 7 | Maximum Allowed Timestep: 0.33333334 8 | m_TimeScale: 1 9 | Maximum Particle Timestep: 0.03 10 | -------------------------------------------------------------------------------- /ProjectSettings/UnityConnectSettings.asset: -------------------------------------------------------------------------------- 1 | %YAML 1.1 2 | %TAG !u! tag:unity3d.com,2011: 3 | --- !u!310 &1 4 | UnityConnectSettings: 5 | m_ObjectHideFlags: 0 6 | serializedVersion: 1 7 | m_Enabled: 1 8 | m_TestMode: 0 9 | m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events 10 | m_EventUrl: https://cdp.cloud.unity3d.com/v1/events 11 | m_ConfigUrl: https://config.uca.cloud.unity3d.com 12 | m_DashboardUrl: https://dashboard.unity3d.com 13 | m_TestInitMode: 0 14 | CrashReportingSettings: 15 | m_EventUrl: https://perf-events.cloud.unity3d.com 16 | m_Enabled: 0 17 | m_LogBufferSize: 10 18 | m_CaptureEditorExceptions: 1 19 | UnityPurchasingSettings: 20 | m_Enabled: 0 21 | m_TestMode: 0 22 | UnityAnalyticsSettings: 23 | m_Enabled: 0 24 | m_TestMode: 0 25 | m_InitializeOnStartup: 1 26 | m_PackageRequiringCoreStatsPresent: 1 27 | UnityAdsSettings: 28 | m_Enabled: 0 29 | m_InitializeOnStartup: 1 30 | m_TestMode: 0 31 | m_IosGameId: 32 | m_AndroidGameId: 33 | m_GameIds: {} 34 | m_GameId: 35 | PerformanceReportingSettings: 36 | m_Enabled: 0 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 1. 简介 2 | 这是Unity Android APP il2cpp热更完美解决方案的Demo([Git地址](https://github.com/noodle1983/UnityAndroidIl2cppPatchDemo/))的说明。 3 | 4 | 和现有的热更解决方案不同的是,他不会引入多余的语言(只是UnityScript,c#...),对Unity程序设计和编码没有任何限制。你可以在预置和场景里的GameObject上添加任何的Compnents组件,需要序列化的和不需要序列化的,他们都是可以热更的,也不需要做额外的标记处理。简而言之,在此方案下,Unity的所有资源和脚本,都是可以热更的。 5 | 6 | 本文接下来将介绍如何去制作热更文件和如何应用这些热更文件。为了简化Demo的设计,Demo包含的热更文件会事先以全量更新的方式制作好,一起打到了Apk里面。具体到项目中热更文件得放服务器,正式上线得放CDN,以增量更新的方式捣鼓出和文中一样的目录结构就OK了。 7 | 8 | Demo代码适用Unity2018-?,2017需要自己看版本历史回退Zip库。 9 | 10 | # 2. 方案总览 11 | 12 | Unity在以il2cpp方式导出Android工程(或者Apk文件)的时候,代码会被编译成libil2cpp,而相关的资源、配置和序列化数据会以他们各自的格式导出到android的assets目录(assets/bin/Data)。这两部分,libil2cpp和assets目录,必须匹配(即需要在同一次打包中提取,可能有的变了,有的没变,增量方式只提取变化的部分)才能正常工作,不然Unity会在启动时崩溃。本方案就是热更这两部分。 13 | 14 | 热更的正式流程如下图. 15 | 16 | ![运行时流程图](https://github.com/noodle1983/private/raw/master/UnityAndroidIl2cppPatch/patch_workflow.png) 17 | 18 | 流程说明: 19 | * 步骤1,在Unity的逻辑之前,libbootstrap会检查本地是否有Patch. Apk安装后,没应用过任何热更,本地是不会有Patch文件的,走no流程。如果热更过,则会有Patch目录,走yes流程。如果是覆盖安装,会检查apk和Patch文件的修改时间,走no流程。Patch目录如何准备,后面会将到。 20 | * 步骤2,加载Patch目录对应架构(arm/x86)的libil2cpp库,并应用assets目录的更新文件。 21 | * 步骤3,开始Unity的流程,进入Unity第一个场景,并执行相关的Unity Script,一般是C#,我们都以C#举例。 22 | * 步骤4,检查服务端是否有新的patch,这步demo没有演示,需要自己实现。 23 | * 步骤5,下载新的patch,这步demo也没有演示,需要自己实现 24 | * 步骤6,根据规则准备patch目录,详细规则会在后面描述。在Demo中只是将全量更新包解压,全量更新包打包的时候目录结构就是对的,所以不需要做其他的处理。 25 | * 步骤7,调用libbootstrap的接口设置patch目录,因为libil2cpp已经加载进进程,所以需要重启APP,从新的patch目录加载patch。这步Demo中有设置patch目录的例子。 26 | 27 | * 步骤8,重启APP,Demo提供了纯C#代码。 28 | * 步骤9,没有新的Patch,就正常进入游戏了。 29 | 30 | 流程里更详细的描述和如何生成Patch文件,见第三章。 31 | 32 | # 3. Demo详述 33 | 34 | ## 3.1. Demo目录结构 35 | 36 | 工程所有文件均置于AndroidIl2cppPatchDemo目录下。各文件目录说明如下表。 37 | 38 | | 名字 | 说明 | 39 | | -------- | ----- | 40 | | Editor/AndroidBuilder.cs| 这个文件包含所有从导出Android工程,到输出Patch和生成Apk安装文件的代码。| 41 | | Editor/Exe/zip.exe| zip压缩工具,用来将asset/bin/Data下的文件压缩成标准zip格式。 | 42 | | Plugin/| 包含libbootstrap库. | 43 | | PrebuiltPatches/| 包含预先生成的两个全量热更新版本。| 44 | | Scene/*.unity| 演示场景,母包和版本1仅有0.unity,版本2增加了1.unity,测试新增场景和脚本的patch | 45 | | Script/Bootstrap.cs| 这个文件定义了libbootstrap的c#接口和重启APP的纯c#实现| 46 | | Script/VersionSettor.cs| 这个脚本用于运行时准备相应的热更版本目录。| 47 | | Script/UI/MessageBoxUI.cs| 这是一个简单的运行时MessageBox控制器。| 48 | | ZipLibrary/| c#版的压缩解压工具,输出的zip文件为非标准文件,Patch制作中不能用于asset/bin/Data文件的压缩,仅用于libil2cpp库的压缩,运行时用于全量热更包的解压. | 49 | 50 | 所有文件就这么多,项目用git管理,master分支为母包分支,version1和version2分支为热更1和热更2分支,分支间会有些细微的差别,version1主要测试序列化数据,version2添加了新场景和新脚本,具体可以diff查看。下面会详细描述打包过程和如何应用热更文件。 51 | 52 | ## 3.2. 打包过程 53 | 54 | 所有的打包逻辑在文件Editor\AndroidBuilder.cs里。展开主菜单**AndroidBuilder**, 可以看到有5步,为了和热更启动流程区分,我们就叫他过程。 55 | 56 | - 过程1:以il2cpp的方式,导出Gradle Android工程。选择Gradle Android工程,而不是ADT Android工程,只是因为Unity2018不再支持ADT方式。Demo并不依赖AndroidStudio,只是导出的Android工程目录结构是以Gradle的方式注释,之后的构建步骤都是调用原始JDK/SDK的方式。Demo这部分的代码可以复用,但需要根据项目需求做一些修改。 57 | 58 | * 过程2:需要修改一下Android工程,因为libbootstrap需要在进入Unity的帧循环前,检查加载本地准备好的patch。大多数情况,你可以复用这个步骤的代码。但是如果你的项目修改了Unity Java的继承体系,你需要检查一下这块代码是否有调用到。如果没有调用到,后面Unity帧循环中的逻辑和资源,用的都是Apk内的相应文件。 59 | 60 | * 过程3:生成热更文件。如在第二章所述,patch分为两部分,il2cpp库和assets/bin/Data目录。具体做法代码均有提供,需要注意的是必须遵守各个文件的命名方式和相对路径。各个文件均有压缩,对于增量包,如果压缩前的文件和之前相比没有变化,则不需要制作对应的压缩文件。这部分制作压缩部分的代码可复用,增量部分需要自己实现,热更文件最好也加进版本管理(svn/git/...)中。 61 | 62 | * 过程4: 生成打包的windows脚本。脚本仅依赖JDK/SDK命令,可复用。生成脚本后,Android工程就不依赖Unity了,可以随意替换文件,再次调用脚本生成新的Apk。需要注意的是,打包用的so动态库,是pkg_raw目录下的so文件,替换时请注意。首次会在Unity目录下生成keystore目录和相应的签名文件,可以将此签名替换,并修改导出脚本中的签名密码。 63 | 64 | * 过程5: 执行过程4中的脚本,生成Apk安装文件,可复用。 65 | 66 | 主菜单AndroidBuilder下还提供了菜单“Running Step 1, 2, 4, 5 for the base version”,这是一键构建母包版本用的,母包不需要制作patch文件,所以少了过程3;和菜单“Runnnig Step 1-4 for patch versions”,这是一键构建Patch用的,因为在demo里,不需要导出Apk文件。 67 | 68 | 关于打包这里得多说两句。 如果没有采用AssetBundle的方式打包,Unity会按各自格式,将所有场景和依赖输出到assets/bin/Data目录,这样子也是可以热更的。但是,不要这么做,因为这样做微小的改动会影响到多个文件,导致热更文件过大。最好是自己用AssetBundle的方式将资源做一个清晰的划分,打包好的AssetBundle放在assets下的其他目录。需要注意和libil2cpp库和assets/bin/Data的文件向匹配(保证是同一个版本的输出)。运行时可以重写AssetBundleManager.overrideBaseDownloadingURL加载最新的AssetBundle。 69 | 70 | ## 3.3. 运行时应用热更文件 71 | 我们回顾一下第二章的流程图,结合打包过程和Demo的代码,做进一步的说明. 72 | 73 | ![运行时流程图](https://github.com/noodle1983/private/raw/master/UnityAndroidIl2cppPatch/patch_workflow.png) 74 | 75 | 打包过程2里,需要在UnityPlayerActivity.java文件头导入一个库,在Unity的游戏逻辑之前,插入了一行Java代码。 76 | ``` 77 | import android.view.WindowManager; 78 | + import io.github.noodle1983.Boostrap; 79 | ``` 80 | ``` 81 | + Boostrap.InitNativeLibBeforeUnityPlay(getApplication().getApplicationContext().getFilesDir().getPath()); 82 | mUnityPlayer = new UnityPlayer(this); 83 | ``` 84 | 这三行代码保证了上图中步骤1-2能在步骤3之前执行,下一行mUnityPlayer的代码即开始了步骤3的执行。步骤3之后所有的逻辑,都是已热更过的il2cpp库里的Unity Script(c#,...)了。热更部分的逻辑如果有修改,会在热更后体现,如果这部分的bug不影响下次热更,则可以通过热更修复,否则应指引用户清除本地数据,以母包热更逻辑更新到最新。所以,在方案的应用中,仍需尽量保证热更部分的代码稳定,不能随意更改。 85 | 86 | 如前所述,Demo里没有步骤4和步骤5的相关逻辑,步骤6中Patch的准备,Demo只是简单地将全量压缩包解压,相关逻辑在Script/VersionSettor.cs文件中。准备更新目录时,应保证libil2cpp部分被解压,命名方式和Demo保持一致,而assets_bin_Data下的文件不需要解压,应保证目录结构和Demo保持一致。如果是增量更新,Patch目录下的文件应该是相对于母包的修改文件。在持续热更中,应保证在步骤7前,本地当前Patch目录的完整性(保证运行中的App还能正常执行),新的Patch应新建目录,通过硬链接的形式从当前Patch目录中提取所需要的没变化的文件,准备好后执行步骤7,重启后将老Patch目录删除. 步骤7和步骤8的代码也在Script/VersionSettor.cs文件中,样子如下 87 | ``` 88 | //4. tell libboostrap.so to use the right patch after reboot 89 | string error = Bootstrap.use_data_dir(runtimePatchPath); 90 | if (!string.IsNullOrEmpty(error)) 91 | { 92 | messageBox.Show("use failed. path:" + zipLibil2cppPath + ", error:" + error, "ok", () => { messageBox.Close(); }); 93 | yield break; 94 | } 95 | 96 | //5. reboot app 97 | yield return StartCoroutine(Restart()); 98 | ``` 99 | 100 | 101 | # 4. Verify 和 Build 102 | 103 | ## 4.1. Verify 104 | 安装预编译的Apk文件,点击按钮可以切换各个版本。 105 | 106 | [release版本](https://github.com/noodle1983/UnityAndroidIl2cppPatchDemo/releases) 107 | 108 | ## 4.2. Build 109 | 110 | ### 依赖 111 | 112 | * Unity (我用Unity2017/Unity2018/Unity2019) 113 | * Unity2019.4 自带的JDK,SDK,NDK 114 | * Git 115 | 116 | ### Build指引 117 | 118 | * 1. 在Unity中(**Edit**->**Preference**->**External tools**)设置好 JDK/SDK/NDK 路径,打包代码里会从Unity中读取。 119 | * 2. 确保gradle能正常工作(Unity内能正常导出apk) 120 | * 3. 出母包,执行菜单 **AndroidBuilder**->**Run Step 1, 2, 4, 5 for base version**, 成功后会弹出文件管理器显示apk所在的目录. 121 | * 4. 一般来说你不需要打Patch文件,如果要打,用git checkout version1或version2,执行菜单 **AndroidBuilder**->**Run Step 1-4 for Patch Version**。PrebuildPatches目录下的相应文件会被更新。 122 | 123 | # 5. 剩下的工作和建议 124 | 打包部分 125 | * 设置部分需要根据项目实际做修改。 126 | * 热更文件的增量版本化管理。 127 | 128 | 运行时部分 129 | * 检查新版本和下载热更文件。 130 | * 持续增量更新的Patch目录的准备。 131 | * 用Asset Bundle管理资源。 132 | 133 | 另外,打包的工作尽量自动的一键化,一次化,除非你想在打包当晚集体晒月亮。另外,低成本的打包流程,大家都愿意在真机上看结果,利于产品的稳定。Demo其实提供了一套自动化的框架和脚本,理解透,化为己用,也是幸事一件。如果有更好的方式,欢迎讨论。 134 | 135 | # 6. 许可 136 | 137 | MIT license. 138 | 139 | 140 | # 7.主要贡献 141 | * 1. [noodle1983(Noodle)](https://github.com/noodle1983)完成了第一版, MIT开源 142 | * 2. [DesperateZero(_DespAir.)](https://github.com/DesperateZero)贡献了首次上线机会,协助解决了一下问题 143 | - 文件句柄泄漏 144 | - 适配:oppo手机,/data/data/appid/files 访问不了 145 | - Google abb打包的适配问题(原因是abb的方式会有多个apk包,原来是patch第一个,目前方案是patch含路径asset/bin/Data的那个) 146 | * 3. [qq:墨(2900180710)]发现并解决了原读写锁不生效的问题,测试文件[test_mutex.cpp](https://github.com/noodle1983/UnityAndroidIl2cppPatchDemo-libboostrap/blob/master/unittest/test_mutex.cpp) 147 | * 4. [sisong(e侯子.net)](https://github.com/sisong)实现了基于hook和ApkDiffPatch的另一种实现方式,实现了mono和Unity版本的热更,并做了大量的机型和各个API Level的测试。[项目地址](https://github.com/sisong/UnityAndroidHotUpdate) 148 | 149 | * 5. qq:木子(406351314)、西's my baby(871967866)团队和Sin(446541451)yudimo@vip.qq.com团队,帮忙发现和验证随机崩溃问题:https://github.com/noodle1983/UnityAndroidIl2cppPatchDemo/issues/12 150 | 151 | * 6. qq:Enough.(1098839800) 实践文档:[通过IL2CPP热更代码](https://www.jianshu.com/p/7b205ebcb54a) 152 | 153 | * 7. qq:粽仔001(1144916875) 发现的Demo中回退base version,脚本常量仍然是patch版本的问题。(il2cpp cache没清) 154 | 155 | * 8. qq:みなの総長(53957801) 发现的新版本没有更新文件,仍走了没必要的更新逻辑的问题。 156 | 157 | * 9. github: [marklalon](https://github.com/marklalon)及其项目组 性能优化和严谨的性能测试 [repo link](https://github.com/marklalon/UnityAndroidIl2cppPatchDemo-libboostrap) 158 | 159 | * 10. github: [ganlvtech](https://github.com/ganlvtech) tests/fixs [spin lock issue](https://github.com/noodle1983/UnityAndroidIl2cppPatchDemo-libboostrap/issues/10). 160 | 161 | # 8.调试和遗留问题 162 | * 1. 集成中如果有问题,先看看Demo的[release版本](https://github.com/noodle1983/UnityAndroidIl2cppPatchDemo/releases)有没有问题。如果Demo有问题,直接找我吧,QQ或邮件都行。 163 | * 2. 如果感兴趣,可以在[log.h](https://github.com/noodle1983/UnityAndroidIl2cppPatchDemo-libboostrap/blob/master/log.h)里,把日志全开,会有一些很有意思的日志,对理解原理和调试都很有用。 164 | * 3. Android obb的支持,欢迎pull request,提供支持 165 | * 4. Q群:593413410 166 | * 5. 遗留问题见[Github Issues](https://github.com/noodle1983/UnityAndroidIl2cppPatchDemo/issues) 167 | 168 | # 9.支持 169 | 170 | - 邮件: noodle1983@126.com. 171 | - Q群:593413410(广告免扰) 172 | 173 | # 10.随缘 174 | 175 | [PayPal:https://www.paypal.me/noodle1983](https://www.paypal.me/noodle1983) 176 | 177 | Or Alipay:![avatar](https://raw.githubusercontent.com/noodle1983/private/master/qr_icon/noodle1983_ali.png) 178 | Or Wechat:![avatar](https://raw.githubusercontent.com/noodle1983/private/master/qr_icon/noodle1983_wx.png) 179 | -------------------------------------------------------------------------------- /build_demo_apk.cmd: -------------------------------------------------------------------------------- 1 | rem global 2 | SET UnityBin="C:\Program Files\Unity\Editor\Unity.exe" 3 | 4 | rem prepare build cmd 5 | SET ScriptPath=%~dp0 6 | SET ScriptPath=%ScriptPath:~0,-1% 7 | 8 | SET ProjectPath=%ScriptPath% 9 | SET BuildCmd=%UnityBin% -quit -buildTarget android -batchmode -projectPath "%ProjectPath%" 10 | 11 | rem ========================================================================================== 12 | rem build version1 patch 13 | rem ========================================================================================== 14 | @echo "start to build version1" 15 | 16 | cd %ProjectPath% 17 | git checkout version1 18 | del %ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_Version1.zip 19 | %BuildCmd% -executeMethod AndroidBuilder.BuildPatch 20 | if not exist "%ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_Version1.zip" ( 21 | echo "Build Version1 Failed!" 22 | pause 23 | exit -1 24 | ) 25 | 26 | rem ========================================================================================== 27 | rem build version2 patch 28 | rem ========================================================================================== 29 | @echo "start to build version2" 30 | 31 | cd %ProjectPath% 32 | git checkout version2 33 | del %ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_Version2.zip 34 | %BuildCmd% -executeMethod AndroidBuilder.BuildPatch 35 | if not exist "%ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_Version2.zip" ( 36 | echo "Build Version2 Failed!" 37 | pause 38 | exit -1 39 | ) 40 | 41 | rem ========================================================================================== 42 | rem build base apk 43 | rem ========================================================================================== 44 | @echo "start to build base version apk" 45 | 46 | cd %ProjectPath% 47 | git checkout master 48 | %BuildCmd% -executeMethod AndroidBuilder.BuildWithoutPatch 49 | if not exist "%ProjectPath%\AndroidGradleProject\Test\src\main\bin\com.test.test.apk" ( 50 | echo "Build Failed! Please Rerun %ProjectPath%\AndroidGradleProject\Test\src\main\build_apk.bat to check the error." 51 | exit -1 52 | ) 53 | 54 | copy /Y %ProjectPath%\AndroidGradleProject\Test\src\main\bin\com.test.test.apk %ScriptPath%\Il2cppDemo_com.test.test.apk 55 | echo "Done!" 56 | exit 0 57 | -------------------------------------------------------------------------------- /build_demo_apk_2017_not_support_by_zip_lib.cmd: -------------------------------------------------------------------------------- 1 | rem global 2 | SET UnityBin="C:\Program Files\Unity2017.2.2f1\Editor\Unity.exe" 3 | 4 | rem prepare build cmd 5 | SET ScriptPath=%~dp0 6 | SET ScriptPath=%ScriptPath:~0,-1% 7 | 8 | SET ProjectPath=%ScriptPath% 9 | SET BuildCmd=%UnityBin% -quit -buildTarget android -batchmode -projectPath "%ProjectPath%" 10 | 11 | rem ========================================================================================== 12 | rem build version1 patch 13 | rem ========================================================================================== 14 | @echo "start to build version1" 15 | 16 | cd %ProjectPath% 17 | git checkout version1 18 | del %ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_Version1.zip 19 | %BuildCmd% -executeMethod AndroidBuilder.BuildPatch -logFile build_version1.log 20 | if not exist "%ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_Version1.zip" ( 21 | echo "Build Version1 Failed!" 22 | pause 23 | exit -1 24 | ) 25 | 26 | rem ========================================================================================== 27 | rem build version2 patch 28 | rem ========================================================================================== 29 | @echo "start to build version2" 30 | 31 | cd %ProjectPath% 32 | git checkout version2 33 | del %ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_Version2.zip 34 | %BuildCmd% -executeMethod AndroidBuilder.BuildPatch -logFile build_version2.log 35 | if not exist "%ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_Version2.zip" ( 36 | echo "Build Version2 Failed!" 37 | pause 38 | exit -1 39 | ) 40 | 41 | rem ========================================================================================== 42 | rem build base apk 43 | rem ========================================================================================== 44 | @echo "start to build base version apk" 45 | 46 | cd %ProjectPath% 47 | git checkout master 48 | %BuildCmd% -executeMethod AndroidBuilder.BuildWithoutPatch -logFile build_version0.log 49 | if not exist "%ProjectPath%\AndroidGradleProject\Test\src\main\bin\com.test.test.apk" ( 50 | echo "Build Failed! Please Rerun %ProjectPath%\AndroidGradleProject\Test\src\main\build_apk.bat to check the error." 51 | exit -1 52 | ) 53 | 54 | copy /Y %ProjectPath%\AndroidGradleProject\Test\src\main\bin\com.test.test.apk %ScriptPath%\Il2cppDemo_com.test.test.apk 55 | echo "Done!" 56 | exit 0 57 | -------------------------------------------------------------------------------- /build_demo_apk_2018.cmd: -------------------------------------------------------------------------------- 1 | rem global 2 | SET UnityBin="C:\Program Files\Unity\Hub\Editor\2018.4.29f1\Editor\Unity.exe" 3 | 4 | rem prepare build cmd 5 | SET ScriptPath=%~dp0 6 | SET ScriptPath=%ScriptPath:~0,-1% 7 | 8 | SET ProjectPath=%ScriptPath% 9 | SET BuildCmd=%UnityBin% -quit -buildTarget android -batchmode -projectPath "%ProjectPath%" 10 | 11 | rem ========================================================================================== 12 | rem build version1 patch 13 | rem ========================================================================================== 14 | @echo "start to build version1" 15 | 16 | cd %ProjectPath% 17 | git checkout version1 18 | del %ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_Version1.zip 19 | %BuildCmd% -executeMethod AndroidBuilder.BuildPatch -logFile build_version1.log 20 | if not exist "%ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_Version1.zip" ( 21 | echo "Build Version1 Failed!" 22 | pause 23 | exit -1 24 | ) 25 | 26 | rem ========================================================================================== 27 | rem build version2 patch 28 | rem ========================================================================================== 29 | @echo "start to build version2" 30 | 31 | cd %ProjectPath% 32 | git checkout version2 33 | del %ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_Version2.zip 34 | %BuildCmd% -executeMethod AndroidBuilder.BuildPatch -logFile build_version2.log 35 | if not exist "%ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_Version2.zip" ( 36 | echo "Build Version2 Failed!" 37 | pause 38 | exit -1 39 | ) 40 | 41 | rem ========================================================================================== 42 | rem build base apk 43 | rem ========================================================================================== 44 | @echo "start to build base version apk" 45 | 46 | cd %ProjectPath% 47 | git checkout master 48 | %BuildCmd% -executeMethod AndroidBuilder.BuildWithoutPatch -logFile build_version0.log 49 | if not exist "%ProjectPath%\AndroidGradleProject_v1.0\Test\src\main\bin\com.test.test.apk" ( 50 | echo "Build Failed! Please Rerun %ProjectPath%\AndroidGradleProject_v1.0\Test\src\main\build_apk.bat to check the error." 51 | exit -1 52 | ) 53 | 54 | copy /Y %ProjectPath%\AndroidGradleProject_v1.0\Test\src\main\bin\com.test.test.apk %ScriptPath%\Il2cppDemo_com.test.test.apk 55 | echo "Done!" 56 | exit 0 57 | -------------------------------------------------------------------------------- /build_demo_apk_2019.4.cmd: -------------------------------------------------------------------------------- 1 | rem global 2 | SET UnityBin="C:\Program Files\Unity\Hub\Editor\2019.4.2f1\Editor\Unity.exe" 3 | 4 | rem prepare build cmd 5 | SET ScriptPath=%~dp0 6 | SET ScriptPath=%ScriptPath:~0,-1% 7 | 8 | SET ProjectPath=%ScriptPath% 9 | SET BuildCmd=%UnityBin% -quit -buildTarget android -batchmode -projectPath "%ProjectPath%" 10 | 11 | rem ========================================================================================== 12 | rem build 2019_4_version1 patch 13 | rem ========================================================================================== 14 | @echo "start to build 2019_4_version1" 15 | 16 | cd %ProjectPath% 17 | git checkout 2019_4_version1 18 | del %ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_version1.zip 19 | %BuildCmd% -executeMethod AndroidBuilder.BuildPatch -logFile build_version1.log 20 | if not exist "%ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_version1.zip" ( 21 | echo "Build 2019_4_version1 Failed!" 22 | pause 23 | exit -1 24 | ) 25 | 26 | rem ========================================================================================== 27 | rem build 2019_4_version2 patch 28 | rem ========================================================================================== 29 | @echo "start to build 2019_4_version2" 30 | 31 | cd %ProjectPath% 32 | git checkout 2019_4_version2 33 | del %ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_version2.zip 34 | %BuildCmd% -executeMethod AndroidBuilder.BuildPatch -logFile build_version2.log 35 | if not exist "%ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_version2.zip" ( 36 | echo "Build 2019_4_version2 Failed!" 37 | pause 38 | exit -1 39 | ) 40 | 41 | rem ========================================================================================== 42 | rem build base apk 43 | rem ========================================================================================== 44 | @echo "start to build base version apk" 45 | 46 | cd %ProjectPath% 47 | git checkout 2019_4_base 48 | %BuildCmd% -executeMethod AndroidBuilder.BuildWithoutPatch -logFile build_version0.log 49 | if not exist "%ProjectPath%\AndroidGradleProject_v1.0\cn.noodle1983.unitypatchdemo.apk" ( 50 | echo "Build Failed! Please Rerun %ProjectPath%\AndroidGradleProject_v1.0\build_apk.bat to check the error." 51 | exit -1 52 | ) 53 | 54 | copy /Y %ProjectPath%\AndroidGradleProject_v1.0\cn.noodle1983.unitypatchdemo.apk %ScriptPath%\cn.noodle1983.unitypatchdemo.apk 55 | echo "Done!" 56 | exit 0 57 | -------------------------------------------------------------------------------- /build_demo_apk_2019.cmd: -------------------------------------------------------------------------------- 1 | rem global 2 | SET UnityBin="C:\Program Files\Unity-2019.1.11f1\Editor\Unity.exe" 3 | 4 | rem prepare build cmd 5 | SET ScriptPath=%~dp0 6 | SET ScriptPath=%ScriptPath:~0,-1% 7 | 8 | SET ProjectPath=%ScriptPath% 9 | SET BuildCmd=%UnityBin% -quit -buildTarget android -batchmode -projectPath "%ProjectPath%" 10 | 11 | rem ========================================================================================== 12 | rem build version1 patch 13 | rem ========================================================================================== 14 | @echo "start to build version1" 15 | 16 | cd %ProjectPath% 17 | git checkout version1 18 | del %ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_Version1.zip 19 | %BuildCmd% -executeMethod AndroidBuilder.BuildPatch 20 | if not exist "%ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_Version1.zip" ( 21 | echo "Build Version1 Failed!" 22 | pause 23 | exit -1 24 | ) 25 | 26 | rem ========================================================================================== 27 | rem build version2 patch 28 | rem ========================================================================================== 29 | @echo "start to build version2" 30 | 31 | cd %ProjectPath% 32 | git checkout version2 33 | del %ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_Version2.zip 34 | %BuildCmd% -executeMethod AndroidBuilder.BuildPatch 35 | if not exist "%ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_Version2.zip" ( 36 | echo "Build Version2 Failed!" 37 | pause 38 | exit -1 39 | ) 40 | 41 | rem ========================================================================================== 42 | rem build base apk 43 | rem ========================================================================================== 44 | @echo "start to build base version apk" 45 | 46 | cd %ProjectPath% 47 | git checkout master 48 | %BuildCmd% -executeMethod AndroidBuilder.BuildWithoutPatch 49 | if not exist "%ProjectPath%\AndroidGradleProject_v1.0\Test\src\main\bin\com.test.test.apk" ( 50 | echo "Build Failed! Please Rerun %ProjectPath%\AndroidGradleProject_v1.0\Test\src\main\build_apk.bat to check the error." 51 | exit -1 52 | ) 53 | 54 | copy /Y %ProjectPath%\AndroidGradleProject_v1.0\Test\src\main\bin\com.test.test.apk %ScriptPath%\Il2cppDemo_com.test.test.apk 55 | echo "Done!" 56 | exit 0 57 | -------------------------------------------------------------------------------- /build_demo_apk_2020.3.cmd: -------------------------------------------------------------------------------- 1 | rem global 2 | SET UnityBin="C:\Program Files\Unity\Hub\Editor\2020.3.30f1c1\Editor\Unity.exe" 3 | 4 | rem prepare build cmd 5 | SET ScriptPath=%~dp0 6 | SET ScriptPath=%ScriptPath:~0,-1% 7 | 8 | SET ProjectPath=%ScriptPath% 9 | SET BuildCmd=%UnityBin% -quit -buildTarget android -batchmode -projectPath "%ProjectPath%" 10 | 11 | rem ========================================================================================== 12 | rem build 2020_3_version1 patch 13 | rem ========================================================================================== 14 | @echo "start to build 2020_3_version1" 15 | 16 | cd %ProjectPath% 17 | git stash 18 | git reset HEAD --hard 19 | git checkout 2020_3_version1 20 | del %ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_version1.zip 21 | %BuildCmd% -executeMethod AndroidBuilder.BuildPatch -logFile build_version1.log 22 | if not exist "%ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_version1.zip" ( 23 | echo "Build 2020_3_version1 Failed!" 24 | pause 25 | exit -1 26 | ) 27 | 28 | rem ========================================================================================== 29 | rem build 2020_3_version2 patch 30 | rem ========================================================================================== 31 | @echo "start to build 2020_3_version2" 32 | 33 | cd %ProjectPath% 34 | git reset HEAD --hard 35 | git checkout 2020_3_version2 36 | del %ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_version2.zip 37 | %BuildCmd% -executeMethod AndroidBuilder.BuildPatch -logFile build_version2.log 38 | if not exist "%ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_version2.zip" ( 39 | echo "Build 2020_3_version2 Failed!" 40 | pause 41 | exit -1 42 | ) 43 | 44 | rem ========================================================================================== 45 | rem build base apk 46 | rem ========================================================================================== 47 | @echo "start to build base version apk" 48 | 49 | cd %ProjectPath% 50 | git reset HEAD --hard 51 | git checkout 2020_3_base 52 | %BuildCmd% -executeMethod AndroidBuilder.BuildWithoutPatch -logFile build_version0.log 53 | if not exist "%ProjectPath%\AndroidGradleProject_v1.0\cn.noodle1983.unitypatchdemo.apk" ( 54 | echo "Build Failed! Please Rerun %ProjectPath%\AndroidGradleProject_v1.0\Test\src\main\build_apk.bat to check the error." 55 | exit -1 56 | ) 57 | 58 | copy /Y %ProjectPath%\AndroidGradleProject_v1.0\cn.noodle1983.unitypatchdemo.apk %ScriptPath%\Il2cppDemo_com.test.test.apk 59 | echo "Done!" 60 | exit 0 61 | -------------------------------------------------------------------------------- /build_demo_apk_2021.3.cmd: -------------------------------------------------------------------------------- 1 | rem global 2 | SET UnityBin="C:\Program Files\Unity\Hub\Editor\2021.3.31f1\Editor\Unity.exe" 3 | 4 | rem prepare build cmd 5 | SET ScriptPath=%~dp0 6 | SET ScriptPath=%ScriptPath:~0,-1% 7 | 8 | SET ProjectPath=%ScriptPath% 9 | SET BuildCmd=%UnityBin% -quit -buildTarget android -batchmode -projectPath "%ProjectPath%" 10 | 11 | rem ========================================================================================== 12 | rem build 2021_3_version1 patch 13 | rem ========================================================================================== 14 | @echo "start to build 2021_3_version1" 15 | 16 | cd %ProjectPath% 17 | git stash 18 | git reset HEAD --hard 19 | git checkout 2021_3_version1 20 | del %ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_version1.zip 21 | %BuildCmd% -executeMethod AndroidBuilder.BuildPatch -logFile build_version1.log 22 | if not exist "%ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_version1.zip" ( 23 | echo "Build 2021_3_version1 Failed!" 24 | pause 25 | exit -1 26 | ) 27 | 28 | rem ========================================================================================== 29 | rem build 2021_3_version2 patch 30 | rem ========================================================================================== 31 | @echo "start to build 2021_3_version2" 32 | 33 | cd %ProjectPath% 34 | git reset HEAD --hard 35 | git checkout 2021_3_version2 36 | del %ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_version2.zip 37 | %BuildCmd% -executeMethod AndroidBuilder.BuildPatch -logFile build_version2.log 38 | if not exist "%ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_version2.zip" ( 39 | echo "Build 2021_3_version2 Failed!" 40 | pause 41 | exit -1 42 | ) 43 | 44 | rem ========================================================================================== 45 | rem build base apk 46 | rem ========================================================================================== 47 | @echo "start to build base version apk" 48 | 49 | cd %ProjectPath% 50 | git reset HEAD --hard 51 | git checkout 2021_3_base 52 | %BuildCmd% -executeMethod AndroidBuilder.BuildWithoutPatch -logFile build_version0.log 53 | if not exist "%ProjectPath%\AndroidGradleProject_v1.0\cn.noodle1983.unitypatchdemo.apk" ( 54 | echo "Build Failed! Please Rerun %ProjectPath%\AndroidGradleProject_v1.0\Test\src\main\build_apk.bat to check the error." 55 | exit -1 56 | ) 57 | 58 | copy /Y %ProjectPath%\AndroidGradleProject_v1.0\cn.noodle1983.unitypatchdemo.apk %ScriptPath%\Il2cppDemo_com.test.test.apk 59 | echo "Done!" 60 | exit 0 61 | -------------------------------------------------------------------------------- /build_demo_apk_2022.3.cmd: -------------------------------------------------------------------------------- 1 | rem global 2 | SET UnityBin="C:\Program Files\Unity\Hub\Editor\2022.3.19f1\Editor\Unity.exe" 3 | 4 | rem prepare build cmd 5 | SET ScriptPath=%~dp0 6 | SET ScriptPath=%ScriptPath:~0,-1% 7 | 8 | SET ProjectPath=%ScriptPath% 9 | SET BuildCmd=%UnityBin% -quit -buildTarget android -batchmode -projectPath "%ProjectPath%" 10 | 11 | rem ========================================================================================== 12 | rem build 2022_3_version1 patch 13 | rem ========================================================================================== 14 | @echo "start to build 2022_3_version1" 15 | 16 | cd %ProjectPath% 17 | git stash 18 | git reset HEAD --hard 19 | git checkout 2022_3_version1 20 | del %ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_version1.zip 21 | %BuildCmd% -executeMethod AndroidBuilder.BuildPatch -logFile build_version1.log 22 | if not exist "%ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_version1.zip" ( 23 | echo "Build 2022_3_version1 Failed!" 24 | pause 25 | exit -1 26 | ) 27 | 28 | rem ========================================================================================== 29 | rem build 2022_3_version2 patch 30 | rem ========================================================================================== 31 | @echo "start to build 2022_3_version2" 32 | 33 | cd %ProjectPath% 34 | git reset HEAD --hard 35 | git checkout 2022_3_version2 36 | del %ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_version2.zip 37 | %BuildCmd% -executeMethod AndroidBuilder.BuildPatch -logFile build_version2.log 38 | if not exist "%ProjectPath%\Assets\AndroidIl2cppPatchDemo\PrebuiltPatches\AllAndroidPatchFiles_version2.zip" ( 39 | echo "Build 2022_3_version2 Failed!" 40 | pause 41 | exit -1 42 | ) 43 | 44 | rem ========================================================================================== 45 | rem build base apk 46 | rem ========================================================================================== 47 | @echo "start to build base version apk" 48 | 49 | cd %ProjectPath% 50 | git reset HEAD --hard 51 | git checkout 2022_3_base 52 | %BuildCmd% -executeMethod AndroidBuilder.BuildWithoutPatch -logFile build_version0.log 53 | if not exist "%ProjectPath%\AndroidGradleProject_v1.0\cn.noodle1983.unitypatchdemo.apk" ( 54 | echo "Build Failed! Please Rerun %ProjectPath%\AndroidGradleProject_v1.0\Test\src\main\build_apk.bat to check the error." 55 | exit -1 56 | ) 57 | 58 | copy /Y %ProjectPath%\AndroidGradleProject_v1.0\cn.noodle1983.unitypatchdemo.apk %ScriptPath%\Il2cppDemo_com.test.test.apk 59 | echo "Done!" 60 | exit 0 61 | --------------------------------------------------------------------------------