언어 지원

지금 컴파일되는 것과, Udon이 결코 실행할 수 없는 C#의 영역.

업데이트 2026-09-03

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로 거부됩니다. 거부 메시지가 그 사실과 대안을 함께 알려 줍니다.

구문 이유와 대신 쓸 것
trycatchthrow Udon에는 예외가 없습니다. 조건을 먼저 확인하세요.
변경 가능한 static 필드 behaviour마다 자기 힙을 가지므로, static은 공유된 하나의 값이 아니라 behaviour마다 하나씩이 되어 버립니다. 한 behaviour의 필드로 두고 그것을 참조하세요.
Awake Udon이 디스패치하지 않습니다. Start를 쓰세요.
CompareTaggameObject.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 연산.

거부 때문에 막히면 그 거부 줄과 함께 이슈를 남겨 주세요. 무엇인지만 특정되면 보통 하루면 됩니다.

Something went wrong. Reload