【Zendesk x Unity】ゲーム内AIチャットボットでプレイヤー情報やエラーログをサポートチケットに自動送信してみた

【Zendesk x Unity】ゲーム内AIチャットボットでプレイヤー情報やエラーログをサポートチケットに自動送信してみた

2025.12.20

こんにちは、ゲームソリューション部の入井です。
本ブログはClassmethod SaaSで加速するゲーム開発 Advent Calendar 2025の20日目のブログとなります。
https://dev.classmethod.jp/referencecat/gamesol-businesssol-advent-calendar-2025/

今回は、Unityで開発したゲーム内にZendeskのAIエージェント(チャットボット)を組み込み、プレイヤーからの問い合わせ対応を効率化する方法を紹介します。

本記事では、以下の3点を検証します。

  1. Unity内でZendeskのAIエージェント(チャットボット)を動作させる
  2. ナレッジベースに基づいた自動回答を行う
  3. 有人対応へのエスカレーション時に、ゲーム内パラメータ(プレイヤーレベル、所持ジェム、エラーログなど)をZendeskチケットに自動送信する

特に3点目の「ゲーム内パラメータの自動送信」は、サポート担当者がプレイヤーの状況を簡単に把握できるようになり、便利な機能だと思います。

関連記事

本記事は以下の記事の内容を前提としています。

https://dev.classmethod.jp/articles/unity-zendesk-sdk-email-to-userprofile/
https://dev.classmethod.jp/articles/zendesk-ai-agent-game-chatbot/

システム構成

スクリーンショット 2025-12-11 140038

検証環境条件

  • Unity: 6.2
  • Zendesk SDK for Unity: 4.2.0

Zendesk側の設定

1. Unityメッセージングチャネルの作成

Zendesk管理センターで、Unity用のメッセージングチャネルを作成します。

具体的な手順はこちらの記事を参考にしてください。

チャネル作成後に表示されるチャネルIDは、Unity側の実装で使用するので控えておいてください。

2. 専用のフォームの作成

Unityからゲーム内パラメータを受け取り、Zendeskのチケットに保管するために専用のフォームを作成します。

今回は、以下の4つのカスタムチケットフィールドを作成します。何らかのトラブルが発生した際、プレイヤーのゲーム進行状況や、直近クライアントで発生したエラーログ情報をオペレーターに自動共有することを想定しています。

パラメータ 説明 Zendeskフィールドタイプ
プレイヤー名 ゲーム内のプレイヤー名 テキスト
レベル プレイヤーの現在レベル 数値
所持ジェム ゲーム内通貨の所持数 数値
直近のエラーログ ゲーム内で発生したエラー情報 複数行テキスト

管理センターの「オブジェクトとルール」→「チケット」→「フィールド」から、以下のように作成します。

スクリーンショット 2025-12-11 141731

続いて、「オブジェクトとルール」→「チケット」→「フォーム」をクリックし、「チケットフォームを追加」ボタンから以下のようにフォームを作成します。先ほど作成したカスタムフィールドも紐づけるようにします。

スクリーンショット 2025-12-11 142104

3. AIエージェントの設定

AIエージェントの基本設定については、こちらの記事を参考にしてください。

1.で設定したメッセージングチャネルの応答役として、ここで作成したAIエージェントが紐づいていればOKです。

4. エスカレーションの設定

作成したAIエージェントの設定画面を開き、「メッセージングの動作」タブ内の「エスカレーション」をクリックし、「チケットを作成する」が有効になっていることを確認します。

これにより、AIエージェントの自動回答で問題が解決せずユーザーが有人対応を希望した際に、チケットが作成されて有人対応にエスカレーションされるようになります。

スクリーンショット 2025-12-15 100533

Unity側の実装

1. 最初の準備

こちらの記事を参考にプロジェクト作成・SDK導入・初期化スクリプトの実装を行ってください。
同じコード・設定をベースに拡張していく形でこの先の検証を進めていきます。

2. エスカレーションとパラメータ送信の実装

既存のコードを拡張し、有人対応にエスカレーションした際にZendeskチケットにプレイヤーデータ(名前、レベル、所持ジェム、直近エラーログ)が自動送信されるようにします。

まず、Unityのエラーログの収集とテスト用エラー出力を担当するクラスを作成します。

using UnityEngine;
using System;
using System.Collections.Generic;
using System.Text;

public class ErrorLogCollector : MonoBehaviour
{
    private List<string> errorLogs = new List<string>();

    private void Awake()
    {
        Application.logMessageReceived += OnLogMessageReceived;
    }

    private void OnDestroy()
    {
        Application.logMessageReceived -= OnLogMessageReceived;
    }

    // エラーログを収集するコールバック
    private void OnLogMessageReceived(string condition, string stackTrace, LogType type)
    {
        if (type == LogType.Error || type == LogType.Exception)
        {
            string errorEntry = $"[{DateTime.Now:HH:mm:ss}] {type}: {condition}";
            errorLogs.Add(errorEntry);
        }
    }

    // 収集したエラーログを文字列として取得
    public string GetRecentErrorLogs()
    {
        if (errorLogs.Count == 0)
        {
            return "エラーレコードがありません。";
        }

        StringBuilder sb = new StringBuilder();
        foreach (string log in errorLogs)
        {
            sb.AppendLine(log);
        }
        return sb.ToString();
    }

    // テスト用エラーを出力
    public void GenerateTestError()
    {
        Debug.LogError("テストエラー: プレイヤーのインベントリデータ取得に失敗しました。");
    }
}

