从 UdonSharp 迁移
从 UdonSharp 移植时真正需要改动的部分,以及可以原样保留的部分。
大多数 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 脚本会照常工作,你可以一个一个地迁移。