夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Unityプロジェクトウィンドウを拡張して直接GprahicsToolsStandardシェーダー適応済みのマテリアルを作成する

本日はMRGT調査枠です。

筆者は基本的にGraphicsToolsStandardShaderのマテリアルを愛用しています。

しかしUnityではマテリアルを作成する際にBuiltInパイプラインではStandard、URPではURP/Litシェーダーのマテリアルがデフォルトで作成されます。

毎回マテリアルを作成しシェーダーをGraphicsToolsStandardに更新することが手間だったので今回はプロジェクトウィンドウを拡張して直接GraphicsToolsStandardシェーダーのマテリアルを作成する機能を実装していきます。

〇プロジェクトウィンドウの拡張

 プロジェクトウィンドウを右クリックした際のコマンドの拡張は先日の記事で紹介しました。

redhologerbera.hatenablog.com

次のようなコードをEditorフォルダ内に作成することで任意のコマンドを追加することができます。

using UnityEngine;
using UnityEditor;

public class TestCommand : MonoBehaviour
{
    [MenuItem("Assets/Create/TestCommand")]
    public static void TestProjectWindowRightClickCommand()
    {

    }
}

今回はこれをベースに実際にマテリアルを作成するコマンドを実装します。

〇マテリアルの作成

今回は次の状態をもとに実装を行っていきます。

using UnityEngine;
using UnityEditor;
using System.IO;
/// <summary>
/// Create MRGTShaderMaterial
/// </summary>
public class CreateMRGTMaterial : MonoBehaviour
{
     [MenuItem("Assets/Create/Material(MRGT))]
    private static void CreateMaterial()
    {
    }
}

この状態ではCreateの一番下にコマンドが追加されます。

①CreateMaterialメソッド内に作成するマテリアルとパスを定義します。

  var directory = AssetDatabase.GetAssetPath(Selection.activeObject);
        Material material = new Material(Shader.Find("Graphics Tools/Standard"));

AssetsDatabase.GetAssetsPath()は引数ないのアセットが格納されている相対パスを返します。

Selection.activeObjectは現在選択されているプロジェクトフォルダを意味しておりdirectoryは現在開いているプロジェクトのパスが返されます。

 またMaterial(Shader.Find("Graphics Tools/Standard"))によって作成されるマテリアルのシェーダーをGraphicsTools/Standardシェーダーに切り替えています。

 

docs.unity3d.com

②directoryが正常に取得されていない場合の処理を記述します。

  var directory = AssetDatabase.GetAssetPath(Selection.activeObject);
        Material material = new Material(Shader.Find("Graphics Tools/Standard"));
        if (string.IsNullOrEmpty(directory))
        {
            directory = "Assets";
        }

ここではAssetsフォルダに設定しました。

③作成されるファイルの名前を記述します。

var path = directory + "/" + "NewMRGTMaterial.mat";
var uniquePath = AssetDatabase.GenerateUniqueAssetPath(path);

今回はdirectortに.matという拡張子のマテリアルを作成するためにpathとしてNewMRGTMaterialを定義しています。

この部分が作成されるマテリアルの名前になります。

AssetDatabase.GenerateUniqueAssetPath()はすでにアセットが存在する場合に同名のファイルが作成されないように末尾に1を追加する処理を行ってくれています。

docs.unity3d.com

④アセットの作成を記述

AssetDatabase.CreateAsset(material, uniquePath);
AssetDatabase.SaveAssets();
Selection.activeObject = material;

AssetDatabase.CreateAsset(アセット,パス)はアセットをパスに作成するメソッドです。

作製を行ったファイルをAssetDatabase.SaveAssets()によって保存しています。

最後にSelection.activeObject は作成されたオブジェクトをピックアップ表示するために使用されています。

この一行によってマテリアルが作成された際にそのマテリアルが選択されている状態となっています。

当然ですがここで作成されるマテリアルはGraphicsTools/Standardシェーダーとなっています。

以上でUnityプロジェクトウィンドウを拡張して直接GprahicsToolsStandardシェーダー適応済みのマテリアルを作成することができました。

〇コード全文

using UnityEngine;
using UnityEditor;
using System.IO;


/// <summary>
/// Create MRGTShaderMaterial
/// </summary>
public class CreateMRGTMaterial : MonoBehaviour
{
    [MenuItem("Assets/Create/Material(MRGT)")]
    private static void CreateMaterial()
    {
        var directory = AssetDatabase.GetAssetPath(Selection.activeObject);
        Material material = new Material(Shader.Find("Graphics Tools/Standard"));
        if (string.IsNullOrEmpty(directory))
        {
            directory = "Assets";
        }
        
var path = directory + "/" + "NewMRGTMaterial.mat";
var uniquePath = AssetDatabase.GenerateUniqueAssetPath(path);
AssetDatabase.CreateAsset(material, uniquePath);
AssetDatabase.SaveAssets();
Selection.activeObject = material;

    }
}