Unityの標準機能を使い、実際にダミーのエラーログを出力したうえでそれを取得するようにしています。

続いて、エスカレーション時にZendeskチケットへプレイヤーデータを送信する処理を実装します。Zendesk SDK for Unityでは、以下のメソッドでMessaging Metadata機能を使用して、メッセージング(チャット)会話にカスタムデータを付与できます。

await ZendeskSdk.Instance.Messaging.SetConversationFieldsAsync(fields);

具体的な使用方法としては、メソッドの引数にZendeskのカスタムチケットフィールドに対応するキーと値のペアを設定します。設定されたデータは、会話がエスカレーションされてチケットが作成される際に、自動的にチケットのカスタムフィールドに反映されます。

詳細は以下のドキュメントをご参照ください。

https://developer.zendesk.com/documentation/zendesk-web-widget-sdks/sdks/unity/messaging-metadata/#setting-conversation-fields

https://support.zendesk.com/hc/ja/articles/5658339908378

既存のZendeskBootstrapクラスを拡張して、以下の機能を実装します。

  • ErrorLogCollectorを参照し、エラーログを取得
  • ゲームデータとエラーログをSetConversationFieldsAsync()でZendeskチケットに反映
using System.Collections.Generic;
using UnityEngine;
using Zendesk.Runtime.Localisation;
using Zendesk.Runtime.SDK;

public class ZendeskBootstrap : MonoBehaviour
{
    [SerializeField] private string channelId;
    [SerializeField]
    private ErrorLogCollector errorLogCollector;

    // ゲームデータ
    [Header("Player Data")]
    [SerializeField] private string playerName = "TestPlayer";
    [SerializeField] private int playerLevel = 1;
    [SerializeField] private int playerGems = 100;

    // Zendeskカスタムフィールドのフィールドコードを指定
    [Header("Zendesk Custom Field")]
    [SerializeField] private string playerNameFieldId;
    [SerializeField] private string playerLevelFieldId;
    [SerializeField] private string playerGemsFieldId;
    [SerializeField] private string errorLogFieldId;

    async void Start()
    {
        // SDK を初期化します
        await ZendeskSdk.InitializeAsync(cfg =>
        {
            cfg.ChannelId = channelId;
            cfg.Language = ZendeskLanguage.Japanese;
        });

        errorLogCollector.GenerateTestError();
        await SetGameDataToConversationFields();

        await ZendeskSdk.Instance.Messaging.ShowMessagingAsync();
    }

    // メッセージング(チャット)会話のConversation Fieldsにカスタムデータを付与
    private async System.Threading.Tasks.Task SetGameDataToConversationFields()
    {

        var fields = new Dictionary<string, object>
        {
            { playerNameFieldId, playerName },
            { playerLevelFieldId, playerLevel },
            { playerGemsFieldId, playerGems },
            { errorLogFieldId, errorLogCollector.GetRecentErrorLogs()}
        };

        try
        {
            await ZendeskSdk.Instance.Messaging.SetConversationFieldsAsync(fields);
            Debug.Log("ゲームデータをConversation Fieldsに設定しました");
        }
        catch (System.Exception e)
        {
            Debug.LogError($"Conversation Fieldsの設定に失敗しました: {e.Message}");
        }
    }

}

SetConversationFieldsAsync()に渡すフィールドIDは、ZendeskのカスタムフィールドのIDを使用します。管理センターの「オブジェクトとルール」→「チケット」→「フィールド」から、作成したカスタムフィールドのIDを確認してください。

スクリーンショット 2025-12-11 141731

動作確認

1. AIエージェントによる回答生成

ゲーム実行後、Zendeskのメッセージング画面が表示されるため、「新しい会話」をクリックして会話を開始します。
チャットボットが起動するので、ゲームについての質問を送ってみます。

スクリーンショット 2025-12-11 174945

画像のように、ナレッジベースに登録されたFAQ記事の内容に基づいて、AIエージェントが自動で回答を生成します。

2. エスカレーションの実行

先ほどの回答の後に表示されたチャットボットからの「お役に立ちましたか?」という質問に「いいえ」と回答し、有人対応へのエスカレーションを発生させます。名前を聞かれるので回答しますが、それ以外のプレイヤーレベルなどの情報はこちらから回答していません。

スクリーンショット 2025-12-15 124737

この時点でエスカレーションが実行され、Zendeskには新しいチケットが作成されています。

3. チケットでのパラメータ確認

エージェントとしZendeskにログインし、ワークスペース上で作成されたチケットを確認します。

先ほどのやりとりがチケットの中でコメントとして記録されています。

スクリーンショット 2025-12-15 125312

サイドバーのカスタムフィールドを見ると、プレイヤー名、レベル、所持ジェム、エラーログといったゲーム内パラメータが保存されていることが確認できます。

スクリーンショット 2025-12-15 125342

このように、Zendesk SDK for Unityの機能を上手く活用することで、ユーザーの手を煩わすことなく、サポートに必要な情報をゲームクライアントから自動的に取得することができます。

まとめ

今回の記事では、Zendesk SDK for Unityを使用して、ゲーム内でAIエージェントによるサポート対応を実装し、エスカレーション時にゲーム内パラメータをチケットに自動送信する方法を紹介しました。

このような仕組みをゲーム内に取り入れることで、カスタマーサポート業務にかかる工数を削減し、サポート品質向上に繋げることが可能となります。

この記事をシェアする

FacebookHatena blogX

関連記事