꿰매 넣지 않고, 감독합니다
서드파티 확장은 자기 프로세스에서 실행됩니다. 크래시가 나면 자신의 매니페스트에 적힌 정책대로 다시 시작하고, vrOS의 나머지는 계속 돌아갑니다. 내장 확장도 같은 원칙으로, 앱 안에서 감독되는 작업으로 실행됩니다.
확장
vrOS의 핵심은 오버레이, 입력, 성능, 플레이 공간입니다. 크리에이터 도구는 하나씩 켜는 확장입니다. 각 확장은 자신이 쓰는 케이퍼빌리티를 밝히고, 결정을 내릴 때까지 멈춰 있습니다.
vrOS 2.0.0은 이 토대를 먼저 내놓습니다. 크리에이터 기능은 확장으로 차례차례 돌아오며, 어떤 것이 언제 오는지는 이 페이지에 적습니다.
작동 방식
서드파티 확장은 자기 프로세스에서 실행됩니다. 크래시가 나면 자신의 매니페스트에 적힌 정책대로 다시 시작하고, vrOS의 나머지는 계속 돌아갑니다. 내장 확장도 같은 원칙으로, 앱 안에서 감독되는 작업으로 실행됩니다.
확장이 실행되기 전에 vrOS가 무엇을 요청했는지 쉬운 말로 나열합니다. 오버레이, 캡처, 오디오, 이벤트 버스, 네트워크. 하나씩 허용할 수 있고, 나중에 설정 → 확장에서 언제든 철회할 수 있습니다. 새로운 것을 요구하는 업데이트는 그 항목 하나만 다시 묻습니다.
vrOS API가 통제하는 케이퍼빌리티는 vrOS가 강제합니다. 네트워크 접근은 공개일 뿐 샌드박스가 아닙니다. 네이티브 프로그램은 vrOS에 묻지 않고도 소켓을 열 수 있기 때문입니다. 그래서 매니페스트가 이를 밝히고, 무엇이든 켜기 전에 먼저 보게 됩니다.
확장의 상태는 확장 프로세스가 아니라 vrOS 저장소에 있습니다. 크래시든 앱 재시작이든 PC 재부팅이든, 있던 자리로 되돌아옵니다. SteamVR이 켜지고 꺼져도 무너지지 않습니다.
vrOS는 먼저 데스크톱 앱이고, 확장도 마찬가지입니다. OSC 메시지를 보내거나 Soundboard 패드를 울리는 일은 SteamVR이 꺼져 있어도 됩니다.
켜져 있지만 아무 일도 하지 않는 확장은 타이머를 돌리지 않고, 아무것도 폴링하지 않으며, 다시 그리지도 않습니다. OBS control은 그것을 보여주는 패널이 화면에 있는 동안에만 스트림과 녹화 상태를 조회합니다.
확장은 자기 PC의 폴더에서 설치하고, 동의 화면은 첫 실행 전에 나옵니다. 서명된 배포는 그다음 단계입니다.
패널
확장은 패널을 Slint 파일로 담아 오고, vrOS가 직접 그립니다. 같은 렌더러, 같은 테마이며 웹 엔진은 근처에도 없습니다.
목록
만들고 있는 순서대로 확장 네 가지입니다. VRChat OSC, OBS control, Soundboard는 v2.0.0 출시에 포함됩니다. Twitch chat은 마지막이고 아직 날짜가 없습니다.
VRChat의 OSC 영역을 한곳에 모았습니다. 입력 표시와 사운드 토글이 있는 챗박스, 아바타 파라미터 송수신, 아바타 변경, input 네임스페이스, camera 네임스페이스. OSCQuery와 mDNS 덕분에 VRChat이 확장과 수신 포트를 찾습니다. 그 포트는 기본적으로 루프백에 바인딩되므로, 네트워크의 다른 무엇도 아바타에 파라미터를 밀어 넣을 수 없습니다. 챗박스 패널은 손목에 앵커합니다.
로컬이든 원격이든 원하는 만큼 OBS 인스턴스에 obs-websocket으로 연결합니다. 장면 전환, 스트림과 녹화 시작·중지, 소스 토글과 잠금, 통계 확인까지. 컴팩트한 디렉터 패널이 눈앞에 떠서 장면 그리드, 스트림·녹화 상태, 탤리를 보여줍니다.
항목마다 볼륨과 루프를 지정한 패드를 vrOS 오디오 엔진으로 재생합니다. 하나의 소리를 여러 출력으로 동시에 보낼 수 있어서, 클립이 헤드폰과 가상 마이크에 함께 들어갑니다. 패드는 명령이므로 SteamVR에서 컨트롤러에 바인딩할 수 있습니다.
다른 모든 것 옆에, 패널 위의 채팅. 로그인은 디바이스 코드 플로를 쓰므로 vrOS는 비밀번호를 절대 보지 않습니다. 순서상 마지막입니다.
내장 확장은 케이퍼빌리티가 이미 허용된 상태로 도착합니다. 서드파티 확장과 똑같이 설정 → 확장에서 언제든 철회할 수 있습니다.