針對(duì)NGUI里面Anchor的OnUpdate調(diào)用頻繁的對(duì)UIRect的優(yōu)化

1.看源碼

通過Unity的控件發(fā)現(xiàn)有
image.png

然后可以看到基礎(chǔ)控件(比如UISprite)里面的這個(gè)屬性一層層找過去會(huì)發(fā)現(xiàn)都是繼承了UIRect,
然后觀察UIRect的源碼可以發(fā)現(xiàn):


image.png

這里確實(shí)有這個(gè)的枚舉,然后再具體的看他的邏輯都在Update()里面,可以發(fā)現(xiàn)他在每一幀調(diào)用,這樣確實(shí)比較頻繁,而且沒有這個(gè)必要,那我想對(duì)他進(jìn)行優(yōu)化就是比如能不能調(diào)用的不那么頻繁,但是又不影響他本身的邏輯,比如我想他0.1s調(diào)用一次,這個(gè)人眼基本看不出來差別,所以我想增加一種新的類型,可以0.1s調(diào)用。

2.修改

image.png

增加一種類型,然后在增加自己的邏輯,其實(shí)邏輯也比較簡單,就是記錄上次的時(shí)間,然后加一個(gè)時(shí)間間隔,先判斷是否是顯得類型,每一幀調(diào)用的時(shí)候判斷下間隔是否0.1秒了,如果是就執(zhí)行。

核心邏輯:

image.png
image.png

3.類型新增,然后呢?

新增類型結(jié)束了,然后就是怎么將它修改到每一個(gè)的場景和控件中,這里需要倆步。你會(huì)發(fā)現(xiàn)需要修改的也只是每一個(gè)prefab和scene里面的anchor類型,他是有一個(gè)屬性控制的,那個(gè)屬性是updateAnchors.


image.png

1.我們的場景和prefab必須是可視化的,不然一個(gè)個(gè)修改,可能手都會(huì)斷,新項(xiàng)目不至于,但是對(duì)于老項(xiàng)目來說容易錯(cuò)還有會(huì)遺漏,這需要先進(jìn)行一個(gè)修改。打開unity的Project Setting:


image.png

這樣就可以用文本文件打開了,這樣也便于svn/git的管理。


image.png

隨便打開一個(gè)prefab/unity能看到updateAnchor = 1,1就是OnUpdate的枚舉,我們的枚舉是 3,那么把1改成3就可以了。
image.png

4修改

所有后面我們需要做的就是如何將這些美術(shù)資源里面的屬性修改掉,我本來打算使用c#實(shí)現(xiàn),寫一個(gè)功能,奈何擱淺了,然后我就換了方式,我使用了python,發(fā)現(xiàn)python可以實(shí)現(xiàn),就寫了這樣一個(gè)腳本,邏輯也不復(fù)雜,核心就是
1:遍歷Assets文件夾,獲取所有的prefab和.unity的場景文件,
2:讀取并修改。
代碼如下:

import os
import chardet

image_path = 'xxx/Assets'



# 獲取文件編碼類型
def get_encoding(file):
    # 二進(jìn)制方式讀取,獲取字節(jié)數(shù)據(jù),檢測類型
    with open(file, 'rb') as f:
        return chardet.detect(f.read())['encoding']



# 遍歷文件夾及其子文件夾中的文件,并存儲(chǔ)在一個(gè)列表中
# 輸入文件夾路徑、空文件列表[]
# 返回 文件列表Filelist,包含文件名(完整路徑)
def get_filelist(dir, Filelist):
    newDir = dir
    if os.path.isfile(dir):
        Filelist.append(dir)
        # # 若只是要返回文件文,使用這個(gè)
        # Filelist.append(os.path.basename(dir))
    elif os.path.isdir(dir):
        for s in os.listdir(dir):
            # 如果需要忽略某些文件夾,使用以下代碼
            # print(s)
            # t = s.split('.')
            # if t[len(t)-1] != "prefab":
            #     continue
            newDir = os.path.join(dir, s)
            get_filelist(newDir, Filelist)
    return Filelist

