> 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 %}

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

每个 embodiment 模块和 Actions 都有各自的编写与诊断窗口，可从 `Convai` 菜单进入：

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

### 诊断

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

#### 配置位置

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

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

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

#### 日志预设

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

| 预设    | Global Log Level | Include Stack Traces | Colored Console Output | Category Overrides |
| ----- | ---------------- | -------------------- | ---------------------- | ------------------ |
| `详细`  | `跟踪`             | 开启                   | 开启                     | 已清除                |
| `默认`  | `信息`             | 开启                   | 开启                     | 已清除                |
| `仅错误` | `错误`             | 开启                   | 开启                     | 已清除                |

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

#### 日志级别

SDK 使用六个日志级别。数字越大，详细程度越高。

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

默认值为 **信息**。在调查期间切换到 **调试** 会产生明显更多的输出——在发布到生产环境前请将其关闭。将 **Global Log Level** 移动到 **关闭** 设为可静默所有 SDK 日志。

{% hint style="warning" %}
`调试`SDK 源码中的 -level 调用都带有 `[Conditional("UNITY_EDITOR")]`, `[Conditional("DEVELOPMENT_BUILD")]`以及 `[Conditional("CONVAI_DEBUG_LOGGING")]`。这意味着 **调试日志调用会在非开发构建中被编译移除** 除非你添加 `CONVAI_DEBUG_LOGGING` 到你的脚本定义符号中。在发布构建中设置 `GlobalLogLevel` 移动到 `调试` 也不会产生 Debug 消息，因为这些调用点在编译后的代码中并不存在。Debug 消息在 Unity 编辑器和开发构建中无需额外定义即可保持启用。这也是为什么 `[SessionMetrics]` 带 Debug 标签的行和 `[ClientLatency]` 条目（本页后面会进一步说明）只会出现在编辑器和开发构建中。
{% endhint %}

要在生产构建中启用 Debug 消息，请添加 `CONVAI_DEBUG_LOGGING` 移动到 **Edit → Project Settings → Player → Scripting Define Symbols**.

#### 日志类别覆盖

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

1. 打开 **诊断** 并展开 **Category Overrides** 折叠区——其中列出了每个日志类别，并带有一个默认值为 `继承`
2. 将 `Transport` 下拉框设置为 `调试`

其他所有类别都保持全局级别。折叠区标题会显示当前有效覆盖数量，例如 **Category Overrides (1)**。将某个类别的下拉框重新设为 `继承` 即可移除该覆盖。

#### 日志类别参考

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

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

通过实现 `ILogSink` 并将其注册到 `ConvaiLogger`.

`ILogSink` ，即可将 SDK 日志条目转发到自定义目的地——文件、遥测服务或游戏内调试覆盖层。

