思路:通过GUID全局搜索匹配
有人是写的Unity编译器版本的,但是运行效率特别慢,不建议使用
我的做法的是
- 取所有文件的guid信息获取到(.meta文件获取)
- 取Unity的资源信息(通常是这几种[".prefab",".unity",".mat",".asset"],这些文件都是可读的)
- 查看文件在资源中的使用情况([".prefab",".unity",".mat",".asset"]中guid的映射情况)
- 把上述数据都存在数据库中,通过sql语句查看引用情况
上述方法的有点是超级快,缺点是因为是把所有的信息都储存在数据库中,所以数据信息是死的,需要更新
以下是我写的Python按本
from tool import Tool
from sql_manager import Sql_manager
def get_guid(t,content):
data=t.find_str_all_re(str(content),r'guid: (.+?)\\r')
if len(data)>0:
return data[0]
else:
data=t.find_str_all_re(str(content),r'guid: (.+?)\\n')
if len(data)>0:
return data[0]
else:
return ''
def get_all_guids(t,content):
data=t.find_str_all_re(str(content),r'guid: (.+?),')
return data
def get_type(path):
strList=str(path).split('.')
if len(strList)>1:
return str(strList[1])
else:
return 'dir'
def read_all_assets_to_sqlite():
t=Tool()
fileList=t.get_file_list(t.get_openTK_path('选择需要查看的文件夹'))
table_name='assets'
sqlManager=Sql_manager('F:/python_projects/tools/data/Assets.db')
sqlManager.execute('''
create table '%s' (id INTEGER PRIMARY KEY AUTOINCREMENT,
uid TEXT,
name TEXT,
type TEXT,
path TEXT)
'''%table_name)
index=0
for f in fileList:
if t.get_file_extension(f) in [".prefab",".unity",".mat",".asset"]:
content=t.read_file(f)
if content is not None:
print('正在读:',f)
guids=get_all_guids(t,content)
for cur_guid in guids:
index=index+1
guid=cur_guid
name=t.get_file_shortName(f)
path=t.get_file_path_noExtension(f)
asset_type=t.get_file_extension(f)
sqlManager.execute("insert into '%s' values (NULL,'%s','%s','%s','%s')" %
(t.get_clear_str(table_name),
t.get_clear_str(guid),
t.get_clear_str(name),
t.get_clear_str(asset_type),
t.get_clear_str(path)))
print(index,guid,name,path)
sqlManager.commit()
sqlManager.close()
print('meta操作完成!!!')
def read_all_metas_to_sqlite():
t=Tool()
fileList=t.get_file_list(t.get_openTK_path('选择需要查看的文件夹'))
table_name='meta'
sqlManager=Sql_manager('F:/python_projects/tools/data/Assets.db')
sqlManager.execute('''
create table '%s' (id INTEGER PRIMARY KEY AUTOINCREMENT,
uid TEXT,
name TEXT,
type TEXT,
path TEXT)
'''%table_name)
index=0
for f in fileList:
if t.get_file_extension(f) in ['.meta']:
content=t.read_file(f)
if content is not None:
print('正在读:',f)
index=index+1
guid=get_guid(t,content)
name=t.get_file_shortName(f)
path=t.get_file_path_noExtension(f)
asset_type=get_type(path)
sqlManager.execute("insert into '%s' values (NULL,'%s','%s','%s','%s')" %
(t.get_clear_str(table_name),
t.get_clear_str(guid),
t.get_clear_str(name),
t.get_clear_str(asset_type),
t.get_clear_str(path)))
print(index,guid,name,path)
sqlManager.commit()
sqlManager.close()
print('assets操作完成!!!')
if __name__ == "__main__":
read_all_metas_to_sqlite()
read_all_assets_to_sqlite()
得到两个表
meta表
assets表
举例查询
sql语句(查整个文件夹)
SELECT
meta.NAME AS 需要查询的文件名,
meta.path AS 需要查询的文件名路径,
assets.NAME AS 引用的文件,
assets.type AS 引用的文件类型,
assets.path AS 引用的文件路径
FROM
meta
LEFT JOIN assets ON meta.uid = assets.uid
WHERE
meta.path LIKE 'E:/sanguo_yuenan/Assets\Res\Font\2dui\%'
AND meta.type IN ( 'prefab' )
AND assets.uid is NOT NULL
查询结果
根据数据库里面的数据,可以自行写sql查询自己想要的东西