From 986c610ef2827d85e7c33f67fcc3e4f96ab18a0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E9=93=AE?= <834207172@qq.com> Date: Wed, 2 Jul 2025 16:28:08 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90m=E3=80=91build=20apk=20=E5=BC=80?= =?UTF-8?q?=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Editor/Build/BuildApkEntity.cs | 33 + .../Editor/Build/BuildApkEntity.cs.meta | 3 + .../Editor/Build/BuildApkWindow.cs | 126 ++ .../Build/BuildApkWindow.cs.meta} | 2 +- .../Editor/BuildAsset/BuildAssetWindow.cs | 24 +- .../{ => BuildAsset}/ChangePlayerMode.meta | 0 .../ChangePlayerMode/ChangeHotUpdateMode.cs | 78 + .../ChangeHotUpdateMode.cs.meta | 3 + .../ChangePlayerMode/ChangePlayerMode.cs | 27 +- .../ChangePlayerMode/ChangePlayerMode.cs.meta | 0 .../Editor/BuildAsset/CreatAssetWindow.cs | 27 +- .../Editor/BuildAsset/CreatDomainDirectory.cs | 70 +- .../Editor/BuildAsset/OneKeyBuildWindow.cs | 17 +- .../{~Samples.meta => Editor/Entity.meta} | 2 +- .../Entity/HotfixMainResDomainEditor.cs | 29 + .../Entity/HotfixMainResDomainEditor.cs.meta} | 2 +- .../Editor/MarkAdressable/MarkAdressable.cs | 25 +- .../PlayerSettings/HotfixMainResDomain.cs | 32 +- .../Runtime.meta => Runtime/loading.meta} | 2 +- .../Runtime/loading/SplashScreen.cs | 48 + .../loading/SplashScreen.cs.meta} | 2 +- .../SplashScreen/EvoScenes.meta} | 2 +- .../SplashScreen/EvoScenes/Canvas.prefab | 174 +++ .../EvoScenes/Canvas.prefab.meta} | 4 +- .../SplashScreen/EvoScenes/loading.unity | 686 +++++++++ .../EvoScenes/loading.unity.meta} | 2 +- .../Samples~/SplashScreen/EvoScenes/logo.png | Bin 0 -> 44144 bytes .../SplashScreen/EvoScenes/logo.png.meta | 127 ++ Assets/00.StaryEvo/package.json | 9 +- .../~Samples/Runtime/CounterApp/Script.meta | 8 - .../CounterApp/Script/AchievementSystem.cs | 41 - .../Script/AchievementSystem.cs.meta | 3 - .../Runtime/CounterApp/Script/CommandAnd.cs | 13 - .../Runtime/CounterApp/Script/CommandSub.cs | 12 - .../Runtime/CounterApp/Script/CounterApp.cs | 15 - .../Runtime/CounterApp/Script/CounterModel.cs | 32 - .../CounterApp/Script/CounterModel.cs.meta | 3 - .../Script/CounterViewController.cs | 53 - .../Script/CounterViewController.cs.meta | 11 - .../Runtime/CounterApp/Script/IStorage.cs | 47 - .../CounterApp/Script/IStorage.cs.meta | 3 - .../~Samples/Runtime/CounterApp/Sence.meta | 8 - .../Runtime/CounterApp/Sence/Counter.unity | 1281 ----------------- .../00.StaryEvo/~Samples/Runtime/Event.meta | 8 - .../Runtime/Event/TypeEventSystemExample.cs | 96 -- .../Event/TypeEventSystemExample.cs.meta | 11 - .../Event/TypeEventSystemExample.unity | 341 ----- Assets/00.StaryEvo/~Samples/Runtime/IOC.meta | 8 - .../~Samples/Runtime/IOC/Script.meta | 8 - .../~Samples/Runtime/IOC/Script/DIPExample.cs | 59 - .../Runtime/IOC/Script/DIPExample.cs.meta | 11 - .../~Samples/Runtime/IOC/Script/IOCExample.cs | 51 - .../Runtime/IOC/Script/IOCExample.cs.meta | 11 - .../~Samples/Runtime/IOC/Sence.meta | 8 - .../~Samples/Runtime/IOC/Sence/DIP.unity | 341 ----- .../~Samples/Runtime/IOC/Sence/DIP.unity.meta | 7 - .../~Samples/Runtime/IOC/Sence/IOC.unity | 341 ----- .../~Samples/Runtime/IOC/Sence/IOC.unity.meta | 7 - 58 files changed, 1480 insertions(+), 2914 deletions(-) create mode 100644 Assets/00.StaryEvo/Editor/Build/BuildApkEntity.cs create mode 100644 Assets/00.StaryEvo/Editor/Build/BuildApkEntity.cs.meta create mode 100644 Assets/00.StaryEvo/Editor/Build/BuildApkWindow.cs rename Assets/00.StaryEvo/{~Samples/Runtime/CounterApp/Script/CommandAnd.cs.meta => Editor/Build/BuildApkWindow.cs.meta} (83%) rename Assets/00.StaryEvo/Editor/{ => BuildAsset}/ChangePlayerMode.meta (100%) create mode 100644 Assets/00.StaryEvo/Editor/BuildAsset/ChangePlayerMode/ChangeHotUpdateMode.cs create mode 100644 Assets/00.StaryEvo/Editor/BuildAsset/ChangePlayerMode/ChangeHotUpdateMode.cs.meta rename Assets/00.StaryEvo/Editor/{ => BuildAsset}/ChangePlayerMode/ChangePlayerMode.cs (75%) rename Assets/00.StaryEvo/Editor/{ => BuildAsset}/ChangePlayerMode/ChangePlayerMode.cs.meta (100%) rename Assets/00.StaryEvo/{~Samples.meta => Editor/Entity.meta} (77%) create mode 100644 Assets/00.StaryEvo/Editor/Entity/HotfixMainResDomainEditor.cs rename Assets/00.StaryEvo/{~Samples/Runtime/CounterApp/Script/CommandSub.cs.meta => Editor/Entity/HotfixMainResDomainEditor.cs.meta} (83%) rename Assets/00.StaryEvo/{~Samples/Runtime.meta => Runtime/loading.meta} (77%) create mode 100644 Assets/00.StaryEvo/Runtime/loading/SplashScreen.cs rename Assets/00.StaryEvo/{~Samples/Runtime/CounterApp/Script/CounterApp.cs.meta => Runtime/loading/SplashScreen.cs.meta} (83%) rename Assets/00.StaryEvo/{~Samples/Runtime/CounterApp.meta => Samples~/SplashScreen/EvoScenes.meta} (77%) create mode 100644 Assets/00.StaryEvo/Samples~/SplashScreen/EvoScenes/Canvas.prefab rename Assets/00.StaryEvo/{~Samples/Runtime/Event/TypeEventSystemExample.unity.meta => Samples~/SplashScreen/EvoScenes/Canvas.prefab.meta} (63%) create mode 100644 Assets/00.StaryEvo/Samples~/SplashScreen/EvoScenes/loading.unity rename Assets/00.StaryEvo/{~Samples/Runtime/CounterApp/Sence/Counter.unity.meta => Samples~/SplashScreen/EvoScenes/loading.unity.meta} (74%) create mode 100644 Assets/00.StaryEvo/Samples~/SplashScreen/EvoScenes/logo.png create mode 100644 Assets/00.StaryEvo/Samples~/SplashScreen/EvoScenes/logo.png.meta delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script.meta delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/AchievementSystem.cs delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/AchievementSystem.cs.meta delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CommandAnd.cs delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CommandSub.cs delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CounterApp.cs delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CounterModel.cs delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CounterModel.cs.meta delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CounterViewController.cs delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CounterViewController.cs.meta delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/IStorage.cs delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/IStorage.cs.meta delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Sence.meta delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Sence/Counter.unity delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/Event.meta delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/Event/TypeEventSystemExample.cs delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/Event/TypeEventSystemExample.cs.meta delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/Event/TypeEventSystemExample.unity delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/IOC.meta delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/IOC/Script.meta delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/IOC/Script/DIPExample.cs delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/IOC/Script/DIPExample.cs.meta delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/IOC/Script/IOCExample.cs delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/IOC/Script/IOCExample.cs.meta delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/IOC/Sence.meta delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/IOC/Sence/DIP.unity delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/IOC/Sence/DIP.unity.meta delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/IOC/Sence/IOC.unity delete mode 100644 Assets/00.StaryEvo/~Samples/Runtime/IOC/Sence/IOC.unity.meta diff --git a/Assets/00.StaryEvo/Editor/Build/BuildApkEntity.cs b/Assets/00.StaryEvo/Editor/Build/BuildApkEntity.cs new file mode 100644 index 0000000..66f9578 --- /dev/null +++ b/Assets/00.StaryEvo/Editor/Build/BuildApkEntity.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using Sirenix.OdinInspector; +using Sirenix.OdinInspector.Editor; +using UnityEditor; +using UnityEditor.Build.Reporting; +using UnityEngine; + +[Serializable] +public class BuildApkEntity +{ + public BuildApkEntity(Action OnBuildApkAction, Action OnBuildApkUpdateAction) + { + this._onBuildApkAction = OnBuildApkAction; + this._onBuildApkUpdateAction = OnBuildApkUpdateAction; + } + + + private Action _onBuildApkAction; + private Action _onBuildApkUpdateAction; + + [Button("打包", ButtonSizes.Large)] + private void BuildApk() + { + this._onBuildApkAction?.Invoke(); + } + + [Button("上传服务器", ButtonSizes.Large)] + private void BuildApkUpdate() + { + this._onBuildApkUpdateAction?.Invoke(); + } +} \ No newline at end of file diff --git a/Assets/00.StaryEvo/Editor/Build/BuildApkEntity.cs.meta b/Assets/00.StaryEvo/Editor/Build/BuildApkEntity.cs.meta new file mode 100644 index 0000000..ef61cb1 --- /dev/null +++ b/Assets/00.StaryEvo/Editor/Build/BuildApkEntity.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9d2f8d70d3b1414a934ca1b195d13b9c +timeCreated: 1751429102 \ No newline at end of file diff --git a/Assets/00.StaryEvo/Editor/Build/BuildApkWindow.cs b/Assets/00.StaryEvo/Editor/Build/BuildApkWindow.cs new file mode 100644 index 0000000..cec020a --- /dev/null +++ b/Assets/00.StaryEvo/Editor/Build/BuildApkWindow.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; +using Sirenix.OdinInspector; +using Sirenix.OdinInspector.Editor; +using Stary.Evo; +using UnityEditor; +using UnityEditor.Build.Reporting; +using UnityEngine; +using BuildReport = UnityEditor.Build.Reporting.BuildReport; + +public class BuildApkWindow : OdinEditorWindow +{ + public static OdinEditorWindow window; + + [MenuItem("Evo/Apk打包工具")] + static void ShowWindows() + { + window = (BuildApkWindow)EditorWindow.GetWindow(typeof(BuildApkWindow)); + window.maxSize = new Vector2(400, 500); + window.Show(); + } + + protected override void Initialize() + { + base.Initialize(); + buildApkLocalEntity = new BuildApkEntity(BuildAndroid, BuildAndroid); + buildApkServerEntity = new BuildApkEntity(BuildAndroid, BuildAndroid); + buildApkWatermarkEntity = new BuildApkEntity(BuildAndroid, BuildAndroid); + } + + [EnumToggleButtons, HideLabel] public DeviceType deviceType; + + [BoxGroup("Build(清空打包缓存)", centerLabel: true, order: 1)] + [Button("清空打包缓存")] + void OnClearCache() + { + // 清理Library缓存目录 + // 使用System.IO删除 + // try { + // System.IO.Directory.Delete(Application.dataPath + "/../Library/AssetImportState", true); + // Debug.Log("成功删除AssetImportState"); + // } catch (System.Exception e) { + // Debug.LogError($"删除失败: {e.Message}"); + // } + // 使用System.IO删除 + try + { + System.IO.Directory.Delete(Application.dataPath + "/../Library/BuildCache", true); + Debug.Log("成功删除BuildCache"); + } + catch (System.Exception e) + { + Debug.LogError($"删除失败: {e.Message}"); + } + + // 使用System.IO删除 + try + { + System.IO.Directory.Delete(Application.dataPath + "/../Library/ScriptAssemblies", true); + Debug.Log("成功删除ScriptAssemblies"); + } + catch (System.Exception e) + { + Debug.LogError($"删除失败: {e.Message}"); + } + + AssetDatabase.Refresh(); + EditorUtility.DisplayDialog("缓存清理", "已成功清除所有打包缓存文件", "确定"); + } + + [BoxGroup("Build(普通包\\服务器本地包)", centerLabel: true, order: 2), HideLabel] + public BuildApkEntity buildApkLocalEntity; + + [BoxGroup("Build(服务器热更包)", centerLabel: true, order: 3), HideLabel] + public BuildApkEntity buildApkServerEntity; + + [BoxGroup("Build(水印包)", centerLabel: true, order: 4), HideLabel] + public BuildApkEntity buildApkWatermarkEntity; + + public void BuildAndroid() + { + HotfixMainResDomain hotfixMainResDomain = Resources.Load("HotfixMainResDomain"); + if (hotfixMainResDomain == null) + { + Debug.LogError("HotfixMainResDomain 资源在Resources下不存在,请检查!"); + } + + // 设置包名和项目名 + PlayerSettings.productName = hotfixMainResDomain.projectInfo.projectName; + PlayerSettings.applicationIdentifier = hotfixMainResDomain.projectInfo.projectPackageName; + + // 配置构建选项 + BuildPlayerOptions buildOptions = new BuildPlayerOptions + { + scenes = new[] + { + $"Assets/SplashScreen/EvoScenes/loading.unity", + $"Assets/Main/main_{deviceType.ToString()}.unity" + }, + locationPathName = $"Builds/Android/{PlayerSettings.applicationIdentifier}.apk", + target = BuildTarget.Android, + options = BuildOptions.None + }; + + // 执行打包 + BuildReport report = BuildPipeline.BuildPlayer(buildOptions); + + BuildSummary summary = report.summary; + if (summary.result == BuildResult.Succeeded) + { + Debug.Log("Build succeeded: " + summary.totalSize + " bytes"); + } + + if (summary.result == BuildResult.Failed) + { + Debug.LogError("Build failed"); + } + } + + + public enum DeviceType + { + Xreal, + Rokid + } +} \ No newline at end of file diff --git a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CommandAnd.cs.meta b/Assets/00.StaryEvo/Editor/Build/BuildApkWindow.cs.meta similarity index 83% rename from Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CommandAnd.cs.meta rename to Assets/00.StaryEvo/Editor/Build/BuildApkWindow.cs.meta index 063ea8b..4fc95e3 100644 --- a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CommandAnd.cs.meta +++ b/Assets/00.StaryEvo/Editor/Build/BuildApkWindow.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: ca5d6aa1e6bbab64dbbdeace6b015b23 +guid: 81361a51e315e2345b51e3004941d04a MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/00.StaryEvo/Editor/BuildAsset/BuildAssetWindow.cs b/Assets/00.StaryEvo/Editor/BuildAsset/BuildAssetWindow.cs index 35a35db..83a32e7 100644 --- a/Assets/00.StaryEvo/Editor/BuildAsset/BuildAssetWindow.cs +++ b/Assets/00.StaryEvo/Editor/BuildAsset/BuildAssetWindow.cs @@ -10,19 +10,17 @@ using System; using System.Collections.Generic; using System.IO; using System.IO.Compression; -using System.Linq; using System.Threading.Tasks; -using EditorFramework; +#if HotUpdate using HybridCLR.Editor; using HybridCLR.Editor.Commands; +#endif using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Sirenix.OdinInspector; using Sirenix.OdinInspector.Editor; using UnityEditor; -using UnityEditorInternal; using UnityEngine; -using UnityEngine.Serialization; using YooAsset; using YooAsset.Editor; @@ -36,6 +34,18 @@ namespace Stary.Evo.Editor [MenuItem("Evo/资源打包工具")] static void ShowWindows() { +#if NotUpdate + +#elif HotUpdate +#endif + +#if NotUpdate + if (EditorUtility.DisplayDialog("提示", "当前为非热更模式,不支持热更打包功能,是否切换热更模式", "是", "否")) + { + ChangeHotUpdateSchema.SetHotUpdateMode(HotUpdateMode.HotUpdate); + } + +#elif HotUpdate if (CreatAssetWindow.GetCreatDomainAll().Count <= 0) { EditorUtility.DisplayDialog("提示", "不存在Domain元素,无法打开此面板,请先创建Domain元素", "确定"); @@ -44,6 +54,7 @@ namespace Stary.Evo.Editor window = (BuildAssetWindow)EditorWindow.GetWindow(typeof(BuildAssetWindow)); window.Show(); +#endif } protected override void OnDisable() @@ -86,7 +97,7 @@ namespace Stary.Evo.Editor [ShowIf("@ buildAssetType== BuildAssetType.Login")] [BoxGroup("Login", showLabel: false)] public string ip, userName, password; - + [ShowIf("@ buildAssetType== BuildAssetType.Login")] [BoxGroup("Login", showLabel: false)] [Button("登录", ButtonSizes.Large)] @@ -167,8 +178,10 @@ namespace Stary.Evo.Editor public BuildAssetEntity hyBridClrBuildEntity = new BuildAssetEntity("HyBridCLRBuild", "DllBuildTarget", () => { +#if HotUpdate //PrebuildCommand.GenerateAll(); CompileDllCommand.CompileDllActiveBuildTarget(); +#endif }); #endregion @@ -380,6 +393,7 @@ namespace Stary.Evo.Editor Debug.LogError($"UnityEvo:读取资源配置表失败【HotfixMainResDomain】...表不存在"); return; } + var ip = hotfixMainResDomain.hotfixMainResDomainEntity.ipconfig; var messageEntity = await WebRequestSystem.PostFile(ip + "/FileLoad/UpLoadFile", new[] { zipFilePath }); EditorUtility.DisplayProgressBar("提示", $"开始上传{setting.packageName}(上传zip文件)", 0.5f); diff --git a/Assets/00.StaryEvo/Editor/ChangePlayerMode.meta b/Assets/00.StaryEvo/Editor/BuildAsset/ChangePlayerMode.meta similarity index 100% rename from Assets/00.StaryEvo/Editor/ChangePlayerMode.meta rename to Assets/00.StaryEvo/Editor/BuildAsset/ChangePlayerMode.meta diff --git a/Assets/00.StaryEvo/Editor/BuildAsset/ChangePlayerMode/ChangeHotUpdateMode.cs b/Assets/00.StaryEvo/Editor/BuildAsset/ChangePlayerMode/ChangeHotUpdateMode.cs new file mode 100644 index 0000000..11c6576 --- /dev/null +++ b/Assets/00.StaryEvo/Editor/BuildAsset/ChangePlayerMode/ChangeHotUpdateMode.cs @@ -0,0 +1,78 @@ +using System; +using System.Linq; +using UnityEditor; +using UnityEngine; + +namespace Stary.Evo.Editor +{ + public class ChangeHotUpdateSchema + { + public static HotUpdateMode HotUpdateMode + { + get => _hotUpdate; + set => SetHotUpdateMode(value); + } + + private static HotUpdateMode _hotUpdate; + + private const string EditorNotUpdateMode = "Evo/ChangeHotUpdateSchema/NOTUPDARE(非热更模式)"; + private const string EditorHotUpdateMode = "Evo/ChangeHotUpdateSchema/HOTUPDATE(热更模式)"; + + [MenuItem(EditorNotUpdateMode)] + private static void SetNotUpdateMode() => SetHotUpdateMode(HotUpdateMode.NotUpdate); + + [MenuItem(EditorHotUpdateMode)] + private static void SetHotUpdateMode() => SetHotUpdateMode(HotUpdateMode.HotUpdate); + + // [MenuItem(WebPlayMode)] + // private static void SetWebMode() => SetPlayerMode(HotUpdateMode.WEB_PLAYMODE); + + [MenuItem(EditorNotUpdateMode, true)] + private static bool ValidateModeMenu() + { + string platform = EditorPrefs.GetString("ChangeHotUpdateSchema"); + Menu.SetChecked(EditorNotUpdateMode, platform == HotUpdateMode.NotUpdate.ToString()); + Menu.SetChecked(EditorHotUpdateMode, platform == HotUpdateMode.HotUpdate.ToString()); + //Menu.SetChecked(WebPlayMode, platform == HotUpdateMode.WEB_PLAYMODE.ToString()); + Debug.LogError("ChangeHotUpdateSchema"); + return true; + } + + public static void SetHotUpdateMode(HotUpdateMode mode) + { + // 清除所有旧模式定义 + var currentTarget = EditorUserBuildSettings.selectedBuildTargetGroup; + if (currentTarget == BuildTargetGroup.Unknown) return; + + var defines = PlayerSettings.GetScriptingDefineSymbolsForGroup(currentTarget) + .Split(';') + .Where(d => !Enum.GetNames(typeof(HotUpdateMode)).Contains(d)) + .ToList(); + + // 添加新模式 + defines.Add(mode.ToString()); + PlayerSettings.SetScriptingDefineSymbolsForGroup(currentTarget, string.Join(";", defines)); + Debug.Log($"当前编译符号: {string.Join(";", defines)}"); // 添加调试日志 + _hotUpdate = mode; + EditorPrefs.SetString("ChangeHotUpdateSchema", _hotUpdate.ToString()); + + ValidateModeMenu(); + AssetDatabase.Refresh(); + // 添加解决方案文件重新生成逻辑 + EditorApplication.delayCall += () => + { + EditorApplication.ExecuteMenuItem("Assets/Open C# Project"); + UnityEditor.Compilation.CompilationPipeline.RequestScriptCompilation(); + Debug.Log("已强制重新生成解决方案文件"); + }; + } + } + + public enum HotUpdateMode + { + //非热更模式, + NotUpdate, + //热更模式 + HotUpdate, + } +} \ No newline at end of file diff --git a/Assets/00.StaryEvo/Editor/BuildAsset/ChangePlayerMode/ChangeHotUpdateMode.cs.meta b/Assets/00.StaryEvo/Editor/BuildAsset/ChangePlayerMode/ChangeHotUpdateMode.cs.meta new file mode 100644 index 0000000..735e809 --- /dev/null +++ b/Assets/00.StaryEvo/Editor/BuildAsset/ChangePlayerMode/ChangeHotUpdateMode.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7d18419d2d9c488687f9aff50cbd8357 +timeCreated: 1751423025 \ No newline at end of file diff --git a/Assets/00.StaryEvo/Editor/ChangePlayerMode/ChangePlayerMode.cs b/Assets/00.StaryEvo/Editor/BuildAsset/ChangePlayerMode/ChangePlayerMode.cs similarity index 75% rename from Assets/00.StaryEvo/Editor/ChangePlayerMode/ChangePlayerMode.cs rename to Assets/00.StaryEvo/Editor/BuildAsset/ChangePlayerMode/ChangePlayerMode.cs index adc038e..4162573 100644 --- a/Assets/00.StaryEvo/Editor/ChangePlayerMode/ChangePlayerMode.cs +++ b/Assets/00.StaryEvo/Editor/BuildAsset/ChangePlayerMode/ChangePlayerMode.cs @@ -5,7 +5,7 @@ using UnityEngine; namespace Stary.Evo.Editor { - public class ChangePlayerMode + public class ChangePlayerSchema { public static PLayerMode PLayerMode { @@ -15,10 +15,10 @@ namespace Stary.Evo.Editor private static PLayerMode _pLayerMode; - private const string EditorSimulateMode = "Evo/ChangePlayerMode/EditorSimulateMode(编辑器调试模式)"; - private const string OfflinePlayMode = "Evo/ChangePlayerMode/OfflinePlayMode(本地运行模式)"; - private const string HostPlayMode = "Evo/ChangePlayerMode/HostPlayMode(服务器运行模式)"; - private const string WebPlayMode = "Evo/ChangePlayerMode/WebPlayMode(Web运行模式)"; + private const string EditorSimulateMode = "Evo/ChangePlayerSchema/EditorSimulateMode(编辑器调试模式)"; + private const string OfflinePlayMode = "Evo/ChangePlayerSchema/OfflinePlayMode(本地运行模式)"; + private const string HostPlayMode = "Evo/ChangePlayerSchema/HostPlayMode(服务器运行模式)"; + private const string WebPlayMode = "Evo/ChangePlayerSchema/WebPlayMode(Web运行模式)"; [MenuItem(EditorSimulateMode)] private static void SetEditorMode() => SetPlayerMode(PLayerMode.EDITOR_SIMULATEMODE); @@ -29,22 +29,22 @@ namespace Stary.Evo.Editor [MenuItem(HostPlayMode)] private static void SetHostMode() => SetPlayerMode(PLayerMode.HOST_PLAYMODE); - [MenuItem(WebPlayMode)] - private static void SetWebMode() => SetPlayerMode(PLayerMode.WEB_PLAYMODE); + // [MenuItem(WebPlayMode)] + // private static void SetWebMode() => SetPlayerMode(PLayerMode.WEB_PLAYMODE); [MenuItem(EditorSimulateMode, true)] private static bool ValidateModeMenu() { - string platform = EditorPrefs.GetString("ChangePLayerMode", PLayerMode.EDITOR_SIMULATEMODE.ToString()); + string platform = EditorPrefs.GetString("ChangePlayerSchema"); Menu.SetChecked(EditorSimulateMode, platform == PLayerMode.EDITOR_SIMULATEMODE.ToString()); Menu.SetChecked(OfflinePlayMode, platform == PLayerMode.OFFLINE_PLAYMODE.ToString()); Menu.SetChecked(HostPlayMode, platform == PLayerMode.HOST_PLAYMODE.ToString()); - Menu.SetChecked(WebPlayMode, platform == PLayerMode.WEB_PLAYMODE.ToString()); + //Menu.SetChecked(WebPlayMode, platform == PLayerMode.WEB_PLAYMODE.ToString()); Debug.LogError("CheckPlatform"); return true; } - private static void SetPlayerMode(PLayerMode mode) + public static void SetPlayerMode(PLayerMode mode) { // 清除所有旧模式定义 var currentTarget = EditorUserBuildSettings.selectedBuildTargetGroup; @@ -60,7 +60,8 @@ namespace Stary.Evo.Editor PlayerSettings.SetScriptingDefineSymbolsForGroup(currentTarget, string.Join(";", defines)); Debug.Log($"当前编译符号: {string.Join(";", defines)}"); // 添加调试日志 _pLayerMode = mode; - EditorPrefs.SetString("ChangePLayerMode", _pLayerMode.ToString()); + EditorPrefs.SetString("ChangePlayerSchema", _pLayerMode.ToString()); + ValidateModeMenu(); AssetDatabase.Refresh(); // 添加解决方案文件重新生成逻辑 EditorApplication.delayCall += () => @@ -83,7 +84,7 @@ namespace Stary.Evo.Editor //联机运行模式 HOST_PLAYMODE, - //web运行模式 - WEB_PLAYMODE + // //web运行模式 + // WEB_PLAYMODE } } \ No newline at end of file diff --git a/Assets/00.StaryEvo/Editor/ChangePlayerMode/ChangePlayerMode.cs.meta b/Assets/00.StaryEvo/Editor/BuildAsset/ChangePlayerMode/ChangePlayerMode.cs.meta similarity index 100% rename from Assets/00.StaryEvo/Editor/ChangePlayerMode/ChangePlayerMode.cs.meta rename to Assets/00.StaryEvo/Editor/BuildAsset/ChangePlayerMode/ChangePlayerMode.cs.meta diff --git a/Assets/00.StaryEvo/Editor/BuildAsset/CreatAssetWindow.cs b/Assets/00.StaryEvo/Editor/BuildAsset/CreatAssetWindow.cs index d7ad156..6aae15e 100644 --- a/Assets/00.StaryEvo/Editor/BuildAsset/CreatAssetWindow.cs +++ b/Assets/00.StaryEvo/Editor/BuildAsset/CreatAssetWindow.cs @@ -2,8 +2,10 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +#if HotUpdate using HybridCLR.Editor; using HybridCLR.Editor.Settings; +#endif using Sirenix.OdinInspector; using Sirenix.OdinInspector.Editor; using Stary.Evo.InformationSave; @@ -13,7 +15,6 @@ using UnityEngine; namespace Stary.Evo.Editor { - public class CreatAssetWindow : OdinEditorWindow { [MenuItem("Evo/创建Domain作用域")] @@ -48,8 +49,8 @@ namespace Stary.Evo.Editor Directory.CreateDirectory(artDomainPath); if (!Directory.Exists(artDomainPath)) - //创建Animation文件夹 - CreatDirectory(artDomainPath + "/Animation"); + //创建Animation文件夹 + CreatDirectory(artDomainPath + "/Animation"); //创建Effects文件夹 CreatDirectory(artDomainPath + "/Effects"); //创建Fbx文件夹 @@ -115,9 +116,8 @@ namespace Stary.Evo.Editor transformInfo.transform.position = Vector3.zero; transformInfo.transform.rotation = Quaternion.identity; transformInfo.AddComponent(); - - - + + CreatDirectory($"{resPath}/Prefabs"); string rootPfbFilePath = $"Assets/Domain/{domain}/AddressableRes/Prefabs/{domain}.prefab"; var localPath = AssetDatabase.GenerateUniqueAssetPath(rootPfbFilePath); @@ -145,11 +145,11 @@ namespace Stary.Evo.Editor body = body.Replace("ROOT_NAMESPACE", hotfixDomain); await writer.WriteAsync(body); } - + //模块化脚本生成配置 string domainClassName = $"{domain}Domain"; string architectureClassName = $"{domain}Architecture"; - +#if HotUpdate //模块配置资源 DomainConfig moduleConfig = CreateInstance(); moduleConfig.domain = domain; @@ -158,7 +158,7 @@ namespace Stary.Evo.Editor moduleConfig.@namespace = domain; AssetDatabase.CreateAsset(moduleConfig, $"Assets/Domain/{domain}/AddressableRes/Config/DomainConfig.asset"); // - + //编辑器配置资源 BuildAssetDataSetting buildAssetDataSetting = CreateInstance(); @@ -174,6 +174,7 @@ namespace Stary.Evo.Editor AssetDatabase.LoadAssetAtPath(configPath); if (domain != "Main") { + // 将程序集定义添加到 HybridCLR 热更列表 var settings = SettingsUtil.HybridCLRSettings; if (!settings.hotUpdateAssemblyDefinitions.Contains(assemblyDefinitionAsset)) @@ -195,8 +196,9 @@ namespace Stary.Evo.Editor HybridCLRSettings.Instance.hotUpdateAssemblyDefinitions = assemblies.ToArray(); HybridCLRSettings.Save(); - } + } +#endif AssetDatabase.SaveAssets(); @@ -215,7 +217,6 @@ namespace Stary.Evo.Editor } - [TitleGroup("预览Domain作用域")] public List domainList; protected override void Initialize() @@ -319,7 +320,7 @@ namespace Stary.Evo.Editor CreatDirectory(artDomainPath + "/Shader"); //创建Textures文件夹 CreatDirectory(artDomainPath + "/Textures"); - + string domainPath = $"{Application.dataPath}/Domain/{domain}"; //程序资源存放文件夹 string resPath = $"{domainPath}/AddressableRes"; @@ -340,7 +341,7 @@ namespace Stary.Evo.Editor CreatDirectory(resPath + "/Sprites"); //创建Video文件夹 CreatDirectory(resPath + "/Video"); - + AssetDatabase.Refresh(); } } diff --git a/Assets/00.StaryEvo/Editor/BuildAsset/CreatDomainDirectory.cs b/Assets/00.StaryEvo/Editor/BuildAsset/CreatDomainDirectory.cs index 51ea5a5..44a0779 100644 --- a/Assets/00.StaryEvo/Editor/BuildAsset/CreatDomainDirectory.cs +++ b/Assets/00.StaryEvo/Editor/BuildAsset/CreatDomainDirectory.cs @@ -1,4 +1,5 @@ -using Stary.Evo.Editor; +using System; +using Stary.Evo.Editor; using UnityEditor; using UnityEngine; @@ -9,19 +10,70 @@ namespace Stary.Evo { static CreatDomainDirectory() { - if (PlayerPrefs.GetInt("CreatDomainDirectory") == 0) + // 注意 因为这个构造函数会被重复调用, + //所以为了防止quitting和update两个回调被重复添加,需要先移除后添加 + EditorApplication.quitting -= OnEditorQuit; + EditorApplication.quitting += OnEditorQuit; + + Debug.Log(" 自动运行 "); + + if (!PlayerPrefs.HasKey("StartUp")) { - PlayerPrefs.SetInt("CreatDomainDirectory", 1); - bool isOk = EditorUtility.DisplayDialog("提示", "发现目录存在缺失,是否检索并创建缺失目录", "是", "否"); - if (isOk) + // 通过标记记录是否已经执行过该方法 + OnEditorStartUp(); + PlayerPrefs.SetInt("StartUp", 1); + + if (PlayerPrefs.GetInt("CreatDomainDirectory") == 0) { - var DomainAll = CreatAssetWindow.GetCreatDomainAll(); - foreach (var domain in DomainAll) + PlayerPrefs.SetInt("CreatDomainDirectory", 1); + bool isOk = EditorUtility.DisplayDialog("提示", "发现目录存在缺失,是否检索并创建缺失目录", "是", "否"); + if (isOk) { - CreatAssetWindow.CreateDomainDirectory(domain.DomainName); + var DomainAll = CreatAssetWindow.GetCreatDomainAll(); + foreach (var domain in DomainAll) + { + CreatAssetWindow.CreateDomainDirectory(domain.DomainName); + } } } + + if (EditorPrefs.GetString("ChangeHotUpdateSchema") == "") + { + ChangeHotUpdateSchema.SetHotUpdateMode(HotUpdateMode.NotUpdate); + } + else + { + ChangeHotUpdateSchema.SetHotUpdateMode( + Enum.Parse(EditorPrefs.GetString("ChangeHotUpdateSchema"))); + } + + if (EditorPrefs.GetString("ChangePlayerSchema") == "") + { + ChangePlayerSchema.SetPlayerMode(PLayerMode.EDITOR_SIMULATEMODE); + } + else + { + ChangePlayerSchema.SetPlayerMode( + Enum.Parse(EditorPrefs.GetString("ChangePlayerSchema"))); + } } - } + } + + + /// + /// UnityEditor 关闭时取消标记 + /// + private static void OnEditorQuit() + { + PlayerPrefs.DeleteKey("StartUp"); + } + + /// + /// 只会在UnityEditor启动时执行一次 + /// + static void OnEditorStartUp() + { + Debug.Log(" UnityEditor 启动 "); + } } } \ No newline at end of file diff --git a/Assets/00.StaryEvo/Editor/BuildAsset/OneKeyBuildWindow.cs b/Assets/00.StaryEvo/Editor/BuildAsset/OneKeyBuildWindow.cs index e154935..1dc72bb 100644 --- a/Assets/00.StaryEvo/Editor/BuildAsset/OneKeyBuildWindow.cs +++ b/Assets/00.StaryEvo/Editor/BuildAsset/OneKeyBuildWindow.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +#if HotUpdate using HybridCLR.Editor.Commands; +#endif using Newtonsoft.Json; using Sirenix.OdinInspector; using Sirenix.OdinInspector.Editor; @@ -16,8 +18,19 @@ namespace Stary.Evo.Editor [MenuItem("Evo/(一键)打包工具")] static void Init() { - var window = (OneKeyBuildWindow)EditorWindow.GetWindow(typeof(OneKeyBuildWindow)); +#if NotUpdate + if (EditorUtility.DisplayDialog("提示", "当前为非热更模式,不支持热更打包功能,是否切换热更模式", "是", "否")) + { + ChangeHotUpdateSchema.SetHotUpdateMode(HotUpdateMode.HotUpdate); + } +#elif HotUpdate + var window = (OneKeyBuildWindow)EditorWindow.GetWindow(typeof(OneKeyBuildWindow)); window.Show(); +#endif + + + + } [Title("全选"), OnValueChanged("OneKeyBuildEvent"), HideLabel] @@ -44,6 +57,7 @@ namespace Stary.Evo.Editor [Button("(一键)标记选择资源", ButtonSizes.Large)] public void OneClickMark() { +#if HotUpdate //打dll CompileDllCommand.CompileDllActiveBuildTarget(); //拷贝dll @@ -51,6 +65,7 @@ namespace Stary.Evo.Editor //标记全部资源 MarkAdressable.AddMarkAll(OneKeyBuildEntities); EditorUtility.DisplayDialog("提示", $"标记所有资源完成!", "确定"); +#endif } [Button("(一键)获取服务器版本", ButtonSizes.Large)] diff --git a/Assets/00.StaryEvo/~Samples.meta b/Assets/00.StaryEvo/Editor/Entity.meta similarity index 77% rename from Assets/00.StaryEvo/~Samples.meta rename to Assets/00.StaryEvo/Editor/Entity.meta index a304446..a779dc9 100644 --- a/Assets/00.StaryEvo/~Samples.meta +++ b/Assets/00.StaryEvo/Editor/Entity.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 50c0b79ec6a68a24cb577c05cefb670d +guid: 281c4d7ec043eaf4290db0498dd5294d folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/00.StaryEvo/Editor/Entity/HotfixMainResDomainEditor.cs b/Assets/00.StaryEvo/Editor/Entity/HotfixMainResDomainEditor.cs new file mode 100644 index 0000000..2807efe --- /dev/null +++ b/Assets/00.StaryEvo/Editor/Entity/HotfixMainResDomainEditor.cs @@ -0,0 +1,29 @@ +using System.Collections; +using System.Collections.Generic; +using Stary.Evo; +using Stary.Evo.Editor; +using UnityEditor; +using UnityEngine; + +[CustomEditor(typeof(HotfixMainResDomain))] +public class HotfixMainResDomainEditor : UnityEditor.Editor +{ + /// + /// 序列化属性,在OnEnable中获取 + /// + [HideInInspector] + private SerializedProperty projectInfo; + + private void OnEnable() + { + projectInfo = serializedObject.FindProperty("projectInfo"); + + } + + public override void OnInspectorGUI() + { + base.OnInspectorGUI(); + HotfixMainResDomain hotfixMainResDomain = (HotfixMainResDomain)target; + hotfixMainResDomain.projectInfo.projectPackageName = $"com.xosmo.{hotfixMainResDomain.projectInfo.projectCode}"; + } +} \ No newline at end of file diff --git a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CommandSub.cs.meta b/Assets/00.StaryEvo/Editor/Entity/HotfixMainResDomainEditor.cs.meta similarity index 83% rename from Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CommandSub.cs.meta rename to Assets/00.StaryEvo/Editor/Entity/HotfixMainResDomainEditor.cs.meta index 8ca4dc7..710584b 100644 --- a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CommandSub.cs.meta +++ b/Assets/00.StaryEvo/Editor/Entity/HotfixMainResDomainEditor.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: b07fd1086f5d247448c730438ab61e75 +guid: cb7e2ce39e1df99428ebf42ff0e04a19 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/00.StaryEvo/Editor/MarkAdressable/MarkAdressable.cs b/Assets/00.StaryEvo/Editor/MarkAdressable/MarkAdressable.cs index 6051d19..b695b98 100644 --- a/Assets/00.StaryEvo/Editor/MarkAdressable/MarkAdressable.cs +++ b/Assets/00.StaryEvo/Editor/MarkAdressable/MarkAdressable.cs @@ -1,8 +1,11 @@ using System; using System.Collections.Generic; using System.IO; + +#if HotUpdate using HybridCLR.Editor; using HybridCLR.Editor.Commands; +#endif using UnityEditor; using UnityEditor.U2D; using UnityEngine; @@ -23,23 +26,6 @@ namespace Stary.Evo.Editor } - // public static string SpriteRemotedAtlas - // { - // get { return Application.dataPath + "/AddressableRes/SpriteAtlas"; } - // } - - - //[MenuItem("Evo/Hotfix/BuildAll")] - public static void BuildAll() - { - PrebuildCommand.GenerateAll(); - Debug.Log("UnityEvo:Build【GenerateAll】完成"); - AddHotfixAddressableDll(); - Debug.Log("UnityEvo:Build【CopyHotfixAddressableDll】完成"); - AddMark(); - Debug.Log("UnityEvo:Build【MarkAsset】完成"); - } - //[MenuItem("Evo/Hotfix/Addressable")] public static void AddHotfixAddressableDll() @@ -72,6 +58,7 @@ namespace Stary.Evo.Editor private static void CopyDllHotUpdateAssembly(string domain, string target) { +#if HotUpdate //读取打包dll位置 string hotUpdateDir = $"{SettingsUtil.HybridCLRSettings.hotUpdateDllCompileOutputRootDir}/{EditorUserBuildSettings.activeBuildTarget}"; @@ -104,10 +91,12 @@ namespace Stary.Evo.Editor FileUtility.Copy(hotfixDllPathPdb, hotfixDllPathPdbTarget, true); } } +#endif } private static void CopyDllStrippedAOTDllOutputRootDir(string target) { +#if HotUpdate //读取打包dll位置 string hotUpdateDir = $"{SettingsUtil.HybridCLRSettings.strippedAOTDllOutputRootDir}/{EditorUserBuildSettings.activeBuildTarget}"; @@ -118,6 +107,7 @@ namespace Stary.Evo.Editor $"{target}/Dll/{EditorUserBuildSettings.activeBuildTarget}/{dll}.bytes"; FileUtility.Copy(hotfixDllPath, hotfixDllPathTarget, true); } +#endif } public static void AddMarkAll(List oneKeyBUildEntities) @@ -530,5 +520,6 @@ namespace Stary.Evo.Editor }; ShaderVariantCollector.Run(localSavePath,BuildAssetWindow.GetBuildPackageName(),1000, completedCallback); } + } } \ No newline at end of file diff --git a/Assets/00.StaryEvo/Runtime/PlayerSettings/HotfixMainResDomain.cs b/Assets/00.StaryEvo/Runtime/PlayerSettings/HotfixMainResDomain.cs index eb4faff..4bf3029 100644 --- a/Assets/00.StaryEvo/Runtime/PlayerSettings/HotfixMainResDomain.cs +++ b/Assets/00.StaryEvo/Runtime/PlayerSettings/HotfixMainResDomain.cs @@ -1,22 +1,40 @@ using System; +using Sirenix.OdinInspector; using UnityEngine; namespace Stary.Evo { - - [CreateAssetMenu(fileName = "HotfixMainResDomain", menuName = "Evo/Create HotfixMainResDomain")] public class HotfixMainResDomain : ScriptableObject { public HotfixMainResDomainEntity hotfixMainResDomainEntity; + public ProjectInfo projectInfo; } - + [Serializable] public class HotfixMainResDomainEntity { - public string ipconfig="http://192.168.31.100:5005/HotRefresh"; - public string mainDomainVersion =""; - public string username="UnityHot"; - public string password="Unity1234"; + public string ipconfig = "http://192.168.31.100:5005/HotRefresh"; + public string mainDomainVersion = ""; + public string username = "UnityHot"; + public string password = "Unity1234"; + } + [Serializable] + public class ProjectInfo + { + /// + /// 项目中文名称 + /// + public string projectName; + + /// + /// 项目代号 + /// + public string projectCode; + /// + /// 项目包名 + /// + [ReadOnly] + public string projectPackageName; } } \ No newline at end of file diff --git a/Assets/00.StaryEvo/~Samples/Runtime.meta b/Assets/00.StaryEvo/Runtime/loading.meta similarity index 77% rename from Assets/00.StaryEvo/~Samples/Runtime.meta rename to Assets/00.StaryEvo/Runtime/loading.meta index 08a8577..4424648 100644 --- a/Assets/00.StaryEvo/~Samples/Runtime.meta +++ b/Assets/00.StaryEvo/Runtime/loading.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 810a1400946cf2a4591b544ec7c6113d +guid: f731b06eebbbde74ea69563a66c3ae6b folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/00.StaryEvo/Runtime/loading/SplashScreen.cs b/Assets/00.StaryEvo/Runtime/loading/SplashScreen.cs new file mode 100644 index 0000000..11f8cb6 --- /dev/null +++ b/Assets/00.StaryEvo/Runtime/loading/SplashScreen.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Threading.Tasks; +using Cysharp.Threading.Tasks; +using UnityEngine; +using UnityEngine.SceneManagement; +using UnityEngine.UI; + +public class SplashScreen : MonoBehaviour +{ + private Image image; + + async void Start() + { + image = GetComponentInChildren(); + // 初始完全透明 + image.color = new Color(1, 1, 1, 0); + + // 渐显效果(2秒) + await Fade(0, 1, 0.5f); + + // 保持显示(原2秒等待) + await UniTask.Delay(TimeSpan.FromSeconds(1)); + + // 渐隐效果(1秒) + await Fade(1, 0, 0.5f); + + await SceneManager.LoadSceneAsync(1); + if (transform != null) + Destroy(gameObject); + } + + + private async UniTask Fade(float startAlpha, float endAlpha, float duration) + { + float elapsed = 0f; + while (elapsed < duration) + { + float alpha = Mathf.Lerp(startAlpha, endAlpha, elapsed / duration); + image.color = new Color(1, 1, 1, alpha); + elapsed += Time.deltaTime; + await UniTask.Yield(); + } + + image.color = new Color(1, 1, 1, endAlpha); + } +} \ No newline at end of file diff --git a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CounterApp.cs.meta b/Assets/00.StaryEvo/Runtime/loading/SplashScreen.cs.meta similarity index 83% rename from Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CounterApp.cs.meta rename to Assets/00.StaryEvo/Runtime/loading/SplashScreen.cs.meta index 4e47fd8..9a4b7e3 100644 --- a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CounterApp.cs.meta +++ b/Assets/00.StaryEvo/Runtime/loading/SplashScreen.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 4b9e1b9962882b647b727dc4749d40dd +guid: eaccb6795ccb65c479e97450d3227af6 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp.meta b/Assets/00.StaryEvo/Samples~/SplashScreen/EvoScenes.meta similarity index 77% rename from Assets/00.StaryEvo/~Samples/Runtime/CounterApp.meta rename to Assets/00.StaryEvo/Samples~/SplashScreen/EvoScenes.meta index fdd3a08..12f45bb 100644 --- a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp.meta +++ b/Assets/00.StaryEvo/Samples~/SplashScreen/EvoScenes.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: bf9eb356dc195004ea58a696dda5559e +guid: f9fe723e297f3aa4189255d2ba9c8392 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/00.StaryEvo/Samples~/SplashScreen/EvoScenes/Canvas.prefab b/Assets/00.StaryEvo/Samples~/SplashScreen/EvoScenes/Canvas.prefab new file mode 100644 index 0000000..58f2372 --- /dev/null +++ b/Assets/00.StaryEvo/Samples~/SplashScreen/EvoScenes/Canvas.prefab @@ -0,0 +1,174 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &408401849155147236 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7508565971128574473} + - component: {fileID: 3113898335757042942} + - component: {fileID: 4573574020091740314} + - component: {fileID: 7717858677675517226} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7508565971128574473 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 408401849155147236} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0.828} + m_LocalScale: {x: 0.0042, y: 0.0042, z: 0.0042} + m_ConstrainProportionsScale: 1 + m_Children: + - {fileID: 6632897685232509078} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0.133, y: -0.098} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!223 &3113898335757042942 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 408401849155147236} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 20 + m_TargetDisplay: 0 +--- !u!114 &4573574020091740314 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 408401849155147236} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 1 +--- !u!114 &7717858677675517226 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 408401849155147236} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: eaccb6795ccb65c479e97450d3227af6, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &2194460266377447544 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6632897685232509078} + - component: {fileID: 7767856386255314419} + - component: {fileID: 181196217961718294} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6632897685232509078 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2194460266377447544} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 7508565971128574473} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1920, y: 1080} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7767856386255314419 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2194460266377447544} + m_CullTransparentMesh: 1 +--- !u!114 &181196217961718294 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2194460266377447544} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: ab3e5b442b3157a4499b698842523b92, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 diff --git a/Assets/00.StaryEvo/~Samples/Runtime/Event/TypeEventSystemExample.unity.meta b/Assets/00.StaryEvo/Samples~/SplashScreen/EvoScenes/Canvas.prefab.meta similarity index 63% rename from Assets/00.StaryEvo/~Samples/Runtime/Event/TypeEventSystemExample.unity.meta rename to Assets/00.StaryEvo/Samples~/SplashScreen/EvoScenes/Canvas.prefab.meta index 75db8f6..dc20f34 100644 --- a/Assets/00.StaryEvo/~Samples/Runtime/Event/TypeEventSystemExample.unity.meta +++ b/Assets/00.StaryEvo/Samples~/SplashScreen/EvoScenes/Canvas.prefab.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 -guid: 0cff87da169d7e44fba9383eb0a7a9c7 -DefaultImporter: +guid: 0b3ee65f4ceab0443ba637d4f4acbc68 +PrefabImporter: externalObjects: {} userData: assetBundleName: diff --git a/Assets/00.StaryEvo/Samples~/SplashScreen/EvoScenes/loading.unity b/Assets/00.StaryEvo/Samples~/SplashScreen/EvoScenes/loading.unity new file mode 100644 index 0000000..f67a66d --- /dev/null +++ b/Assets/00.StaryEvo/Samples~/SplashScreen/EvoScenes/loading.unity @@ -0,0 +1,686 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.12731749, g: 0.13414757, b: 0.1210787, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &394404790 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 394404791} + - component: {fileID: 394404797} + - component: {fileID: 394404796} + - component: {fileID: 394404795} + - component: {fileID: 394404794} + - component: {fileID: 394404793} + - component: {fileID: 394404792} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &394404791 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 394404790} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 7117355850823243513} + m_Father: {fileID: 459117623} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &394404792 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 394404790} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + m_VolumeTrigger: {fileID: 0} + m_VolumeFrameworkUpdateModeOption: 2 + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_AllowHDROutput: 1 + m_UseScreenCoordOverride: 0 + m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} + m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_Version: 2 + m_TaaSettings: + quality: 3 + frameInfluence: 0.1 + jitterScale: 1 + mipBias: 0 + varianceClampScale: 0.9 + contrastAdaptiveSharpening: 0 +--- !u!114 &394404793 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 394404790} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c2fadf230d1919748a9aa21d40f74619, type: 3} + m_Name: + m_EditorClassIdentifier: + m_TrackingType: 0 + m_UpdateType: 0 + m_IgnoreTrackingState: 0 + m_PositionInput: + m_UseReference: 0 + m_Action: + m_Name: Position + m_Type: 0 + m_ExpectedControlType: Vector3 + m_Id: 6d61cbe8-767d-42f4-9dc7-f664d6d12f2c + m_Processors: + m_Interactions: + m_SingletonActionBindings: + - m_Name: + m_Id: 3e422fc6-df92-4a15-ad96-171d3f60ed8d + m_Path: /centerEyePosition + m_Interactions: + m_Processors: + m_Groups: + m_Action: Position + m_Flags: 0 + - m_Name: + m_Id: f97fd872-5aea-41b1-8e31-574cc6dcc92c + m_Path: /devicePosition + m_Interactions: + m_Processors: + m_Groups: + m_Action: Position + m_Flags: 0 + m_Flags: 0 + m_Reference: {fileID: 0} + m_RotationInput: + m_UseReference: 0 + m_Action: + m_Name: Rotation + m_Type: 0 + m_ExpectedControlType: Quaternion + m_Id: 2ecc7c4e-050c-4740-9654-21b6d18176ec + m_Processors: + m_Interactions: + m_SingletonActionBindings: + - m_Name: + m_Id: 88d29596-b12f-455e-a2a0-269593ff6cd4 + m_Path: /centerEyeRotation + m_Interactions: + m_Processors: + m_Groups: + m_Action: Rotation + m_Flags: 0 + - m_Name: + m_Id: 58052588-70e6-4194-a9e5-79c8e8be426f + m_Path: /deviceRotation + m_Interactions: + m_Processors: + m_Groups: + m_Action: Rotation + m_Flags: 0 + m_Flags: 0 + m_Reference: {fileID: 0} + m_TrackingStateInput: + m_UseReference: 0 + m_Action: + m_Name: Tracking State + m_Type: 0 + m_ExpectedControlType: Integer + m_Id: 6bbb8585-d5c2-45a0-9ec1-4bf19ec244b3 + m_Processors: + m_Interactions: + m_SingletonActionBindings: + - m_Name: + m_Id: 302aabe3-29c6-40fa-8339-c72b8b21d3e9 + m_Path: /trackingState + m_Interactions: + m_Processors: + m_Groups: + m_Action: Tracking State + m_Flags: 0 + m_Flags: 0 + m_Reference: {fileID: 0} + m_PositionAction: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 6d9a055e-0450-4cc9-842b-952dea46fc3a + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_RotationAction: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 5353ff1b-7953-4375-a89a-0301bf190f4b + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 +--- !u!114 &394404794 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 394404790} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 816b289ef451e094f9ae174fb4cf8db0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UseCustomMaterial: 0 + m_CustomMaterial: {fileID: 0} +--- !u!114 &394404795 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 394404790} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4966719baa26e4b0e8231a24d9bd491a, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FocusMode: -1 + m_LightEstimationMode: -1 + m_AutoFocus: 1 + m_LightEstimation: 0 + m_FacingDirection: 1 + m_RenderMode: 0 +--- !u!81 &394404796 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 394404790} + m_Enabled: 1 +--- !u!20 &394404797 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 394404790} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0, g: 0, b: 0, a: 1} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.1 + far clip plane: 20 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!1 &459117622 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 459117623} + m_Layer: 0 + m_Name: Camera Offset + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &459117623 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 459117622} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 394404791} + m_Father: {fileID: 1237795371} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1035006624 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1035006626} + - component: {fileID: 1035006625} + m_Layer: 0 + m_Name: XR Interaction Manager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1035006625 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1035006624} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 83e4e6cca11330d4088d729ab4fc9d9f, type: 3} + m_Name: + m_EditorClassIdentifier: + m_StartingHoverFilters: [] + m_StartingSelectFilters: [] +--- !u!4 &1035006626 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1035006624} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1237795366 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1237795371} + - component: {fileID: 1237795370} + - component: {fileID: 1237795369} + - component: {fileID: 1237795368} + - component: {fileID: 1237795367} + m_Layer: 0 + m_Name: XR Origin (Mobile AR) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1237795367 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1237795366} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fa17d122634046b4a8e23048891fafc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_RaycastPrefab: {fileID: 0} +--- !u!114 &1237795368 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1237795366} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e1760703bbd54c04488a8d10600262ab, type: 3} + m_Name: + m_EditorClassIdentifier: + m_PlanePrefab: {fileID: 0} + m_DetectionMode: -1 +--- !u!114 &1237795369 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1237795366} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 017c5e3933235514c9520e1dace2a4b2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ActionAssets: [] +--- !u!114 &1237795370 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1237795366} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e0cb9aa70a22847b5925ee5f067c10a9, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Camera: {fileID: 394404797} + m_OriginBaseGameObject: {fileID: 1237795366} + m_CameraFloorOffsetObject: {fileID: 459117622} + m_RequestedTrackingOriginMode: 1 + m_CameraYOffset: 0 +--- !u!4 &1237795371 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1237795366} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 459117623} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &7117355850823243512 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 394404791} + m_Modifications: + - target: {fileID: 408401849155147236, guid: 0b3ee65f4ceab0443ba637d4f4acbc68, type: 3} + propertyPath: m_Name + value: Canvas + objectReference: {fileID: 0} + - target: {fileID: 7508565971128574473, guid: 0b3ee65f4ceab0443ba637d4f4acbc68, type: 3} + propertyPath: m_Pivot.x + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 7508565971128574473, guid: 0b3ee65f4ceab0443ba637d4f4acbc68, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 7508565971128574473, guid: 0b3ee65f4ceab0443ba637d4f4acbc68, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7508565971128574473, guid: 0b3ee65f4ceab0443ba637d4f4acbc68, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7508565971128574473, guid: 0b3ee65f4ceab0443ba637d4f4acbc68, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7508565971128574473, guid: 0b3ee65f4ceab0443ba637d4f4acbc68, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7508565971128574473, guid: 0b3ee65f4ceab0443ba637d4f4acbc68, type: 3} + propertyPath: m_SizeDelta.x + value: 100 + objectReference: {fileID: 0} + - target: {fileID: 7508565971128574473, guid: 0b3ee65f4ceab0443ba637d4f4acbc68, type: 3} + propertyPath: m_SizeDelta.y + value: 100 + objectReference: {fileID: 0} + - target: {fileID: 7508565971128574473, guid: 0b3ee65f4ceab0443ba637d4f4acbc68, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7508565971128574473, guid: 0b3ee65f4ceab0443ba637d4f4acbc68, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7508565971128574473, guid: 0b3ee65f4ceab0443ba637d4f4acbc68, type: 3} + propertyPath: m_LocalPosition.z + value: 0.828 + objectReference: {fileID: 0} + - target: {fileID: 7508565971128574473, guid: 0b3ee65f4ceab0443ba637d4f4acbc68, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 7508565971128574473, guid: 0b3ee65f4ceab0443ba637d4f4acbc68, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7508565971128574473, guid: 0b3ee65f4ceab0443ba637d4f4acbc68, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7508565971128574473, guid: 0b3ee65f4ceab0443ba637d4f4acbc68, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7508565971128574473, guid: 0b3ee65f4ceab0443ba637d4f4acbc68, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0.133 + objectReference: {fileID: 0} + - target: {fileID: 7508565971128574473, guid: 0b3ee65f4ceab0443ba637d4f4acbc68, type: 3} + propertyPath: m_AnchoredPosition.y + value: -0.098 + objectReference: {fileID: 0} + - target: {fileID: 7508565971128574473, guid: 0b3ee65f4ceab0443ba637d4f4acbc68, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7508565971128574473, guid: 0b3ee65f4ceab0443ba637d4f4acbc68, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 7508565971128574473, guid: 0b3ee65f4ceab0443ba637d4f4acbc68, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 0b3ee65f4ceab0443ba637d4f4acbc68, type: 3} +--- !u!224 &7117355850823243513 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 7508565971128574473, guid: 0b3ee65f4ceab0443ba637d4f4acbc68, type: 3} + m_PrefabInstance: {fileID: 7117355850823243512} + m_PrefabAsset: {fileID: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 1035006626} + - {fileID: 1237795371} diff --git a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Sence/Counter.unity.meta b/Assets/00.StaryEvo/Samples~/SplashScreen/EvoScenes/loading.unity.meta similarity index 74% rename from Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Sence/Counter.unity.meta rename to Assets/00.StaryEvo/Samples~/SplashScreen/EvoScenes/loading.unity.meta index 5b4b6ad..c4f33f6 100644 --- a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Sence/Counter.unity.meta +++ b/Assets/00.StaryEvo/Samples~/SplashScreen/EvoScenes/loading.unity.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a98d5b4bbdf7a41428d28563f2282a7d +guid: 88d6c32a67b8891498813e0cf6008440 DefaultImporter: externalObjects: {} userData: diff --git a/Assets/00.StaryEvo/Samples~/SplashScreen/EvoScenes/logo.png b/Assets/00.StaryEvo/Samples~/SplashScreen/EvoScenes/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..829d510f6595adb90cd09292c147380ef9a66c8e GIT binary patch literal 44144 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 +6{~7x*GRHmX2!KVU1#n;J{HK5} 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 - - var previousCount = counterData.Count.Value; - - counterData.Count.Register(newCount => - { - if (newCount >= 10 && previousCount < 10) - { - Debug.Log("解锁 10 次点击成就"); - } - else if (newCount >= 20 && previousCount < 20) - { - Debug.Log("解锁 20 次点击成就"); - } - - previousCount = newCount; - }); - } - } -} \ No newline at end of file diff --git a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/AchievementSystem.cs.meta b/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/AchievementSystem.cs.meta deleted file mode 100644 index 3abcc58..0000000 --- a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/AchievementSystem.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: f241abf86b6647ea93571ad2f92c913a -timeCreated: 1624955512 \ No newline at end of file diff --git a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CommandAnd.cs b/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CommandAnd.cs deleted file mode 100644 index 6745bc8..0000000 --- a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CommandAnd.cs +++ /dev/null @@ -1,13 +0,0 @@ - - -namespace Stary.Evo.Example.Counter -{ - public class CommandAnd : AbstractCommand - { - protected override void OnExecute() - { - this.GetData().Count.Value++; - } - } - -} \ No newline at end of file diff --git a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CommandSub.cs b/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CommandSub.cs deleted file mode 100644 index 7174862..0000000 --- a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CommandSub.cs +++ /dev/null @@ -1,12 +0,0 @@ - - -namespace Stary.Evo.Example.Counter -{ - public class CommandSub : AbstractCommand - { - protected override void OnExecute() - { - CounterApp.Interface.GetData().Count.Value--; - } - } -} \ No newline at end of file diff --git a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CounterApp.cs b/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CounterApp.cs deleted file mode 100644 index aaddb46..0000000 --- a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CounterApp.cs +++ /dev/null @@ -1,15 +0,0 @@ - - -namespace Stary.Evo.Example.Counter -{ - public class CounterApp : Architecture - { - protected override void Init() - { - RegisterSystem(new AchievementSystem()); - RegisterData(new CounterData()); - RegisterUtility(new PlayerPrefsStorage()); - } - } - -} \ No newline at end of file diff --git a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CounterModel.cs b/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CounterModel.cs deleted file mode 100644 index 0e3bdcf..0000000 --- a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CounterModel.cs +++ /dev/null @@ -1,32 +0,0 @@ - - -namespace Stary.Evo.Example.Counter -{ - - public interface ICounterData : IData - { - BindableProperty Count { get; } - } - - public class CounterData : AbstractData, ICounterData - { - public override void Dispose() - { - - } - - protected override void OnInit() - { - var storage = this.GetUtility(); - Count.Value = storage.LoadInt("COUNTER_COUNT", 0); - - Count.Register( count => { storage.SaveInt("COUNTER_COUNT", count); }); - } - - public BindableProperty Count { get; } = new BindableProperty() - { - Value = 0 - }; - - } -} \ No newline at end of file diff --git a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CounterModel.cs.meta b/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CounterModel.cs.meta deleted file mode 100644 index 2b9975e..0000000 --- a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CounterModel.cs.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 10c86a7a3c934d4796a6ec85a27f5a81 -timeCreated: 1624948547 \ No newline at end of file diff --git a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CounterViewController.cs b/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CounterViewController.cs deleted file mode 100644 index f3a9d7e..0000000 --- a/Assets/00.StaryEvo/~Samples/Runtime/CounterApp/Script/CounterViewController.cs +++ /dev/null @@ -1,53 +0,0 @@ -using UnityEngine; -using UnityEngine.UI; - -namespace Stary.Evo.Example.Counter -{ - public class CounterViewController : MonoBehaviour, IController - { - private Text _countText; - private ICounterData mCounterData; - - void Start() - { - // 获取 - mCounterData = this.GetData(); - mCounterData.Count.Register(UpdateView); - _countText = transform.Find("CountText").GetComponent(); - _countText.text = mCounterData.Count.Value.ToString(); - transform.Find("ButtonAdd").GetComponent