这里是安装包https://apps.qoo-app.com/en/app/22989
就是未加密的常规Unity包,用文本编辑器或者你顺手的工具把文件头UnityFS前面的数据删掉就行了
更正,只读取出来了一半文件,我再看看
再次更正,搞明白了,他把多个unity包缝到一起了,根据UnityFS字段所在行把文件分割成多个文件,然后再对每个文件重复一次开头的操作就行了
试了下csplit切出来的文件有的能读有的读不出来,具体原因还没找到,等一个英雄登场
游戏资源两部分,一部分在包内,以.bs为后缀,另一部分在Android的目录(这里我就只提取Custom里面的,剩下的音频视频自己拆)
用16进制查看,没加密,只是有些干扰,写个脚本批量删就好了
加载了2371个,我这边ab资源是有2465个,感觉应该是shader报错不计入其中?
游戏是spine动画不是live2d,直接类型勾选Texture2D和TextAsset,搜spine,按照容器路径导出即可
import os
import shutil
# 指定输入目录和输出目录
input_directory = "./Custom"
output_directory = "./Output"
def contains_unityfs(data):
return b'\x55\x6E\x69\x74\x79\x46\x53' in data
if not os.path.exists(output_directory):
os.makedirs(output_directory)
# elif os.listdir(output_directory):
# print("输出目录不为空,请清空输出目录后重新运行脚本。")
# exit(1)
total_files = 0
processed_files = 0
skipped_files = 0
for root, dirs, files in os.walk(input_directory):
for file in files:
total_files += 1
input_file_path = os.path.join(root, file)
relative_path = os.path.relpath(input_file_path, input_directory)
output_file_path = os.path.join(output_directory, relative_path)
with open(input_file_path, 'rb') as f:
file_data = f.read()
if contains_unityfs(file_data):
processed_files += 1
last_occurrence = file_data.rfind(b'\x55\x6E\x69\x74\x79\x46\x53')
trimmed_data = file_data[last_occurrence:]
output_file_dir = os.path.dirname(output_file_path)
if not os.path.exists(output_file_dir):
os.makedirs(output_file_dir)
with open(output_file_path, 'wb') as output_file:
output_file.write(trimmed_data)
else:
skipped_files += 1
if not os.path.exists(output_file_path):
output_file_dir = os.path.dirname(output_file_path)
if not os.path.exists(output_file_dir):
os.makedirs(output_file_dir)
shutil.copy2(input_file_path, output_file_path)
print(f"处理文件: {input_file_path}")
print(f"总文件数: {total_files}")
print(f"处理文件数: {processed_files}")
print(f"跳过文件数: {skipped_files}")
1 个赞
我也同样的问题,apk里的bs包全切完出来2042个文件,只读出来283个