Unity去除项目中Default-Material

项目中的预制件或者模型文件,去除不必要的依赖Default-Material。

一、什么是Default-Material

Default-Material是Unity内置的材质,并且依赖Standard Shader。

如果一个物体依赖了这个材质,在场景中是会显示成紫色方块,并且在打包的时候编译shader非常耗时,并且会造成大量的冗余。

所有这完全是一个没要必要引用的东西,可以使用工具检查项目,并且达到一键去除的功能。

二、查找项目中的Default-Material

在这里首先要感谢Unity 查找unity内置资源的工具这篇博文博主提供的查找代码。

引用到项目后,做了进一步的精简,需要的是查找引用了Default-Material的资源。

整体思路:

0.使用编辑器常用接口,去查找文件,并且列举出来。常用接口可以查看我的这边文章Unity总结整理编辑器常用接口

1.搜索项目资源目录中的.prefab和.fbx文件,预制件和模型文件

2.判断文件上的Renderer是否有引用了Default-Material的材质,用名字匹配即可

3.按照预制件、模型文件,分别用不同的方式去除文件。

三、去除预制件上的Default-Material

找到预制件上的renderer,检查是否引用了Default-Material,重新赋值一个空的材质,然后保存这个资源。

这里需要注意的是不能直接render.sharedMaterials = null,或者mats [i] = null。

void RemoveDefaultMaterial(string path)
{
    GameObject obj = AssetDatabase.LoadAssetAtPath<GameObject>(path);
    Renderer[] renders = obj.GetComponentsInChildren<Renderer>();
    if (renders == null) return;
    string materialName = "Default-Material";
    foreach (var render in renders)
    {
        Material[] mats = render.sharedMaterials;
        for (int i = 0; i < mats.Length; i++)
        {
            if (null != mats[i] && mats[i].name == materialName)
            {
                render.sharedMaterials = new Material[render.sharedMaterials.Length];
            }
        }
    }
    AssetDatabase.SaveAssets();
    AssetDatabase.Refresh();
}

四、去除模型上的Default-Material

把模型的Import Material去掉勾选,然后再去除Default-Material。

与美术约定,模型只需要网格即可,导入模型做成预制件,然后在预制件中依赖对应的shader即可。

用工具检查到有问题的模型后,使用AssetDatabase.ImportAsset重新导入这个资源,然后在导入处理代码中统一处理。

这样在下次导入其他模型时,也会使用去除代码。

注意:importMaterials=false这个会修改meta文件,受版本控制。而render.sharedMaterials = new Material[render.sharedMaterials.Length]不受版本控制,所以如果检查到有问题,需要在打包机上执行。

public class RemoveDefaultMaterial : AssetPostprocessor
{
    void OnPreprocessModel()
    {
        ModelImporter modelImporter = assetImporter as ModelImporter;
        modelImporter.importMaterials = false;
    }

    void OnPostprocessModel(GameObject model)
    {
        Renderer[] renders = model.GetComponentsInChildren<Renderer>();
        if (renders == null) return;
        foreach (Renderer render in renders)
        {
            render.sharedMaterials = new Material[render.sharedMaterials.Length];
        }
    }
}

 

Unity,代码是用来实现游戏逻辑和功能的关键部分。Unity支持使用C#或UnityScript(一种基于JavaScript的脚本语言)编写代码。 在Unity,代码通常被组织在脚本文件,这些脚本文件可以附加到游戏对象上。当游戏运行时,这些脚本将被执行,并且可以通过调用函数、访问变量等方式来实现游戏的各种功能。 以下是一些常见的Unity代码概念和功能: 1. MonoBehaviour:MonoBehaviour是Unity所有脚本的基类,它提供了一些常用的函数,如Start()、Update()等。通过继承MonoBehaviour类,可以创建自定义的脚本,并将其附加到游戏对象上。 2. GameObject:GameObject是Unity的基本对象,它代表了游戏场景的一个实体。可以通过代码创建、修改和销毁游戏对象,以及访问其属性和组件。 3. 组件(Component):组件是附加到游戏对象上的模块化功能单元。例如,Transform组件用于控制游戏对象的位置、旋转和缩放;Rigidbody组件用于模拟物理行为;MeshRenderer组件用于渲染3D模型等。可以通过代码访问和操作组件。 4. 事件(Event):Unity的事件系统允许在特定条件下触发代码。例如,当玩家点击按钮时,可以触发一个OnClick事件,然后执行相应的代码逻辑。 5. 协程(Coroutine):协程是一种特殊的函数,可以在一段时间内暂停和恢复执行。协程常用于处理复杂的异步操作,如延迟执行、动画序列等。 6. 资源管理:Unity提供了资源管理系统,可以加载、实例化和销毁各种资源,如模型、纹理、声音等。通过代码可以访问和操作这些资源。 关于Unity代码的更多详细信息和示例,请参考Unity官方文档和教程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漫步云巅Kim

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值