Unity项目中查找所有使用某一张图片的材质球,再查找所有使用材质球的预设

这篇具有很好参考价值的文章主要介绍了Unity项目中查找所有使用某一张图片的材质球,再查找所有使用材质球的预设。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

废话少说,直接上代码。

using UnityEditor;
using UnityEngine;

public class FindDependencies : MonoBehaviour
{
    static bool m_bIsSaveFile = false;
    static TextWriteHelper m_szMaterialList = new TextWriteHelper();
    static TextWriteHelper m_szPrefabList = new TextWriteHelper();
    [MenuItem("Assets/FindImageDependencies")]
    static void FindDepend()
    {
        m_szMaterialList.ClearData();
        string imagePath = GetObjPath(); // "Assets/Path/To/Your/Image.png";
        string[] guids = AssetDatabase.FindAssets("t:Material");
        foreach (string guid in guids)
        {
            string assetPath = AssetDatabase.GUIDToAssetPath(guid);
            Material material = AssetDatabase.LoadAssetAtPath<Material>(assetPath);

            if (material != null && HasTexture(material, imagePath))
            {
                Debug.Log(string.Format("Material referencing the image: {0}, and path = {1}", material.name, assetPath));
                //m_szMaterialList.AddContent(string.Format("Material referencing the image: {0}, and path = {1}", material.name, assetPath));
                FindPrefab(assetPath);
            }
        }
        if (m_bIsSaveFile)
        {
            m_szMaterialList.SaveFile("MaterialReferenceList");
            m_szPrefabList.SaveFile("PrefabReferenceList");
        }
    }
    static string GetObjPath()
    {
        string path = AssetDatabase.GetAssetPath(Selection.activeInstanceID);
        return path;
    }
    static bool HasTexture(Material material, string texturePath)
    {
        SerializedObject serializedMaterial = new SerializedObject(material);
        SerializedProperty texturesProperty = serializedMaterial.FindProperty("m_SavedProperties.m_TexEnvs");

        for (int i = 0; i < texturesProperty.arraySize; i++)
        {
            SerializedProperty textureProperty = texturesProperty.GetArrayElementAtIndex(i);
            SerializedProperty textureValueProperty = textureProperty.FindPropertyRelative("second.m_Texture");

            if (textureValueProperty != null)
            {
                Texture texture = textureValueProperty.objectReferenceValue as Texture;
                if (texture != null && AssetDatabase.GetAssetPath(texture) == texturePath)
                {
                    return true;
                }
            }
        }
        return false;
    }

    static void FindPrefab(string materialPath)
    {
        //string materialPath = "Assets/Path/To/Your/Material.mat";
        string[] guids = AssetDatabase.FindAssets("t:Prefab");
        foreach (string guid in guids)
        {
            string assetPath = AssetDatabase.GUIDToAssetPath(guid);
            GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(assetPath);

            if (prefab != null && HasMaterialReference(prefab, materialPath))
            {
                Debug.Log(string.Format("Prefab referencing the material: {0},and prefab path ={1} ", prefab.name, assetPath));
                //m_szPrefabList.AddContent(string.Format("Prefab referencing the material: {0},and prefab path ={1} ", prefab.name, assetPath));
            }
        }
    }

    static bool HasMaterialReference(GameObject gameObject, string materialPath)
    {
        Renderer[] renderers = gameObject.GetComponentsInChildren<Renderer>(true);

        foreach (Renderer renderer in renderers)
        {
            foreach (Material material in renderer.sharedMaterials)
            {
                if (material != null && AssetDatabase.GetAssetPath(material) == materialPath)
                {
                    return true;
                }
            }
        }

        return false;
    }
}

上述代码中,我们首先使用AssetDatabase.FindAssets方法通过过滤类型("t:Material")获取所有材质球的GUID。然后遍历每个GUID,加载对应的材质球,判断该材质球是否引用了指定的图片。我们定义了一个辅助方法HasTexture来检查材质球中的纹理是否引用了目标图片,通过检查SerializedProperty来判断纹理是否匹配。

上述代码中,我们首先使用AssetDatabase.FindAssets方法通过过滤类型("t:Prefab")获取所有预设的GUID。然后遍历每个GUID,加载对应的预设,并判断该预设是否引用了指定的材质球。我们定义了一个辅助方法HasMaterialReference来检查预设及其子物体的渲染组件是否使用了目标材质球,通过遍历渲染组件的sharedMaterials数组来进行匹配。

综上所诉,我们也可以通过相似的方式去查找其他类型的资源引用。好了大功告成。。。文章来源地址https://www.toymoban.com/news/detail-632526.html

