概要
ProjectViewで選択したフォルダ内にあるマテリアルとテクスチャを取得し、マテリアル名に特定の文字がある場合、特定の文字を含むテクスチャをマテリアルのマッププロパティにアサインする。
目的
沢山のモデルをインポートした時、いちいち複数あるマテリアルにテクスチャをアサインするのが面倒だったので、命名規則に則ってアサインするスクリプトを作った。
環境
Unity 2018.3.14f1
仕様
- 3Dモデルをインポートした時のマテリアルについて行う
- マテリアルは1体に複数ある
- テクスチャはマテリアル生成後、同階層にインポートする
- シェーダーはインポーターで自動設定される
##内容
MatAssign.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class MatAssign : MonoBehaviour
{
[MenuItem("Tools/MatAssign")]
static void MaterialAssign()
{
List<Material> mlist = new List<Material>();
List<Texture2D> tlist = new List<Texture2D>();
//選択したフォルダの取得
Object[] selectedAsset = Selection.GetFiltered (typeof(Object), SelectionMode.Assets);
foreach (var sel in selectedAsset) {
Debug.Log (sel.name + " : " + sel.GetType ());
//選択したものがフォルダなら、フォルダ内にあるマテリアルとテクスチャを検索してリストに追加
if ((sel.GetType ().ToString () == "UnityEditor.DefaultAsset")){
var folder = (DefaultAsset)sel;
var dirpath = AssetDatabase.GetAssetPath(folder);
string[] diraug = {dirpath};
//マテリアルに対する処理
var mfiles = AssetDatabase.FindAssets("t:Material",diraug);
foreach(var mf in mfiles){
var mfpath = AssetDatabase.GUIDToAssetPath(mf);
var mfasset = AssetDatabase.LoadAllAssetsAtPath(mfpath);
foreach(var mfa in mfasset){
mlist.Add((Material)mfa);
}
}
//テクスチャに対する処理
var tfiles = AssetDatabase.FindAssets("t:Texture2D",diraug);
foreach(var tf in tfiles){
var tfpath = AssetDatabase.GUIDToAssetPath(tf);
var tfasset = AssetDatabase.LoadAllAssetsAtPath(tfpath);
foreach(var tfa in tfasset){
tlist.Add((Texture2D)tfa);
Debug.Log(tfa);
}
}
}
}
//マテリアルリストをfor文で回して名前の種類によって処理を分ける
foreach (var mat in mlist)
{
if(mat.name.Contains("_body_"))
{
foreach (var tex in tlist)
{
if(tex.name.Contains("_body")){
mat.SetTexture("_BaseMap",tex);
mat.SetTexture("_ShadeMap",tex);
}
}
}
else if(mat.name.Contains("_face_"))
{
foreach (var tex in tlist)
{
if(tex.name.Contains("_face")){
mat.SetTexture("_BaseMap",tex);
mat.SetTexture("_ShadeMap",tex);
mat.SetColor("_ShadeColor",Color.white);
}
}
}
else if(mat.name.Contains("_head_"))
{
foreach (var tex in tlist)
{
if(tex.name.Contains("_head")){
mat.SetTexture("_BaseMap",tex);
}
}
}
else
{
continue;
}
}
}
}
##雑感
仕事用にはもうちょっと色々書いてたけど、公開用に一部適当に改変してます。
後半部分、もっとスマートに書けそうだけどまあいいやと思いつく順に書いてしまった。