VRChat SDK 提供了一组接口和方法,你可以用来增强世界和虚拟形象的构建过程。
在两个 SDK 中都可以找到 Public SDK API 文件夹:
- 世界:Packages/VRChat SDK - Worlds/Editor/VRCSDK/SDK3/Public SDK API
- 虚拟形象:Packages/VRChat SDK - Avatars/Editor/VRCSDK/SDK3A/Public SDK API
然而,大多数事件和方法在世界和虚拟形象 SDK 之间是共享的,定义在 Base SDK Package 中:Packages/VRChat SDK - Base > Editor/VRCSDK/Dependencies/VRChat/Public SDK API。
其他标记为 [PublicAPI] 的方法也是 Public SDK API 的一部分。例如,"Packages/VRChat SDK - Base/Editor/VRCSDK/Dependencies/VRChat/API/VRCApi.cs" 用于更新内容描述。
这些类型位于自动引用的程序集定义中。如果你在自己的项目中编写代码,这些类型通常默认可用。如果你正在编写可再发行的包并拥有自己的程序集定义,则需要添加相应的程序集定义引用:
对于虚拟形象:VRC.SDK3A.Editor
对于世界:VRC.SDK3.Editor
对于两者:VRC.SDKBase.Editor
可用的功能
要获取最新的事件和方法列表,建议直接查看上面提到的文件。
以下是可用功能的简要列表:
- 主 SDK 面板的 OnEnable/OnDisable 事件
- 构建开始/结束事件
- 上传成功/错误事件
- 构建、构建并测试、构建并上传方法
如果在构建过程中遇到异常,可以在接口定义中查看预期的异常列表。
示例
获取构建器实例
连接到 OnSdkPanelEnable 将确保 SDK 窗口已打开并且构建器已注册。然后可以使用 TryGetBuilder 获取所需构建器的实例。
你可以在任何时候调用
VRCSdkControlPanel.TryGetBuilder,但如果 SDK 窗口未打开或你尝试访问的构建器不可用,它将返回 false。
[InitializeOnLoadMethod]
public static void RegisterSDKCallback()
{
VRCSdkControlPanel.OnSdkPanelEnable += AddBuildHook;
}
private IVRCSdkAvatarBuilderApi _builder;
private static void AddBuildHook(object sender, EventArgs e)
{
VRCSdkControlPanel.TryGetBuilder<IVRCSdkAvatarBuilderApi>(out _builder);
}
在构建前运行代码
OnSdkBuildStart 在 SDK 开始构建过程之前运行,但在验证和构建请求回调通过之后。
[InitializeOnLoadMethod]
public static void RegisterSDKCallback()
{
VRCSdkControlPanel.OnSdkPanelEnable += AddBuildHook;
}
private static void AddBuildHook(object sender, EventArgs e)
{
if (VRCSdkControlPanel.TryGetBuilder<IVRCSdkAvatarBuilderApi>(out var builder))
{
builder.OnSdkBuildStart += OnBuildStarted;
}
}
private static void OnBuildStarted(object sender, object target)
{
Debug.Log("Building " + ((GameObject) target).name);
}
从脚本构建
[MenuItem("My Tools/Build Selected Avatar")]
public static async void BuildSelectedAvatar()
{
var avatar = Selection.activeGameObject;
if (!VRCSdkControlPanel.TryGetBuilder<IVRCSdkAvatarBuilderApi>(out var builder)) return;
try {
await builder.BuildAndTest(avatar);
} catch (Exception e) {
Debug.LogError(e.Message);
}
}
注意事项
如果你目前正在使用反射访问 SDK 内部,建议尽快切换到公开 API。
我们会尽最大努力提供稳定的 API,但它将来仍可能发生变化。建议利用语义化版本控制(semver)来定义你的工具兼容的 SDK 版本。在此了解更多。