Skip to main content

避免使用 internal 可见性

如果你使用 internal 关键字,你的方法或属性可能会随机无法导出,而且不会有任何错误提示。

截止到 VRCSDK 版本 3.8.2,这一问题一直没有得到修复。直到 VRCSDK 解决这个错误前,你至少不应该在 U# 脚本中使用 internal 修饰在类属性访问器或类方法。由于 U# 从未考虑过该访问修饰符,取决于 U# 程序集被编译的顺序,你的 U# 脚本对应的类方法将随机的被导出或不被导出。

这听起来很奇怪,对吗?下面我将带你深入 U# 编译器的实现了解该 Bug 的成因。

但首先,我们要了解一下 Udon 和 U# 的内部细节 :)

U# 的诞生

在 VRChat 的世界,VRSDK - World 开发最早不存在 U# 脚本,伴随 VRCSDK 3.0 推出取代 VRCSDK 2.0 的实际上是一种被称为 Udon Node Graph 的可视化图形编程语言。Udon Node Graph 需要被被编译为 Udon VM 字节码 才能在 VRChat 世界中运行。

显然,Udon Node Graph 是无法满足开发者对于组织复杂代码、复杂工程的需求的,Udon Node Graph 也无法像常规文本脚本一样被简单复用。但好消息是,VRCSDK 并没有限制开发者自行实现新的编译器并生成 Udon VM 字节码。因此,UdonSharp (后文称 U#)这一社区项目诞生了。U# 允许用户使用 C# 的语法功能子集编写脚本,然后被 Udon VM 执行。抛开 Udon VM 的糟糕性能不谈,U# 大幅提高了开发者的开发效率,很快也被 VRChat 吸收作为官方项目。

作为背景介绍的一部分,尽管 VRChat 宣传“Udon Node Graph 适合编程新手”,但很多开发者并不认同这一说法。主要的原因是,Udon Node Graph 没有简化编程,反而让简单的编程概念变得更复杂:用户不得不需要具有编程的大部分先验知识才能在 Udon Node Graph 用简陋的工具“带着脚镣跳舞”。这也导致了 Udon Node Graph 使用率异常的低,当编程新手想在社区里获得帮助时,往往会意外的发现,几乎所有资深开发者都不了解 Udon Node Graph,而这反过来又降低了 Udon Node Graph 的使用率。