나만의 UI
기본 패널의 모양을 바꾸고, 코드 없이 내 캔버스나 월드 오브젝트에 조작을 만들고, C#으로 부품을 작성합니다.
기본 패널에 특별한 것은 없습니다. 평범한 uGUI에 작은 컴포넌트 여섯 가지가 붙어 있고, 각각 VideoPlayer를 가리킬 뿐입니다. 패널이 하는 일은 나만의 UI에서도 같은 방식으로 할 수 있습니다.
패널 모양 바꾸기
플레이어의 Controls 오브젝트 아래는 모두 마음대로 바꿔도 됩니다. 색, 스프라이트, 글꼴, 배치, 어떤 버튼을 둘지까지. 버튼을 지워도 나머지는 그대로 동작합니다. 부품은 이름으로 무언가를 찾지 않고, 인스펙터에서 설정한 자기 참조만 가지고 있습니다.
코드 없이 조작 만들기
이 부품들을 내 캔버스, 월드 공간 메뉴, 실제 오브젝트에 붙이고 player를 설정하세요.
| 부품 | 하는 일 |
|---|---|
VideoButton |
UI Button에서, 또는 콜라이더가 있는 월드 오브젝트의 Interact에서 명령을 실행합니다. 상태를 아이콘으로 보여주고, 로컬 플레이어가 쓸 수 없으면 비활성화됩니다 |
VideoLabel |
항목을 TextMeshPro 텍스트나 기존 Text에 씁니다. 접두어와 비었을 때의 문구를 정할 수 있습니다 |
VideoSlider |
모두를 위해 탐색하거나, 내 볼륨을 바꾸는 Slider |
VideoLinkField |
VRCUrlInputField. Enter로 링크를 대기열에 넣고, enterPlaysNow면 바로 재생합니다 |
VideoShowWhen |
조건이 맞는 동안 오브젝트를 보여주고, 불러오는 중 표시를 돌릴 수도 있습니다 |
VideoQueueRow |
대기열 항목 하나. 제목, 추가한 사람, 지금 재생, 삭제 |
VideoButton은 명령을 받습니다. TogglePause, Play, Pause, Skip, Stop, Reload, ToggleLoop, ToggleLock, ToggleMute, ClearQueue 중 하나입니다. icon과 스프라이트 두 장을 주면 알아서 바꿔 주므로, 버튼 하나로 재생과 일시정지를, 자물쇠로 잠김과 열림을 보여줄 수 있습니다. 월드 오브젝트에서 button을 비워 두면 VRChat에서 누를 때 명령이 실행됩니다.
VideoLabel은 항목을 받습니다. Title, AddedBy, Status, Time, Position, Duration, Remaining, Volume, QueueCount, NextTitle, Owner, Url 중 하나입니다. 시간 항목은 1초에 몇 번 갱신되고, 나머지는 플레이어가 바뀔 때만 바뀝니다.
VideoShowWhen은 조건을 받습니다. Idle, Loading, Playing, Paused, Failed, Live, HasVideo, Showing, CanSeek, Locked, CanControl, CanModerate, Muted, Looping, HasQueue, HasProblem 중 하나이고, invert로 반대가 됩니다. targets를 보이고 숨기므로, 계속 활성 상태인 오브젝트에 붙이세요. 자기 GameObject를 숨긴 부품은 갱신이 멈추고 다시 돌아오지 않습니다.
물리 버튼 하나와 그 위에 간판이 있는 영화관 좌석이라면 코드가 필요 없습니다. 버튼에 TogglePause인 VideoButton을, 간판에 Title인 VideoLabel을 붙이면 됩니다.
C#으로 부품 작성하기
VideoPart를 상속하고 Refresh를 구현합니다. 플레이어가 준비되었을 때, 그리고 UI가 보여주는 무언가가 바뀔 때마다 실행됩니다.
public class NowPlayingSign : VideoPart
{
public TextMeshProUGUI sign;
protected override void Refresh()
{
sign.text = player.IsPlaying ? player.Title : "";
}
}
Tick은 그다음 매 프레임 실행됩니다. 시계처럼 스스로 움직이는 것을 위한 자리입니다. Position은 거기서 읽고, 작업은 가볍게 하세요.
플레이어는 어디서든 부를 수 있습니다. PlayUrl, Enqueue, Play, Pause, TogglePause, SeekTo, Skip, Stop 등은 레퍼런스에 있습니다. 명령은 잠금을 대신 확인합니다. 조작이 막힌 플레이어의 호출은 아무것도 바꾸지 않고 Status에 짧은 안내만 띄웁니다.
내 코드에서 플레이어 읽기
VideoPart에서 읽으면 타이밍을 신경 쓸 필요가 없습니다. 부품이 플레이어가 준비될 때까지 기다립니다. 다른 비헤이비어의 Start나 Update에서 플레이어를 읽는 코드는 먼저 player.player가 설정되었는지 확인하세요. 명령은 Refresh를 포함해 어디서든 부를 수 있습니다.