避免使用 internal 可见性
如果你使用 internal
关键字,你的方法或属性可能会随机无法导出,而且不会有任何错误提示。
截止到 VRCSDK 版本 3.8.2
,这一问题一直没有得到修复。在 VRCSDK 解决这个错误前,你至少不应该在 UdonSharp 脚本中使用 internal
修饰类属性访问器或类方法。由于 UdonSharp 从未考虑过该访问修饰符,取决于 U# 程序集被编译的顺序,你的 UdonSharp 脚本对应的类方法将随机的被导出或不被导出。
这听起来很奇怪,对吗?
这篇文章将带领你深入探索 UdonSharp 编译器的实现,并解释该问题的具体原因。
但首先,你需要了解一下 Udon 和 UdonSharp 的历史及其内部细节:
U# 的诞生
在 VRChat 的世界,VRSDK - World 开发最早不存在 UdonSharp 脚本,伴随 VRCSDK 3.0 推出取代 VRCSDK 2.0 的实际上是一种被称为 Udon Node Graph 的可视化图形编程语言。Udon Node Graph 需要被被编译为 Udon VM 字节码 才能在 VRChat 世界中运行。
为什么不直接允许用户编写任意 C# 脚本,而是将用户代码放在 Udon VM 中运行?VRChat 的每个世界都由用户创建并上传,如果允许运行任意 C# 代码,可能会有人上传恶意代码破坏你的 VRChat 客户端或破坏你的电脑。就像浏览器中的 JavaScript 运行在隔离沙盒中一样,将不可信代码隔离在虚拟机或沙盒中运行保证宿主安全是常用的安全策略。
显然,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 的使用率。