目录
- #1 提取资源文件
- #2 解密
- #3 读取资源
- #4 导出资源
- #4.1 导出单个 / 少量资源
- #4.2 按种类导出资源
- #5 资源去重(可选)
本篇文章偏小白向,有一定基础的可以选择性阅读
本文仅供学习交流使用,请勿用于商业用途。
更新至 2024.5.2, 星趴版本号
v1.2.3_20240430_123a
#1 提取资源文件
- 启动你的星趴
- 按下 Ctrl+Shift+Esc 打开任务管理器(右键任务栏,选择「任务管理器」亦可)
- 找到
AstralParty.exe
(如果你看到的是乱序的列表,点击窗口上部左侧的「名称」进行排序) - 右键
AstralParty.exe
,选择「打开文件所在的位置」
- 这时候跳出的文件资源管理器的窗口就是星趴的根目录了,大概长这样:
- 依次打开文件夹
AstralParty_Data
StreamingAssets
aa
StandaloneWindows64
,可以看到许多以.bundle
为扩展名的文件,这些就是星趴的资源文件了- 如果没看到扩展名
.bundle
,可以点击窗口上部的「查看」,并勾选右侧的「文件扩展名」
- 如果没看到扩展名
- 我们并不希望影响星趴的正常运行,所以将你想要的文件(如果你不清楚你想要的文件是哪些,那就 Ctrl+A 全选)复制到别的地方(下文以文件夹「tutorial」为例)
- 不必担心其他类型的文件,它们没有影响
#2 解密
- 在「tutorial」文件夹下新建一个文本文档并打开
- 如果没看到扩展名
.txt
,可以点击窗口上部的「查看」,并勾选右侧的「文件扩展名」(见图 3)
- 如果没看到扩展名
- 复制下面的部分至文本文档中
<# :
cls&echo off&cd /d "%~dp0"&rem bat存为ANSI/GB2312编码
path %SYSTEMROOT%\System32\WindowsPowerShell\v1.0;%path%
set "self=%~f0"
powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0'|Out-String|Invoke-Expression"
pause
exit
#>
$self=get-item -literal $env:self;
$current=$self.Directory.FullName.trimend('\');
$len=18;
$newfolder=$current+'\stripped';
if(-not (test-path -literal $newfolder)){[void][IO.Directory]::CreateDirectory($newfolder);}
$files=@(dir -literal $current|?{($self.Extension -ne $_.Extension) -and ($_ -is [System.IO.FileInfo])});
for($i=0;$i -lt $files.length;$i++){$arr=[IO.File]::ReadAllBytes($files[$i].FullName);$brr=@();if($arr.length -gt $len){$brr=$arr[$len..($arr.length-1)];}$newfile=$newfolder.trimend('\')+'\'+$files[$i].Name;write-host $files[$i].Name ' (' ($i+1) '/' $files.length ')' -Separator '';[IO.File]::WriteAllBytes($newfile, $brr);
}
本段代码的目的是去除文件的前 18 个字节
- 关闭文本文档,将其重命名为
strip.bat
- 跳出如下窗口时选择「是」
- 跳出如下窗口时选择「是」
- 双击打开
strip.bat
,待出现「请按任意键继续...」后关闭,此时文件夹stripped
下的文件就可以用于下一步了
#3 读取资源
- 打开这个链接(打不开的话多刷新几次),下载页面底部
net7.0
开头的.zip
文件 - 解压后打开里面的
AssetStudio.GUI.exe
- 调整配置如下
- 别问我为什么可以同时开两个菜单,这是两张图拼起来的
- 点击左上角的
File
点击菜单中的Load Folder
并选择刚才的stripped
文件夹 - 待下方的进度条满(文件数较多时请耐心等待)后点击上方的
Asset List
,即可看到内部的资源- 点击部分资源右边会出现预览图
- 点击部分资源右边会出现预览图
#4 导出资源
#4.1 导出单个 / 少量资源
- 在左侧列表中选中需要导出的资源并右键,选择
Export selected assets
,然后选择放置导出文件的文件夹即可
#4.2 按种类导出资源
- 点击窗口上部的
Filter Type
,一般按需选择TextAsset
(文本)、Texture2D
(图片)、VideoClip
(视频)即可 - 点击窗口上部的
Export
,在菜单中选择Filtered assets
,然后选择放置导出文件的文件夹即可
#5 资源去重(可选)
- 在按种类导出资源时,我们可能会遇到资源重复的问题(通常出现在图片类型的资源中),我们通过以下的 Python 脚本除去
import filecmp, os
rootdir = os.path.dirname(__file__)
lst = os.listdir(rootdir)
lst.sort()
lst.remove(os.path.basename(__file__))
# print(lst)
dic = {}
def getRawname(filename: str) -> str: # 获取对应的原始文件名(无后缀)return filename.split('.')[0].split('(')[0].strip()
for i in lst: # 根据原始文件名分组rawname = getRawname(i)if rawname not in dic:dic[rawname] = []dic[rawname].append(i)
# print(dic.keys())
for rawname in dic.keys():dic[rawname] = dic[rawname][-1:] + dic[rawname][:-1] # 把原始文件名对应的文件放在列表开头for i in range(len(dic[rawname]) - 1, -1, -1): # 倒序枚举被删除文件的指针for j in range(0, i): # 正序枚举模板文件的指针if filecmp.cmp(dic[rawname][i], dic[rawname][j]): # 若两文件相同os.remove(os.path.join(rootdir, dic[rawname][i]))print(f"Removed {dic[rawname][i]}! (equals to {dic[rawname][j]})")break