Animation是Unity中的動畫文件,主要內容由一個個關鍵幀數據構成。經過將Unity的資源序列化方式調整爲Text,就能夠以文本方式查看動畫文件。
經過菜單項Edit -> Project Settings -> Editor打開Editor Settings窗口,就能夠設置資源序列化方式:python
下圖展現了我對一個Cube製做的動畫,動畫中包含了若干個關鍵幀,調整了Cube的座標位置和旋轉方向:正則表達式
以文本方式打開動畫文件,部份內容以下:動畫
動畫文件的序列化格式不在咱們的討論範圍內,本文咱們主要討論的是經過下降精度來減小動畫文件的大小。經過查看動畫文件,咱們發現Unity在序列化動畫文件時使用的浮點精度比較高,能夠到小數點後面不少位。所以,經過下降精度咱們就能夠減小動畫文件的大小。
這裏咱們使用python腳原本實現該功能,處理的邏輯以下:
1. 讀取動畫文件中的每一行
2. 對於讀取到的每一行,去除行尾的換行符
3. 使用"空格"做爲分隔符,分隔行內容
4. 對於分隔後的每個內容,使用正則表達式查詢是否包含浮點數據
5. 若是包含浮點數據,則使用四捨五入法保留小數點3位。若是不包含浮點數據,則直接寫入到輸出文件3d
下面是python代碼,能夠根據須要自行調整:blog
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')
經過下降精度調整後,動畫文件以下:ip
經過下降精度的調整,咱們將大小爲19.2KB的動畫文件下降到了18.3KB。看上去很微不足道,這是由於這個動畫文件僅僅包含了13幀動畫數據,對於真實項目中成百上千幀的動畫文件,節省量是很客觀的。以133秒的動畫文件爲例,大小從8MB下降到了3MB。資源