{"id":14960530,"url":"https://github.com/michael811125/oxgframe","last_synced_at":"2026-01-08T15:05:16.625Z","repository":{"id":44595609,"uuid":"512438754","full_name":"michael811125/OxGFrame","owner":"michael811125","description":"The OxGFrame is a framework based on Unity for accelerating game development. Supports multi-platform Win, OSX, Android, iOS, WebGL.","archived":false,"fork":false,"pushed_at":"2025-04-01T08:40:16.000Z","size":188928,"stargazers_count":187,"open_issues_count":1,"forks_count":29,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-04-01T09:32:33.733Z","etag":null,"topics":["framework","game","game-framework","gameframework","hot-update","hotfix","hotupdate","hybridclr","oxgframe","oxgkit","unity","unity-3d","unity-framework","unity-framework-module","unity3d","unity3d-framework","unity3d-hotfix","unity3d-plugin","yooasset"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/michael811125.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-07-10T13:13:20.000Z","updated_at":"2025-04-01T08:40:22.000Z","dependencies_parsed_at":"2024-01-02T06:23:51.072Z","dependency_job_id":"6b78477b-d594-4c3b-a69c-64b0cdceedc4","html_url":"https://github.com/michael811125/OxGFrame","commit_stats":{"total_commits":402,"total_committers":2,"mean_commits":201.0,"dds":0.06965174129353235,"last_synced_commit":"870c33dd97f1c83840bb65cf3ad55cee0756b7c6"},"previous_names":[],"tags_count":130,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michael811125%2FOxGFrame","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michael811125%2FOxGFrame/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michael811125%2FOxGFrame/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/michael811125%2FOxGFrame/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/michael811125","download_url":"https://codeload.github.com/michael811125/OxGFrame/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247198449,"owners_count":20900079,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["framework","game","game-framework","gameframework","hot-update","hotfix","hotupdate","hybridclr","oxgframe","oxgkit","unity","unity-3d","unity-framework","unity-framework-module","unity3d","unity3d-framework","unity3d-hotfix","unity3d-plugin","yooasset"],"created_at":"2024-09-24T13:22:27.677Z","updated_at":"2026-01-08T15:05:16.595Z","avatar_url":"https://github.com/michael811125.png","language":"C#","funding_links":["https://paypal.me/MichaelOthx?country.x=TW\u0026locale.x=zh_TW","https://www.buymeacoffee.com/michael8116"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\r\n  \u003cimg width=\"384\" height=\"384\" src=\"Docs/OxGFrame_Logo_v2.png\"\u003e\r\n\u003c/p\u003e\r\n\r\n[![License](https://img.shields.io/github/license/michael811125/OxGFrame)](https://github.com/michael811125/OxGFrame/blob/master/LICENSE.md)\r\n\r\n---\r\n\r\n## 官方主頁 (OxGFrame with [YooAsset](https://github.com/tuyoogame/YooAsset) + [HybridCLR](https://github.com/focus-creative-games/hybridclr))\r\n\r\n- [官方文檔](https://oxgframe.ouhiyo.com/)\r\n\r\n- [快速上手 (安裝教程)](https://oxgframe.ouhiyo.com/docs/getting-started)\r\n\r\n---\r\n\r\n## 常用與依賴的工具庫\r\n\r\n- ### [OxGKit](https://github.com/michael811125/OxGKit)\r\n\r\n---\r\n\r\n## 使用 OxGFrame 實現的 Demo 小遊戲\r\n\r\n[Github - FlappyBird_OxGFrame](https://github.com/michael811125/FlappyBird_OxGFrame)\r\n  - [Resources](https://github.com/michael811125/FlappyBird_OxGFrame/tree/resources)\r\n  - [AssetBundle](https://github.com/michael811125/FlappyBird_OxGFrame/tree/assetbundle)\r\n  - [AssetBundle + HybridCLR](https://github.com/michael811125/FlappyBird_OxGFrame/tree/assetbundle_clr)\r\n\r\nhttps://github.com/michael811125/OxGFrame/assets/30960759/5e41e84a-029d-4392-8142-7199ce45018c\r\n\r\n---\r\n\r\n## Wiki\r\n- [Coding Style wiki (代碼風格)](https://github.com/michael811125/OxGFrame/wiki/Coding-Style)\r\n- [Macro Defitions wiki (宏定義)](https://github.com/michael811125/OxGFrame/wiki/Macro-Definitions)\r\n- [Encryption and Decryption Efficiency wiki (加解密效率)](https://github.com/michael811125/OxGFrame/wiki/Encryption-and-Decryption-Efficiency-Reference)\r\n- [Roadmap wiki](https://github.com/michael811125/OxGFrame/wiki/Roadmap)\r\n\r\n## 基本介紹\r\n\r\nOxGFrame 是基於 Unity 用於加快遊戲開發的框架，並且使用 UniTask 進行異步處理，從資源加載 (AssetLoader)、遊戲介面 (UIFrame)、場景資源 (SRFrame)、Unity 場景 (USFrame)、模板物件 (CPFrame)、音樂音效 (AudioFrame)、影片 (VideoFrame)、遊戲階段整合 (GSIFrame)、網路 (NetFrame)、事件中心 (CenterFrame)，能夠簡單入手與有效的加快開發效率，並且支持多平台 Win、OSX、Android、iOS、WebGL。\r\n\r\n**平台測試**\r\n- Windows (Passed)\r\n- MacOSX (Passed)\r\n- Android (Passed)\r\n- iOS (Passed)\r\n- WebGL (Passed)\r\n\r\nhttps://github.com/michael811125/OxGFrame/assets/30960759/fd04f6e5-6338-400c-9f57-dcdbdf73dfff\r\n\r\n相關模板建立的選單 (Create menu items)\r\n\r\n![](Docs/img_2.png)\r\n\r\n---\r\n\r\n## 模塊框架介紹\r\n\r\n- [Hotfixer](https://github.com/michael811125/OxGFrame#hotfixer-dependence-hybridclr-assetloader)\r\n- [AssetLoader](https://github.com/michael811125/OxGFrame#assetloader-dependence-yooasset)\r\n- [CoreFrame](https://github.com/michael811125/OxGFrame#coreframe-dependence-assetloader)\r\n- [MediaFrame](https://github.com/michael811125/OxGFrame#mediaframe-dependence-assetloader)\r\n- [GSIFrame](https://github.com/michael811125/OxGFrame#gsiframe)\r\n- [NetFrame](https://github.com/michael811125/OxGFrame#netframe-dependence-oxgkitutilities)\r\n- [CenterFrame](https://github.com/michael811125/OxGFrame#centerframe)\r\n\r\n![](Docs/img_9.png)\r\n\r\n### Hotfixer (dependence HybridCLR, AssetLoader)\r\n\r\n代碼熱修復模塊，使用 [HybridCLR](https://github.com/focus-creative-games/hybridclr) (前身 Huatuo) 革命性的熱更新方案進行整合，相關建置請前往[官方文檔](https://hybridclr.doc.code-philosophy.com/)進行熟悉。\r\n- 如果相關建置完畢，前往點選 HybridCLR/OxGFrame With HybirdCLR/Complie And Copy To HotfixCollector，將會幫忙拷貝至 **HotfixCollector** 文件夾，再使用 YooAsset Collector 進行收集打包。\r\n\r\n**使用流程詳看 HotfixerDemo (Import frome Package Manager)**\r\n\r\n![](Docs/img_4.png)\r\n![](Docs/img_5.png)\r\n![](Docs/img_6.png)\r\n\r\n※備註 : 運行打包 HotfixerDemo 需要 Import PatchLauncher from PackageManager\r\n\r\n---\r\n\r\n### AssetLoader (dependence YooAsset)\r\n\r\n資源加載器模塊，支援動態 Async 或 Sync 加載 (Dynamic Loading)，採用計數管理方式進行資源管控 (支援 Resources 與 AssetBundle)，如果直接使用 AssetLoaders API 進行 Load 跟 Instantiate，則在 Destroy 物件時，需要連帶調用 Unload (成對呼叫 Load \u0026 Unload)。\r\n其中 AssetBundle 集成 YooAsset 實現資源熱更新方案，並且實現 YooAsset 提供的加密介面，其中實現加解密方式有 Offset (偏移量方式)、XOR、HT2XOR (Head-Tail 2 XOR)、HT2XOR-Plus (Head-Tail 2 XOR Plus)、AES、ChaCha20、XXTEA、OffsetXOR 實現文件加密。\r\n\r\n※備註 : Use \"res#\" will load from Resources else load from Bundle\r\n\r\n※提醒 : 如果要使用同步加載，資源一定要是事先下載完成的 (主要是資源不在本地時，請求下載部分是異步處理)，也提醒同步加載只適合小資源 (當然強烈建議全部都使用異步處理)。\r\n\r\n**選擇使用 Bundle 開發時，需要先將 PatchLauncher 拖曳至場景中，才能驅動相關配置。【如果使用 PakcageManager 安裝的，透過 Samples Import PatchLauncher Prefab】**\r\n\r\n- FileCryptogram (文件加解密 - 僅供參考)\r\n  - 運算效率 Offset \u003e HT2XOR \u003e XOR \u003e= OffsetXOR \u003e= HT2XORPlus \u003e XXTEA \u003e ChaCha20 \u003e AES\r\n  - 內存占用 Offset ≈ OffsetXOR \u003e AES ≈ ChaCha20 \u003e XXTEA \u003e HT2XORPlus = HT2XOR = XOR \r\n  - AB 包體積增加 Offset ≈ OffsetXOR \u003e AES ≈ ChaCha20 \u003e XXTEA \u003e HT2XORPlus = HT2XOR = XOR\r\n  - 破解難度 AES ≈ ChaCha20 \u003e XXTEA \u003e HT2XORPlus \u003e HT2XOR \u003e OffsetXOR \u003e XOR \u003e Offset\r\n\r\n#### 群組分包舉例\r\n  - 最小運行包\r\n  - 標準運行包\r\n  - 全部運行包 (預設索引標籤為 #all)\r\n\r\n![](Docs/img_1.png)\r\n\r\n#### 資源更新過程 (支援下載途中直接進行修復功能)\r\n\r\nhttps://github.com/michael811125/OxGFrame/assets/30960759/11dcf0d3-41bd-4a8d-af6b-7115374552f5\r\n\r\n\r\n#### 是否啟用 Disk Space 檢查流程\r\n\r\n![](Docs/img_14.png)\r\n\r\n![](Docs/img_15.png)\r\n\r\n![](Docs/img_17.png)\r\n\r\n![](Docs/img_16.png)\r\n\r\n\r\n#### 使用 PackageOperation 進行 DLC 資源包的操作 (方便控管資源包)\r\n\r\nhttps://github.com/michael811125/OxGFrame/assets/30960759/694d1125-cf9f-42bb-85f4-df42041057c7\r\n\r\n```C#\r\n    // Use Example\r\n    var packageOperations = new PackageOperation[]\r\n    {\r\n        new PackageOperation\r\n        (\r\n            \"DLC Package 1\",\r\n            new DlcPackageInfoWithBuild()\r\n            {\r\n                buildMode = BuildMode.ScriptableBuildPipeline,\r\n                packageName = \"Dlc1Package\",\r\n                dlcVersion = \"latest\"\r\n            },\r\n            false\r\n        ),\r\n        new PackageOperation\r\n        (\r\n            \"DLC Pacakge 2\",\r\n            new DlcPackageInfoWithBuild()\r\n            {\r\n                buildMode = BuildMode.ScriptableBuildPipeline,\r\n                packageName = \"Dlc2Package\",\r\n                dlcVersion = \"latest\"\r\n            },\r\n            false\r\n        )\r\n    };\r\n```\r\n\r\n**App Package**\r\n```C#\r\n// [Load asset and download from specific package (Export App Bundles for CDN)]\r\n\r\nAppPackageInfoWithBuild packageInfo = new AppPackageInfoWithBuild()\r\n{\r\n    buildMode = BundleConfig.BuildMode.ScriptableBuildPipeline,\r\n    packageName = \"OtherPackage\"\r\n};\r\n\r\nbool isInitialized = await AssetPatcher.InitAppPackage(packageInfo, true);\r\nif (isInitialized)\r\n{\r\n    var package = AssetPatcher.GetPackage(packageName);\r\n    var downloader = AssetPatcher.GetPackageDownloader(package);\r\n    Debug.Log($\"Has In Local: {downloader.TotalDownloadCount == 0}, Patch Count: {downloader.TotalDownloadCount}, Patch Size: {BundleUtility.GetBytesToString((ulong)downloader.TotalDownloadBytes)}\");\r\n    await AssetLoaders.LoadAssetAsync\u003cGameObject\u003e(packageName, assetName);\r\n}\r\n```\r\n\r\n**DLC Package**\r\n```C#\r\n// [Load asset and download from specific package (Export Individual DLC Bundles for CDN)]\r\n\r\nDlcPackageInfoWithBuild packageInfo = new DlcPackageInfoWithBuild()\r\n{\r\n    buildMode = BundleConfig.BuildMode.ScriptableBuildPipeline,\r\n    packageName = \"DlcPackage\",\r\n    dlcVersion = \"dlcVersion\",\r\n    withoutPlatform = false\r\n};\r\n\r\nbool isInitialized = await AssetPatcher.InitDlcPackage(packageInfo, true);\r\nif (isInitialized)\r\n{\r\n    var package = AssetPatcher.GetPackage(packageName);\r\n    var downloader = AssetPatcher.GetPackageDownloader(package);\r\n    Debug.Log($\"Has In Local: {downloader.TotalDownloadCount == 0}, Patch Count: {downloader.TotalDownloadCount}, Patch Size: {BundleUtility.GetBytesToString((ulong)downloader.TotalDownloadBytes)}\");\r\n    await AssetLoaders.LoadAssetAsync\u003cGameObject\u003e(packageName, assetName);\r\n}\r\n```\r\n\r\n#### Bundle [burlconfig] (Bundle URL Config) 格式\r\n\r\n格式如下，以下為明文類型 **(store_link 針對非 Android, iOS 平台的，可以設置主程式下載的 link)**\r\n- 支持 Cipher Type (密文類型)\r\n- 支持 Plaintext Type (明文類型)\r\n\r\n```\r\n# bundle_ip = First CDN Server IP or Domain (Plan A)\r\n# bundle_fallback_ip = Second CDN Server IP or Domain (Plan B)\r\n# store_link = GooglePlay Store Link (https://play.google.com/store/apps/details?id=YOUR_ID)\r\n# store_link = Apple Store Link (https://apps.apple.com/app/idYOUR_ID)\r\n\r\nbundle_ip http://127.0.0.1\r\nbundle_fallback_ip http://127.0.0.1\r\nstore_link http://\r\n```\r\n\r\n---\r\n\r\n### CoreFrame (dependence AssetLoader)\r\n\r\n核心模塊 (連動 AssetLoader 實現自動卸載)，包含用於製作 UI, Scene Resource, Clone Prefab, Unity Scene，針對製作對應使用 UI Prefab =\u003e UIFrame、Scene Resource Prefab =\u003e SRFrame、Other Prefab =\u003e CPFrame、Unity Scene =\u003e USFrame。支援 Resources 與 AssetBundle 加載方式，並且實現物件命名綁定功能 (UIBase and SRBase = _Node@XXX, CPBase = ~Node@XXX, 類型均為 GameObject)。\r\n\r\n#### UIFrame (User Interface)\r\n\r\n用於調度 UI Prefab，僅支援 UGUI，使用 UIManager 管理掛載 UIBase 的 Prefab，支援 UI 反切 (Reverse Changes)、UI 堆疊關閉 (Close Stack By Stack)，基本上 UI 有隱藏凍結功能，避免 UI 動畫尚未完成期間，能夠被點擊觸發事件。另外如需要製作 UI 動畫，可以在 ShowAnimation 跟 HideAnimation 覆寫執行相關過渡動畫 (DoTween, Animation...)，並且一定要在完成 UI 動畫後正確呼叫 animationEnd() 回調。額外還有 UI 的 MaskEvent 也可以 override 自定義事件 (使用 _Node@XXX 進行物件綁定)。\r\n\r\n| UI 反切運用 (Reverse Changes)  | UI 反切運用 (Reverse Changes) |\r\n|:-|:-|\r\n| ![](Docs/gif_3.gif) | ![](Docs/gif_4.gif) |\r\n\r\n| UI 堆疊關閉運用 (Close Stack By Stack)  | UI 堆疊關閉運用 (Close Stack By Stack) |\r\n|:-|:-|\r\n| ![](Docs/gif_5.gif) | ![](Docs/gif_6.gif) |\r\n\r\n#### SRFrame (Scene Resource)\r\n\r\n用於調度場景或資源物件 Prefab，使用 SRManager 管理掛載 SRBase 的 Prefab (使用 _Node@XXX 進行物件綁定)。\r\n\r\n#### USFrame (Unity Scene)\r\n\r\n用於調度 Unity Scene，使用 USManager 管理 Unity 場景 (支援 AssetBundle)。\r\n- ※備註 : Use \"build#\" will load scene from Build else load scene from Bundle\r\n\r\n#### CPFrame (Clone Prefab)\r\n\r\n用於實例 Prefab 模板物件，使用 CPManager 管理掛載 CPBase 的 Prefab (使用 ~Node@XXX 進行綁定)，可以用於加載模板物件，並且直接進行 GameObject.Destroy 就好，將會自動卸載。\r\n\r\n#### 常用方法說明\r\n\r\n- OnCreate : 初始 Member Params (建構式概念)，另外如果採用拖曳式指定組件，也可以直接在此初始 (不過不建議，建議還是在 OnBind 執行)。\r\n- OnBind : 初始綁定組件與事件 (After Bind)。\r\n- OnPreShow : 當有異步處理或者附屬物件控制時，可以在此處理。例如 : TopUI 附屬連動開啟 LeftUI \u0026 RightUI，那麼就可以在 TopUI 中的 OnPreShow 方法實現 Show LeftUI \u0026 RightUI。\r\n  - **不建議在 OnPreClose 時進行相關 Show 的處理，如果有進行的話也沒關係，因為針對 CloseAll 的 API 有提供 disabledPreClose 的開關。**\r\n- OnShow : 調用 Show 時，此方法會被激活，並且可以透過帶入的 object 進行數據傳送。\r\n- OnClose : 調用 Close 時，此方法會被激活。\r\n- OnRelease : 當物件被 Destroy 時，此方法會被激活。\r\n\r\n#### 初始順序說明\r\n\r\nInit Order : OnCreate (Once) \u003e OnAutoBind (Once) \u003e OnBind (Once) \u003e OnPreShow (EveryOpen) \u003e OnShow (EveryOpen)\r\n\r\n#### 物件綁定獲取說明 (OnBind)\r\n\r\n- 透過 collector.GetNode(\"BindName\") 返回取得綁定 GameObject (單一名綁定)\r\n  - UIBase \u0026 SRBase 使用 _Node@XXX\r\n  - CPBase 使用 ~Node@XXX\r\n- 透過 collector.GetNodes(\"BindName\") 返回取得綁定 GameObject[] (同名多綁定，物件順序由上至下)\r\n  - UIBase \u0026 SRBase 使用 _Node@XXX\r\n  - CPBase 使用 ~Node@XXX\r\n- 透過 collector.GetNodeComponent\\\u003cTComponent\\\u003e(\"BindName\") 返回取得綁定 TComponent (單一名綁定)\r\n  - UIBase \u0026 SRBase 使用 _Node@XXX\r\n  - CPBase 使用 ~Node@XXX\r\n- 透過 collector.GetNodeComponents\\\u003cTComponent\\\u003e(\"BindName\") 返回取得綁定 TComponent[] (同名多綁定，物件順序由上至下)\r\n  - UIBase \u0026 SRBase 使用 _Node@XXX\r\n  - CPBase 使用 ~Node@XXX\r\n\r\n***建議使用 Hotkey，不然使用 Right-Click 會執行多次 (實際上不影響自動生成)，但這是 [Unity Bug](https://issuetracker.unity3d.com/issues/menuitem-is-executed-more-than-once-when-multiple-objects-are-selected) 官方不修復了***\r\n\r\n#### 自動生成停止綁定標籤 (Hotkey: Shift+E, E: End)\r\n\r\n能夠縮短 Runtime 在綁定的向下查找次數，時間複雜度為 O(N)，N = StopEndIdx (**如有大量節點物件建議使用**)。\r\n  - 如果有特殊使用 Transform.Find 查找子物件時，剛好子物件名稱有 # 標籤，可以無視 (在 Runtime 時，會 Replace 標籤，還原字串)。\r\n\r\n![](Docs/img_8.png)\r\n\r\n![](Docs/gif_2.gif)\r\n\r\n#### 自動生成物件綁定代碼 (Hotkey: Shift+B, B: Bind)\r\n\r\n命名規範使用 * 指向 TailName\r\n- UIBase \u0026 SRBase\r\n  - _Node@XXX\\*Btn (以此類推)\r\n  - _Node@XXX\\*Btn\\*Img\\*Trans (以此類推，支持多個 \\* 指向多 TailName)\r\n- CPBase\r\n  - ~Node@XXX\\*Btn (以此類推)\r\n  - ~Node@XXX\\*Btn\\*Img\\*Trans (以此類推，支持多個 \\* 指向多 TailName)\r\n\r\n綁定說明\r\n\r\n![](Docs/img_19.png)\r\n\r\n綁定配置\r\n\r\n![](Docs/img_18.png)\r\n\r\n預設組件綁定表 (可從 CodeBindingSettings 中自行新增或修改 TailName 對應綁定組件類型)\r\n\r\n| **Tail Name** | **Component Name** | **End Remove Count** | **End Plural Txt** |\r\n|:-|:-|:-|:-|\r\n| **Other** |\r\n| Trans | Transform | 0 | es |\r\n| RectTrans | RectTransform | 0 | es |\r\n| **Legacy** |\r\n| Img | Image | 0 | s |\r\n| RawImg | RawImage | 0 | s |\r\n| Txt | Text | 0 | s | \r\n| Btn | Button | 0 | s | \r\n| Tgl | Toggle | 0 | s | \r\n| Sld | Slider | 0 | s | \r\n| ScrBar | Scrollbar | 0 | s | \r\n| ScrView | ScrollRect | 0 | s | \r\n| Drd | Dropdown | 0 | s | \r\n| Field | InputField | 0 | s | \r\n| **TMP** |\r\n| TmpTxt | TMP_Text | 0 | s | \r\n| TmpDrd | TMP_Dropdown | 0 | s | \r\n| TmpField | TMP_InputField | 0 | s |\r\n| **Custom** |\r\n| BtnPlus | ButtonPlus | 0 | es |\r\n| NodePool | NodePool | 0 | s |\r\n\r\n自動綁定產生器的功能有方法類型的區分，如下\r\n- 自動 (Auto) \\[預設\\]，自動儲存綁定內容至代碼中，將會自動 override OnAutoBind() 與調用。\r\n\r\nhttps://github.com/michael811125/OxGFrame/assets/30960759/4c61bede-0bbc-4cae-baba-4a9bc7274c2e\r\n\r\n- 手動 (Manual) \\[自選\\]，手動將綁定內容複製至代碼中，將會自動 override OnAutoBind() 與調用。\r\n\r\nhttps://github.com/michael811125/OxGFrame/assets/30960759/8e4f63e9-b955-4f91-8ac7-be949677c54f\r\n\r\n※備註 : Right-Click Create/OxGFrame/Core Frame... (Template cs and prefab)\r\n\r\n---\r\n\r\n### MediaFrame (dependence AssetLoader)\r\n\r\n影音模塊 (連動 AssetLoader 實現自動卸載)，包含用於製作 Audio (2D/3D), Video 遊戲影音，支援多平台加載方式 (Local, StreamingAssets, URL)，主要也對於 WebGL 有進行細節校正，因為 WebGL 對於 Audio 請求部分是無法取得正確長度 (官方放棄修正)，導致音訊控制會有部分缺陷，所以支援預置體製作時，可進行 Preload 請求 Clip 長度進行預設置。\r\n\r\n#### AudioFrame\r\n\r\n用於播放 Audio，使用 AudioManager 管理掛載 AudioBase 的 Prefab，且採用 Unity Mixer 進行各音軌控制。 \r\n\r\n**(需先將 AudioManager 預置體拖至場景)【如果使用 PakcageManager 安裝的，透過 Samples Import AudioManager Prefab】**\r\n\r\n- Audio Sound Type 說明\r\n  - Sole : 唯一性 (不能重複播放)，建議種類為 BGM (背景音樂), Voice (配音) 等。\r\n  - SoundEffect : 多實例 (可以重複播放)，建議種類為 Fight Sound (戰鬥音效), General Sound (一般音效) 等。\r\n\r\n#### VideoFrame\r\n\r\n用於播放 Video，使用 VideoManager 管理掛載 VideoBase 的 Prefab，且支援 RenderTexture, Camera。\r\n- Video Render Mode 說明\r\n  - RenderTexture : 將 Video 映射至 RenderTexture 再透過 UGUI 的 RawImage 進行渲染 (VideoBase 使用 RenderTexture.GetTemporary 跟 RenderTexture.ReleaseTemporary 創建與釋放，確保內存正確釋放 RenderTexture)。\r\n  - Camera : 直接透過 Camera 進行渲染。\r\n\r\n#### Media [murlconfig] (Media URL Config) 格式\r\n\r\n如果音訊跟影片來源存放於 Server，可以使用 URL 的方式進行文件請求，格式如下 **(如果不透過 murlconfig.txt 指定 URL 的話，也可以輸入完整資源 URL 至 Prefab 中，不過缺點就是對於未來更動 URL，要進行更改維護就會非常麻煩)**\r\n\r\n```\r\n# audio_urlset = Audio Source Url Path\r\n# video_urlset = Video Source Url Path\r\n\r\naudio_urlset 127.0.0.1/audio/\r\nvideo_urlset 127.0.0.1/video/\r\n```\r\n\r\n**\\\u003e\\\u003e 建立 murlconfig.txt 方式 \\\u003c\\\u003c**\r\n- 使用 OxGFrame/MediaFrame/Media Url Config Generator 創建 murlconfig.txt (StreamingAssets/murlconfig.txt)。\r\n\r\n**\\\u003e\\\u003e 加載 murlconfig.txt 方式 \\\u003c\\\u003c**\r\n1. 如果選擇 Url Cfg Request Type = Assign 的方式指定 murlconfig.txt 至 prefab 中。\r\n2. 如果選擇 Url Cfg Request Type = Streaming Assets 的方式請求 murlconfig.txt，將 murlconfig.txt 放至 StreamingAssets 根目錄中 (StreamingAssets/murlconfig.txt)。\r\n\r\n**額外說明**：如果透過 URL 方式請求音訊或影片資源，建議於 WebGL 平台上使用，因為 WebGL 不支援 AssetBundle 事先指定 AudioClip 或 VideoClip (Assign 方式) 至 Prefab 中，所以提供 URL 的方式進行影音檔請求。\r\n\r\n※備註 : Right-Click Create/OxGFrame/Media Frame... (Template prefab)\r\n\r\n---\r\n\r\n### GSIFrame\r\n\r\n遊戲階段整合模塊 (FSM 概念)，而 GSI 為 **Game Stage Integration** 的縮寫，對於遊戲製作的時候缺乏整合系統，導致遊戲系統運作之間過於零散，基本上遊戲階段區分為 StartupStage (啟動階段), LogoStage (商標階段), HotfixStage (熱修復階段), PatchStage (資源熱更階段), LoginStage (登入階段), ReloginStage (重登階段), EnterStage (進入階段), LobbyStage (大廳階段), FightStage (戰鬥階段) 等，以上只是舉例大致上遊戲階段之間的劃分，基本上還是依照自己規劃創建為主，這些遊戲階段規劃好後，都可以使用 GSIFrame 進行整合與切換 (階段劃分後就可以自行實現每階段的運作)。\r\n\r\n- GSIBase，遊戲階段基類，在透過 Update 切換當前階段自定義的狀態流程 (Enum) 時，可透過 StopUpdate \u0026 RunUpdate 方法進行開關設置，即可停止或繼續 Update 的每幀調用，需建立實作 =\u003e 右鍵創建\r\n- GSIManagerBase，用於繼承實現管理層與註冊階段，需建立實作 =\u003e 右鍵創建\r\n\r\n#### Default API\r\n\r\n```C#\r\n    public static int GetCurrentId()\r\n    \r\n    public static U GetStage\u003cU\u003e() where U : GSIBase\r\n    \r\n    public static U GetStage\u003cU\u003e(int id) where U : GSIBase\r\n    \r\n    public static void AddStage\u003cU\u003e() where U : GSIBase, new()\r\n    \r\n    public static void AddStage\u003cU\u003e(int id) where U : GSIBase, new()\r\n    \r\n    public static void AddStage(int id, GSIBase gameStage)\r\n    \r\n    public static void DeleteStage\u003cU\u003e() where U : GSIBase\r\n    \r\n    public static void DeleteStage(int id)\r\n    \r\n    public static void ChangeStage\u003cU\u003e(bool force = false) where U : GSIBase\r\n    \r\n    public static void ChangeStage(int id, bool force = false)\r\n    \r\n    public static void DriveStart()\r\n    \r\n    public static void DriveUpdate(float dt = 0.0f)\r\n```\r\n\r\n※備註 : Right-Click Create/OxGFrame/GSI Frame... (Template cs)\r\n\r\n---\r\n\r\n### NetFrame (dependence OxGKit.Utilities)\r\n\r\n網路模塊，網路事件分為 OnOpen, OnBinary, OnMessage, OnError, OnClose，進行事件註冊後就可以針對網路狀態進行監控，也實現多網路節點 (NetNode)，再由 NetManager 進行網路節點註冊進行管理操作，另外可以設置心跳檢測回調、超時處理回調、重新連接回調的各處理，並且也能實現 INetTips 接口網路訊息介面的實作。\r\n\r\n- NetManager (網路節點管理器)\r\n- NetNode (網路節點)\r\n- INetProvider (網路供應者)\r\n  - TcpNetProvider (TCP)\r\n  - KcpNetProvider (KCP)\r\n  - WebSocketNetProvider (WebSocket)\r\n- NetOption (連線配置)\r\n  - TcpNetOption\r\n  - KcpNetOption\r\n  - WebSocketNetOption \r\n- INetTips (網路狀態提示接口)\r\n\r\n**目前有提供的 NetProvider 為以下** (可自行擴展其他 Provider)\r\n- TCP ([Telepathy TCP](https://github.com/MirrorNetworking/Telepathy))\r\n  - **注意**：Telepathy 框架已處理分黏包問題，會強制在 **Packet** 前面加入 **4 bytes** 來表示封包長度。\r\n- KCP ([kcp2k](https://github.com/MirrorNetworking/kcp2k))\r\n- WebSocket ([UnityWebSocket](https://github.com/psygames/UnityWebSocket))\r\n\r\n示例使用 [ioGame](https://github.com/iohao/ioGame) 作為服務端 (高效、方便快速切換連接方式)，客戶端使用 NetFrame - TcpNetProvider, WebSocketNetProvider 作為連線：\r\n\r\n| ioGame Server (TCP) | NetFrame - TcpNetProvider Client |\r\n|:-:|:-:|\r\n| ![](Docs/gif_7.gif) | ![](Docs/gif_8.gif) |\r\n| ![](Docs/img_21.png) | ![](Docs/img_20.png) |\r\n\r\n| ioGame Server (WebSocket) | NetFrame - WebSocketNetProvider Client |\r\n|:-:|:-:|\r\n| ![](Docs/img_23.png) | ![](Docs/img_22.png) |\r\n\r\n---\r\n\r\n### CenterFrame\r\n\r\n事件委派中心，可以自行實現 TClass 註冊類型，再由自定義管理類統一繼承 CenterBase\u003cTCenter, TClass\u003e，實現簡易事件派送，預設提供以下。\r\n\r\n#### Default API\r\n\r\n```C#\r\n    public static void Add\u003cUClass\u003e() where UClass : TClass, new()\r\n    \r\n    public static void Add\u003cUClass\u003e(int id) where UClass : TClass, new()\r\n    \r\n    public static void Add(int id, TClass @class)\r\n    \r\n    public static void Delete\u003cUClass\u003e() where UClass : TClass\r\n    \t\t\r\n    public static void Delete(int id)\r\n    \t\r\n    public static void DeleteAll()\r\n    \t\r\n    public static UClass Find\u003cUClass\u003e() where UClass : TClass\r\n    \r\n    public static UClass Find\u003cUClass\u003e(int id) where UClass : TClass\r\n```\r\n\r\n#### EventCenter\r\n\r\n集中式 Event 整合模塊，可以自定義每個 Event 的格式進行派送 (也可列出事件 ID 交由企劃填表填入已註冊的 ID，就能讀表取出事件 ID 進行派送)。\r\n- TClass: EventBase，單個 Event 基類，需建立實作 =\u003e 右鍵創建\r\n- TCenter: EventCenter，用於繼承管理層，主要用於註冊階段，需建立實作 =\u003e 右鍵創建\r\n  - 使用 Default API 進行調用 (Add, Find)\r\n\r\n#### APICenter\r\n\r\n集中式 API 整合模塊，可以自定義每個 API 的格式進行 Http API 短連接請求，能夠有效的集中管理各型式的 API 格式，使用 Acax (類似 Ajax 方式，請求 API)。\r\n- TClass: APIBase，單個 API 基類，需建立實作 =\u003e 右鍵創建\r\n- TCenter: APICenter，用於繼承管理層，主要用於註冊階段，需建立實作 =\u003e 右鍵創建\r\n  - 使用 Default API 進行調用 (Add, Find)\r\n\r\nAcax 種類支持：\r\n- Http.Acax (UnityWebRequest - using UnityEngine.Networking)，僅支持主線程。\r\n  - 平台建議：WebGL、WIN、OSX、Android、iOS。\r\n- HttpNativeClient.Acax (HttpClient - using System.Net.Http 新)，支持其他線程。\r\n  - 平台建議：WIN、OSX、Android、iOS。\r\n- HttpNativeWebRequest.Acax (HttpWebRequest - using System.Net 舊)，支持其他線程。\r\n  - 平台建議：WIN、OSX、Android、iOS。\r\n\r\n※備註 : Right-Click Create/OxGFrame/Center Frame... (Template cs)\r\n\r\n---\r\n\r\n### Unity 版本\r\n\r\n建議使用 Unity 2022.3.59f1(LTS) or higher 版本 - [Unity Download](https://unity3d.com/get-unity/download/archive)\r\n\r\n---\r\n\r\n### 特別感謝\r\n\r\n[killop - anything_about_game](https://github.com/killop/anything_about_game#unity-framework)\r\n\r\n[UWA 開源庫](https://lab.uwa4d.com/lab/62d51e6fa8103dabd0cce57f)\r\n\r\n[YooAsset 友情鏈結](https://www.yooasset.com/docs/community/Blogroll)\r\n\r\n[OxGFrame 开源项目使用教程](https://blog.csdn.net/gitblog_00798/article/details/142840300)\r\n\r\n[开启游戏开发新纪元 —— OxGFrame 框架深度解析](https://blog.csdn.net/gitblog_00035/article/details/139977201)\r\n\r\n---\r\n\r\n### 討論區\r\n\r\n[![dc_logo_x128](https://github.com/michael811125/OxGFrame/assets/30960759/b3bedd38-3c1d-4679-9417-d99a46f5b068)](https://discord.gg/jyJmWhRAv7)\r\n\r\n---\r\n\r\n### Donate\r\n\r\n[![paypal_logo_x128](https://github.com/michael811125/OxGFrame/assets/30960759/abe46416-b347-4cce-b41a-8004cbe52a5d)](https://paypal.me/MichaelOthx?country.x=TW\u0026locale.x=zh_TW)\r\n\r\n[![buymeacoffee_qrcode_x128](https://github.com/michael811125/OxGFrame/assets/30960759/179d19ad-b0e9-4a41-b045-99171f0bd7bb)](https://www.buymeacoffee.com/michael8116)\r\n\r\n---\r\n\r\n## License\r\n\r\nThis library is under the MIT License.\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmichael811125%2Foxgframe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmichael811125%2Foxgframe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmichael811125%2Foxgframe/lists"}