언어 지원
지금 컴파일되는 것과, Udon이 결코 실행할 수 없는 C#의 영역.
Udonite는 일상적인 C#의 상당 부분을 컴파일합니다. 아래의 모든 구문은 출력물을 어셈블해 실제 Udon 가상 머신에서 실행하는 테스트로 확인하고 있습니다.
컴파일되는 것
형식과 멤버
class
struct
interface
enum
중첩 형식
직접 만든 클래스를 필드와 지역 변수로 쓰는 것
제약이 붙은 제네릭
기본 구현이 있는 인터페이스 메서드
속성
자동 속성
식 본문 멤버
인덱서
확장 메서드
params
선택적 매개변수
명명된 인수
out / ref
튜플과 분해
지역 함수
정적 도우미 클래스
레코드와 레코드 구조체: 위치 기반 생성, with, 값 동등성, ToString, 분해. static 필드는 const이거나 readonly여야 합니다(아래 참고).
문과 식
if
switch 문
switch 식
for
foreach
while
do
break
continue
패턴 매칭
형식 패턴
is not null
관계 패턴
속성 패턴
when 가드
?.
??
??=
형식 지정자를 포함한 문자열 보간
nameof
산술 연산자
비트 연산자
시프트 연산자
[Flags] 열거형
HasFlag
char 산술
배열
다차원 배열
범위와 인덱스
Array.Sort
Find
FindAll
Exists
IndexOf
Resize
Copy
Fill
ConvertAll
List<T>
Dictionary<K,V>
HashSet<T>
Queue<T>
Stack<T>
LINQ
Action / Func 필드
메서드 그룹
멀티캐스트 += / -=
C# event
다른 behaviour의 public 메서드를 가리키는 델리게이트
값으로 쓰는 람다
StringBuilder
string.Format
Split
Join
Substring
Replace
Trim
PadLeft
널 허용 값 형식
HasValue
GetValueOrDefault
관계 패턴은 is > 5 and < 10처럼 씁니다. 범위와 인덱스는 arr[^1], arr[1..3]을 말합니다. LINQ는 배열, 리스트, 딕셔너리에 씁니다: Select, Where, OrderBy, ThenBy, GroupBy, First, Any, All, Sum, Average, Min, Max, Count, Take, Skip, TakeWhile, SkipWhile, Distinct, Reverse, Concat, Zip, Union, Intersect, Except, SequenceEqual, ToArray, ToList, ToDictionary, Range, Repeat, 그리고 이들의 연결. LINQ와 List<T>/Array 도우미에 넘긴 람다는 호출 지점에 인라인됩니다. 메서드 그룹은 Action done = Cleanup;처럼 씁니다. 다른 behaviour의 public 메서드를 가리키는 델리게이트와 값으로 쓰는 람다는 둘 다 컴파일됩니다. 변수를 캡처하는 람다에는 한 가지 제약이 있으며, 아래에서 다룹니다.
Unity와 VRChat
GetComponent<T>()
TryGetComponent<T>(out T)
Instantiate
Destroy
SetActive
트랜스폼
물리 쿼리
Mathf
Vector3
Quaternion
Color
Random
Time
코루틴
yield return null
WaitForSeconds
WaitUntil
중첩 코루틴
StartCoroutine(Run())
StartCoroutine(nameof(Run))
StopAllCoroutines
Invoke
InvokeRepeating
CancelInvoke
async 메서드
Task
UniTask
UniTaskVoid
await
VRCPlayerApi
Networking
픽업
스테이션
UdonBehaviour 참조
SendCustomEvent
SetProgramVariable
GetProgramVariable<T>
Invoke, InvokeRepeating, CancelInvoke는 public 메서드에 씁니다. async 메서드는 void, Task, UniTask, UniTaskVoid를 반환할 수 있습니다. await Task.Delay(...)와 다른 async 메서드 await도 됩니다. 네트워크에 있는 모든 것.
Udon이 결코 실행할 수 없는 것
이것들은 UDN0011로 거부됩니다. 거부 메시지가 그 사실과 대안을 함께 알려 줍니다.
| 구문 | 이유와 대신 쓸 것 |
|---|---|
try/catch/throw |
Udon에는 예외가 없습니다. 조건을 먼저 확인하세요. |
변경 가능한 static 필드 |
behaviour마다 자기 힙을 가지므로, static은 공유된 하나의 값이 아니라 behaviour마다 하나씩이 되어 버립니다. 한 behaviour의 필드로 두고 그것을 참조하세요. |
Awake |
Udon이 디스패치하지 않습니다. Start를 쓰세요. |
CompareTag와 gameObject.tag |
Udon은 태그를 노출하지 않습니다. 레이어나 이름을 비교하거나 참조를 들고 있으세요. |
IsInvoking, Application.isPlaying, Time.timeScale, AudioListener, new GameObject(), ScriptableObject 파생 형식 |
Udon이 노출하지 않습니다. |
| 인스펙터 필드에 넣는 사용자 정의 클래스나 구조체의 배열 | Udon이 역직렬화하지 못합니다. 기본 형식, Unity 형식, behaviour 참조의 배열을 쓰세요. |
| behaviour가 아닌 일반 객체의 메서드를 가리키는 델리게이트, 그리고 Unity가 직렬화하는 public 필드에 놓인 델리게이트 | 둘 다 월드까지 가지고 갈 수 없습니다. |
| 자신을 만든 메서드 밖까지 살아남는 캡처 람다(필드에 대입, 반환, 인수로 전달, 반복문 안에서 생성) | 캡처된 변수는 behaviour의 단일 힙에 있으므로, 저장된 클로저는 다음 호출에서 낡은 상태를 보게 됩니다. 캡처하지 않는 람다는 자유롭게 저장할 수 있고, 캡처하는 람다는 같은 메서드 안에서 호출하는 지역 변수로는 잘 동작합니다. |
아직 지원하지 않는 것
UDN0002로 거부됩니다. 이것은 Udon이 아니라 Udonite 쪽의 빈틈이며, 요청이 있는 것부터 풀립니다.
- 리스트 패턴(
is [1, ..]). - 단독 식으로서의
typeof(T), 그리고 비제네릭GetComponent(typeof(T)). - 재귀(
UDN0012), 반복문 안의 캡처 람다,checked연산.
거부 때문에 막히면 그 거부 줄과 함께 이슈를 남겨 주세요. 무엇인지만 특정되면 보통 하루면 됩니다.