返回「计算机、信息技术与工程」
本地删除FBX的DefaultMaterial在unity重启后无效
本文目录 3 个章节
本地删除FBX的DefaultMaterial在unity重启后无效
note · 我的 UWA 问答 本文收录我在 UWA 问答发表的公开回答。问题内容归原提问者;回答保留当时语境,技术结论可能受 Unity 版本、平台和项目条件限制。
问题
用了addressables系统,打包ab有default material有冗余
在打包机上运行脚本把fbx的默认材质删除后变紫,但是重新打开工程后默认材质又回来了,导致冗余还在
版本2018.4.34
删除材质的脚本:
using System;
using UnityEngine;
using System.Collections;
using System.IO;
using UnityEditor;
using Object = UnityEngine.Object;
class DisableMaterialImport : AssetPostprocessor {
[MenuItem("Tools/Reimport All Model")]
public static void ReimportAllModel()
{
var assetPaths = AssetDatabase.GetAllAssetPaths();
Array.Sort(assetPaths);
Debug.LogWarning(string.Format("Total assets count: {0}", assetPaths.Length));
int processedCount = 0;
foreach (string assetPath in assetPaths)
{
string normalizedAssetPath = assetPath.ToLower();
if (!normalizedAssetPath.EndsWith(".fbx") &&
!normalizedAssetPath.EndsWith(".obj") &&
!normalizedAssetPath.EndsWith(".3ds"))
{
continue;
}
var modelImporter = AssetImporter.GetAtPath(assetPath) as ModelImporter;
if (modelImporter == null || modelImporter.importMaterials)
{
continue;
}
AssetDatabase.ImportAsset(assetPath, ImportAssetOptions.ImportRecursive | ImportAssetOptions.ForceUpdate);
Debug.Log(assetPath, AssetDatabase.LoadMainAssetAtPath(assetPath));
processedCount++;
}
Debug.LogWarning(string.Format("Total processed model count: {0}", processedCount));
AssetDatabase.SaveAssets();
}
private static void FixedModelImport(ModelImporter modelImporter, GameObject model)
{
//Debug.Log("FixedModelImport "+model);
var renderers = model.GetComponentsInChildren<Renderer>(true);
if (renderers == null)
{
return;
}
modelImporter.importMaterials = false;
modelImporter.importBlendShapes = false;
modelImporter.importAnimation = false;
modelImporter.isReadable = false;
modelImporter.optimizeMesh = true;
foreach (var renderer in renderers)
{
if (renderer == null)
{
continue;
}
renderer.sharedMaterials = new Material[renderer.sharedMaterials.Length];
}
/* var animator = model.GetComponent<Animator>();
if(animator!=null) Object.DestroyImmediate(animator);*/
}
private static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets,
string[] movedFromAssetPaths)
{
foreach (var path in importedAssets)
{
//Debug.Log("OnPostprocessAllAssets "+path+" "+path.EndsWith(".FBX"));
if (path.EndsWith(".FBX")) //大写的FBX不会进OnPostprocessModel函数
{
GameObject model = AssetDatabase.LoadAssetAtPath<GameObject>(path);
ModelImporter import = AssetImporter.GetAtPath(path) as ModelImporter;
FixedModelImport(import, model);
}
}
}
void OnPostprocessModel(GameObject model)
{
var modelImporter = assetImporter as ModelImporter;
if (modelImporter == null)
{
return;
}
FixedModelImport(modelImporter, model);
}
}
- 提问者:唐
- 提问时间:2021-05-11 02:08:56
我的回答
我这边试验过,不会变回来啊,会不会是把工程回滚了。另外这个脚本的ReimportAllModel只对本身就没有勾选Import Materials的模型有效。
- 回答时间:2021-05-11 05:49:23
- 最后更新:2021-05-11 05:50:10
- 采纳状态:未采纳
来源与关系
- 上位集合:我的 UWA 问答
- UWA 标签:内存管理
- 原始问题:本地删除FBX的DefaultMaterial在unity重启后无效
- 源页最后更新:2021-05-11 17:17:21