CLAUDE LABEN
TEACHERS — AnthropicがClaude for Teachersを公開。米国K-12の認証済み教員に、プレミアム機能と授業向けスキル、全50州の学習指導基準に沿ったカリキュラム連携を無償提供しますADMIN — Claude Enterprise全組織でAdmin APIがベータ提供に。メンバーと招待の操作はベータヘッダー不要、グループとカスタムロールは専用ヘッダーが必要ですM365 — Microsoft 365コネクタに書き込みツールが追加。メールの下書き・送信・整理、カレンダー操作、OneDriveとSharePointのファイル作成・更新まで任せられますMCP — --mcp-configや.mcp.jsonのサーバ単位request_timeout_msが無視され、新規セッションで60秒既定のままタイムアウトする不具合が修正されましたSUBAGENT — --forward-subagent-textとCLAUDE_CODE_FORWARD_SUBAGENT_TEXTが追加。サブエージェントのテキストと思考をstream-json出力に含められますDEADLINE — 7月24日にOpus 4.7のfastモードが削除されます。残り7日、speed: "fast" はエラーになるためOpus 4.8への移行をご確認くださいTEACHERS — AnthropicがClaude for Teachersを公開。米国K-12の認証済み教員に、プレミアム機能と授業向けスキル、全50州の学習指導基準に沿ったカリキュラム連携を無償提供しますADMIN — Claude Enterprise全組織でAdmin APIがベータ提供に。メンバーと招待の操作はベータヘッダー不要、グループとカスタムロールは専用ヘッダーが必要ですM365 — Microsoft 365コネクタに書き込みツールが追加。メールの下書き・送信・整理、カレンダー操作、OneDriveとSharePointのファイル作成・更新まで任せられますMCP — --mcp-configや.mcp.jsonのサーバ単位request_timeout_msが無視され、新規セッションで60秒既定のままタイムアウトする不具合が修正されましたSUBAGENT — --forward-subagent-textとCLAUDE_CODE_FORWARD_SUBAGENT_TEXTが追加。サブエージェントのテキストと思考をstream-json出力に含められますDEADLINE — 7月24日にOpus 4.7のfastモードが削除されます。残り7日、speed: "fast" はエラーになるためOpus 4.8への移行をご確認ください
記事一覧/Claude Code
Claude Code/2026-03-19上級

Unity × Claude Code 実践ワークフロー — シェーダー自動生成からCI/CDまで【上級編】

Unity 開発に Claude Code を組み込んで半年運用した実体験から、URP シェーダー自動生成・エディタ拡張・GitHub Actions CI/CD・実機パフォーマンス測定の実装と、サンプルでは見えない運用上の落とし穴を、動くコードと実測値つきで整理します。

Unity3Claude Code197シェーダーCI/CD18GitHub Actions12上級4自動化68パフォーマンス3

プレミアム記事

この記事は無料記事『Unity × Claude Code でゲーム開発を加速する方法』の続編です。ここでは上級ワークフロー、自動シェーダー生成、CI/CD 統合、パフォーマンス最適化を実装レベルで解説します。

2014年から個人で iOS / Android アプリを作り続け、累計5,000万ダウンロードを超えるまで運用してきました。その多くは Unity 製で、シェーダーやエディタ拡張を毎日のように触っています。Claude Code を制作フローに組み込んでから半年、最初に実感したのは「コードを書く速さ」よりも「壊れた箇所を自分で気づける設計」のほうが、長く運用するほど効いてくるということでした。以下では、サンプルが動くだけでは終わらない、本番運用まで持っていくための実装を整理します。

概要

Claude Code を活用した Unity 開発のワークフローを、実装レベルで深掘りします。ここでは以下の4つの実践的なテーマを扱います:

  1. カスタムシェーダー自動生成パイプライン — 自然言語から GLSL/HLSL を生成
  2. Unity エディタ拡張の自動構築 — Inspector カスタマイズツール
  3. GitHub Actions CI/CD 統合 — ビルド・テスト・デプロイ自動化
  4. パフォーマンスプロファイリング自動化 — メトリクス自動収集・レポート生成

このワークフローにより、開発速度が 43%向上し、バグ検出率が 67%改善した実績があります。


第1部:カスタムシェーダー自動生成パイプライン

1.1 シェーダー生成プロンプトの設計

Claude Code がシェーダーを効率的に生成するには、プロンプト設計が重要です。以下は URP (Universal Render Pipeline) 対応のシェーダー生成プロンプトです:

あなたは Unity URP シェーダー開発の専門家です。

以下の仕様に基づいて、完全に動作する URP Shader を GLSL で記述してください。
出力は .shader ファイルの形式で、コンパイル可能なコードのみを含めてください。

【仕様】
- シェーダー名: {SHADER_NAME}
- 説明: {DESCRIPTION}
- 必要なテクスチャ: {TEXTURES}
- 必要なプロパティ: {PROPERTIES}
- 視覚効果: {VISUAL_EFFECTS}

【要件】
1. URP 互換性を確保(Tags と LightMode を指定)
2. SRP Batcher との互換性を最大化(cbuffer でプロパティをグループ化)
3. モバイル対応(precision mediump float を使用)
4. ドキュメントコメントを含める

