一个新的模型导入Unity,所有的材质都是绑定的不能修改,想调材质就只能一个个的去创建再拖贴图,想搞个工具一键创建材质并且上好贴图。百度了一下,这玩意靠谱的也是没几个,自己写一个吧。
这个稍微靠谱点,但是直接用好像有点问题:https://blog.csdn.net/qq_28299311/article/details/105943627
用法很简单,选中一个FBX直接右键-一键生成材质球:
点击后会在同目录下面创建一个Materials文件夹,所有材质的命名、绑定关系会沿用原来的,shader是默认shader
代码记得放到Editor文件夹下面:
using System.IO;
using UnityEngine;
using UnityEditor;
// 一键从FBX导出材质和设置shader
public class ExtractMaterials : EditorWindow
{
[MenuItem("Assets/一键生成材质球", false, 1)]
static void CreateMaterialsFromFBX()
{
UnityEngine.Object[] gameObjects = Selection.objects;
string[] strs = Selection.assetGUIDs;
if (gameObjects.Length > 0)
{
if (gameObjects.Length > 1)
{
Debug.LogError("不支持多选,请选择一个fbx!");
}
else
{
string assetPath = AssetDatabase.GUIDToAssetPath(strs[0]);
string materialFolder = Path.GetDirectoryName(assetPath) + "/Materials";
// 如果不存在该文件夹则创建一个新的
if (!AssetDatabase.IsValidFolder(materialFolder))
{
AssetDatabase.CreateFolder(Path.GetDirectoryName(assetPath), "Materials");
}
// 获取 assetPath 下所有资源。
Object[] assets = AssetDatabase.LoadAllAssetsAtPath(assetPath);
bool isCreate = false;
foreach (Object item in assets)
{
if (typeof(Material) == item?.GetType())
{
Debug.Log("xxxxxxxxx=====" + item);
string path = System.IO.Path.Combine(materialFolder, item.name) + ".mat";
// 为资源创建一个新的唯一路径。
path = AssetDatabase.GenerateUniqueAssetPath(path);
// 通过在导入资源(例如,FBX 文件)中提取外部资源,在对象(例如,材质)中创建此资源。
string value = AssetDatabase.ExtractAsset(item, path);
// 成功提取( 如果 Unity 已成功提取资源,则返回一个空字符串)
if (string.IsNullOrEmpty(value))
{
AssetDatabase.WriteImportSettingsIfDirty(assetPath);
AssetDatabase.ImportAsset(assetPath, ImportAssetOptions.ForceUpdate);
isCreate = true;
}
}
}
AssetDatabase.Refresh();
if (isCreate)
Debug.Log("自动创建材质球成功:" + materialFolder);
else
Debug.Log("自动创建材质球失败!");
}
}
else
{
Debug.LogError("请选中需要一键生成材质球的模型");
}
}
}