最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

【Unity Editor】當個編輯器仔好難

2023-03-17 14:45 作者:江楓楓Maple  | 我要投稿

???最近發(fā)現(xiàn)當工具仔的頻率有點高,但是常用的接口總是記不住,決定還是整個筆記紀錄一下都有哪些接口,以后回來查的時候也方便一些。

0.做個工具入口

????在上方工具欄加個入口吧!注意函數(shù)要是靜態(tài)函數(shù)才行哦。

1.用路徑加載對象

2.搜索指定路徑下的所有文件

3.修改完了如何保存資源

4.編輯器下到底應(yīng)該如何卸載資源?

????使用第一種方式(AssetDatabase.LoadAssetAtPath)加載了對應(yīng)的預制體后,發(fā)現(xiàn)這個東西居然不能用正常的方式卸載?!而且因為工具需要遍歷的資源太多太大,這些資源無法及時卸載導致內(nèi)存爆炸最后crash。接下來紀錄一下為了卸載這個玩意兒我都試了哪些辦法:

????Resources.UnloadAsset

???很明顯這個接口不行,因為這個接口只能釋放資源,無法釋放GameObject。調(diào)用卸載GameObject會報錯:
???UnloadAsset may only be used on individual assets and can not be used on GameObject's / Components / AssetBundles or GameManagers

????Object.DestroyImmediate

???這個接口也以失敗告終,因為Unity會認為你在直接修改資源,如果直接刪除對象會導致資源丟失,報錯:
???Destroying assets is not permitted to avoid data loss.

????Resources.UnloadUnusedAssets

???我嘗試著先將資源的引用置為null,然后調(diào)用這個接口進行釋放資源,雖然執(zhí)行起來沒有報錯,但是我的內(nèi)存仍然還是在上漲,并無法回到代碼執(zhí)行前的內(nèi)存水平。
???我又試了一下多次運行這段代碼,會出現(xiàn)內(nèi)存仍然升高的現(xiàn)象,但是最終的值會穩(wěn)定回到我第一次運行結(jié)束時的內(nèi)存占用水平。

????AssetDatabase.DeleteAsset

???看名字感覺像是跟LoadAssetAtPath接口像是配套的接口,但是 完 全 不 是 !他喵的這個接口是用來刪除資源的,調(diào)一調(diào)資源全刪掉!還好我有版本控制工具MMP。

???? ?踩了四個坑,終于找到最終的接口了:
EditorUtility.UnloadUnusedAssetsImmediate();

???用了這個接口之后,內(nèi)存穩(wěn)如老狗,隨便加載隨便卸載,實在是太爽了?。。。ň庉嬈飨虏庞杏门叮?br>???運行時應(yīng)該還是要用Resources.UnloadUnusedAssets()進行卸載,不過現(xiàn)在暫時沒用到,用到在研究吧~?

5.加速importing

? ??在批量修改資源后,保存修改會針對每一個資源進行保存操作。這是個十分耗時的操作。


? ?Unity官方的解釋:Starts importing Assets into the Asset Database. This lets you group several Asset imports together into one larger import.通俗點講就是對大量的import操作進行合批,進而加快import效率。StartAssetEditing/StopAssetEditing是成對出現(xiàn)的,Unity引擎內(nèi)部有一個gLock字段用于記錄StartAssetEditing/StopAssetEditing操作,每執(zhí)行一次StartAssetEditing,gLock++,同樣每執(zhí)行一次StopAssetEditing,gLock--,當gLock=0時標志著一次import合批完成。為了實現(xiàn)import合批,unity會掛起StartAssetEditing/StopAssetEditing之間的所有Import和Refresh操作,等到StopAssetEditing后,一次性Import和Refresh。

6.給進程做個進度條吧~

???代碼雖然很簡單,但是每次都忘了接口叫啥,每次都要去之前的代碼里復制,這里也稍微提一下吧:

7.readonly和const的區(qū)別

???readonly修飾的字段:其初始化僅是固定了其引用(地址不能修改),但它引用的對象的屬性是可以更改的。
??const:定義的是靜態(tài)常量,在對象初始化的時候賦值。以后不能改變它的值,屬于編譯時常量(編譯時就已經(jīng)確定的值)。不能用new初始化。不能與static一起使用,因為const已經(jīng)是靜態(tài)的了。

8.is/as與拆裝箱

???is是一次類型檢查,它只會檢查對象是否與目標類型兼容,而不會進行類型轉(zhuǎn)換。當然,is適用于所有類型,無論是值類型還是引用類型:

obj is Enum
obj is Vector2
obj is bool

???as是一次類型轉(zhuǎn)換,首先它會檢查對象是否與目標類型兼容,兼容則進行類型轉(zhuǎn)換并拆箱成對應(yīng)類型,如果不兼容則返回null。

????as內(nèi)部雖然做了一次類型檢查,但是使用as的你并不知道檢查結(jié)果,所以在使用as之后通常還是需要一次檢查結(jié)果是否為null。
????as無法用在可空類型上,即值類型無法使用as進行類型轉(zhuǎn)換。

???那么我們在拆箱時具體要怎么辦呢?

對于引用類型,可以直接使用as進行拆箱,拆箱后記得判空

對于值類型,只能先對類型使用is檢查,然后進行強轉(zhuǎn)。如

????P.S.is和as都需要一個實例,也就是一個obj是否是另外一個類型,但是有的時候我們需要一些類型間的比較該怎么辦呢?比如想判斷一個類型是否為另外一個類型的子類,我們就可以使用下面的接口進行判斷:

9.程序集與類型

???比如我們想獲取某一個類型的所有子類,首先我們需要獲取對應(yīng)的程序集。
??通過類型可以直接獲取類型所在的程序集,如

???其中如果我們想拿某個類型的父類,可以通過類型的.BaseType獲取父類,但是如果你的類型繼承自一個泛型父類,那么使用 targetType.BaseType == typeof(父類<>) 進行類型判斷是不行的,因為在編譯結(jié)束的時候,這個類的父類就已經(jīng)是確定類型了,比如你的泛型傳入的是int,那么類型的父類就是父類<int>?而不是父類<> 了。

10.結(jié)果寫入文件

???很簡單,幾行代碼就解決了,但是代碼是啥總忘,記一下。

11.文件改名

C#的文件改名就是用FileInfo的MoveTo函數(shù),不過在unity里這樣不會更新meta文件改完之后meta文件會變

所以還是用Unity自己的改名函數(shù)試試把(改完記得調(diào)一下refresh哦)

【Unity Editor】當個編輯器仔好難的評論 (共 條)

分享到微博請遵守國家法律
青川县| 高邑县| 施秉县| 修水县| 高要市| 永昌县| 卢湾区| 江孜县| 九台市| 宝兴县| 嵊泗县| 新巴尔虎左旗| 南木林县| 太康县| 正定县| 鹰潭市| 乡宁县| 武夷山市| 孝昌县| 无棣县| 湟源县| 宜宾县| 新密市| 台北市| 宣威市| 延长县| 邳州市| 共和县| 古交市| 西藏| 台东市| 新野县| 巴马| 平潭县| 邮箱| 突泉县| 唐河县| 广州市| 阳西县| 天台县| 九寨沟县|