Skip to main content

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" 用于更新内容描述。

note

这些类型位于自动引用的程序集定义中。如果你在自己的项目中编写代码,这些类型通常默认可用。如果你正在编写可再发行的包并拥有自己的程序集定义,则需要添加相应的程序集定义引用:

对于虚拟形象:VRC.SDK3A.Editor 对于世界:VRC.SDK3.Editor 对于两者:VRC.SDKBase.Editor

可用的功能

要获取最新的事件和方法列表,建议直接查看上面提到的文件。

以下是可用功能的简要列表:

  • 主 SDK 面板的 OnEnable/OnDisable 事件
  • 构建开始/结束事件
  • 上传成功/错误事件
  • 构建、构建并测试、构建并上传方法
note

如果在构建过程中遇到异常,可以在接口定义中查看预期的异常列表。

示例​

获取构建器实例​

连接到 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);
}
}

注意事项​

caution

如果你目前正在使用反射访问 SDK 内部,建议尽快切换到公开 API。

我们会尽最大努力提供稳定的 API,但它将来仍可能发生变化。建议利用语义化版本控制(semver)来定义你的工具兼容的 SDK 版本。在此了解更多。