本日はUnity枠です。
今回はエディタ拡張を使用してUnityのプロジェクトウィンドウを右クリックすることで表示できるメニューから直接hlslファイルを作成する機能を作成します。
〇HLSLファイルを生成する
ShaderをUnityで生成するにあたってhlslファイルはよく使用します。
Unityではプロジェクトウィンドウで右クリックを行ことでShaderやC#など様々なファイルを作成できますが、hlslファイルはサポートされていません。

これまではエクスプローラー等でディレクトリを開き新規でテキストファイルなどを作成し、拡張子を.hlslに変更することで無理やり作成していました。
今回は以下のコードを作成しました。
using UnityEngine;
using UnityEditor;
using System.IO;
public class CreateHLSLFile
{
[MenuItem("Assets/Create/Shader/HLSL File", false, 100)]
public static void CreateNewHLSLFile()
{
var selectedAsset = Selection.activeObject;
string selectedPath = AssetDatabase.GetAssetPath(selectedAsset);
if (selectedAsset == null || string.IsNullOrEmpty(selectedPath))
{
selectedPath = "Assets";
}
string fullPath = Path.Combine(selectedPath, "NewHLSL.hlsl");
fullPath = AssetDatabase.GenerateUniqueAssetPath(fullPath);
File.WriteAllText(fullPath, string.Empty);
AssetDatabase.Refresh();
}
}
こちらをUnityプロジェクト内でEditorフォルダの中に作成します。
こちらはエディタ拡張でコマンドを追加しています。
public class CreateHLSLFile
{
[MenuItem("Assets/Create/Shader/HLSL File", false, 100)]
public static void CreateNewHLSLFile(){}
[MenuItem("Assets/○○")]というように記述することでプロジェクトウィンドウを右クリックした際に表示されるコマンドとして登録できます。
これによってShaderを作成する階層にhlslファイルを作成できるようにしました。

public static void CreateNewHLSLFile()
{
//現在プロジェクトウィンドウで開いているパスを取得
var selectedAsset = Selection.activeObject;
string selectedPath = AssetDatabase.GetAssetPath(selectedAsset);
//もし選択していない場合はAssets直下に作成
if (selectedAsset == null || string.IsNullOrEmpty(selectedPath))
{
selectedPath = "Assets";
}
//現在プロジェクトウィンドウで開いているパスにNewHLSL.hlslという名前を付けファイルを作成
string fullPath = Path.Combine(selectedPath, "NewHLSL.hlsl");
fullPath = AssetDatabase.GenerateUniqueAssetPath(fullPath);
//ファイルが存在しない場合作成
File.WriteAllText(fullPath, string.Empty);
AssetDatabase.Refresh();
}
これによってコマンドを実行するとhlslファイルが作成されます。

以上でhlslファイルの作成するコマンドができました。
本日は以上です。