从 UdonSharp 迁移

从 UdonSharp 移植时真正需要改动的部分,以及可以原样保留的部分。

更新于 2026-09-03

大多数 UdonSharp 脚本本来就是普通的 C#。移植通常只需要换掉基类和少数几个特性名。

机械替换的部分

UdonSharp Udonite
using UdonSharp; using Udonite.Package.Runtime;
: UdonSharpBehaviour : UdoniteBehaviour
[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)] 同名,同一个枚举
[UdonSynced][UdonSynced(UdonSyncMode.Linear)] 保持不变
[FieldChangeCallback(nameof(Prop))] 保持不变
void Start()void Update()void Interact() public override void Start()
RequestSerialization() this.RequestSerialization()
SendCustomNetworkEvent(target, "Name") this.SendCustomNetworkEvent(target, nameof(Name))
SendCustomEventDelayedSeconds("Name", 1f) this.SendCustomEventDelayedSeconds(nameof(Name), 1f)
VRCInstantiate(prefab) Instantiate(prefab)
[RecursiveMethod] 不支持;递归会被拒绝

事件在 UdoniteBehaviour 上是 virtual 的,所以 Unity 或 VRChat 的事件方法需要写 public override。签名不匹配时编译器会告诉你(UDN0010)。

变轻松的部分

你为了绕开 UdonSharp 限制而养成的那些习惯,大多不再需要:泛型、接口、record、LINQ、async、协程、字典、对任意对象的 foreach、switch 表达式、模式匹配、带格式说明符的字符串插值,以及可空值类型,全都能编译。详见语言支持

保持不变的部分

Udon 自身的限制仍然存在:没有异常、没有可变的静态状态、没有 tag、没有 Awake。Udonite 会用 UDN0011 拒绝这些写法,并说明应该改成什么。所有权、序列化和事件规则属于 VRChat,没有变化。

两者共存

Udonite 和 UdonSharp 可以在同一个项目中共存。Udonite 只编译不继承 UdonSharpBehaviour 的类,因此现有的 UdonSharp 脚本会照常工作,你可以一个一个地迁移。

Something went wrong. Reload