【Unity】Unity Shader Graph入門:プログラミング不要でシェーダーを自在に操る

作成: 2026-02-05最終更新: 2026-07-13

UnityのShader Graphを使ってプログラミング不要でシェーダーを作成する方法を解説。ノードベースのビジュアルエディタで直感的にマテリアルをカスタマイズできます。

「水面をゆらゆら揺らしたい」「敵が被弾したら白く光らせたい」——やりたい表現は明確なのに、調べると出てくるのはHLSLの呪文のようなコード。シェーダーはやりたいことと学習コストのギャップが一番大きい分野かもしれません。

そのギャップを埋めるのが Shader Graph——Unity公式のノードベースビジュアルシェーダーエディタです。ノードを線でつなぐだけで、発光するマテリアルや波打つ水面、ホログラムのようなエフェクトまで、コードを1行も書かずに作れます。

Shader Graphのイメージ。ノードのボックスをケーブルでつなぐと、プレビューの球体のマテリアルが変化していく

この記事でわかること

  • Shader Graphの構成要素(Master Stack・Blackboard・プロパティ)
  • 作成から適用までの基本操作と、テクスチャ・スクロールの実例
  • スクリプトからの変更とMaterialPropertyBlockの使いどころ
  • Sub Graph・Keyword・Custom Functionによる発展
  • 実践:被弾で白く点滅するシェーダーを組む

Sponsored

従来のシェーダーとの違い

従来のシェーダーの課題

  • プログラミングの知識が必須
  • デバッグが難しい
  • 試行錯誤に時間がかかる
  • 非エンジニアには敷居が高い

Shader Graphの利点

  • プログラミング不要 - ノードを接続するだけ
  • ビジュアルで分かりやすい - 処理の流れが視覚的に理解できる
  • リアルタイムプレビュー - 変更結果を即座に確認
  • 再利用性が高い - Sub Graphで共通パーツを作成
  • URPとHDRPに対応 - Built-in RPはバージョンにより対応状況が異なる

Built-in RP対応状況:

UnityバージョンBuilt-in RP対応状況
2021.1以前非対応
2021.2以降(Shader Graph 12〜)Built-Inターゲット で Lit / Unlit とも対応

Built-Inターゲットでは、URP/HDRP向けに先行して追加される一部ノード・設定が使えない制限があります。挙動が違うと感じたら、公式ドキュメントで対象ターゲットの対応状況を確認してください(本記事の検証はUnity 6 / 6000.0時点)。

Shader Graphの構成要素

要素説明
Shader Graphアセットシェーダーの設定を保存するファイル
Blackboardプロパティとキーワードのリスト
Master Stackシェーダーへの最終的な出力
ノードシェーダーの処理単位
プロパティシェーダーの外部パラメータ
Sub Graph再利用可能なパーツ

Shader Graphアセットの種類

種類用途
Unlit Shader Graphライトの影響を受けない(UI、エフェクト向け)
Lit Shader Graphライトの影響を受ける(PBRマテリアル向け)

Master Stackの構造

Master Stackは2つのステージで構成されています:

Master Stackの構造図。Vertexステージは頂点を動かす担当、Fragmentステージは色を決める担当。ノードをつないだ結果がここに集まってシェーダーの出力になる
ステージ処理内容主な用途
Vertex頂点シェーダー処理頂点アニメーション、位置変形
Fragmentフラグメントシェーダー処理色、テクスチャ、ライティング

Position端子: Vertexステージの Position 端子に接続することで、頂点の位置を変形できます(波打つ水面、風になびく草など)。

Lit Shader GraphのPBRパラメータ

パラメータ説明
Base Color基本色
Normal法線マップ(凹凸表現)
Metallic金属度(0=非金属、1=金属)
Smoothness滑らかさ(0=ザラザラ、1=ツルツル)
Emission発光色
Ambient Occlusion環境遮蔽(影の濃さ)
Alpha透明度(Transparent設定時に使用)

透明・半透明マテリアルの設定

ガラスや半透明のマテリアルを作成するには:

  1. Shader Graphを選択し、Graph Inspector を開く
  2. Surface TypeTransparentに変更
  3. Master Stackの Alpha 端子に透明度を接続(0=完全透明、1=不透明)

Graph Inspectorの主要設定一覧:

設定選択肢用途
Surface TypeOpaque / Transparent不透明 / 透明
Render FaceFront / Back / Both描画面
Alpha ClippingOn / Offテクスチャ切り抜き
Two SidedOn / Off両面描画
Cast ShadowsOn / Off影の投影

Alpha Clipping: 葉や草など、テクスチャで切り抜きたい場合は Alpha Clipping を有効にし、Alpha Clip Threshold を設定します。

Sponsored

Shader Graphの作成と基本操作

Shader Graphアセットの作成

  1. Projectウィンドウで右クリック
  2. Create > Shader Graph > URP > Unlit Shader Graphを選択
  3. アセットをダブルクリックしてエディタを開く