| 成员                              | 说明                     |
| ------------------------------- | ---------------------- |
| `string Name { get; }`          | 在诊断中显示的接收器标识符          |
| `bool IsEnabled { get; }`       | 返回值 `否` 在不注销的情况下暂停接收器  |
| `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 Action Monitor**；其 Inspector 标题是 **Action Monitor**.

**通过以下方式添加：** Add Component → **Convai/Actions/Diagnostics/Convai Action Monitor**

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

#### Inspector 字段

| 字段                       | 说明                                              |
| ------------------------ | ----------------------------------------------- |
| **Log To Console**       | 启用后，每个动作事件都会连同完整细节打印到 Console。生产环境中请禁用，以避免日志泛滥。 |
| **Received Batch Count** | 自 Play 开始以来接收的动作批次数总计                           |
| **Started Step Count**   | 分发器已开始执行的步骤总数                                   |
| **Succeeded Step Count** | 完成并带有 `Succeeded`                               |
| **Failed Step Count**    | 返回 `Failed`, `TimedOut`，或缺少定义或目标的步骤总数           |
| **Unhandled Step Count** | 执行器返回 `Unhandled`                               |
| **Aborted Batch Count**  | 过早停止的批次数总计（Stop Batch 失败策略）                     |
| **Last Received Batch**  | 最近一次从 Convai 接收到的批次 JSON                        |
| **Last Step Started**    | 最近开始的步骤详情                                       |
| **Last Step Succeeded**  | 最近成功的步骤详情                                       |
| **Last Unhandled Step**  | 最近未处理步骤的详情                                      |

#### 上下文菜单操作

右键单击 `ConvaiActionDebugProbe` 组件标题即可访问：

| 条目                    | 功能说明                                                                                                                                                                       |
| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Inject Test Batch** | 发送一个 `Move To` 动作，目标为第一个已注册对象——在没有实时对话的情况下验证执行器连线。如果成功，说明动作定义、对象目标和执行器都已正确配置；如果 `Unhandled Step Count` 增加而不是 `Succeeded Step Count`增加，则该 GameObject 上未注册用于 `Move To` 的执行器。 |
| **Reset Probe State** | 重置所有计数器并清除最近一次看到的文本字段                                                                                                                                                      |

### ConvaiRoomManager 运行时状态

`ConvaiRoomManager` 以普通属性公开诊断状态——无需订阅事件。可从任何脚本、编辑器中的 `[ContextMenu]` 方法，或场景内的调试面板中读取它们。

#### 公开状态属性

| 属性                        | 类型             | 说明                                                           |
| ------------------------- | -------------- | ------------------------------------------------------------ |
| `CurrentState`            | `SessionState` | 当前会话状态： `已断开连接`, `Connecting`, `已连接`, `断开连接中`, `重新连接中`, `错误` |
| `IsConnected`             | `布尔值`          | `是` 当房间处于活动连接状态时                                             |
| `ConnectAttemptCount`     | `整数`           | 自场景加载以来的总连接尝试次数                                              |
| `ReconnectCount`          | `整数`           | 自场景加载以来的总重连尝试次数                                              |
| `LastSessionErrorCode`    | `字符串`          | 最近一次错误事件的错误代码                                                |
| `LastSessionErrorMessage` | `字符串`          | 最近一次错误的人类可读消息                                                |

{% 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`            | `字符串`       | 创建快照时的状态名称                       |
| `TotalConnectionAttempts` | `整数`        | 自启动或上次重置以来的所有连接尝试                |
| `SuccessfulConnections`   | `整数`        | 到达 Connected 状态的尝试               |
| `FailedConnections`       | `整数`        | 以失败结束的尝试                         |
| `TotalErrors`             | `整数`        | 记录的错误总数                          |
| `LastConnectedAt`         | `DateTime?` | 上一次成功连接的 UTC 时间戳； `null` 如果从未连接过 |
| `LastErrorAt`             | `DateTime?` | 上一次记录错误的 UTC 时间戳； `null` 如果没有错误  |
| `LastErrorCode`           | `字符串`       | 上一次错误的错误代码                       |
| `LastErrorMessage`        | `字符串`       | 上一次错误的人类可读消息                     |
| `SessionUptime`           | `TimeSpan?` | 自当前会话连接以来经过的时间； `null` 断开连接时     |
| `已注册角色数`                  | `整数`        | `ConvaiCharacter` 当前在代理注册表中注册的实例 |
| `已注册玩家数`                  | `整数`        | `ConvaiPlayer` 当前注册的实例           |

### 会话指标控制台消息

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

SDK 的日志记录器会自动在每条控制台条目前加上 `[SourceFileName]`，来自记录该条目的源文件。下面的消息是跟在该前缀后的消息正文——请在控制台中搜索消息文本，而不是整行内容。

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

### 客户端延迟指标

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

每个回合完成后，延迟条目会自动出现在控制台中：

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

日志记录器的自动 `[SourceFileName]` 前缀也会出现在这一行之前，因此控制台中的条目显示为 `[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                | 网络 + 处理 + 缓冲的综合结果；逐项排查各个片段 |

### LipSync 漂移监视器

不支持自定义运行时 sink 注入——SDK 没有供其使用的公开扩展点。请通过受支持的映射或配置文件来驱动 Lip Sync，使用 `ConvaiLipSyncComponent` 来替代。相关类型 `SkinnedMeshBlendshapeSink`, `LipSyncDriftMonitor`, `LipSyncDriftSample`以及 `LipSyncDriftEvent` 存在于 SDK 中，但属于内部实现，不是公共 API 的一部分。

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

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

窗口显示：

* 测得的音频播放头与视觉（BlendShape）时钟之间的实时漂移误差，单位毫秒；正值表示嘴型落后于音频
* 在可配置时间窗口（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`                                                                                         |
| **Actions 编辑器（实时）**                                 | 播放模式下的动作批次、目标注册表和逐个动作洞察 | `Convai → Actions Editor`                                                                                         |
| **具身 / 视线 / 身体动画 / 情绪编辑器**                          | 各具身模块的设置与调优             | `Convai → Embodiment Editor`, `Convai → Gaze Editor`, `Convai → Body Animation Editor`, `Convai → Emotion Editor` |
| **诊断**                                              | 所有 SDK 子系统——详细程度与过滤     | `Convai → Settings` 或 `编辑 → 项目设置 → Convai SDK` （诊断部分）                                                             |
| **Convai Action Monitor（`ConvaiActionDebugProbe`)** | 动作分发、执行器接线、批处理失败        | 添加组件 → Convai/Actions/Diagnostics/Convai Action Monitor                                                           |
| **ConvaiRoomManager 属性**                            | 会话状态、错误代码、连接/重新连接次数     | `FindFirstObjectByType<ConvaiRoomManager>()` ——直接读取属性                                                             |
| **IRoomDiagnostics 快照**                             | 连接尝试次数、在线时长、最近错误、代理数量   | `room.DiagnosticsCoordinator.GetDiagnostics()`                                                                    |
| **Session Metrics 消息**                              | 重新连接成功率、会话生命周期、错误时间线    | 控制台过滤器 `[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 dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

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

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
