diff --git a/.claude/rules/yooasset-extensions.md b/.claude/rules/yooasset-extensions.md new file mode 100644 index 000000000..aafdf744c --- /dev/null +++ b/.claude/rules/yooasset-extensions.md @@ -0,0 +1,24 @@ +# YooAsset Extension Sample Maintenance + +YooAsset ships Extension Samples under `Assets/Samples/YooAsset/`. These are vendor-provided examples that JEngine customizes. When YooAsset is updated and its Extension Samples change, our customizations may be overwritten. + +## Custom Modifications to Track + +### PreprocessBuildCatalog (Decryption Support) + +**File**: `Assets/Samples/YooAsset/*/Extension Sample/Editor/PreprocessBuild/PreprocessBuildCatalog.cs` + +**What we changed**: The upstream code calls `CatalogTools.CreateCatalogFile(null, ...)` with a `//TODO 自行处理解密` comment, which causes a NRE when manifests are encrypted. We replaced this with a try-all approach that attempts each `IManifestRestoreServices` from `EncryptionMapping.Mapping` until one succeeds. + +**Why**: See [YooAsset#730](https://github.com/tuyoogame/YooAsset/issues/730). The YooAsset author confirmed this is an intentional extension point for consumers to customize. + +**On YooAsset update**: Verify that `PreprocessBuildCatalog.cs` still contains our `TryCreateCatalogFile` / `TryCreate` helper methods and the `using JEngine.Core.Encrypt` import. If the sample was overwritten by the update, reapply the decryption try-all logic. + +## Update Checklist + +When updating YooAsset or its Extension Samples: + +- [ ] Diff the new Extension Sample files against our customized versions +- [ ] Reapply any overwritten JEngine customizations listed above +- [ ] Verify catalog generation works with both encrypted and unencrypted manifests +- [ ] Add any new upstream extension points to this file if customized diff --git a/.github/instructions/code-review.instructions.md b/.github/instructions/code-review.instructions.md index dde750c7e..fb00951c6 100644 --- a/.github/instructions/code-review.instructions.md +++ b/.github/instructions/code-review.instructions.md @@ -43,8 +43,19 @@ Avoid LINQ in hot paths and UI code for performance: - Use array/list indexing instead of `.First()` / `.Last()` - LINQ allocates iterators and delegates - avoid in frequently called code +### 7. Unit Test Coverage +New features and new logic in non-core packages (JEngine.UI, JEngine.Util, and any future packages) MUST include unit tests: +- Target **93%+ code coverage** for all new/modified code +- **Applies to**: All `Packages/com.jasonxudeveloper.jengine.*` packages **except** `jengine.core` +- Prefer **EditMode tests** (`Tests/Editor/`) for most logic +- Use **PlayMode tests** (`Tests/Runtime/`) when runtime behavior requires it (MonoBehaviour lifecycle, scene loading, etc.) — these must run **non-interactively** (no user input, no manual scene setup) +- Cover: constructors, public API, fluent chaining, edge cases, event handlers +- Use reflection to test private methods (e.g. `OnAttachToPanel`, hover handlers) when they contain meaningful logic +- Verify tests exercise both happy paths and error/boundary conditions + ## Common Issues to Flag +- Missing or insufficient unit tests for new features - Missing XML documentation on public APIs - Direct `Debug.Log` (should use proper logging) - `Task` instead of `UniTask` diff --git a/.github/instructions/jengine.instructions.md b/.github/instructions/jengine.instructions.md index ad4710886..976e1d870 100644 --- a/.github/instructions/jengine.instructions.md +++ b/.github/instructions/jengine.instructions.md @@ -102,6 +102,84 @@ internal class MyEditorClass } ``` +## Unit Testing + +### Scope +Unit tests are required for all non-core JEngine packages — i.e. any package under `Packages/com.jasonxudeveloper.jengine.*` **except** `jengine.core`. This includes JEngine.UI, JEngine.Util, and any future packages. + +### Coverage Requirement +New features and new logic MUST include unit tests targeting **93%+ code coverage**: +- All public methods, properties, and constructors +- Fluent API chaining +- Edge cases and error conditions +- Event handlers and callbacks (use reflection for private handlers) + +### Test Modes +- **EditMode tests** (`Tests/Editor/`): Preferred for most logic — fast, no scene required. +- **PlayMode tests** (`Tests/Runtime/`): Use when the test needs a running game loop, MonoBehaviour lifecycle, or scene loading. PlayMode tests **must run non-interactively** (no user input, no manual scene setup). Use `[UnityTest]` with `UniTask.ToCoroutine()` for async PlayMode tests. + +### Test Location +Tests mirror the source structure under each package's test folders: +``` +Packages/com.jasonxudeveloper.jengine.ui/Editor/Components/Button/JButton.cs + → Packages/com.jasonxudeveloper.jengine.ui/Tests/Editor/Components/Button/JButtonTests.cs + +Packages/com.jasonxudeveloper.jengine.util/Runtime/JAction.cs + → Packages/com.jasonxudeveloper.jengine.util/Tests/Editor/JActionTests.cs + +# PlayMode tests when runtime behavior requires it: +Packages/com.jasonxudeveloper.jengine.util/Runtime/SomeFeature.cs + → Packages/com.jasonxudeveloper.jengine.util/Tests/Runtime/SomeFeatureTests.cs +``` + +### EditMode Test Pattern +```csharp +[TestFixture] +public class MyComponentTests +{ + private MyComponent _component; + + [SetUp] + public void SetUp() + { + _component = new MyComponent(); + } + + [Test] + public void Constructor_Default_AddsBaseClass() + { + Assert.IsTrue(_component.ClassListContains("my-component")); + } +} +``` + +### PlayMode Test Pattern +PlayMode tests must be fully automated — no interactive input or manual scene setup: +```csharp +[TestFixture] +public class MyRuntimeTests +{ + [UnityTest] + public IEnumerator MyAsyncTest() => UniTask.ToCoroutine(async () => + { + var go = new GameObject(); + var component = go.AddComponent(); + await UniTask.DelayFrame(1); + Assert.IsTrue(component.IsInitialized); + Object.Destroy(go); + }); +} +``` + +### Testing Private Methods via Reflection +For private event handlers and internal styling methods: +```csharp +var method = typeof(MyComponent).GetMethod("OnMouseEnter", + BindingFlags.NonPublic | BindingFlags.Instance); +method.Invoke(_component, new object[] { null }); +Assert.AreEqual(expectedColor, _component.style.backgroundColor.value); +``` + ## Review Focus Areas When reviewing JEngine code, check: @@ -110,3 +188,4 @@ When reviewing JEngine code, check: 3. Resource cleanup (ScriptableObjects, events) 4. Thread safety for callback-accessed state 5. Proper namespace usage +6. Unit tests with 93%+ coverage for new features/logic diff --git a/CLAUDE.md b/CLAUDE.md index 4b8238af9..67e4e9a85 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,6 +6,7 @@ @.claude/rules/commit-conventions.md @.claude/rules/package-creation.md @.claude/rules/plugin-maintenance.md +@.claude/rules/yooasset-extensions.md ## Project Overview diff --git a/UnityProject/Assets/HotUpdate/Compiled/AOT/Assembly-CSharp.dll.bytes b/UnityProject/Assets/HotUpdate/Compiled/AOT/Assembly-CSharp.dll.bytes index 3e08fe13e..7561714f8 100644 Binary files a/UnityProject/Assets/HotUpdate/Compiled/AOT/Assembly-CSharp.dll.bytes and b/UnityProject/Assets/HotUpdate/Compiled/AOT/Assembly-CSharp.dll.bytes differ diff --git a/UnityProject/Assets/HotUpdate/Compiled/AOT/JEngine.Core.dll.bytes b/UnityProject/Assets/HotUpdate/Compiled/AOT/JEngine.Core.dll.bytes index 5aa4c62dc..20b4217f1 100644 Binary files a/UnityProject/Assets/HotUpdate/Compiled/AOT/JEngine.Core.dll.bytes and b/UnityProject/Assets/HotUpdate/Compiled/AOT/JEngine.Core.dll.bytes differ diff --git a/UnityProject/Assets/HotUpdate/Compiled/HotUpdate.Code.dll.bytes b/UnityProject/Assets/HotUpdate/Compiled/HotUpdate.Code.dll.bytes index 2e4a6742f..9c830aef3 100644 Binary files a/UnityProject/Assets/HotUpdate/Compiled/HotUpdate.Code.dll.bytes and b/UnityProject/Assets/HotUpdate/Compiled/HotUpdate.Code.dll.bytes differ diff --git a/UnityProject/Assets/Obfuz/SymbolObfus/symbol-mapping.xml b/UnityProject/Assets/Obfuz/SymbolObfus/symbol-mapping.xml index 38ff1638c..452886b4e 100644 --- a/UnityProject/Assets/Obfuz/SymbolObfus/symbol-mapping.xml +++ b/UnityProject/Assets/Obfuz/SymbolObfus/symbol-mapping.xml @@ -306,12 +306,12 @@ - + - - + + - + @@ -418,8 +418,6 @@ - - @@ -477,11 +475,11 @@ - - + + @@ -549,13 +547,13 @@ - + - + @@ -574,8 +572,10 @@ + + @@ -594,16 +594,11 @@ - - - - - - - - - - + + + + + @@ -728,6 +723,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -777,6 +809,16 @@ + + + + + + + + + + @@ -854,6 +896,20 @@ + + + + + + + + + + + + + + @@ -934,6 +990,19 @@ + + + + + + + + + + + + + @@ -1013,6 +1082,17 @@ + + + + + + + + + + + @@ -1085,6 +1165,14 @@ + + + + + + + + @@ -1194,6 +1282,22 @@ + + + + + + + + + + + + + + + + @@ -1250,6 +1354,10 @@ + + + + diff --git a/UnityProject/Assets/Samples/YooAsset/2.3.18/Extension Sample/Editor/PreprocessBuild/PreprocessBuildCatalog.cs b/UnityProject/Assets/Samples/YooAsset/2.3.18/Extension Sample/Editor/PreprocessBuild/PreprocessBuildCatalog.cs index 339fc58d7..1e67e0770 100644 --- a/UnityProject/Assets/Samples/YooAsset/2.3.18/Extension Sample/Editor/PreprocessBuild/PreprocessBuildCatalog.cs +++ b/UnityProject/Assets/Samples/YooAsset/2.3.18/Extension Sample/Editor/PreprocessBuild/PreprocessBuildCatalog.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.IO; +using JEngine.Core.Encrypt; using UnityEngine; namespace YooAsset @@ -30,19 +31,44 @@ public void OnPreprocessBuild(UnityEditor.Build.Reporting.BuildReport report) { string packageName = subDirectory.Name; string pacakgeDirectory = subDirectory.FullName; - try + if (!TryCreateCatalogFile(packageName, pacakgeDirectory)) { - bool result = CatalogTools.CreateCatalogFile(null, packageName, pacakgeDirectory); //TODO 自行处理解密 - if (result == false) - { - Debug.LogError($"Create package {packageName} catalog file failed ! See the detail error in console !"); - } + Debug.LogError($"Create package {packageName} catalog file failed ! See the detail error in console !"); } - catch (System.Exception ex) + } + } + + private static bool TryCreateCatalogFile(string packageName, string packageDirectory) + { + // Try without decryption first (unencrypted manifests) + if (TryCreate(null, packageName, packageDirectory)) + return true; + + // Try each registered encryption method + foreach (var kvp in EncryptionMapping.Mapping) + { + var restore = kvp.Value.ManifestEncryptionConfig.Decryption; + if (TryCreate(restore, packageName, packageDirectory)) { - Debug.LogError($"Create package {packageName} catalog file failed ! {ex.Message}"); + YooLogger.Log($"Package '{packageName}' catalog created using {kvp.Key} decryption."); + return true; } } + + return false; + } + + private static bool TryCreate(IManifestRestoreServices services, + string packageName, string packageDirectory) + { + try + { + return CatalogTools.CreateCatalogFile(services, packageName, packageDirectory); + } + catch + { + return false; + } } } } \ No newline at end of file diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/1832d193ad604c285e2456ba2a7855c7.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/1832d193ad604c285e2456ba2a7855c7.bundle new file mode 100644 index 000000000..726588b2e Binary files /dev/null and b/UnityProject/Assets/StreamingAssets/yoo/main/1832d193ad604c285e2456ba2a7855c7.bundle differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/5154722f17ed26abd07f0275b2fb315c.bundle.meta b/UnityProject/Assets/StreamingAssets/yoo/main/1832d193ad604c285e2456ba2a7855c7.bundle.meta similarity index 74% rename from UnityProject/Assets/StreamingAssets/yoo/main/5154722f17ed26abd07f0275b2fb315c.bundle.meta rename to UnityProject/Assets/StreamingAssets/yoo/main/1832d193ad604c285e2456ba2a7855c7.bundle.meta index 96074e337..595ef167b 100644 --- a/UnityProject/Assets/StreamingAssets/yoo/main/5154722f17ed26abd07f0275b2fb315c.bundle.meta +++ b/UnityProject/Assets/StreamingAssets/yoo/main/1832d193ad604c285e2456ba2a7855c7.bundle.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 5243d056b9ae74f9fbaa56e844dc828a +guid: dc7a2510496394a2e9b776e56a9d254c DefaultImporter: externalObjects: {} userData: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/20c6686ce660502e16a881f74dde76d7.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/20c6686ce660502e16a881f74dde76d7.bundle new file mode 100644 index 000000000..728781068 Binary files /dev/null and b/UnityProject/Assets/StreamingAssets/yoo/main/20c6686ce660502e16a881f74dde76d7.bundle differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/427571ab4f40f72802eba023fca7a5e8.bundle.meta b/UnityProject/Assets/StreamingAssets/yoo/main/20c6686ce660502e16a881f74dde76d7.bundle.meta similarity index 74% rename from UnityProject/Assets/StreamingAssets/yoo/main/427571ab4f40f72802eba023fca7a5e8.bundle.meta rename to UnityProject/Assets/StreamingAssets/yoo/main/20c6686ce660502e16a881f74dde76d7.bundle.meta index 30b76022e..18cef0e3d 100644 --- a/UnityProject/Assets/StreamingAssets/yoo/main/427571ab4f40f72802eba023fca7a5e8.bundle.meta +++ b/UnityProject/Assets/StreamingAssets/yoo/main/20c6686ce660502e16a881f74dde76d7.bundle.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: de5e734b7a33942bd9654e699dacc44c +guid: 31581fb4b699643dd9e3e7e63b2d0ba9 DefaultImporter: externalObjects: {} userData: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/427571ab4f40f72802eba023fca7a5e8.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/427571ab4f40f72802eba023fca7a5e8.bundle deleted file mode 100644 index 61e6aa1fc..000000000 Binary files a/UnityProject/Assets/StreamingAssets/yoo/main/427571ab4f40f72802eba023fca7a5e8.bundle and /dev/null differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/4549b29fd00b2e57f75873c7c370340b.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/4549b29fd00b2e57f75873c7c370340b.bundle deleted file mode 100644 index 4c68bf650..000000000 Binary files a/UnityProject/Assets/StreamingAssets/yoo/main/4549b29fd00b2e57f75873c7c370340b.bundle and /dev/null differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/490ed19cf4dd5e128fb13cf883211456.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/490ed19cf4dd5e128fb13cf883211456.bundle new file mode 100644 index 000000000..1d0ef8d6f Binary files /dev/null and b/UnityProject/Assets/StreamingAssets/yoo/main/490ed19cf4dd5e128fb13cf883211456.bundle differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/578aebd507ab15c1f73f9a41b5962e15.bundle.meta b/UnityProject/Assets/StreamingAssets/yoo/main/490ed19cf4dd5e128fb13cf883211456.bundle.meta similarity index 74% rename from UnityProject/Assets/StreamingAssets/yoo/main/578aebd507ab15c1f73f9a41b5962e15.bundle.meta rename to UnityProject/Assets/StreamingAssets/yoo/main/490ed19cf4dd5e128fb13cf883211456.bundle.meta index d9a18d087..66b075e9c 100644 --- a/UnityProject/Assets/StreamingAssets/yoo/main/578aebd507ab15c1f73f9a41b5962e15.bundle.meta +++ b/UnityProject/Assets/StreamingAssets/yoo/main/490ed19cf4dd5e128fb13cf883211456.bundle.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 9e41401d7b056451bbff4a803d6a9851 +guid: fe311c92cb54941d2a621f92626d7cf1 DefaultImporter: externalObjects: {} userData: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/4abd3c5f4f01b40f54c4a348b24ead49.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/4abd3c5f4f01b40f54c4a348b24ead49.bundle new file mode 100644 index 000000000..df66425e7 Binary files /dev/null and b/UnityProject/Assets/StreamingAssets/yoo/main/4abd3c5f4f01b40f54c4a348b24ead49.bundle differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/4549b29fd00b2e57f75873c7c370340b.bundle.meta b/UnityProject/Assets/StreamingAssets/yoo/main/4abd3c5f4f01b40f54c4a348b24ead49.bundle.meta similarity index 74% rename from UnityProject/Assets/StreamingAssets/yoo/main/4549b29fd00b2e57f75873c7c370340b.bundle.meta rename to UnityProject/Assets/StreamingAssets/yoo/main/4abd3c5f4f01b40f54c4a348b24ead49.bundle.meta index dbcbd6f19..cd7e49741 100644 --- a/UnityProject/Assets/StreamingAssets/yoo/main/4549b29fd00b2e57f75873c7c370340b.bundle.meta +++ b/UnityProject/Assets/StreamingAssets/yoo/main/4abd3c5f4f01b40f54c4a348b24ead49.bundle.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 2174447b3e3b0476d812642fafebd053 +guid: 921643076c5e940629df9ff840da556d DefaultImporter: externalObjects: {} userData: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/5154722f17ed26abd07f0275b2fb315c.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/5154722f17ed26abd07f0275b2fb315c.bundle deleted file mode 100644 index 2ef062de8..000000000 Binary files a/UnityProject/Assets/StreamingAssets/yoo/main/5154722f17ed26abd07f0275b2fb315c.bundle and /dev/null differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/56d90d09aba519ecd1cba11dfc31f5d8.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/56d90d09aba519ecd1cba11dfc31f5d8.bundle new file mode 100644 index 000000000..25496770c Binary files /dev/null and b/UnityProject/Assets/StreamingAssets/yoo/main/56d90d09aba519ecd1cba11dfc31f5d8.bundle differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/56d90d09aba519ecd1cba11dfc31f5d8.bundle.meta b/UnityProject/Assets/StreamingAssets/yoo/main/56d90d09aba519ecd1cba11dfc31f5d8.bundle.meta new file mode 100644 index 000000000..6456b7b5b --- /dev/null +++ b/UnityProject/Assets/StreamingAssets/yoo/main/56d90d09aba519ecd1cba11dfc31f5d8.bundle.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e3eb4a466d3e7449b9eb542b9afc29b3 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/578aebd507ab15c1f73f9a41b5962e15.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/578aebd507ab15c1f73f9a41b5962e15.bundle deleted file mode 100644 index 786243cd1..000000000 Binary files a/UnityProject/Assets/StreamingAssets/yoo/main/578aebd507ab15c1f73f9a41b5962e15.bundle and /dev/null differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/743303a92561c811cf9e428d59f4eed5.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/743303a92561c811cf9e428d59f4eed5.bundle deleted file mode 100644 index 2262543fa..000000000 Binary files a/UnityProject/Assets/StreamingAssets/yoo/main/743303a92561c811cf9e428d59f4eed5.bundle and /dev/null differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/743303a92561c811cf9e428d59f4eed5.bundle.meta b/UnityProject/Assets/StreamingAssets/yoo/main/743303a92561c811cf9e428d59f4eed5.bundle.meta deleted file mode 100644 index 7d3e1566d..000000000 --- a/UnityProject/Assets/StreamingAssets/yoo/main/743303a92561c811cf9e428d59f4eed5.bundle.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 81bbcfd248fb343c28dac65c33d43001 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/76c5d9ebda370e318d1d711bf29db391.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/76c5d9ebda370e318d1d711bf29db391.bundle deleted file mode 100644 index e3b710e08..000000000 Binary files a/UnityProject/Assets/StreamingAssets/yoo/main/76c5d9ebda370e318d1d711bf29db391.bundle and /dev/null differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/76c5d9ebda370e318d1d711bf29db391.bundle.meta b/UnityProject/Assets/StreamingAssets/yoo/main/76c5d9ebda370e318d1d711bf29db391.bundle.meta deleted file mode 100644 index 1705d5547..000000000 --- a/UnityProject/Assets/StreamingAssets/yoo/main/76c5d9ebda370e318d1d711bf29db391.bundle.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 212dfe20022f74ecd8320d07a2ab2c47 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/7d008b589c7529b71f703107fc14b2a1.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/7d008b589c7529b71f703107fc14b2a1.bundle deleted file mode 100644 index ca5fd5145..000000000 Binary files a/UnityProject/Assets/StreamingAssets/yoo/main/7d008b589c7529b71f703107fc14b2a1.bundle and /dev/null differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/7d008b589c7529b71f703107fc14b2a1.bundle.meta b/UnityProject/Assets/StreamingAssets/yoo/main/7d008b589c7529b71f703107fc14b2a1.bundle.meta deleted file mode 100644 index f873a455d..000000000 --- a/UnityProject/Assets/StreamingAssets/yoo/main/7d008b589c7529b71f703107fc14b2a1.bundle.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 958812791c38144aa81c7b1b1524183d -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/85bf7a8000e78a0640dd575c462d71de.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/85bf7a8000e78a0640dd575c462d71de.bundle new file mode 100644 index 000000000..a81da76d3 Binary files /dev/null and b/UnityProject/Assets/StreamingAssets/yoo/main/85bf7a8000e78a0640dd575c462d71de.bundle differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/85bf7a8000e78a0640dd575c462d71de.bundle.meta b/UnityProject/Assets/StreamingAssets/yoo/main/85bf7a8000e78a0640dd575c462d71de.bundle.meta new file mode 100644 index 000000000..5f50007f8 --- /dev/null +++ b/UnityProject/Assets/StreamingAssets/yoo/main/85bf7a8000e78a0640dd575c462d71de.bundle.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 632bea6b9a7e84b419f3295c5a786c06 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/BuildinCatalog.bytes b/UnityProject/Assets/StreamingAssets/yoo/main/BuildinCatalog.bytes index f45f9ca03..a76e75272 100644 Binary files a/UnityProject/Assets/StreamingAssets/yoo/main/BuildinCatalog.bytes and b/UnityProject/Assets/StreamingAssets/yoo/main/BuildinCatalog.bytes differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/BuildinCatalog.json b/UnityProject/Assets/StreamingAssets/yoo/main/BuildinCatalog.json index 6ff076070..bd82f2921 100644 --- a/UnityProject/Assets/StreamingAssets/yoo/main/BuildinCatalog.json +++ b/UnityProject/Assets/StreamingAssets/yoo/main/BuildinCatalog.json @@ -1,59 +1,59 @@ { "FileVersion": "1.0.0", "PackageName": "main", - "PackageVersion": "260202209", + "PackageVersion": "260208479", "Wrappers": [ { - "BundleGUID": "427571ab4f40f72802eba023fca7a5e8", - "FileName": "427571ab4f40f72802eba023fca7a5e8.bundle" + "BundleGUID": "1832d193ad604c285e2456ba2a7855c7", + "FileName": "1832d193ad604c285e2456ba2a7855c7.bundle" }, { - "BundleGUID": "4549b29fd00b2e57f75873c7c370340b", - "FileName": "4549b29fd00b2e57f75873c7c370340b.bundle" + "BundleGUID": "20c6686ce660502e16a881f74dde76d7", + "FileName": "20c6686ce660502e16a881f74dde76d7.bundle" }, { - "BundleGUID": "5154722f17ed26abd07f0275b2fb315c", - "FileName": "5154722f17ed26abd07f0275b2fb315c.bundle" + "BundleGUID": "490ed19cf4dd5e128fb13cf883211456", + "FileName": "490ed19cf4dd5e128fb13cf883211456.bundle" }, { - "BundleGUID": "578aebd507ab15c1f73f9a41b5962e15", - "FileName": "578aebd507ab15c1f73f9a41b5962e15.bundle" + "BundleGUID": "4abd3c5f4f01b40f54c4a348b24ead49", + "FileName": "4abd3c5f4f01b40f54c4a348b24ead49.bundle" }, { - "BundleGUID": "743303a92561c811cf9e428d59f4eed5", - "FileName": "743303a92561c811cf9e428d59f4eed5.bundle" + "BundleGUID": "56d90d09aba519ecd1cba11dfc31f5d8", + "FileName": "56d90d09aba519ecd1cba11dfc31f5d8.bundle" }, { - "BundleGUID": "76c5d9ebda370e318d1d711bf29db391", - "FileName": "76c5d9ebda370e318d1d711bf29db391.bundle" + "BundleGUID": "85bf7a8000e78a0640dd575c462d71de", + "FileName": "85bf7a8000e78a0640dd575c462d71de.bundle" }, { - "BundleGUID": "7d008b589c7529b71f703107fc14b2a1", - "FileName": "7d008b589c7529b71f703107fc14b2a1.bundle" + "BundleGUID": "a08587b61b8accf9b169ccdf828176f6", + "FileName": "a08587b61b8accf9b169ccdf828176f6.bundle" }, { - "BundleGUID": "a99f206109faf44e637346323f255c84", - "FileName": "a99f206109faf44e637346323f255c84.bundle" + "BundleGUID": "ae16386504461146b4ec88eabc7de89f", + "FileName": "ae16386504461146b4ec88eabc7de89f.bundle" }, { - "BundleGUID": "aa7811a04dda58d98435ef7170ce0828", - "FileName": "aa7811a04dda58d98435ef7170ce0828.bundle" + "BundleGUID": "c792026eb6f717273422cfb875e3121d", + "FileName": "c792026eb6f717273422cfb875e3121d.bundle" }, { - "BundleGUID": "bd7a40533fe708ab184ec75ceac853ee", - "FileName": "bd7a40533fe708ab184ec75ceac853ee.bundle" + "BundleGUID": "c9cd151a5606eec7bf47ac8d9401fb94", + "FileName": "c9cd151a5606eec7bf47ac8d9401fb94.bundle" }, { - "BundleGUID": "e578f9b5397d53f41a2b284805860df8", - "FileName": "e578f9b5397d53f41a2b284805860df8.bundle" + "BundleGUID": "cde787d0afee29507a54189b7372cf14", + "FileName": "cde787d0afee29507a54189b7372cf14.bundle" }, { - "BundleGUID": "e6ed0b286414267962e71c6bd3e19aae", - "FileName": "e6ed0b286414267962e71c6bd3e19aae.bundle" + "BundleGUID": "dcb1b5ed74667265ec98799a1576d5d3", + "FileName": "dcb1b5ed74667265ec98799a1576d5d3.bundle" }, { - "BundleGUID": "eb53152c634d44794e4aebca15ee8b0b", - "FileName": "eb53152c634d44794e4aebca15ee8b0b.bundle" + "BundleGUID": "ec451612fae802d07094821d3808809f", + "FileName": "ec451612fae802d07094821d3808809f.bundle" } ] } \ No newline at end of file diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/a08587b61b8accf9b169ccdf828176f6.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/a08587b61b8accf9b169ccdf828176f6.bundle new file mode 100644 index 000000000..053e4cbb8 Binary files /dev/null and b/UnityProject/Assets/StreamingAssets/yoo/main/a08587b61b8accf9b169ccdf828176f6.bundle differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/a08587b61b8accf9b169ccdf828176f6.bundle.meta b/UnityProject/Assets/StreamingAssets/yoo/main/a08587b61b8accf9b169ccdf828176f6.bundle.meta new file mode 100644 index 000000000..8b27aa7d6 --- /dev/null +++ b/UnityProject/Assets/StreamingAssets/yoo/main/a08587b61b8accf9b169ccdf828176f6.bundle.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: bb82bd11c6eb54d0cbe0c30fef98a7d4 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/a99f206109faf44e637346323f255c84.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/a99f206109faf44e637346323f255c84.bundle deleted file mode 100644 index ed26b2c15..000000000 Binary files a/UnityProject/Assets/StreamingAssets/yoo/main/a99f206109faf44e637346323f255c84.bundle and /dev/null differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/a99f206109faf44e637346323f255c84.bundle.meta b/UnityProject/Assets/StreamingAssets/yoo/main/a99f206109faf44e637346323f255c84.bundle.meta deleted file mode 100644 index 851e0121a..000000000 --- a/UnityProject/Assets/StreamingAssets/yoo/main/a99f206109faf44e637346323f255c84.bundle.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 2958988901cfc434b80f4be6803f2476 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/aa7811a04dda58d98435ef7170ce0828.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/aa7811a04dda58d98435ef7170ce0828.bundle deleted file mode 100644 index 5a9273183..000000000 Binary files a/UnityProject/Assets/StreamingAssets/yoo/main/aa7811a04dda58d98435ef7170ce0828.bundle and /dev/null differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/aa7811a04dda58d98435ef7170ce0828.bundle.meta b/UnityProject/Assets/StreamingAssets/yoo/main/aa7811a04dda58d98435ef7170ce0828.bundle.meta deleted file mode 100644 index 200b376c0..000000000 --- a/UnityProject/Assets/StreamingAssets/yoo/main/aa7811a04dda58d98435ef7170ce0828.bundle.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 40e342c01cb18476a95a4e9594d40050 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/ae16386504461146b4ec88eabc7de89f.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/ae16386504461146b4ec88eabc7de89f.bundle new file mode 100644 index 000000000..b9fc0ab4b Binary files /dev/null and b/UnityProject/Assets/StreamingAssets/yoo/main/ae16386504461146b4ec88eabc7de89f.bundle differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/ae16386504461146b4ec88eabc7de89f.bundle.meta b/UnityProject/Assets/StreamingAssets/yoo/main/ae16386504461146b4ec88eabc7de89f.bundle.meta new file mode 100644 index 000000000..20f497b3f --- /dev/null +++ b/UnityProject/Assets/StreamingAssets/yoo/main/ae16386504461146b4ec88eabc7de89f.bundle.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ee72209489a534945a77825685951022 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/bd7a40533fe708ab184ec75ceac853ee.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/bd7a40533fe708ab184ec75ceac853ee.bundle deleted file mode 100644 index 3df9048f8..000000000 Binary files a/UnityProject/Assets/StreamingAssets/yoo/main/bd7a40533fe708ab184ec75ceac853ee.bundle and /dev/null differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/bd7a40533fe708ab184ec75ceac853ee.bundle.meta b/UnityProject/Assets/StreamingAssets/yoo/main/bd7a40533fe708ab184ec75ceac853ee.bundle.meta deleted file mode 100644 index 98d786a16..000000000 --- a/UnityProject/Assets/StreamingAssets/yoo/main/bd7a40533fe708ab184ec75ceac853ee.bundle.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: f4fdff4e1398e4a5885baa7fc28a455c -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/c792026eb6f717273422cfb875e3121d.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/c792026eb6f717273422cfb875e3121d.bundle new file mode 100644 index 000000000..2f4ca6735 Binary files /dev/null and b/UnityProject/Assets/StreamingAssets/yoo/main/c792026eb6f717273422cfb875e3121d.bundle differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/c792026eb6f717273422cfb875e3121d.bundle.meta b/UnityProject/Assets/StreamingAssets/yoo/main/c792026eb6f717273422cfb875e3121d.bundle.meta new file mode 100644 index 000000000..9a02a3545 --- /dev/null +++ b/UnityProject/Assets/StreamingAssets/yoo/main/c792026eb6f717273422cfb875e3121d.bundle.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 97326bc3b2b3443a3b498357057be8bf +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/c9cd151a5606eec7bf47ac8d9401fb94.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/c9cd151a5606eec7bf47ac8d9401fb94.bundle new file mode 100644 index 000000000..68c3c340a Binary files /dev/null and b/UnityProject/Assets/StreamingAssets/yoo/main/c9cd151a5606eec7bf47ac8d9401fb94.bundle differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/c9cd151a5606eec7bf47ac8d9401fb94.bundle.meta b/UnityProject/Assets/StreamingAssets/yoo/main/c9cd151a5606eec7bf47ac8d9401fb94.bundle.meta new file mode 100644 index 000000000..ca02ceac6 --- /dev/null +++ b/UnityProject/Assets/StreamingAssets/yoo/main/c9cd151a5606eec7bf47ac8d9401fb94.bundle.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ee899f247db36435bb5cf06b6a567699 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/cde787d0afee29507a54189b7372cf14.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/cde787d0afee29507a54189b7372cf14.bundle new file mode 100644 index 000000000..5df889a71 Binary files /dev/null and b/UnityProject/Assets/StreamingAssets/yoo/main/cde787d0afee29507a54189b7372cf14.bundle differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/cde787d0afee29507a54189b7372cf14.bundle.meta b/UnityProject/Assets/StreamingAssets/yoo/main/cde787d0afee29507a54189b7372cf14.bundle.meta new file mode 100644 index 000000000..c7e35becf --- /dev/null +++ b/UnityProject/Assets/StreamingAssets/yoo/main/cde787d0afee29507a54189b7372cf14.bundle.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5eea8af94087e493f8ed9ddec3e12db3 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/dcb1b5ed74667265ec98799a1576d5d3.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/dcb1b5ed74667265ec98799a1576d5d3.bundle new file mode 100644 index 000000000..1f488cbf9 Binary files /dev/null and b/UnityProject/Assets/StreamingAssets/yoo/main/dcb1b5ed74667265ec98799a1576d5d3.bundle differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/dcb1b5ed74667265ec98799a1576d5d3.bundle.meta b/UnityProject/Assets/StreamingAssets/yoo/main/dcb1b5ed74667265ec98799a1576d5d3.bundle.meta new file mode 100644 index 000000000..2a4d87bde --- /dev/null +++ b/UnityProject/Assets/StreamingAssets/yoo/main/dcb1b5ed74667265ec98799a1576d5d3.bundle.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5a35de3829437495a958346abdea9fe5 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/e578f9b5397d53f41a2b284805860df8.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/e578f9b5397d53f41a2b284805860df8.bundle deleted file mode 100644 index 58728e098..000000000 Binary files a/UnityProject/Assets/StreamingAssets/yoo/main/e578f9b5397d53f41a2b284805860df8.bundle and /dev/null differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/e578f9b5397d53f41a2b284805860df8.bundle.meta b/UnityProject/Assets/StreamingAssets/yoo/main/e578f9b5397d53f41a2b284805860df8.bundle.meta deleted file mode 100644 index ca8b57254..000000000 --- a/UnityProject/Assets/StreamingAssets/yoo/main/e578f9b5397d53f41a2b284805860df8.bundle.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 5c1eb87919ebe47b1a06e08655a3bc2c -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/e6ed0b286414267962e71c6bd3e19aae.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/e6ed0b286414267962e71c6bd3e19aae.bundle deleted file mode 100644 index fddb219c2..000000000 Binary files a/UnityProject/Assets/StreamingAssets/yoo/main/e6ed0b286414267962e71c6bd3e19aae.bundle and /dev/null differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/e6ed0b286414267962e71c6bd3e19aae.bundle.meta b/UnityProject/Assets/StreamingAssets/yoo/main/e6ed0b286414267962e71c6bd3e19aae.bundle.meta deleted file mode 100644 index 48f835839..000000000 --- a/UnityProject/Assets/StreamingAssets/yoo/main/e6ed0b286414267962e71c6bd3e19aae.bundle.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: a84b9fbe1723d4e4fae407b37fe9fbed -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/eb53152c634d44794e4aebca15ee8b0b.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/eb53152c634d44794e4aebca15ee8b0b.bundle deleted file mode 100644 index 3a4706dd6..000000000 Binary files a/UnityProject/Assets/StreamingAssets/yoo/main/eb53152c634d44794e4aebca15ee8b0b.bundle and /dev/null differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/eb53152c634d44794e4aebca15ee8b0b.bundle.meta b/UnityProject/Assets/StreamingAssets/yoo/main/eb53152c634d44794e4aebca15ee8b0b.bundle.meta deleted file mode 100644 index acd97f688..000000000 --- a/UnityProject/Assets/StreamingAssets/yoo/main/eb53152c634d44794e4aebca15ee8b0b.bundle.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: ef03bf55664ca498e91aedd1b9fd485c -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/ec451612fae802d07094821d3808809f.bundle b/UnityProject/Assets/StreamingAssets/yoo/main/ec451612fae802d07094821d3808809f.bundle new file mode 100644 index 000000000..d1eece83b Binary files /dev/null and b/UnityProject/Assets/StreamingAssets/yoo/main/ec451612fae802d07094821d3808809f.bundle differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/ec451612fae802d07094821d3808809f.bundle.meta b/UnityProject/Assets/StreamingAssets/yoo/main/ec451612fae802d07094821d3808809f.bundle.meta new file mode 100644 index 000000000..53fd0a836 --- /dev/null +++ b/UnityProject/Assets/StreamingAssets/yoo/main/ec451612fae802d07094821d3808809f.bundle.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d36862f8c80594046b66470b69bc88ae +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/main.version b/UnityProject/Assets/StreamingAssets/yoo/main/main.version index c18b98797..f960c074f 100644 --- a/UnityProject/Assets/StreamingAssets/yoo/main/main.version +++ b/UnityProject/Assets/StreamingAssets/yoo/main/main.version @@ -1 +1 @@ -260202209 \ No newline at end of file +260208479 \ No newline at end of file diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/main_260202209.bytes b/UnityProject/Assets/StreamingAssets/yoo/main/main_260202209.bytes deleted file mode 100644 index 44af77e89..000000000 Binary files a/UnityProject/Assets/StreamingAssets/yoo/main/main_260202209.bytes and /dev/null differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/main_260202209.bytes.meta b/UnityProject/Assets/StreamingAssets/yoo/main/main_260202209.bytes.meta deleted file mode 100644 index d2f2440d8..000000000 --- a/UnityProject/Assets/StreamingAssets/yoo/main/main_260202209.bytes.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: e54223704c94c4bb5a1affe8058d803d -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/main_260202209.hash b/UnityProject/Assets/StreamingAssets/yoo/main/main_260202209.hash deleted file mode 100644 index 684ea60dd..000000000 --- a/UnityProject/Assets/StreamingAssets/yoo/main/main_260202209.hash +++ /dev/null @@ -1 +0,0 @@ -7f2ba677 \ No newline at end of file diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/main_260202209.hash.meta b/UnityProject/Assets/StreamingAssets/yoo/main/main_260202209.hash.meta deleted file mode 100644 index e64e2a6f0..000000000 --- a/UnityProject/Assets/StreamingAssets/yoo/main/main_260202209.hash.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 24256b48ddcbd492892edc790e8f209c -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/main_260208479.bytes b/UnityProject/Assets/StreamingAssets/yoo/main/main_260208479.bytes new file mode 100644 index 000000000..913ef75d7 Binary files /dev/null and b/UnityProject/Assets/StreamingAssets/yoo/main/main_260208479.bytes differ diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/main_260208479.bytes.meta b/UnityProject/Assets/StreamingAssets/yoo/main/main_260208479.bytes.meta new file mode 100644 index 000000000..c2fc90301 --- /dev/null +++ b/UnityProject/Assets/StreamingAssets/yoo/main/main_260208479.bytes.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2f4124e6754aa47e696d655d5e28dd78 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/main_260208479.hash b/UnityProject/Assets/StreamingAssets/yoo/main/main_260208479.hash new file mode 100644 index 000000000..1bc5d2d89 --- /dev/null +++ b/UnityProject/Assets/StreamingAssets/yoo/main/main_260208479.hash @@ -0,0 +1 @@ +120fa27e \ No newline at end of file diff --git a/UnityProject/Assets/StreamingAssets/yoo/main/main_260208479.hash.meta b/UnityProject/Assets/StreamingAssets/yoo/main/main_260208479.hash.meta new file mode 100644 index 000000000..b68807bb1 --- /dev/null +++ b/UnityProject/Assets/StreamingAssets/yoo/main/main_260208479.hash.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 30cc906e1c1894181ad12bc06845c3d2 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProject/Packages/com.jasonxudeveloper.jengine.core/Editor/CustomEditor/BootstrapEditor.cs b/UnityProject/Packages/com.jasonxudeveloper.jengine.core/Editor/CustomEditor/BootstrapEditor.cs index 6e5259d03..e7991c120 100644 --- a/UnityProject/Packages/com.jasonxudeveloper.jengine.core/Editor/CustomEditor/BootstrapEditor.cs +++ b/UnityProject/Packages/com.jasonxudeveloper.jengine.core/Editor/CustomEditor/BootstrapEditor.cs @@ -74,6 +74,9 @@ private VisualElement CreateDefaultInspectorGUI() // UI Settings Group CreateUISettingsGroup(); + // Text Settings Group + CreateTextSettingsGroup(); + UpdateFallbackServerVisibility(); return _root; @@ -440,6 +443,53 @@ private void CreateUISettingsGroup() _root.Add(uiGroup); } + private void CreateTextSettingsGroup() + { + var textGroup = CreateGroup("Text Settings"); + + var textProperty = serializedObject.FindProperty("text"); + + // Iterate child properties directly — no foldout + var iterator = textProperty.Copy(); + var endProperty = iterator.GetEndProperty(); + iterator.NextVisible(true); // enter children + while (!SerializedProperty.EqualContents(iterator, endProperty)) + { + var field = new PropertyField(iterator); + field.AddToClassList("form-control"); + textGroup.Add(field); + if (!iterator.NextVisible(false)) + break; + } + + // Reset to Defaults button + var resetRow = CreateFormRow(""); + var resetButton = new UnityEngine.UIElements.Button(() => + { + Undo.RecordObject(_bootstrap, "Reset Bootstrap Text to Defaults"); + var textProp = serializedObject.FindProperty("text"); + var defaults = BootstrapText.Default; + var fields = typeof(BootstrapText).GetFields(BindingFlags.Public | BindingFlags.Instance); + foreach (var field in fields) + { + var prop = textProp.FindPropertyRelative(field.Name); + if (prop != null && prop.propertyType == SerializedPropertyType.String) + { + prop.stringValue = (string)field.GetValue(defaults); + } + } + serializedObject.ApplyModifiedProperties(); + }); + resetButton.text = "Reset to Defaults"; + resetButton.AddToClassList("form-control"); + EditorUIUtils.MakeFormWidthButton(resetButton); + EditorUIUtils.SwitchButtonColor(resetButton, EditorUIUtils.ButtonType.Warning); + resetRow.Add(resetButton); + textGroup.Add(resetRow); + + _root.Add(textGroup); + } + #if UNITY_EDITOR private void CreateDevelopmentSettingsGroup() { diff --git a/UnityProject/Packages/com.jasonxudeveloper.jengine.core/Runtime/Bootstrap.cs b/UnityProject/Packages/com.jasonxudeveloper.jengine.core/Runtime/Bootstrap.cs index af34abd7f..b7057f935 100644 --- a/UnityProject/Packages/com.jasonxudeveloper.jengine.core/Runtime/Bootstrap.cs +++ b/UnityProject/Packages/com.jasonxudeveloper.jengine.core/Runtime/Bootstrap.cs @@ -82,6 +82,9 @@ public partial class Bootstrap : MonoBehaviour public Button startButton; + [Header("Text Settings")] + [SerializeField] private BootstrapText text = BootstrapText.Default; + #if UNITY_EDITOR [Header("Development Settings")] [HideInInspector] public bool useEditorDevMode = true; @@ -194,6 +197,11 @@ private void Awake() }); } + private void Reset() + { + text = BootstrapText.Default; + } + private async void Initialize() { try @@ -202,7 +210,7 @@ private async void Initialize() } catch (Exception e) { - await Prompt.ShowDialogAsync("Error", $"Initialization failed: {e.Message}", "OK", null); + await Prompt.ShowDialogAsync(text.dialogTitleError, BootstrapText.SafeFormat(text.dialogInitFailed, e.Message), text.buttonOk, null); Application.Quit(); } } @@ -214,7 +222,7 @@ private async UniTask InitializeGame() { try { - updateStatusText.text = "Initializing..."; + updateStatusText.text = text.initializing; downloadProgressBar.gameObject.SetActive(false); YooAssets.Destroy(); @@ -229,20 +237,23 @@ private async UniTask InitializeGame() YooAssets.SetDefaultPackage(package); // Use the extracted common initialization function + var t = text; var packageInitCallbacks = new PackageInitializationCallbacks { - OnStatusUpdate = status => updateStatusText.text = GetStatusText(status), + OnStatusUpdate = status => updateStatusText.text = GetStatusText(status, t), OnVersionUpdate = version => versionText.text = $"v{Application.version}.{version}", OnDownloadPrompt = async (count, size) => - await Prompt.ShowDialogAsync("Notice", - $"Need to download {count} files, total size {size / 1024f / 1024f:F2}MB. Start download?", - "Download", "Cancel"), + await Prompt.ShowDialogAsync(t.dialogTitleNotice, + BootstrapText.SafeFormat(t.dialogDownloadPrompt, count, $"{size / 1024f / 1024f:F2}"), + t.buttonDownload, t.buttonCancel), OnDownloadProgress = data => { if (updateStatusText != null) { - updateStatusText.text = - $"Downloading file {data.CurrentDownloadCount}/{data.TotalDownloadCount} ({data.CurrentDownloadBytes / 1024f / 1024f:F2}MB/{data.TotalDownloadBytes / 1024f / 1024f:F2}MB)"; + updateStatusText.text = BootstrapText.SafeFormat(t.dialogDownloadProgress, + data.CurrentDownloadCount, data.TotalDownloadCount, + $"{data.CurrentDownloadBytes / 1024f / 1024f:F2}", + $"{data.TotalDownloadBytes / 1024f / 1024f:F2}"); } if (downloadProgressText != null) @@ -258,20 +269,20 @@ await Prompt.ShowDialogAsync("Notice", OnDownloadStart = () => { downloadProgressBar.gameObject.SetActive(true); - updateStatusText.text = "Downloading..."; + updateStatusText.text = t.downloading; downloadProgressText.text = ""; downloadProgressBar.value = 0f; }, OnDownloadComplete = () => { if (updateStatusText != null) - updateStatusText.text = "Download completed, loading..."; + updateStatusText.text = t.downloadCompletedLoading; if (downloadProgressText != null) downloadProgressText.text = "100%"; if (downloadProgressBar != null) downloadProgressBar.value = 1f; }, - OnError = async error => await Prompt.ShowDialogAsync("Warning", error.Message, "OK", null) + OnError = async error => await Prompt.ShowDialogAsync(t.dialogTitleWarning, error.Message, t.buttonOk, null) }; bool success = await UpdatePackage(package, packageInitCallbacks, encryptionOption); @@ -281,14 +292,14 @@ await Prompt.ShowDialogAsync("Notice", } // First supplement metadata - updateStatusText.text = "Loading code..."; + updateStatusText.text = text.loadingCode; await LoadMetadataForAOTAssemblies(); // Set dynamic key - updateStatusText.text = "Decrypting resources..."; + updateStatusText.text = text.decryptingResources; await SetUpDynamicSecret(); // Load hot update DLL - updateStatusText.text = "Loading code..."; + updateStatusText.text = text.loadingCode; #if UNITY_EDITOR var assemblies = AppDomain.CurrentDomain.GetAssemblies(); Assembly hotUpdateAss = null; @@ -316,10 +327,10 @@ await Prompt.ShowDialogAsync("Notice", #endif // Enter hot update scene - updateStatusText.text = "Loading scene..."; + updateStatusText.text = text.loadingScene; var sceneLoadCallbacks = new SceneLoadCallbacks { - OnStatusUpdate = status => updateStatusText.text = GetSceneLoadStatusText(status), + OnStatusUpdate = status => updateStatusText.text = GetSceneLoadStatusText(status, t), OnProgressUpdate = progress => { downloadProgressText.text = $"{Mathf.RoundToInt(progress * 100)}%"; @@ -327,8 +338,9 @@ await Prompt.ShowDialogAsync("Notice", }, OnError = async exception => { - await Prompt.ShowDialogAsync("Error", $"Scene loading failed: {exception.Message}", - "Retry", null); + await Prompt.ShowDialogAsync(t.dialogTitleError, + BootstrapText.SafeFormat(t.dialogSceneLoadFailed, exception.Message), + t.buttonRetry, null); } }; downloadProgressBar.gameObject.SetActive(true); @@ -341,7 +353,7 @@ await Prompt.ShowDialogAsync("Error", $"Scene loading failed: {exception.Message catch (Exception ex) { Debug.LogError($"Initialization failed with exception: {ex}"); - await Prompt.ShowDialogAsync("Error", $"Exception occurred during initialization: {ex.Message}", "OK", "Cancel"); + await Prompt.ShowDialogAsync(text.dialogTitleError, BootstrapText.SafeFormat(text.dialogInitException, ex.Message), text.buttonOk, text.buttonCancel); // Continue the loop to retry } } @@ -352,7 +364,7 @@ private async UniTask LoadHotCode(Assembly hotUpdateAss) Type type = hotUpdateAss.GetType(hotUpdateClassName); if (type == null) { - await Prompt.ShowDialogAsync("Error", "Code exception, please contact customer service", null, "OK"); + await Prompt.ShowDialogAsync(text.dialogTitleError, text.dialogCodeException, null, text.buttonOk); Application.Quit(); return; } @@ -360,7 +372,7 @@ private async UniTask LoadHotCode(Assembly hotUpdateAss) var method = type.GetMethod(hotUpdateMethodName, BindingFlags.Public | BindingFlags.Static); if (method == null) { - await Prompt.ShowDialogAsync("Error", "Code exception, please contact customer service", null, "OK"); + await Prompt.ShowDialogAsync(text.dialogTitleError, text.dialogCodeException, null, text.buttonOk); Application.Quit(); return; } @@ -392,7 +404,7 @@ private async UniTask LoadHotCode(Assembly hotUpdateAss) catch (Exception e) { Debug.LogError($"Failed to invoke hot update method {hotUpdateMethodName}: {e}"); - await Prompt.ShowDialogAsync("Error", $"Function call failed: {e.Message}", "Exit", null); + await Prompt.ShowDialogAsync(text.dialogTitleError, BootstrapText.SafeFormat(text.dialogFunctionCallFailed, e.Message), text.buttonExit, null); Application.Quit(); } } @@ -677,29 +689,29 @@ private async UniTask UpdatePackageImpl(ResourcePackage package, } } - private static string GetStatusText(PackageInitializationStatus status) + private static string GetStatusText(PackageInitializationStatus status, BootstrapText text) { return status switch { - PackageInitializationStatus.InitializingPackage => "Initializing resource package...", - PackageInitializationStatus.GettingVersion => "Getting resource package version...", - PackageInitializationStatus.UpdatingManifest => "Updating resource manifest...", - PackageInitializationStatus.CheckingUpdate => "Checking resources to download...", - PackageInitializationStatus.DownloadingResources => "Downloading resources...", - PackageInitializationStatus.Completed => "Resource package initialization completed", - PackageInitializationStatus.Failed => "Initialization failed", - _ => "Unknown status" + PackageInitializationStatus.InitializingPackage => text.initializingPackage, + PackageInitializationStatus.GettingVersion => text.gettingVersion, + PackageInitializationStatus.UpdatingManifest => text.updatingManifest, + PackageInitializationStatus.CheckingUpdate => text.checkingUpdate, + PackageInitializationStatus.DownloadingResources => text.downloadingResources, + PackageInitializationStatus.Completed => text.packageCompleted, + PackageInitializationStatus.Failed => text.initializationFailed, + _ => text.unknownPackageStatus }; } - private static string GetSceneLoadStatusText(SceneLoadStatus status) + private static string GetSceneLoadStatusText(SceneLoadStatus status, BootstrapText text) { return status switch { - SceneLoadStatus.Loading => "Loading scene...", - SceneLoadStatus.Completed => "Scene loading completed", - SceneLoadStatus.Failed => "Scene loading failed", - _ => "Unknown status" + SceneLoadStatus.Loading => text.sceneLoading, + SceneLoadStatus.Completed => text.sceneCompleted, + SceneLoadStatus.Failed => text.sceneFailed, + _ => text.unknownSceneStatus }; } diff --git a/UnityProject/Packages/com.jasonxudeveloper.jengine.core/Runtime/BootstrapText.cs b/UnityProject/Packages/com.jasonxudeveloper.jengine.core/Runtime/BootstrapText.cs new file mode 100644 index 000000000..24b43cc40 --- /dev/null +++ b/UnityProject/Packages/com.jasonxudeveloper.jengine.core/Runtime/BootstrapText.cs @@ -0,0 +1,173 @@ +// BootstrapText.cs +// +// Author: +// JasonXuDeveloper +// +// Copyright (c) 2025 JEngine +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using System; +using UnityEngine; + +namespace JEngine.Core +{ + /// + /// All user-facing strings shown by during initialization. + /// Customize per-project for localization or branding. + /// + [Serializable] + public struct BootstrapText + { + // ── Package Initialization Status ── + + [Header("Package Initialization Status")] + public string initializingPackage; + public string gettingVersion; + public string updatingManifest; + public string checkingUpdate; + public string downloadingResources; + public string packageCompleted; + public string initializationFailed; + public string unknownPackageStatus; + + // ── Scene Load Status ── + + [Header("Scene Load Status")] + public string sceneLoading; + public string sceneCompleted; + public string sceneFailed; + public string unknownSceneStatus; + + // ── Inline Status ── + + [Header("Inline Status")] + public string initializing; + public string downloading; + public string downloadCompletedLoading; + public string loadingCode; + public string decryptingResources; + public string loadingScene; + + // ── Dialog Titles ── + + [Header("Dialog Titles")] + public string dialogTitleError; + public string dialogTitleWarning; + public string dialogTitleNotice; + + // ── Dialog Buttons ── + + [Header("Dialog Buttons")] + public string buttonOk; + public string buttonCancel; + public string buttonDownload; + public string buttonRetry; + public string buttonExit; + + // ── Dialog Content (format strings) ── + + [Header("Dialog Content")] + [Tooltip("{0} = error message")] + public string dialogInitFailed; + + [Tooltip("{0} = file count, {1} = total size in MB")] + public string dialogDownloadPrompt; + + [Tooltip("{0} = current count, {1} = total count, {2} = current MB, {3} = total MB")] + public string dialogDownloadProgress; + + [Tooltip("{0} = error message")] + public string dialogSceneLoadFailed; + + [Tooltip("{0} = exception message")] + public string dialogInitException; + + public string dialogCodeException; + + [Tooltip("{0} = error message")] + public string dialogFunctionCallFailed; + + /// + /// Default English text matching the original hardcoded strings. + /// + public static readonly BootstrapText Default = new() + { + initializingPackage = "Initializing resource package...", + gettingVersion = "Getting resource package version...", + updatingManifest = "Updating resource manifest...", + checkingUpdate = "Checking resources to download...", + downloadingResources = "Downloading resources...", + packageCompleted = "Resource package initialization completed", + initializationFailed = "Initialization failed", + unknownPackageStatus = "Unknown status", + + sceneLoading = "Loading scene...", + sceneCompleted = "Scene loading completed", + sceneFailed = "Scene loading failed", + unknownSceneStatus = "Unknown status", + + initializing = "Initializing...", + downloading = "Downloading...", + downloadCompletedLoading = "Download completed, loading...", + loadingCode = "Loading code...", + decryptingResources = "Decrypting resources...", + loadingScene = "Loading scene...", + + dialogTitleError = "Error", + dialogTitleWarning = "Warning", + dialogTitleNotice = "Notice", + + buttonOk = "OK", + buttonCancel = "Cancel", + buttonDownload = "Download", + buttonRetry = "Retry", + buttonExit = "Exit", + + dialogInitFailed = "Initialization failed: {0}", + dialogDownloadPrompt = "Need to download {0} files, total size {1}MB. Start download?", + dialogDownloadProgress = "Downloading file {0}/{1} ({2}MB/{3}MB)", + dialogSceneLoadFailed = "Scene loading failed: {0}", + dialogInitException = "Exception occurred during initialization: {0}", + dialogCodeException = "Code exception, please contact customer service", + dialogFunctionCallFailed = "Function call failed: {0}", + }; + + /// + /// Safe wrapper around that falls back + /// to a safe value if the user-edited format string is malformed or null. + /// + public static string SafeFormat(string template, params object[] args) + { + if (string.IsNullOrEmpty(template)) + { + return string.Empty; + } + + try + { + return string.Format(template, args); + } + catch (FormatException) + { + return template; + } + } + } +} diff --git a/UnityProject/Packages/com.jasonxudeveloper.jengine.core/Runtime/BootstrapText.cs.meta b/UnityProject/Packages/com.jasonxudeveloper.jengine.core/Runtime/BootstrapText.cs.meta new file mode 100644 index 000000000..ec5206f4f --- /dev/null +++ b/UnityProject/Packages/com.jasonxudeveloper.jengine.core/Runtime/BootstrapText.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 159bc6ca939304dc88e4729dfd960ea5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/UnityProject/Packages/com.jasonxudeveloper.jengine.ui/Editor/Components/Navigation/JTabView.cs b/UnityProject/Packages/com.jasonxudeveloper.jengine.ui/Editor/Components/Navigation/JTabView.cs new file mode 100644 index 000000000..af0261034 --- /dev/null +++ b/UnityProject/Packages/com.jasonxudeveloper.jengine.ui/Editor/Components/Navigation/JTabView.cs @@ -0,0 +1,232 @@ +// JTabView.cs +// +// Author: +// JasonXuDeveloper +// +// Copyright (c) 2025 JEngine +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using System.Collections.Generic; +using JEngine.UI.Editor.Theming; +using UnityEngine; +using UnityEngine.UIElements; + +namespace JEngine.UI.Editor.Components.Navigation +{ + /// + /// A tabbed container that shows one content panel at a time. + /// Each tab has a button in the tab bar and an associated content element. + /// + public class JTabView : VisualElement + { + private readonly VisualElement _tabBar; + private readonly VisualElement _contentArea; + private readonly List