美文网首页Unity
【Unity】查看资源引用

【Unity】查看资源引用

作者: FCLoveShare | 来源:发表于2019-12-09 17:11 被阅读0次

    思路:通过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查询自己想要的东西

    相关文章

      网友评论

        本文标题:【Unity】查看资源引用

        本文链接:https://www.haomeiwen.com/subject/njqigctx.html