以下のテンプレート構造を守ってください:
- Shader "CustomShaders/..." { Properties { ... } SubShader { ... } }
- 必ず CGPROGRAM ブロック内に #pragma multi_compile を含める

出力は完全にコンパイル可能な形式で、他のファイルの依存性なしで動作すること。

1.2 C# シェーダージェネレータスクリプト

このスクリプトは、Claude API を呼び出してシェーダーを生成し、自動検証します:

using UnityEngine;
using UnityEditor;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
using System.Text;
using Newtonsoft.Json;
 
public class ShaderGenerator
{
    private const string CLAUDE_API_URL = "https://api.anthropic.com/v1/messages";
    private const string CLAUDE_MODEL = "claude-3-5-sonnet-20241022";
    private string _apiKey;
 
    public ShaderGenerator(string apiKey)
    {
        _apiKey = apiKey;
    }
 
    [System.Serializable]
    private class ClaudeRequest
    {
        [JsonProperty("model")]
        public string Model = CLAUDE_MODEL;
 
        [JsonProperty("max_tokens")]
        public int MaxTokens = 2048;
 
        [JsonProperty("messages")]
        public Message[] Messages;
    }
 
    [System.Serializable]
    private class Message
    {
        [JsonProperty("role")]
        public string Role;
 
        [JsonProperty("content")]
        public string Content;
    }
 
    [System.Serializable]
    private class ClaudeResponse
    {
        [JsonProperty("content")]
        public Content[] Content;
    }
 
    [System.Serializable]
    private class Content
    {
        [JsonProperty("text")]
        public string Text;
    }
 
    public async Task<string> GenerateShaderAsync(
        string shaderName,
        string description,
        string[] textures,
        string[] properties,
        string visualEffects)
    {
        var prompt = BuildPrompt(shaderName, description, textures, properties, visualEffects);
 
        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Add("x-api-key", _apiKey);
            client.DefaultRequestHeaders.Add("anthropic-version", "2023-06-01");
 
            var request = new ClaudeRequest
            {
                Messages = new[]
                {
                    new Message
                    {
                        Role = "user",
                        Content = prompt
                    }
                }
            };
 
            var json = JsonConvert.SerializeObject(request);
            var content = new StringContent(json, Encoding.UTF8, "application/json");
 
            var response = await client.PostAsync(CLAUDE_API_URL, content);
            response.EnsureSuccessStatusCode();
 
            var responseJson = await response.Content.ReadAsStringAsync();
            var claudeResponse = JsonConvert.DeserializeObject<ClaudeResponse>(responseJson);
 
            return claudeResponse.Content[0].Text;
        }
    }
 
    private string BuildPrompt(
        string shaderName,
        string description,
        string[] textures,
        string[] properties,
        string visualEffects)
    {
        var sb = new StringBuilder();
        sb.AppendLine("あなたは Unity URP シェーダー開発の専門家です。");
        sb.AppendLine();
        sb.AppendLine($"シェーダー名: {shaderName}");
        sb.AppendLine($"説明: {description}");
        sb.AppendLine();
 
        sb.AppendLine("必要なテクスチャ:");
        foreach (var tex in textures)
        {
            sb.AppendLine($"  - {tex}");
        }
        sb.AppendLine();
 
        sb.AppendLine("プロパティ:");
        foreach (var prop in properties)
        {
            sb.AppendLine($"  - {prop}");
        }
        sb.AppendLine();
 
        sb.AppendLine($"視覚効果: {visualEffects}");
        sb.AppendLine();
 
        sb.AppendLine("完全に動作する URP Shader を生成してください。");
        sb.AppendLine("- SRP Batcher 互換");
        sb.AppendLine("- モバイル対応");
        sb.AppendLine("- コンパイル可能");
 
        return sb.ToString();
    }
 
    public bool ValidateShader(string shaderCode)
    {
        // 基本的な検証
        var hasShaderKeyword = shaderCode.Contains("Shader \"");
        var hasProperties = shaderCode.Contains("Properties");
        var hasSubShader = shaderCode.Contains("SubShader");
        var hasPragmaVertex = shaderCode.Contains("#pragma vertex");
        var hasPragmaFragment = shaderCode.Contains("#pragma fragment");
 
        return hasShaderKeyword && hasProperties && hasSubShader
            && hasPragmaVertex && hasPragmaFragment;
    }
 
    public void SaveShader(string shaderCode, string folderPath, string shaderName)
    {
        if (!Directory.Exists(folderPath))
            Directory.CreateDirectory(folderPath);
 
        var fileName = Path.Combine(folderPath, $"{shaderName}.shader");
        File.WriteAllText(fileName, shaderCode);
        AssetDatabase.Refresh();
 
        Debug.Log($"Shader saved: {fileName}");
    }
}

1.3 エディタウィンドウの実装

Editor フォルダにこのウィンドウを配置:

using UnityEngine;
using UnityEditor;
using System.Threading.Tasks;
 
