3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Unity]MaterialにTextureを自動でアサインする

Last updated at Posted at 2019-06-01

概要

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;
            }
        }
    }
}

##雑感
仕事用にはもうちょっと色々書いてたけど、公開用に一部適当に改変してます。
後半部分、もっとスマートに書けそうだけどまあいいやと思いつく順に書いてしまった。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?