UdonSharp
UdonSharp 允许您使用 C# 创建 Udon 脚本。UdonSharp 包含在 VRChat Worlds SDK 中,并将您的 C# 编译为 Udon Assembly 代码。
- 添加有用的特性以扩展 UdonSharp 脚本的功能。
- 打开类暴露树查看 UdonSharp 中可用的 C# 类和方法。
- 更改配置以禁用自动编译或更改其他设置。
- 学习如何编写自定义编辑器脚本。
- 了解如何迁移使用非常旧版本 UdonSharp 的项目。
如何创建 UdonSharp 脚本
你可以通过项目窗口或层级窗口创建 UdonSharp 脚本,步骤如下。
在项目窗口中
- 在项目资源浏览器中右键单击。
- 导航到"Create" > "U# script"。
- 点击"U# script"。这将打开一个文件创建对话框。
- 为脚本选择一个名称并点击"Save"。
- 这将在同一目录下创建一个
.cs脚本文件和一个为该脚本配置的 UdonSharp 程序资源。
在层级窗口中
- 在场景中创建一个新的游戏对象。
- 为对象添加一个
Udon Behaviour组件。 - 在"New Program"按钮下方,点击下拉菜单并选择"Udon C# Program Asset"。
- 现在点击"New Program"按钮。这将为你创建一个新的 UdonSharp 程序资源。
- 点击"Create Script"按钮并选择保存目标和脚本名称。
创建新的 UdonSharp 脚本时,你会得到两个文件:
- 一个"UdonSharp Program Asset"文件。(创建后无需编辑此文件。)
- 一个
.cs文件。它包含UdonSharpBehaviour类,如下所示:
- UdonSharp
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;
public class YourScriptName : UdonSharpBehaviour
{
void Start()
{
}
}
在你选择的编辑器中编辑 UdonSharpBehaviour 并开始编程。你可以将 UdonSharpBehaviour 添加到场景中的任何 GameObject 上。
支持的 C# 特性
UdonSharp 支持大多数 C# 基本语法:
- 流程控制:
if、else、while、for、do、foreach、switch、return、break、continue、三元运算符(condition ? true : false)、?? - 隐式和显式类型转换
- 数组和数组索引器
- 所有内置算术运算符
- 条件短路
(true || CheckIfTrue())不会执行CheckIfTrue() typeof()- 带有
out或ref参数的 Extern 方法,例如Physics.Raycast()的多种变体 - 带参数和返回值的用户定义方法,支持 out/ref、扩展方法和
params - 用户定义属性
- 静态用户方法
- UdonSharpBehaviour 继承、虚方法等
- 带参数的 Unity/Udon 事件回调。例如,注册带
VRCPlayerApi参数的OnPlayerJoined事件是有效的。 - 字符串插值
- 字段初始化器
- 锯齿数组
- 引用其他自定义 UdonSharpBehaviour 类、访问字段和调用其方法
- 通过
[RecursiveMethod]特性支持递归方法调用
与 Unity/C# 特性的差异
UdonSharp 不遵循任何版本的 C# 语言规范。某些 C# 特性未实现或无法工作。
- 为了获得创建 UdonSharp 脚本的最佳体验,请使脚本继承自
UdonSharpBehaviour而不是MonoBehaviour。 - 更改序列化为
Behaviour字段的enabled状态在 behaviour 是UdonSharpBehaviour组件时无效。应 改为使用自定义 U# 脚本的类型序列化该字段。 - Udon 和 UdonSharp 目前仅支持数组
[]集合和数据容器。泛型集合如List<T>尚不支持。 - 字段初始化器在编译时求值。如果有依赖于场景中其他对象的初始化逻辑,应使用
Start。 - 对要跨网络同步的字段使用
[UdonSynced]特性。 - 由于 UdonVM 的限制,数值转换会检查溢出。
- 由
.GetType()返回的变量的内部类型并不总是符合你的预期,因为 U# 抽象了一些类型以便它们在 Udon 中工作。例如,任何锯齿数组类型将返回object[]类型,而不是像二维int锯齿数组的int[][]。
示例脚本
旋转立方体演示
每秒将附加的对象旋转 90 度。
using UnityEngine;
using UdonSharp;
public class RotatingCubeBehaviour : UdonSharpBehaviour
{
private void Update()
{
transform.Rotate(Vector3.up, 90f * Time.deltaTime);
}
}
其他示例
- VRChat Worlds SDK 在
Assets/UdonSharp/UtilityScripts中包含 UdonSharp 示例。- 如果不使用这些脚本,可以安全删除。