def modifyPrefab(file,old_str,new_str):
    """
    替換文件中的字符串
    :param file:文件名
    :param old_str:就字符串
    :param new_str:新字符串
    :return:
    """
    file_data = ""
    with open(file, "r", encoding="utf-8") as f:
        for line in f:
            if old_str in line:
                line = line.replace(old_str,new_str)
            file_data += line
    with open(file,"w",encoding="utf-8") as f:
        f.write(file_data)

if __name__ == '__main__':
    list = get_filelist(image_path, [])
    print("lenght------------------------------",len(list))
    for e in list:
        # print(e)
        t = e.split('.')
        if (t[len(t)-1] == "prefab" or t[len(t) - 1] == "unity"):
            # modifyPrefab(e,"updateAnchors: 1","updateAnchors: 3")
            # encoding = get_encoding(e)
            # if(encoding != 'utf-8'):
            #     print(t,"當(dāng)前的編碼格式不對(duì)----------------",encoding);
            # else:
            #     modifyPrefab(e,"updateAnchors: 1","updateAnchors: 3")
            #     print(e)
            modifyPrefab(e, "updateAnchors: 1", "updateAnchors: 3")
            print(e)

ps:中間的編碼格式,是因?yàn)橛龅綀?bào)錯(cuò),中斷了,先以為是編碼格式的問題,后來發(fā)現(xiàn)是prefab的腳本丟失,導(dǎo)致他變成亂碼,所以直接中斷了,如果遇到這樣的問題,找到那個(gè)prefab,要么找回對(duì)應(yīng)的腳本,要么先刪掉,或者先刪掉整個(gè)的prefab,自己記錄,后續(xù)修改,畢竟錯(cuò)誤的情況不會(huì)那么多。然后執(zhí)行完我這邊大概有2000個(gè)文件,有修改的大概700多個(gè),自己玩了下沒有大問題。你們?cè)趐ython3的環(huán)境下直接填入自己的Asset的絕對(duì)路徑又可以了,這樣就解決了我們的問題了。
我覺得解決問題,一定要先定位問題,在想好怎么做,一步步的解決就好了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 編程代碼規(guī)范: 1:腳本行數(shù)最多500行。 2:如果要發(fā)行其他國家的版本需要重新Copy一份客戶端代碼,在另行修改...
    諸子百家誰的天下閱讀 2,953評(píng)論 0 2
  • 關(guān)于這些技巧這些技巧不可能適用于每個(gè)項(xiàng)目。這些是基于我的一些項(xiàng)目經(jīng)驗(yàn),項(xiàng)目團(tuán)隊(duì)的規(guī)模從3人到20人不等;框架結(jié)構(gòu)的...
    Babybus_Unity閱讀 2,757評(píng)論 2 27
  • 關(guān)于這些技巧這些技巧不可能適用于每個(gè)項(xiàng)目。這些是基于我的一些項(xiàng)目經(jīng)驗(yàn),項(xiàng)目團(tuán)隊(duì)的規(guī)模從3人到20人不等;框架結(jié)構(gòu)的...
    游戲開發(fā)小Y閱讀 1,037評(píng)論 0 1
  • 一:什么是協(xié)同程序? 在主線程運(yùn)行的同時(shí)開啟另一段邏輯處理,來協(xié)助當(dāng)前程序的執(zhí)行,協(xié)程很像多線程,但是不是多線程,...
    胤醚貔貅閱讀 2,095評(píng)論 0 13
  • 一:什么是協(xié)同程序?答:在主線程運(yùn)行時(shí)同時(shí)開啟另一段邏輯處理,來協(xié)助當(dāng)前程序的執(zhí)行。換句話說,開啟協(xié)程就是開啟一個(gè)...
    CrixalisAs閱讀 2,099評(píng)論 1 7