바인딩

인스펙터에서 아무것도 연결하지 않고 플레이어가 컨트롤을 움직였다는 사실을 받습니다.

업데이트 2026-09-08

플레이어가 슬라이더를 끌면 음악이 커집니다. 월드에서 손으로 쓰면 이건 인스펙터에서 UdonBehaviour에 연결한 슬라이더가, 직접 타이핑한 문자열 이름의 메서드를 가리키는 형태가 됩니다. 철자를 틀려도, 메서드 이름을 바꿔도, 비헤이비어를 다른 것으로 갈아끼워도 아무 일도 일어나지 않습니다. 아무도 알려주지 않습니다. 슬라이더는 그냥 움직이고, 아무 일도 없습니다.

Udon에는 UnityEvent가 없어서 코드로 컨트롤을 구독할 방법이 없습니다. 이 패키지는 대신 컨트롤을 매 프레임 읽고, 컴파일러가 확인해 주는 델리게이트를 건네줍니다.

using Udonite.Binding;

public class Music : UdoniteBehaviour
{
    public Slider slider;
    public AudioSource music;

    private SliderBinding volume = new SliderBinding();

    public override void Start()
    {
        volume.Watch(slider);
        volume.OnChanged += Louder;
    }

    public override void Update()
    {
        volume.Poll();
    }

    private void Louder(float value)
    {
        music.volume = value;
    }
}

인스펙터에서 연결한 것은 하나도 없습니다. Louder는 컴파일러가 아는 메서드입니다. 이름을 바꾸면 빌드가 실패하고, 그게 바로 목적입니다.

원하면 양방향으로

Observable은 위에 얹는 선택 사항입니다. Watch 대신 Bind를 쓰면 컨트롤과 값이 양쪽으로 맞춰집니다. 플레이어가 손잡이를 움직이면 값이 따라오고, 코드가 값을 바꾸면 손잡이가 따라옵니다.

private Observable<float> volume = new Observable<float>(0.5f);

private SliderBinding slider = new SliderBinding();
private FillBinding meter = new FillBinding();

public override void Start()
{
    slider.Bind(volumeSlider, volume);
    meter.Bind(volumeBar, volume);      // 하나의 값을 두 가지로 보여주기
}

둘 다 같은 숫자를 보여주지만 서로를 알지는 못합니다.

일곱 가지 바인딩

넷은 플레이어가 쓸 수 있는 컨트롤을 지켜보며, Update에서 Poll()이 필요합니다.

바인딩 컨트롤
SliderBinding Slider
ToggleBinding Toggle
InputBinding TMP_InputField

셋은 값으로 무언가를 움직이며, 폴링이 필요 없습니다.

바인딩 움직이는 대상
TextBinding<T> 라벨의 글자. 앞뒤에 문자를 붙일 수 있습니다
ActiveBinding 오브젝트를 보이거나 숨기기. 반대로도 가능합니다
FillBinding 이미지의 채움. 범위는 직접 정합니다

시작하기가 동작하는 컨트롤까지의 가장 짧은 길이고, 레퍼런스가 모든 멤버와 무엇이 그것을 일으키는지입니다.

하지 않는 것

버튼. 클릭은 값이 아니라 사건입니다. 슬라이더의 위치는 언제든 읽을 수 있지만 "지난 프레임 이후 클릭됐는가"는 읽을 수 없어서 폴링할 대상이 없습니다. 버튼은 여전히 인스펙터 연결이 필요하고, 이 패키지는 아닌 척하지 않습니다.

URL 필드. VRCUrlInputField는 포커스되지 않고 진짜 VRChat 클라이언트 밖에서는 입력도 되지 않아서 묶을 것이 없습니다. VRChat이 안내하는 대로 인스펙터에서 OnEndEdit을 쓰세요.

문제가 발생했습니다 새로 고침