Creating Custom Shaders.ja - toydev/HC_VRTrial GitHub Wiki

カスタムシェーダーの作成

前提

準備

.NET プロジェクトにシェーダーソースおよびアセットバンドル(≒ビルド済みシェーダーの集合体)を置いてリポジトリ管理します。 そのために以下をします。

  • .NET プロジェクトに AssetBundles ディレクトリを作る。
  • AssetBundles に以下の .gitignore を置いて不要な二次生成物をリポジトリ管理対象外に設定する。
AssetBundles
*.manifest
*.meta
  • Unity プロジェクトを作る。
    • Editor Version: 2021.3.14f1
    • Template: 3D

Unity プロジェクトは一時的な作業領域としてのみ使用し、リポジトリ管理対象外とします。 バージョンをゲーム本体と合わせることは重要です。 バージョンが異なると互換性の問題で作ったシェーダーの読み込みに失敗してしまう可能性が高いです。

コマンドプロンプトを管理者権限で開き、以下のコマンドで .NET プロジェクトの AssetBundles ディレクトリを Unity プロジェクトの Asset/AssetBundles ディレクトリにリンクして紐づけます。

mklink /D UnityプロジェクトのAsset/AssetBundlesディレクトリ .NETプロジェクトのAssetBundlesディレクトリ

シェーダーとアセットバンドルの作成

  • AssetBundles ディレクトリを選択し、メニューの「Create」→「Shader」からシェーダーを作成する。
  • シェーダーファイルを選択し、「Inspector」下部にある「AssetBundle」を選択する。
    • 初回は New で作成する。以降は作成済みのものを選択できる。
    • 入力欄が2つあるが先頭の1つ目だけで良い。必要であれば2つ目はアセットバンドルの細分化に使う。
  • プロジェクトの Assets ディレクトリに Editor ディレクトリを作成する。
  • Editor ディレクトリを選択し、メニューの「Create」→「C# Script」から C# スクリプトを作成する。
  • C# スクリプトの名前を「BuildAssetBundles」にし以下を記述する。
    • シェーダをビルドしアセットバンドルにまとめる操作を Unity のプルダウンメニューに追加するためのものである。
using UnityEditor;

public class BuildAssetBundles
{
    [MenuItem("Assets/Build AssetBundles")]
    static void BuildAllAssetBundles()
    {
        BuildPipeline.BuildAssetBundles("Assets/AssetBundles", BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
    }
}
  • メニューの「Asset」→「Build AssetBundles」でアセットバンドルをビルドする。

Asset/AssetBundles ディレクトリにアセットバンドルにつけた名前と同じファイルができていれば作成は成功です。

.NET プロジェクトへの組み込み

アセットバンドルファイルの「ビルドアクション」を「埋め込みリソース」に変更します。

以下のコードでシェーダーを読み込みます。

using System.IO;

using UnityEngine;

using HC_VRTrial.Logging;

namespace HC_VRTrial.VRUtils
{
    public class CustomAssetManager
    {
        private static AssetBundle Bundle { get; set; }
        public static AssetBundle GetBundle()
        {
            if (Bundle == null)
            {
                Bundle = AssetBundle.LoadFromMemory(ReadAllBytes($"{nameof(HC_VRTrial)}.AssetBundles.custom_asset_bundle"));
                foreach (var i in Bundle.GetAllAssetNames()) PluginLog.Debug($"Available custom_asset: {i}");
            }
            return Bundle;
        }

        public static Shader UiUnlitTransparentShader { get => GetBundle().LoadAsset("assets/assetbundles/ui-unlit-transparent.shader").Cast<Shader>(); }

        private static byte[] ReadAllBytes(string resourceName)
        {
            var assembly = typeof(CustomAssetManager).Assembly;
            using (var stream = assembly.GetManifestResourceStream(resourceName))
            using (var memoryStream = new MemoryStream())
            {
                stream.CopyTo(memoryStream);
                return memoryStream.ToArray();
            }
        }
    }
}

補足

Unity のビルトインシェーダーは以下のページの各 OS のプルダウンの「Built in shaders」からダウンロードできます。

先ほどのシェーダー読み込みサンプルに出てきた「assets/assetbundles/ui-unlit-transparent.shader」は「UI-Unlit-Transparent.shader」ビルドインシェーダーです。

ゲーム本体に含まれていなかったのでカスタムシェーダーとして取り込んだ例です。

⚠️ **GitHub.com Fallback** ⚠️