Unity

【Unity】查看资源引用

2019-12-09  本文已影响0人  FCLoveShare

思路:通过GUID全局搜索匹配

有人是写的Unity编译器版本的,但是运行效率特别慢,不建议使用
我的做法的是

  1. 取所有文件的guid信息获取到(.meta文件获取)
  2. 取Unity的资源信息(通常是这几种[".prefab",".unity",".mat",".asset"],这些文件都是可读的)
  3. 查看文件在资源中的使用情况([".prefab",".unity",".mat",".asset"]中guid的映射情况)
  4. 把上述数据都存在数据库中,通过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表

image.png

assets表

image.png
举例查询
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

查询结果


image.png

根据数据库里面的数据,可以自行写sql查询自己想要的东西

上一篇下一篇

猜你喜欢

热点阅读