ノードの作成と接続

  1. 作業スペースで右クリック → Create Node
  2. 検索フィールドでノードを検索
  3. ノードの出力ポートからMaster Stackの入力ポートへドラッグ

マテリアルの作成と適用

  1. Shader Graphアセットを右クリック → Create > Material
  2. 作成されたマテリアルをオブジェクトにドラッグ&ドロップ

プロパティを使った動的なシェーダー

プロパティの追加

  1. Blackboardの+ボタンをクリック
  2. プロパティの種類を選択(Color、Float、Texture2Dなど)
  3. プロパティをShader Graphウィンドウにドラッグ&ドロップ

スクリプトから色を変更

// 方法1: material直接変更(マテリアルインスタンスが生成される)
renderer.material.SetColor("_Main_Color", Color.red);

// 方法2: MaterialPropertyBlock(バッチング維持、推奨)
var mpb = new MaterialPropertyBlock();
renderer.GetPropertyBlock(mpb);
mpb.SetColor("_Main_Color", Color.red);
renderer.SetPropertyBlock(mpb);

SRP BatcherとMaterialPropertyBlockの関係(SRP Batcherの仕組みは ドローコールとバッチング を参照):

  • SRP Batcher有効環境ではMaterialPropertyBlockを使用するとSRP Batcherのバッチが切れます
  • 少数のオブジェクト → MaterialPropertyBlockで問題なし
  • 大量のオブジェクト → material instanceの方がSRP Batcherの恩恵を受けられる場合がある
  • 用途に応じて使い分けてください

重要: Reference名について スクリプトからプロパティにアクセスする際は、Blackboardで設定した Reference名 を使用します。Blackboardでプロパティを選択し、Graph Inspectorで Reference フィールドを確認してください。デフォルトでは_プロパティ名の形式になります(例:Main Color_Main_Color、スペースはアンダースコアに変換)。Reference名はGraph Inspectorで自由に変更可能です。

テクスチャを使ったシェーダー

  1. Texture2Dプロパティを追加
  2. Sample Texture 2Dノードを追加
  3. プロパティをTexture入力に接続
  4. RGBA出力をBase Colorに接続
Sponsored

スクロールするテクスチャ

「動くシェーダー」の入門はこれです。川の流れ、ベルトコンベア、背景の雲——Timeノードで取得した時間をUVのオフセットに流し込むと、テクスチャが延々と流れ続けます。

スクロールするテクスチャのノード構成。TimeノードをMultiplyでスピード調整し、Tiling and OffsetのOffsetに接続、その出力をSample Texture 2DのUVへつなぐとテクスチャが流れ続ける
  1. Timeノード を追加(時間を取得)
  2. Vector2ノード を追加(X方向のみに時間を適用)
  3. Tiling and Offsetノード を追加
  4. Vector2の出力をOffset入力に接続
  5. Sample Texture 2DのUV入力に接続

スピード調整にはMultiplyノードを使用します。

よく使うノード

Input Nodes

ノード説明
Time時間を取得(アニメーション用)
UVメッシュのUV座標を取得
Position頂点の位置を取得

Texture Nodes

ノード説明
Sample Texture 2Dテクスチャをサンプリング
Tiling and OffsetUV座標にタイリングとオフセットを適用

Math Nodes

ノード説明
Add, Subtract, Multiply, Divide基本的な算術演算
Lerp線形補間
Clamp値を範囲内に制限

Procedural Nodes

ノード説明
Noiseノイズを生成
Checkerboardチェッカーボードパターンを生成
Gradientグラデーションを生成
Fresnel Effect視線角度に応じた効果(リムライト、ホログラム)

Fresnel EffectのPower値:

  • 値が小さい(1〜2)→ 効果が広い範囲に及ぶ(全体的に光る)
  • 値が大きい(5〜10)→ 効果がエッジのみに集中(シャープなリムライト)
Fresnel Effectのリムライト比較。Power値が小さい球は表面全体がふんわり光り、Power値が大きい球は輪郭(エッジ)だけがシャープに光る。ホログラムやリムライト表現の基礎

Sub Graphの作成

Sub Graphは、複数のノードをまとめて再利用可能なパーツにする機能です。

作成手順

  1. Projectウィンドウで右クリック → Create > Shader Graph > Sub Graph
  2. Sub Graphエディタで入力(Input)と出力(Output)を定義
  3. 処理ノードを接続
  4. 保存して、他のShader Graphで使用

活用例

  • ノイズ生成の共通処理
  • UV操作のパターン
  • 色変換の共通ロジック

具体例:UV回転Sub Graph

入出力名前
入力UVVector2
入力AngleFloat
出力RotatedUVVector2

処理: RotateノードでUVをAngle度回転させ、RotatedUVとして出力。テクスチャの回転アニメーションなどに再利用できます。

高度な機能

Keyword(条件分岐)

シェーダー内で#ifdef相当の条件分岐を実現します。

  1. Blackboardで+Keyword を選択
  2. Boolean/Enum/Built-inから種類を選択
  3. Keywordをグラフにドラッグすると Keywordノード が自動生成される
  4. Keywordノードの各出力に異なる処理を接続