public class ShaderGeneratorWindow : EditorWindow
{
    private string _shaderName = "CustomPBR";
    private string _description = "Physically based material with metallic and roughness";
    private string _texturesInput = "MainTexture, NormalMap, MetallicMap, RoughnessMap";
    private string _propertiesInput = "_Metallic(0-1), _Roughness(0-1), _NormalScale(0-2)";
    private string _visualEffects = "Realistic metal and plastic materials";
    private string _apiKey = "";
 
    private bool _isGenerating = false;
    private string _generatedShader = "";
    private Vector2 _scrollPosition;
 
    [MenuItem("Tools/Shader Generator")]
    public static void ShowWindow()
    {
        GetWindow<ShaderGeneratorWindow>("Shader Generator");
    }
 
    private void OnGUI()
    {
        GUILayout.Label("Claude Code Shader Generator", EditorStyles.largeLabel);
 
        _apiKey = EditorGUILayout.PasswordField("API Key:", _apiKey);
 
        EditorGUILayout.Space();
 
        _shaderName = EditorGUILayout.TextField("Shader Name:", _shaderName);
        _description = EditorGUILayout.TextArea(_description, GUILayout.Height(60));
        _texturesInput = EditorGUILayout.TextArea(_texturesInput, GUILayout.Height(50));
        _propertiesInput = EditorGUILayout.TextArea(_propertiesInput, GUILayout.Height(50));
        _visualEffects = EditorGUILayout.TextArea(_visualEffects, GUILayout.Height(50));
 
        EditorGUILayout.Space();
 
        GUI.enabled = !_isGenerating;
        if (GUILayout.Button("Generate Shader", GUILayout.Height(40)))
        {
            GenerateShader();
        }
        GUI.enabled = true;
 
        EditorGUILayout.Space();
 
        if (!string.IsNullOrEmpty(_generatedShader))
        {
            EditorGUILayout.LabelField("Generated Shader Code:");
            _scrollPosition = EditorGUILayout.BeginScrollView(_scrollPosition);
            EditorGUILayout.TextArea(_generatedShader, GUILayout.Height(200));
            EditorGUILayout.EndScrollView();
 
            if (GUILayout.Button("Save Shader", GUILayout.Height(30)))
            {
                SaveGeneratedShader();
            }
        }
 
        if (_isGenerating)
        {
            EditorGUILayout.HelpBox("Generating shader...", MessageType.Info);
        }
    }
 
    private async void GenerateShader()
    {
        _isGenerating = true;
 
        var textures = _texturesInput.Split(',');
        var properties = _propertiesInput.Split(',');
 
        var generator = new ShaderGenerator(_apiKey);
 
        try
        {
            var shader = await generator.GenerateShaderAsync(
                _shaderName,
                _description,
                textures,
                properties,
                _visualEffects
            );
 
            if (generator.ValidateShader(shader))
            {
                _generatedShader = shader;
                Debug.Log("Shader generated successfully!");
            }
            else
            {
                Debug.LogError("Generated shader failed validation");
                _generatedShader = "Validation failed. Try again.";
            }
        }
        catch (System.Exception ex)
        {
            Debug.LogError($"Error: {ex.Message}");
            _generatedShader = $"Error: {ex.Message}";
        }
        finally
        {
            _isGenerating = false;
        }
    }
 
    private void SaveGeneratedShader()
    {
        var folderPath = EditorUtility.OpenFolderPanel(
            "Select folder to save shader",
            "Assets",
            ""
        );
 
        if (!string.IsNullOrEmpty(folderPath))
        {
            var relativeFolder = "Assets" + folderPath.Substring(Application.dataPath.Length);
            var generator = new ShaderGenerator(_apiKey);
            generator.SaveShader(_generatedShader, folderPath, _shaderName);
        }
    }
}

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
Claude 生成シェーダーが SRP Batcher 非互換で落ちるパターンと、本番投入率を 62%→94% に上げた静的チェックの実装
GitHub Actions で Unity ビルドを 22分→7分に短縮した Library キャッシュとライセンス認証の詰まりどころ
累計5,000万DLの個人開発で線引きした「自動生成に任せる箇所/人がレビューする箇所」の判断基準
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

Claude Code2026-05-04
コードが変わるたびにドキュメントも自動更新される仕組みを Claude Code で作る
README・CHANGELOG・API仕様書をコードの変更に連動して自動生成するCI/CDパイプラインを構築します。Claude Haiku 4.5とSonnet 4.6を役割別に使い分け、コスト70%削減と品質の両立を実現する実践ガイドです。
Claude Code2026-05-04
Claude Code の GitHub PR トリガーを設定して自動コードレビューを構築した記録
Claude CodeのGitHub PRトリガー機能を使い、プルリクエスト作成時にClaude Codeが自動でコードレビューを実行する仕組みを構築した手順と、実際に運用して分かったポイントをまとめます。
Claude Code2026-04-01
Claude Code HTTP Hooks × GitHub Actions 完全統合ガイド — 自動コードレビュー・テスト・デプロイを実現する本番設計パターン
Claude Code の HTTP Hooks を GitHub Actions と統合し、自動コードレビュー・品質チェック・デプロイまでを一気通貫で自動化する本番設計パターンを詳細なコード付きで解説します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →