1.看源碼
通過Unity的控件發(fā)現(xiàn)有然后可以看到基礎(chǔ)控件(比如UISprite)里面的這個(gè)屬性一層層找過去會(huì)發(fā)現(xiàn)都是繼承了UIRect,
然后觀察UIRect的源碼可以發(fā)現(xiàn):
這里確實(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.修改
增加一種類型,然后在增加自己的邏輯,其實(shí)邏輯也比較簡單,就是記錄上次的時(shí)間,然后加一個(gè)時(shí)間間隔,先判斷是否是顯得類型,每一幀調(diào)用的時(shí)候判斷下間隔是否0.1秒了,如果是就執(zhí)行。
核心邏輯:
3.類型新增,然后呢?
新增類型結(jié)束了,然后就是怎么將它修改到每一個(gè)的場景和控件中,這里需要倆步。你會(huì)發(fā)現(xiàn)需要修改的也只是每一個(gè)prefab和scene里面的anchor類型,他是有一個(gè)屬性控制的,那個(gè)屬性是updateAnchors.
1.我們的場景和prefab必須是可視化的,不然一個(gè)個(gè)修改,可能手都會(huì)斷,新項(xiàng)目不至于,但是對(duì)于老項(xiàng)目來說容易錯(cuò)還有會(huì)遺漏,這需要先進(jìn)行一個(gè)修改。打開unity的Project Setting:
這樣就可以用文本文件打開了,這樣也便于svn/git的管理。
隨便打開一個(gè)prefab/unity能看到updateAnchor = 1,1就是OnUpdate的枚舉,我們的枚舉是 3,那么把1改成3就可以了。
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ì)路徑又可以了,這樣就解決了我們的問題了。
我覺得解決問題,一定要先定位問題,在想好怎么做,一步步的解決就好了。