【Unity】查看资源引用

思路:通过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的Resources系统和AssetBundle系统进行深入讨论。 分为四个部分: 有关...
    Wenchao阅读 2,034评论 0 1
  • 1、特殊文件夹(unity doc : Special Folders) Unity工程根目录下,有三个特殊文件夹...
    小飞不会飞_阅读 6,406评论 2 27
  • 首先附上原文链接:https://unity3d.com/cn/learn/tutorials/topics/be...
    Bonging阅读 579评论 0 0
  • Unity的资源加载及管理,基础很重要。此篇文章作为近期梳理项目内资源管理器的一个小总结,尝试尽量用人话将Unit...
    某人在阅读 20,405评论 8 44
  • 花点时间陪陪父母,发生在你身上的事,同样也发生在他们身上,正如孤独。 在办公室里加班至深夜, 在接了很多个所谓的紧...
    溺水而亡的河阅读 120评论 0 0