Unity教程之-自定义拓展Editor导入Unity3d资源自动生成材质Material

 

在Unity3d项目中,有时候导入一些资源时候,需要对应创建材质球,如果每次自己动手创建,还是挺麻烦的,下面是如何导入资源时候自动创建材质球。废话不说贴上Editor脚本代码


using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using System.IO;

public class BuildMaterial : UnityEditor.AssetModificationProcessor
{

//生成出的Material的路径
private static string MaterialsPath = "Assets/Resources/Skin/";

// 创建菜单按钮,手工调用创建材质
[MenuItem ("HETools/BuildMaterials")]
static void CreateMateral ()
{
Object[] selectObject = Selection.objects;

List<string> path = new List<string> ();
foreach (Object obj in selectObject) {
path.Add (AssetDatabase.GetAssetPath (obj));
}

foreach (string p in path) {
CreateOneMateral (p);
}
System.GC.Collect ();
}

// 监控assets资源添加,发现指定目录ThemeTile有新增加的texture,就自动生成材质
public static void OnWillCreateAsset (string path)
{
int index = path.LastIndexOf (".");
string file = path.Substring (index);
string[] pathArr = path.Split ('/');
if (pathArr [pathArr.Length - 3] != "ThemeTile")
return;

CreateOneMateral (path);
System.GC.Collect ();
}

// 创建材质球
static void CreateOneMateral (string p)
{
p = p.Replace (".meta", "");
Debug.Log ("CreateOneMateral from path: " + p);

int pos = p.LastIndexOf ('/');
if (pos == -1)
return;

string[] strArr = p.Split ('/');

string themeIDStr = strArr [strArr.Length - 2];

Texture textur = (Texture)AssetDatabase.LoadAssetAtPath (p, typeof(Texture)) as Texture;

string name = strArr [strArr.Length - 1];

int y = name.IndexOf ('.');
name = name.Substring (0, y);
Material mater = new Material (Shader.Find ("Mobile/VertexLit"));
mater.mainTexture = textur;

AssetDatabase.CreateAsset (mater, MaterialsPath + themeIDStr + "/" + name + ".mat");
}
}

Editor导入 
注意,上面代码中我是规定了只有指定的目录添加texture才会自动生成材质,所以使用时候,请自行修改下。

这里发现了个问题: 
导入贴图时候,自动创建出来的材质球丢失了纹理图,而采用菜单按钮点击创建出来的正常。问题还没有解决,有哪位朋友知道解决办法可以告诉我下,好了,本篇unity3d教程到此结束,下篇我们再会!