Animation是Unity中的動畫文件,主要內容由一個個關鍵幀數據構成。通過將Unity的資源序列化方式調整為Text,就可以以文本方式查看動畫文件。
通過菜單項Edit -> Project Settings -> Editor打開Editor Settings窗口,就可以設置資源序列化方式:
下圖展示了我對一個Cube制作的動畫,動畫中包含了若干個關鍵幀,調整了Cube的坐標位置和旋轉方向:
以文本方式打開動畫文件,部分內容如下:
動畫文件的序列化格式不在我們的討論范圍內,本文我們主要討論的是通過降低精度來減少動畫文件的大小。通過查看動畫文件,我們發現Unity在序列化動畫文件時使用的浮點精度比較高,可以到小數點后面很多位。因此,通過降低精度我們就可以減少動畫文件的大小。
這里我們使用python腳本來實現該功能,處理的邏輯如下:
1. 讀取動畫文件中的每一行
2. 對於讀取到的每一行,去除行尾的換行符
3. 使用"空格"作為分隔符,分隔行內容
4. 對於分隔后的每一個內容,使用正則表達式查詢是否包含浮點數據
5. 如果包含浮點數據,則使用四舍五入法保留小數點3位。如果不包含浮點數據,則直接寫入到輸出文件
下面是python代碼,可以根據需要自行調整:
import re animFile = open("Move.anim") outputFile = open("NewMove.anim", "w", newline='\n') for l in animFile.readlines(): # 讀取文件中的每一行 line = l.rstrip() # 對於讀取到的每一行,去除行尾的換行符 words = line.split(' ') # 使用"空格"作為分隔符,分隔行內容 for word in words: match = re.match("-?\d+\.\d+", word) # 對於分隔后的每一個內容,使用正則表達式查詢是否包含浮點數據 # 如果包含浮點數據,則使用四舍五入法保留小數點3位。如果不包含浮點數據,則直接寫入到輸出文件 if match: value = match.group(0) floatValue = float(value) outputFile.write(word.replace(value, str(round(floatValue, 3)))) else: outputFile.write(word) if word != words[-1]: outputFile.write(' ') outputFile.write('\n')
通過降低精度調整后,動畫文件如下:
通過降低精度的調整,我們將大小為19.2KB的動畫文件降低到了18.3KB。看上去很微不足道,這是因為這個動畫文件僅僅包含了13幀動畫數據,對於真實項目中成百上千幀的動畫文件,節省量是很客觀的。以133秒的動畫文件為例,大小從8MB降低到了3MB。