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。资源