资源所有权与写时复制
了解为什么编辑一个包自带的 Convai 配置文件会创建可编辑的项目副本,而不是修改原始资源。
每个实体模块随附的设置资源——一个 ConvaiGazeProfile、一个 ConvaiEmotionProfile、以及其余部分——都会保留在 Convai 包中,直到你修改它为止。你一旦编辑了包中随附的某个资源,Convai 就会把它复制到你的项目中,并让角色指向这份副本,而不是直接写回原文件。理解其中原因就能解释一种否则看起来像 bug 的行为:你的编辑生效了,但不是作用在你以为的那个文件上。
为什么不能直接就地编辑
SDK 内随附的配置文件或设置资源位于 Packages/com.convai.convai-sdk-for-unity/。即使 Unity 恰好允许写入,直接在那里编辑也是错误的:它是所有未来角色继承的默认值;下一次 SDK 更新会替换该文件;而且当你共享项目或在另一台机器上安装 SDK 时,这个更改不会随项目一起带走。
因此,检查器控件保持可用,而不是被警告禁用。第一次编辑会把资源复制到你的项目中,让角色指向这份副本,并在副本上应用你的更改——然后再告诉你它做了什么。在你被允许尝试之前,不会要求你先做任何事;Convai 会处理包布局所带来的记录工作。
什么算是 SDK 拥有的,什么算是你自己的
Convai 会把每个设置资源归类为四种所有权类型之一(SDK/Editor/Ownership/ConvaiAssetOwnership.cs)再决定一次编辑是否需要先复制:
无
未分配任何资源。角色使用该模块内置的默认值运行。
无——这是默认的、未配置状态。
项目拥有
一个只有这个角色读取的项目资源。
没有提示。你正在编辑的正是你以为自己在编辑的内容。
项目共享
一个项目资源,打开场景中的其他角色也会读取它。
一条信息提示,说明有多少个角色共享它,并带有一个 为此角色设为独立副本 按钮。
SDK 拥有
一个随 Convai 包一起提供的资源。
一条信息提示,说明这些设置随 SDK 一起提供,并带有一个 创建项目副本 按钮。
共享只会被提示,不会被阻止——同时编辑多个共享同一配置文件的角色,是你完全可以正当做出的选择。只有 SDK 拥有的资源才需要先复制,编辑才算真正有意义。
第一次编辑时会发生什么
在选中角色时更改一个 SDK 拥有的资源上的任意字段,Convai 会:
将资源复制到你的项目中。
让角色的组件指向该副本。
将你的编辑应用到副本上——包括在副本创建之前已经做出的任何更改,并逐个属性地转移过去。
将整个操作记录为一个撤销步骤,名称按发生的事情来命名,而不是按机制来命名——例如“创建 Nova 的专属动画设置”,而不是“检查器”。
该 .asset 文件本身不受 Unity 的撤销系统覆盖—— AssetDatabase 资源创建从来都不受覆盖——因此撤销编辑只会把角色的引用恢复原状,但会把复制出来的文件留在项目中,你可以自己找到并删除它。
副本会放在哪里
如果角色在你的项目中有自己的 prefab,副本就会放在该角色 prefab 的旁边:属于某个角色的设置资源放在它所属角色旁边,本身就不言自明。如果没有 prefab——例如普通场景对象,或者本身位于包中的 prefab——副本就会放在 Assets/Convai/<Module>/ 中,其中 <Module> 是该模块自己的文件夹名称,例如 Assets/Convai/Gaze/。无论哪种情况,文件名都会以角色自己的名字开头,并简化为字母、数字和下划线,因此为“Nova (Front Desk)”创建的副本,仍然可以通过搜索 Nova.
在自己的检查器中复制一个设置资源、且未选中任何角色时,没有角色可供用来命名副本。该副本会放在 Assets/Convai/<AssetTypeName>/ 中,按资源类型分组。
被多个角色共享的项目资源绝不会自动复制——只有 SDK 拥有的资源才会。使用 为此角色设为独立副本 ,即可让某个角色获得共享项目资源的独立副本。
下一步
角色具身化对话状态最后更新于
这有帮助吗?