시작하기

한 줄 쓰고, 태그를 달고, 무언가를 단언하고, 그 줄을 다른 곳으로 넘기기.

업데이트 2026-09-08

설치

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

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

한 줄 쓰기

네임스페이스를 더하고 쓰면 끝입니다. 씬에 놓을 것도, 연결할 것도 없습니다.

using Udonite.Logging;

public class Door : UdoniteBehaviour
{
    public override void Interact()
    {
        Log.Info("opened");
    }
}
[Door.Interact:8] opened

Log.WarningLog.Error는 같은 줄을 Console의 다른 채널에 씁니다.

타입 이름은 파일 이름에서 가져옵니다. 실행 중에 Udon에게 자기를 감싼 타입을 물어볼 방법은 없습니다. 그리고 Unity는 타입 이름과 파일 이름이 같은 behaviour만 인식하므로, 로그를 쓰는 behaviour에게는 그 둘이 같은 문자열입니다. 이름이 다른 클래스에서 부르면 그 클래스가 아니라 파일의 이름이 나옵니다.

관련된 줄에 태그 달기

태그는 같은 이야기에 속한 줄들을 묶고, 호출 위치보다 앞에 옵니다.

Log.Info("hit for " + damage, "combat");
[combat] [Weapon.Fire:22] hit for 3

태그는 줄 안의 평범한 글자이므로 Console의 검색창에서 그대로 걸러집니다.

무언가를 단언하기

Log.Assert는 조건이 거짓일 때만 보고하고, 그 조건의 소스를 그대로 인용합니다.

Log.Assert(owner != null);
Log.Assert(players.Length > 0);
[assertion failed] [Room.Join:31] owner != null
[assertion failed] [Room.Join:32] players.Length > 0

이 인용이 if 하나와 Error 하나 대신 이것을 쓰는 이유입니다. 무언가가 거짓이었다고만 말하는 대신 무엇이 거짓이었는지를 짚고, 나중에 조건을 고쳐도 하는 말이 계속 맞습니다.

조건만으로는 설명이 되지 않는 자리에서는 메시지가 인용을 대신합니다.

Log.Assert(state == Ready, "방이 다 실리기 전에 join 핸들러가 돌았습니다");

보고하고 돌아올 뿐, 절대 던지지 않습니다. Udon에서 예외가 나면 그 behaviour는 세션이 끝날 때까지 멈춥니다. 진단하려던 것이 월드에 있는 모두에게는 장애가 되어 버립니다.

줄을 다른 곳으로 넘기기

월드 안의 패널, 링 버퍼, 클라이언트 밖으로 보낼 문자열. 갈 곳이 있는 줄을 위해 Log.Entry는 쓰는 대신 조각들을 돌려줍니다.

LogEntry entry = Log.Entry("hit for " + damage, LogLevel.Warning, "combat");

panel.Show(entry.Message, entry.Tag, entry.Time);

Log.Write(entry);

Message, Text, Tag, Type, Member, Line, Level, Time이 각각 따로 있습니다. 2미터 앞의 패널이 원하는 부분과 콘솔이 원하는 부분은 다르기 때문입니다.

평범한 호출을 공짜로 두려고 이것은 별도의 호출입니다. Entry는 매번 객체를 하나 할당합니다. Update에서 로그를 쓰는 월드가 아무도 읽지 않을 객체의 값을 치를 이유는 없습니다. Log.Info와 그 형제들은 아무것도 돌려주지 않습니다.

무엇이 드는가

로그 호출은 문자열을 만들고, 월드는 10초짜리 VM 예산 아래에서 돕니다. 사람의 속도에서는 없는 셈이지만 뜨거운 루프 안에서는 진짜 비용입니다. 매 프레임 모든 플레이어에 대해 도는 코드에는 두지 마세요.

호출을 지우는 것 말고 로그를 끄는 방법은 없습니다. 원래 그 일을 해야 할 장치는 [Conditional]로, 호출과 인자를 통째로 없애 버리는 것인데, Udonite는 아직 이것을 존중하지 않습니다.

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