> For the complete documentation index, see [llms.txt](https://docs.convai.com/api-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.convai.com/api-docs/zh/cha-jian-yu-ji-cheng/convai-unity-sdk/troubleshooting/debug-tools-reference.md).

# 调试工具参考

Convai SDK 调试工具参考，包括 Troubleshooter、按模块分开的编辑器窗口、日志记录和客户端延迟指标。

Convai Unity SDK 附带一套分层的诊断工具：Convai Troubleshooter、按模块划分的编辑器窗口、可配置的日志系统（带有按子系统控制详细程度的功能）、用于动作调试的实时 Inspector 探针、以及实时会话诊断 `ConvaiRoomManager`、会话指标输出到 Console，以及用于对话流水线分析的客户端延迟测量。本页是它们的完整参考。

### Convai 故障排除工具

`Convai → Troubleshooter` 报告是什么阻止了一个 `ConvaiCharacter` 正常工作，按模块逐一排查，并在每个发现旁边给出修复方法。在使用本页下方的工具之前，先从这里开始——大多数设置错误都会在 Troubleshooter 中显现，并附带一键修复，无需在 Console 中搜索。

{% content-ref url="/pages/683b1f80f2d09bf9f43b94fabdbf62b3dd4466aa" %}
[Convai Troubleshooter](/api-docs/zh/cha-jian-yu-ji-cheng/convai-unity-sdk/troubleshooting/convai-troubleshooter.md)
{% endcontent-ref %}

### 按模块的编辑器窗口

每个实体模块和 Actions 都有自己的编辑与诊断窗口，可从 `Convai` 菜单：

| 窗口          | 菜单路径                             | 显示内容                                                                      |
| ----------- | -------------------------------- | ------------------------------------------------------------------------- |
| Actions 编辑器 | `Convai → Actions Editor`        | 编辑、测试以及一个 **实时** 选项卡——正在进行的批次、最近批次的时间线（每个步骤的持续时间和结果）、合并后的目标注册表，以及按动作划分的见解 |
| 实体编辑器       | `Convai → Embodiment Editor`     | **设置**, **预设**，以及 **实时** 用于角色实体堆栈的选项卡                                     |
| 凝视编辑器       | `Convai → Gaze Editor`           | Gaze 模块的设置与调优                                                             |
| 身体动画编辑器     | `Convai → Body Animation Editor` | 身体动画模块的设置与调优                                                              |
| 情绪编辑器       | `Convai → Emotion Editor`        | 设置、角色面部的已解析表情映射，以及 Play 模式下的实时视图                                          |

### 诊断

日志配置位于 Diagnostics 部分，可从 `Convai → 设置` 以及从 `编辑 → 项目设置 → Convai SDK`.

#### 配置位置

打开 `Convai → 设置` 或 `编辑 → 项目设置 → Convai SDK` 并滚动到 **诊断** 部分。两个入口显示的是同一个 `DiagnosticsSectionView`，因此在一处所做的更改会同步显示到另一处。控制 Unity Console 中显示内容的设置有：

* **预设** ——一键按钮，可同时设置 Global Log Level、Include Stack Traces 和 Colored Console Output；参见 [日志预设](#logging-presets)
* **全局日志级别** ——适用于所有日志类别的最低详细程度
* **包含堆栈跟踪** ——Warning 和 Error 条目是否包含堆栈跟踪
* **彩色 Console 输出** ——日志条目是否在 Unity Console 中按颜色编码
* **类别覆盖** ——按子系统设置的覆盖项，优先于全局级别

Diagnostics 部分标题也有自己的 **重置** 按钮，其应用的配置与下方的 `默认` 预设相同。

#### 日志预设

在 Global Log Level 字段上方有三个预设按钮。每个预设会同时设置全局级别和两个输出标志，然后清除所有类别覆盖。

| 预设    | 全局日志级别  | 包含堆栈跟踪 | 彩色 Console 输出 | 类别覆盖 |
| ----- | ------- | ------ | ------------- | ---- |
| `详细`  | `跟踪`    | 开启     | 开启            | 已清除  |
| `默认`  | `信息`    | 开启     | 开启            | 已清除  |
| `仅错误` | `Error` | 开启     | 开启            | 已清除  |

`默认` 与 SDK 的默认日志配置一致。应用任何预设都会覆盖 Global Log Level、Include Stack Traces 和 Colored Console Output，并移除现有的 Category Overrides——点击预设后，请重新应用项目特定的覆盖项。

#### 日志级别

SDK 使用六个日志级别。数值越高，表示越详细。

| 级别        | 值 | Console 中显示的内容    |
| --------- | - | ----------------- |
| **关闭**    | 0 | 无内容——静默所有 SDK 日志  |
| **Error** | 1 | 仅错误               |
| **警告**    | 2 | 错误和警告             |
| **信息**    | 3 | 错误、警告和信息消息 *（默认）* |
| **调试**    | 4 | 以上全部，再加上 Debug 消息 |
| **跟踪**    | 5 | 全部内容，包括细粒度的内部跟踪   |

默认值为 **信息**。切换到 **调试** 在排查问题时会产生明显更多输出——在发布到生产环境前请将其禁用。将 **全局日志级别** 为 **关闭** 设置为可静默所有 SDK 日志。

{% hint style="warning" %}
`调试`SDK 源码中的调试级调用会使用 `[Conditional("UNITY_EDITOR")]`, `[Conditional("DEVELOPMENT_BUILD")]`，以及 `[Conditional("CONVAI_DEBUG_LOGGING")]`进行修饰。这意味着 **Debug 日志调用会从非开发构建中被编译移除** 除非你将 `CONVAI_DEBUG_LOGGING` 添加到你的脚本定义符号中。将 `GlobalLogLevel` 为 `调试` 在正式版构建中设为该值不会产生 Debug 消息，因为编译后的代码中并不存在这些调用点。Debug 消息在 Unity Editor 和 Development Builds 中无需任何额外定义即可保持启用。这也是为什么 `[SessionMetrics]` 带有 Debug 标签的行以及 `[ClientLatency]` 条目——本页下方会进一步介绍——只会出现在 Editor 和 Development Builds 中。
{% endhint %}

要在正式版构建中启用 Debug 消息，请添加 `CONVAI_DEBUG_LOGGING` 为 **Edit → Project Settings → Player → Scripting Define Symbols**.

#### 日志类别覆盖

类别覆盖允许你提高某个子系统的详细程度，而不会让来自其他子系统的输出淹没 Console。例如，要诊断传输问题，但不想看到音频、UI 和角色日志：

1. 打开 **诊断** 并展开 **类别覆盖** 折叠项——其中列出了每个日志类别，并带有一个下拉菜单，默认值为 `继承`
2. 将 `传输` 下拉菜单设为 `调试`

其他所有类别仍保持全局级别。折叠项标题会显示当前生效的覆盖数量，例如 **类别覆盖 (1)**。将某个类别的下拉菜单改回 `继承` 即可移除此覆盖。

#### 日志类别参考

| 类别           | 涵盖的子系统                          |
| ------------ | ------------------------------- |
| `SDK`        | SDK 的通用操作与初始化                   |
| `Character`  | 角色和 NPC 生命周期                    |
| `音频`         | 音频输出和麦克风输入                      |
| `UI`         | 转录 UI 和通知组件                     |
| `REST`       | 对 Convai 的 REST API 调用          |
| `传输`         | LiveKit 和 WebRTC 传输层            |
| `事件`         | 事件转发系统（会话、角色、转录事件）              |
| `Player`     | 玩家身份与输入                         |
| `Editor`     | 仅编辑器可用的工具和验证器                   |
| `视觉`         | 摄像头捕获和视频发布                      |
| `启动`         | SDK 初始化和 ConvaiSettings 加载      |
| `Transcript` | 转录处理与路由                         |
| `叙事`         | 叙事设计和故事触发系统                     |
| `唇形同步`       | 唇形同步处理和 blendshape 播放           |
| `动画`         | 身体动画系统（层、过渡、移动）                 |
| `凝视`         | 凝视系统（目标定位、策略、眼睛/头部/身体求解器）       |
| `身体语言`       | 身体语言系统（手势、姿态、呼吸、小动作）            |
| `动作`         | 动作系统：哪些命令已到达、哪些被丢弃以及原因，以及目标如何解析 |

#### 自定义日志接收器

通过实现以下接口，将 SDK 日志条目转发到自定义目标——文件、遥测服务或游戏内调试覆盖层—— `ILogSink` 并将其注册到 `ConvaiLogger`.

`ILogSink` 需要以下成员：

| 成员                              | 说明                          |
| ------------------------------- | --------------------------- |
| `string Name { get; }`          | 在诊断中显示的接收器标识符               |
| `bool IsEnabled { get; }`       | 返回 `false` 可在不注销接收器的情况下将其暂停 |
| `void SetEnabled(bool enabled)` | 在运行时切换接收器                   |
| `void Write(LogEntry entry)`    | 对每个通过级别筛选的日志条目调用            |
| `void Flush()`                  | 刷新所有缓冲条目——在应用关闭前调用          |
| `void Dispose()`                | 在移除接收器时清理资源                 |

{% code title="FileLogSink.cs" %}

```csharp
using System.IO;
using Convai.Domain.Logging;

public class FileLogSink : ILogSink
{
    private readonly string _path;
    private bool _enabled = true;

    public FileLogSink(string path) => _path = path;

    public string Name => "FileLogSink";
    public bool IsEnabled => _enabled;
    public void SetEnabled(bool enabled) => _enabled = enabled;

    public void Write(LogEntry entry)
    {
        string line = $"[{entry.Level}][{entry.Category}] {entry.Message}";
        File.AppendAllText(_path, line + "\n");
    }

    public void Flush() { }
    public void Dispose() { }
}
```

{% endcode %}

请尽早注册该接收器——在 `Awake()` 或一个 `[RuntimeInitializeOnLoadMethod]` 回调中——在任何 Convai 组件激活之前。 `ConvaiLogger` 首次使用时会自动初始化；在初始化后注册的接收器只能接收后续消息。

```csharp
// 在任何 Convai 组件激活前注册一次
private void Awake()
{
    ConvaiLogger.RegisterSink(new FileLogSink(Application.persistentDataPath + "/sdk.log"));
}
```

当接收器不再需要时将其移除：

```csharp
ConvaiLogger.UnregisterSink(mySink);
```

`ConvaiLogger.SinkCount` 返回当前已注册接收器的数量。默认的 Unity Console 接收器（`UnityConsoleSink`）始终处于注册状态，无法通过公共 API 移除。

### ConvaiActionDebugProbe

`ConvaiActionDebugProbe` 是 Actions 功能的主要诊断工具。它订阅每个分发器事件，并直接在 Inspector 中显示实时计数器和最近一次看到的动作数据——无需自定义日志。该组件的 Add Component 条目是 **Convai/Actions/Diagnostics/Convai 动作监视器**；其 Inspector 标题是 **动作监视器**.

**添加方式：** Add Component → **Convai/Actions/Diagnostics/Convai 动作监视器**

该组件需要 `ConvaiCharacter` 位于同一个 GameObject 上，并会自动解析 `ConvaiActionDispatcher`。如果 `ConvaiActionDispatcher` 不存在，探针仍会通过以下方式记录接收到的动作批次： `ConvaiCharacter.OnActionsReceived`，但分发器生命周期事件（步骤开始、成功、失败）将不会被跟踪。

#### Inspector 字段

| 字段              | 说明                                              |
| --------------- | ----------------------------------------------- |
| **记录到 Console** | 启用后，每个动作事件都会带有完整细节打印到 Console。在正式环境中禁用，以避免日志刷屏。 |
| **接收到的批次数**     | 自 Play 开始以来接收到的动作批次数总计                          |
| **已开始步骤数**      | 分发器已开始执行的步骤总数                                   |
| **成功步骤数**       | 以以下结果完成的步骤总数 `成功`                               |
| **失败步骤数**       | 返回以下结果的步骤总数 `Failed`, `超时`，或缺少定义或目标             |
| **未处理步骤数**      | 执行器返回以下结果的步骤总数 `未处理`                            |
| **中止的批次数**      | 提前停止的批次数（Stop Batch 失败策略）                       |
| **最近接收到的批次**    | 从 Convai 接收到的最近一次批次的 JSON                       |
| **最近开始的步骤**     | 最近开始的步骤详情                                       |
| **最近成功的步骤**     | 最近成功的步骤详情                                       |
| **最近未处理的步骤**    | 最近未处理的步骤详情                                      |

#### 上下文菜单操作

右键单击 `ConvaiActionDebugProbe` Inspector 中的组件标题，以访问：

| 项目         | 作用                                                                                                                                            |
| ---------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| **注入测试批次** | 发送一个 `移动到` 动作，目标指向第一个已注册对象——无需实时对话即可验证执行器连线是否正确。如果成功，则说明动作定义、对象目标和执行器都已正确配置；如果 `未处理步骤数` 计数增加而不是 `成功步骤数`，则说明没有适用于 `移动到` 的执行器注册在此 GameObject 上。 |
| **重置探针状态** | 重置所有计数器并清空最近一次看到的文本字段                                                                                                                         |

### ConvaiRoomManager 运行时状态

`ConvaiRoomManager` 将诊断状态以普通属性形式暴露——无需订阅事件。可以从任意脚本、从 `[ContextMenu]` Editor 中的方法，或从场景内调试面板读取。

#### 公共状态属性

| 属性                        | 类型             | 说明                                                        |
| ------------------------- | -------------- | --------------------------------------------------------- |
| `CurrentState`            | `SessionState` | 当前会话状态： `已断开连接`, `连接中`, `已连接`, `正在断开连接`, `重新连接中`, `Error` |
| `IsConnected`             | `bool`         | `true` 房间处于活动连接状态时                                        |
| `ConnectAttemptCount`     | `int`          | 自场景加载以来的连接尝试总数                                            |
| `ReconnectCount`          | `int`          | 自场景加载以来的重连尝试总数                                            |
| `LastSessionErrorCode`    | `string`       | 最近一次错误事件的错误代码                                             |
| `LastSessionErrorMessage` | `string`       | 最近一次错误的可读消息                                               |

{% hint style="warning" %}
`SessionState.Error` 表示无法恢复的会话失败。房间在此状态下不会自动重连。请调用 `DisconnectAsync()` 然后再调用 `ConnectAsync()` 以重置会话。
{% endhint %}

#### IRoomDiagnostics 完整快照

若需更丰富的快照，请调用 `GetDiagnostics()` 在 `ConvaiRoomManager.DiagnosticsCoordinator`。这将返回一个 `RoomDiagnosticsSnapshot` ，其中包含自创建诊断实例以来累计的连接统计信息。 `DiagnosticsCoordinator` 是 `null` 在房间的内部装配创建之前都不会可用，而这发生在第一次连接尝试时——在调用前请先做空值检查 `GetDiagnostics()`.

```csharp
var room = FindFirstObjectByType<ConvaiRoomManager>();
if (room?.DiagnosticsCoordinator != null)
{
    RoomDiagnosticsSnapshot snap = room.DiagnosticsCoordinator.GetDiagnostics();
    Debug.Log($"State:          {snap.CurrentState}");
    Debug.Log($"Connections:    {snap.SuccessfulConnections} / {snap.TotalConnectionAttempts} succeeded");
    Debug.Log($"Failed:         {snap.FailedConnections}");
    Debug.Log($"Total errors:   {snap.TotalErrors}");
    Debug.Log($"Last connected: {snap.LastConnectedAt}");
    Debug.Log($"Last error:     {snap.LastErrorCode} at {snap.LastErrorAt}");
    Debug.Log($"Uptime:         {snap.SessionUptime}");
    Debug.Log($"Characters:     {snap.RegisteredCharacterCount}");
    Debug.Log($"Players:        {snap.RegisteredPlayerCount}");
}
```

#### RoomDiagnosticsSnapshot 字段参考

| 字段                         | 类型          | 说明                                |
| -------------------------- | ----------- | --------------------------------- |
| `CurrentState`             | `string`    | 拍摄快照时的状态名称                        |
| `TotalConnectionAttempts`  | `int`       | 自启动或上次重置以来的所有连接尝试                 |
| `SuccessfulConnections`    | `int`       | 到达 Connected 状态的尝试                |
| `FailedConnections`        | `int`       | 以失败结束的尝试                          |
| `TotalErrors`              | `int`       | 记录的错误总数                           |
| `LastConnectedAt`          | `DateTime?` | 最近一次成功连接的 UTC 时间戳； `null` 如果从未连接过 |
| `LastErrorAt`              | `DateTime?` | 最近一次记录的错误的 UTC 时间戳； `null` 如果没有错误 |
| `LastErrorCode`            | `string`    | 最后一次错误的错误代码                       |
| `LastErrorMessage`         | `string`    | 最后一次错误的可读消息                       |
| `SessionUptime`            | `TimeSpan?` | 自当前会话连接以来经过的时间； `null` 在断开连接时     |
| `RegisteredCharacterCount` | `int`       | `ConvaiCharacter` 当前在代理注册表中已注册的实例 |
| `RegisteredPlayerCount`    | `int`       | `ConvaiPlayer` 当前已注册的实例           |

### 会话指标 Console 消息

`SessionMetrics` 将会话生命周期事件记录到 Console。标记为 Debug 的消息遵循与其他所有 Debug 级日志调用相同的条件编译规则——见上方 [日志级别](#log-levels) 提示。

SDK 的日志器会自动在每条 Console 条目前添加 `[SourceFileName]`，该名称来自记录它的源文件。下面的消息是跟在该前缀之后的消息正文——请在 Console 中搜索消息文本，而不是整行。

| Message                                 | 级别 | 当它出现时                                         |
| --------------------------------------- | -- | --------------------------------------------- |
| `[SessionMetrics] 指标已重置`                | 调试 | 指标已通过程序重置                                     |
| `[SessionMetrics] 会话已开始`                | 调试 | 初始连接尝试开始（房间从 Disconnected 变为 Connecting）      |
| `[SessionMetrics] 已连接 - 开始持续时间计时器`      | 调试 | 初始连接达到 Connected 状态；开始会话在线时长计时器（重连时则触发“重连成功”） |
| `[SessionMetrics] 重连尝试 #N`              | 调试 | 每次重连尝试开始                                      |
| `[SessionMetrics] 重连成功（尝试 #N，成功率：P%）`   | 信息 | 一次重连尝试成功                                      |
| `[SessionMetrics] 重连失败（错误：X）`           | 警告 | 一次重连尝试失败                                      |
| `[SessionMetrics] 会话错误：X`               | 警告 | 记录了一次非重连会话错误                                  |
| `[SessionMetrics] 会话已结束（原因）：{snapshot}` | 信息 | 因任何原因终止会话；快照包含完整指标                            |

### 客户端延迟指标

`ClientLatencyMetricsCollector` 衡量对话流水线的端到端延迟，从玩家停止说话的那一刻到角色音频开始播放的那一刻。它在 Unity 编辑器和开发版构建中生效，与本页任何其他 Debug 级别诊断的适用范围相同。

每次完成一轮后，延迟条目会自动出现在 Console 中：

```
[ClientLatency] 玩家：stop→finalTranscript=120ms | 角色：stop→firstTranscript=450ms stop→ttsStarted=520ms stop→firstLipSync=600ms stop→audioPlaying=650ms (audioHoldForLipSync=130ms)
```

日志器的自动 `[SourceFileName]` 前缀也会出现在这一行之前，因此 Console 中的条目显示为 `[ClientLatencyMetricsCollector] [ClientLatency] ...` ——按 `[ClientLatency]` 筛选即可找到它。

#### 延迟片段参考

| 片段                     | 测量内容                             |
| ---------------------- | -------------------------------- |
| `stop→finalTranscript` | 从玩家停止说话到最终玩家转写到达客户端              |
| `stop→firstTranscript` | 从玩家停止说话到首个角色转写标记到达               |
| `stop→ttsStarted`      | 从玩家停止说话到 Convai 开始文本转语音合成        |
| `stop→firstLipSync`    | 从玩家停止说话到首个唇形同步数据帧到达              |
| `stop→audioPlaying`    | 从玩家停止说话到角色音频实际开始播放 `AudioSource` |
| `audioHoldForLipSync`  | TTS 开始与音频播放之间的差值——播放开始前的音频缓冲填充时长 |

#### 数值解读

| 较高的片段值                                       | 可能原因                       |
| -------------------------------------------- | -------------------------- |
| `stop→firstTranscript` > 500 ms              | 到 Convai 的网络延迟；请检查连接质量     |
| `stop→ttsStarted` 远高于 `stop→firstTranscript` | Convai 处理时间；复杂响应时属正常       |
| `audioHoldForLipSync` > 200 ms               | 音频缓冲较大；可以接受，但会降低感知响应速度     |
| `stop→audioPlaying` > 1000 ms                | 网络 + 处理 + 缓冲综合所致；请逐项排查各个片段 |

### 唇形同步漂移监视器

不支持自定义运行时 sink 注入——SDK 没有公开的扩展接口可供使用。请改为通过受支持的映射或配置文件来驱动唇形同步，使用 `ConvaiLipSyncComponent` 而不是这样。相关类型 `SkinnedMeshBlendshapeSink`, `LipSyncDriftMonitor`, `LipSyncDriftSample`，以及 `LipSyncDriftEvent` 存在于 SDK 中，但属于内部实现，不是公共 API 的一部分。

可从角色的 `ConvaiLipSyncComponent` 检查器中：选择 **打开漂移监视器** ，就在延迟设置附近。打开的窗口标题为 **LipSync 漂移**.

监控为可选启用：打开 **监控** 切换开关，进入播放模式，并与角色交谈以填充数据。若注册了多个角色，请从下拉菜单中选择一个角色——样本和事件按角色分别跟踪。

窗口显示：

* 一个实时音频/视觉偏移覆盖滑块，用于凭视觉校准感知到的同步
* 一张图表，绘制在可配置时间窗口（3-30 秒）内的漂移误差和监视器的累计校正，并叠加生命周期事件标记
* 在可见窗口内计算的平均绝对误差、最大绝对误差和校正率
* 一个实时音频/视觉偏移覆盖滑块，用于凭视觉校准感知到的同步
* 一个事件日志，列出带时间戳的生命周期事件（例如 gate open、anchor、cancel）

点击 **导出 CSV** 以将当前样本和事件保存到文件。保存对话框标题为 **导出漂移样本**，默认文件名为 `lipsync-drift-<characterId>.csv`。导出的文件包含一个样本表，列包括 `time_s`, `error_ms`, `audio_target_s`, `visual_clock_s`, `cumulative_correction_ms`, `buffered_s`, `headroom_s`, `state`，以及 `audio_active`，后面跟一个空行以及一个事件表，列包括 `event_time_s` 和 `label`.

### 快速参考

| 工具                                                  | 诊断内容                    | 如何访问                                                                                                              |
| --------------------------------------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------- |
| **Convai 故障排除工具**                                   | 针对单个角色或整个场景的跨模块发现及修复    | `Convai → Troubleshooter`                                                                                         |
| **动作编辑器（实时）**                                       | 播放模式下的动作批次、目标注册表和逐动作洞察  | `Convai → Actions Editor`                                                                                         |
| **具身 / 视线 / 身体动画 / 情绪编辑器**                          | 各具身模块的设置与调优             | `Convai → Embodiment Editor`, `Convai → Gaze Editor`, `Convai → Body Animation Editor`, `Convai → Emotion Editor` |
| **诊断**                                              | 所有 SDK 子系统——详细程度和过滤     | `Convai → 设置` 或 `编辑 → 项目设置 → Convai SDK` （诊断部分）                                                                   |
| **Convai Action Monitor（`ConvaiActionDebugProbe`)** | 动作分发、执行器连接、批处理失败        | 添加组件 → Convai/Actions/Diagnostics/Convai Action Monitor                                                           |
| **ConvaiRoomManager 属性**                            | 会话状态、错误代码、连接/重连次数       | `FindFirstObjectByType<ConvaiRoomManager>()` ——直接读取属性                                                             |
| **IRoomDiagnostics 快照**                             | 连接尝试次数、运行时长、上次错误、代理数量   | `room.DiagnosticsCoordinator.GetDiagnostics()`                                                                    |
| **会话指标消息**                                          | 重连成功率、会话生命周期、错误时间线      | 控制台筛选器 `[SessionMetrics]`；需要 Info 或 Debug 级别                                                                      |
| **客户端延迟指标**                                         | 端到端对话流水线延迟              | 控制台筛选器 `[ClientLatency]`；仅限编辑器和开发版构建                                                                              |
| **LipSync 漂移监视器**                                   | 音频与视觉唇形同步对齐、漂移误差、CSV 导出 | `ConvaiLipSyncComponent` 检查器 → **打开漂移监视器**                                                                        |
| **自定义日志接收器**                                        | 将日志路由到文件、遥测或叠加层         | `ConvaiLogger.RegisterSink(new YourSink())`                                                                       |

### 下一步

对于平台特定问题——WebGL AudioContext 解锁、Android 麦克风处理或平台构建设置——请参见平台指南部分。

{% content-ref url="/pages/c548f38700d19163b7037cf3152f210077f0967b" %}
[平台指南](/api-docs/zh/cha-jian-yu-ji-cheng/convai-unity-sdk/platform-guides.md)
{% endcontent-ref %}

对于特定功能的诊断工具，请查看各功能部分内的故障排查页面。Actions、Emotion、Vision 和 Narrative Design 功能都包含详细的决策树和控制台日志参考，超出此处所涵盖的内容。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.convai.com/api-docs/zh/cha-jian-yu-ji-cheng/convai-unity-sdk/troubleshooting/debug-tools-reference.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
