屬於 Unity 的 Flutter——UIWidgets
介紹
UIWidgets 是 Unity 的一個外掛包,是一個從 Google 的移動 UI 框架 Flutter 演變過來的 UI 框架。
相對於原生開發的高開發成本(不同平臺都需要不同的一套程式碼),Flutter、React-Native 等這種跨平臺 UI 框架應運而生。
Flutter 自 2018 年 3 月釋出以來,社群不斷壯大。由於 Flutter 自身設計理念的出色,Unity 中國已經著手將其移植過來。當然了,也因為這兩個東西都非常的年輕,因此開發的時候都像開荒一樣。
框架圖
Flutter 有自己的一套渲染系統,那麼 Unity 作為一個遊戲引擎,底層的圖形 API 用自己的一套東西就行了,因此移植過來更方便了。
Flutter 框架結構
UIWidgets 框架結構
執行效率
這裡提一些基礎的知識:
Batch 就是 DrawCall 的另一種說法,瞭解渲染流水線的同學會知道流水線在 CPU 與 GPU 之間通訊時,一般有三個步驟:
- 把資料載入到視訊記憶體中。
- 設定渲染狀態。
- 呼叫 Draw Call
Draw Call 就是一個呼叫命令,讓 CPU 告訴 GPU 要怎麼樣用給定的渲染狀態和輸入的頂點資訊來計算。Batch 裡面裝著頂點資訊,也就是 DrawCall 中 GPU 需要的頂點資訊。
DrawCall 可以在 Profiler 中看,Batches 可以在 Stats 視窗看,大家可以仔細看看上面動圖(右鍵在新標籤頁開啟圖片)裡面的資料變化。
在我隨便寫的一個例子中間,可以看到 Batches 數只有 1 。即使在有動畫的時候 Batches 會多一點,但動畫停止後 DrawCall 和 Batches 都馬上下來了。這也有我這個應用寫的太簡單的原因,但是這種效率還是非常值得期待的。
元件樹
學過前端的同學應該熟悉元件樹,這裡就不介紹了。
為了更高的渲染效率,Unity 採用了 Render Object Compositiing 的技術。
如果一個子樹沒有發生改變,Unity 就會將其渲染到一個離屏的 Render Texture 上快取下來,需要的時候再將其貼到螢幕上。
相比之下,以前的做法是,Canvas 只要有 UI element 改動了,整個 Canvas 都需要重新繪製。即使也有一種優化做法是準備兩個 Canvas 分別繪製動態 UI element 和 靜態 UI element,但這樣也存在很多手動管理的地方。
另外一方面,你可能也意識到了,我們不需要再管什麼用同一個材質等等來優化圖的合批,UIWidgets 會自動來管理這些事情。這方面也跟 FairyGUI 非常像,開發者能專注在生產效率上,讓外掛來管理麻煩的事情。
優點
- 能開發遊戲以外的 APP
- 遊戲中的 UI
- 新的使用者體驗
- 不用管渲染過程,提升效率
- 因為是 Unity 的外掛,可以輕鬆加各種粒子效果和其他騷操作。
- 一套程式碼能跑在遊戲中、APP 中、網頁中和 Unity 的 Editor 視窗中。(開發者還用其做了一個 Unity 中文文件的網站...一套程式碼能用在網頁上和 APP 端,不過還在開發中)
- 和 Flutter 的 API 幾乎一樣,可以參考 Flutter 教程來用 UIWidgets 搭應用。
缺點
- 無論是 Flutter 還是 UIWidgets 都還很年輕,有很多元件 UIWidgets 還沒移植過來(GridView、Circle Avatar 等等)
- 官方示例、文件還沒完善
- 開發時是開荒模式,所以可能忍不住直接轉用 Flutter 去了...
我的示例
這裡借用了 ミライ小町 的模型,所以程式碼倉庫大小會比較大。(專案裡面還有ミライ小町的跳舞動畫 animation!)
專案倉庫:Latias94/UIWidget-Practice
UIWidgets:UnityTech/UIWidgets
相關文章
- Unity的Flutter元件渲染UnityFlutter元件
- 構建屬於自己的Flutter混合開發框架Flutter框架
- flutter與unity的碰撞--opengl紋理共享實現flutter與unity介面的融合FlutterUnity
- flutter 屬性記錄Flutter
- 手把手教你用Flutter搭建屬於自己的個人部落格Flutter
- Unity3D指令碼屬性Unity3D指令碼
- 關於MDM 的屬於Tech還是屬於Apps的思考。。APP
- Unity中專屬資料夾介紹Unity
- Unity-Built-In-Attributes 內建屬性UnityUI
- Unity3D中Animation的常見屬性及方法Unity3D
- 關於unity中的update、Lateupdate和FixedUpdateUnity
- Flutter GetX Tag 屬性使用詳解Flutter
- 基於autofac的屬性注入
- C#開發Unity遊戲教程之遊戲物件的屬性變數C#Unity遊戲物件變數
- flutter 學習筆記【flutter 構造方法 TextField 屬性說明】Flutter筆記構造方法
- Flutter : 關於 KeyFlutter
- Flutter : 關於 ZoneFlutter
- cardboard sdk for unity 系統分析 - 屬性行為分析CardBoard類Unity
- Flutter 入門 — Container 屬性詳解FlutterAI
- Flutter 基於BLoC完整Flutter App專案FlutterBloCAPP
- 室外土方和挖方---院裡的室外屬於建築,馬路上才屬於市政
- 關於Unity Plugins資料夾UnityPlugin
- Flutter 基於Bloc框架的封裝FlutterBloC框架封裝
- iPhone 6是屬於黃牛黨的iPhone
- 論文的版權屬於誰?
- 關於css屬性calc對於ie的態度CSS
- 基於Unity3D引擎的大地形生成研究Unity3D
- Unity Shader基於視差對映的雲海效果Unity
- 關於unity專案匯出iOS工程的問題UnityiOS
- 關於Unity 如何與Blazor Server結合UnityBlazorServer
- 基於Flutter的仿微信聊天應用Flutter
- 基於 Riverpod 的 Flutter 狀態管理Flutter
- 基於 Linux 的 Flutter 方法通道 ChannelsLinuxFlutter
- Flutter Distributor 用於打包和釋出 Flutter 應用的完整工具Flutter
- 屬於我的md5sum程式
- C++ 的成功屬於意料之外C++
- 利用WordPress搭建屬於自己的網站網站
- 搭建屬於自己的個人部落格