시작하기

설치하고, 컨트롤을 지켜보고, 값으로 라벨을 움직이는 데까지.

업데이트 2026-09-08

설치

먼저 VCC(VRChat Creator Companion)를 통해 Unity 프로젝트에 바인딩 패키지를 추가합니다. 프로젝트의 vccproject.json을 열고 패키지를 추가하거나, VCC 인터페이스를 사용해 직접 설치하세요.

바인딩 패키지는 UdoniteObservables를 자동으로 포함하므로, 그것들도 함께 설치됩니다.

설치 후 패키지는 프로젝트에서 사용 가능하며 아래의 바인딩 API를 사용하기 시작할 수 있습니다.

스크립트 맨 위에:

using Udonite.Binding;

컨트롤을 듣기

세 줄입니다. 바인딩을 담을 필드, 시작하는 Watch, 계속 돌리는 Poll.

public class Lights : UdoniteBehaviour
{
    public Toggle box;
    public GameObject lamp;

    private ToggleBinding switched = new ToggleBinding();

    public override void Start()
    {
        switched.Watch(box);
        switched.OnChanged += Flip;
    }

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

    private void Flip(bool on)
    {
        lamp.SetActive(on);
    }
}

바인딩은 필드지 지역 변수가 아닙니다. 핸들러를 들고 있는 것이 바인딩 자신이라서, 그것을 만든 메서드보다 오래 살아야 합니다. 지역 변수는 스코프를 벗어나고 컨트롤은 조용히 멈춥니다.

Poll()Update에 둡니다. 한 프레임에 비교 하나입니다. 플레이어가 만질 수 없는 컨트롤이면 빼도 되고, 그러면 아무것도 보고되지 않습니다.

값을 보여주기

나머지 절반에는 폴링이 필요 없습니다. 바인딩에 Observable을 주면 값이 바뀔 때마다 컨트롤에 씁니다.

private Observable<int> score = new Observable<int>();

private TextBinding<int> scoreText = new TextBinding<int>();

public override void Start()
{
    scoreText.Bind(label, score, "Score: ", "");
}

public void Goal()
{
    score.Value = score.Value + 1;      // 라벨은 알아서 갱신됩니다
}

라벨은 다음 변경 때가 아니라 바인딩하는 순간 값을 보여주므로, 누가 득점할 때까지 빈칸으로 있지 않습니다.

둘 다 한 번에

지켜보는 컨트롤에 Bind를 쓰면 둘 다 합니다. 플레이어가 움직이면 값이 따라오고, 코드가 값을 바꾸면 컨트롤이 따라옵니다.

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

private SliderBinding slider = new SliderBinding();

public override void Start()
{
    slider.Bind(volumeSlider, volume);
}

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

서로 쫓아다니지 않습니다. Observable은 값이 실제로 다를 때만 알리므로, 자기 폴링에 대한 응답으로 되쓴 값은 아무것도 바꾸지 않고 거기서 멈춥니다.

OnChanged를 일으키는 것은 플레이어의 변경뿐입니다. Observable에 대입해서 컨트롤을 움직여도 일어나지 않습니다. 대입한 코드는 이미 알고 있으니까요.

다른 비헤이비어에 있는 핸들러

핸들러가 바인딩과 같은 곳에 있을 필요는 없습니다.

public Scoreboard display;

volume.OnChanged += display.Show;

플레이어가 컨트롤을 움직이면 다른 비헤이비어의 Show에 닿습니다. 이것도 인스펙터 연결이 필요 없고, 메서드 이름은 컴파일러가 확인해 줍니다.

흔한 실수

필드가 아니라 지역 변수로 두기. 가장 흔합니다. Watch는 아무것도 돌려주지 않고, 컨트롤은 그냥 아무것도 보고하지 않습니다.

Poll()을 빼먹기. 바인딩한 쪽은 동작하므로(컨트롤이 값을 따라옵니다) 연결을 안 한 것이 아니라 절반쯤 고장 난 것처럼 보입니다.

두 번 실행되는 Start에서 바인딩하기. 문제없습니다. 두 번째 바인딩이 앞의 것을 대체하므로 둘이 아니라 하나가 됩니다.

버튼을 기대하기. ButtonBinding은 없고, 만들 수도 없습니다. 이유는 레퍼런스에 있습니다.

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