最適化: Keywordを使うと、条件に応じて異なるシェーダーバリアントがコンパイルされ、不要な処理を省けます。

Custom Function Node

HLSLコードを直接記述できるノードです。Shader Graphでは実現できない処理を追加する際に使用します。

  1. 右クリック → Create NodeCustom Function を検索
  2. ファイルまたはインラインでHLSLコードを記述
  3. 入力/出力を定義して接続

次のステップ: HLSLの知識がある方は、Custom Function Nodeで高度な表現に挑戦してみてください。

よくある問題と解決策

症状原因と対処
ピンク色になるシェーダーのコンパイルエラー。Graph Inspectorでエラーを確認
マテリアルが真っ黒Base Colorに何も接続されていない、またはNormal Mapの形式が未設定
透明にならないSurface TypeがOpaqueのまま
Normal Mapが紫色にならないテクスチャのImport SettingsでTexture Typeを「Normal map」に設定する

シェーダーバリアント: Keywordを増やすとシェーダーバリアント数が指数的に増加します(n個のBooleanキーワードで最大2^n個)。モバイル向けではGraphics Settingsで不要なバリアントを除外することを推奨します。

実践:被弾フラッシュシェーダーを組む

アクションゲームで敵を斬ったとき、シューティングでボスに弾が当たったとき、RPGで攻撃がヒットしたとき——敵が一瞬白く光るあの定番演出は、Shader Graphの格好の練習台です。「プロパティを作る→ノードでつなぐ→スクリプトから動かす」という、この記事で学んだ流れがすべて登場します。

仕組みは1本のLerpだけです。通常の色と真っ白を、FlashAmount(0〜1)で混ぜる——0なら通常表示、1なら真っ白、スクリプトでこの値を一瞬だけ上げれば「点滅」になります。

被弾フラッシュシェーダーのノード構成。Sample Texture 2Dの出力と白色を、FlashAmountプロパティを係数にしてLerpノードで混ぜ、Base Colorへ出力する

グラフの組み立て(3ステップ):

  1. Blackboardでプロパティを2つ追加: MainTex(Texture2D)とFlashAmount(Float、Reference名_FlashAmount、既定値0)
  2. Sample Texture 2Dでテクスチャを読み、LerpノードのAに接続。BにはColorノード(白)を接続
  3. FlashAmountをLerpのTに接続し、出力をMaster StackのBase Colorへ

あとはスクリプトから_FlashAmountを動かすだけです。ここで本文で紹介したMaterialPropertyBlockが活きます。

// DamageFlash.cs(敵にアタッチ)
using System.Collections;
using UnityEngine;

public class DamageFlash : MonoBehaviour
{
    [SerializeField] private float flashDuration = 0.1f;

    private Renderer rend;
    private MaterialPropertyBlock mpb;
    private static readonly int FlashAmount = Shader.PropertyToID("_FlashAmount");

    void Awake()
    {
        rend = GetComponent<Renderer>();
        mpb = new MaterialPropertyBlock();
    }

    // ダメージ処理から呼ぶ
    public void Flash()
    {
        StopAllCoroutines();
        StartCoroutine(FlashRoutine());
    }

    private IEnumerator FlashRoutine()
    {
        SetFlash(1f); // 真っ白に
        yield return new WaitForSeconds(flashDuration);
        SetFlash(0f); // 元に戻す
    }

    private void SetFlash(float amount)
    {
        rend.GetPropertyBlock(mpb);
        mpb.SetFloat(FlashAmount, amount);
        rend.SetPropertyBlock(mpb);
    }
}

敵のダメージ処理でdamageFlash.Flash()と呼べば完成です。MaterialPropertyBlockを使っているので、敵が100体いてもマテリアルは1つのまま——個体ごとに別々のタイミングで点滅できます。

ポイントは2つです。 「見た目の切り替えはLerp+0〜1のプロパティで作る」(白フラッシュに限らず、凍結・毒・ステルスなど大半の状態表現がこの形になります)と、 「スクリプトから触る値はReference名で正確に」_FlashAmountのスペルミスはエラーにならず、ただ無言で効かないので要注意)。コルーチンの仕組み が曖昧な方はそちらもどうぞ。

まとめ

Shader Graphは、プログラミング不要でシェーダーを作成できる強力なツールです。

  • ノードベース - ノードを接続するだけで複雑なシェーダーを作成
  • リアルタイムプレビュー - 変更結果を即座に確認
  • プロパティ - マテリアルから値を調整、スクリプトからも変更可能
  • Sub Graph - 共通パーツを再利用
  • 状態表現の基本形は Lerp+0〜1のプロパティ。被弾フラッシュはその第一歩

まずは簡単な色の変更やテクスチャの表示から始めて、徐々にアニメーションやエフェクトに挑戦してみてください。あなたのゲームの敵、被弾したときにちゃんと「痛そう」に見えていますか?

次に読む記事