到了这里,关于Unity项目中查找所有使用某一张图片的材质球,再查找所有使用材质球的预设的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity 批量选择图片并转换为材质

    用Selection.GetFiltered来表示选择到的物体 第一个参数表示仅检索此类型的对象。 第二个参数 SelectionMode.Assets 表示仅返回 Asset 目录中的资源对象。 先检查当前路径下是否有此名称的材质存在,若存在则不生成新的材质。 创建一个材质实例。 将材质创建为Asset资源。

    2024年02月13日
    浏览(65)
  • Unity切割图片:把一张图片中的物体裁成多个单独的游戏物体

    首先选中需要切割的图片素材,将Inspector面板中的 Sprite Mode 由默认的 Single改为Multiple ; 然后点击 Sprite Editor ; 第一步之后便会弹出下例面板,然后 点击Slice菜单 ,继续点击,便 会自动被分割好 ,最后 点击右上角的Apply 。 点击Apply后在右下角会弹出一个小的面板,你可以

    2024年02月05日
    浏览(40)
  • 【Unity】编辑器下查找指定文件下的所有特定资源

            需求上很简单,就是在编辑器下,找到某个制定文件下的所有特定资源(UnityEngine.Object)。Unity 没有提供专门的 API,我一开始想在网上搜索代码,发现没有现成可以直接用的。         功能实现本身并不复杂,代码也比较直观:         其实就是借用 System.IO 的代

    2024年02月11日
    浏览(41)
  • 【Unity】编辑器下查找制定文件下的所有特定资源

            需求上很简单,就是在编辑器下,找到某个制定文件下的所有特定资源(UnityEngine.Object)。Unity 没有提供专门的 API,我一开始想在网上搜索代码,发现没有现成可以直接用的。         功能实现本身并不复杂,代码也比较直观:         其实就是借用 System.IO 的代

    2024年02月12日
    浏览(42)
  • roop 一张图片就能生成换脸视频的开源项目

    roop的github地址:https://github.com/s0md3v/roop 记住到 2023-6-18 这天 一定要是python3的10版本,11版本会有包不兼容,我就这个问题耗费了一天。 我使用的是:python3.10.9 python 下载地址:https://www.python.org/downloads/ 下载之后无脑安装但有一点,全局变量PATH一定要勾选 下载地址:https://

    2024年02月11日
    浏览(36)
  • 爬虫项目(五):抓取网页所有图片

    推荐本人书籍《Python网络爬虫入门到实战》 ,详细介绍见👉: 《Python网络爬虫入门到实战》 书籍介绍 原理:抓取该链接中所有的图片格式。基于selenium来获取,自动下载到output文件夹中。

    2024年02月07日
    浏览(55)
  • 使用Python中的matplotlib将多个图片显示到一张图内

    在我们写论文或是汇报时,经常需要整合所得到的可视化数据结果,插入我们的论文中。如下所示的情况,我们需要将四个相关的弹性模量预测结果在一张图里展示。 使用matplotlib库中的子图(subplot)功能可以轻松而高效地实现这一过程,避免繁琐地手动调节。 具体代码如下,

    2024年02月06日
    浏览(53)
  • unity中的基本材质使用

      在unity中我们可以使用unity本身自带的材质来改变物体的颜色,和我们使用法线和高度,光源遮罩来完善我们的物体的质感和其他各种的功能 在unity中我们如何创建一个材质,首先我们在资源管理界面右键鼠标,点击第一个创建,再找到Material点击如何我们的文件中就出现了一

    2023年04月08日
    浏览(34)
  • 使用TortoiseGit拉取GitLab代码仓库中某一项目的某一分支的代码

    你安装好git+TortoiseGit后,你的右键变为: 说明你安装成功!!! 步骤一:打开GitLab网站,先通过 Clone 下拉框,在其中选择HTTP网址,进行copy【假设这个是:http://test123.git】 还有一点要注意: 这里有一些分支【在例子中是3个】,每个分支由扮演不同角色的人进行维护 步骤二

    2024年03月22日
    浏览(54)
  • SadTalker AI模型使用一张图片与一段音频便可以自动生成视频

    SadTalker模型是一个使用图片与音频文件自动合成人物说话动画的开源模型,我们自己给模型一张图片以及一段音频文件,模型会根据音频文件把传递的图片进行人脸的相应动作,比如张嘴,眨眼,移动头部等动作。 SadTalker,它从音频中生成 3DMM 的 3D 运动系数(头部姿势、表

    2024年02月17日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包