Unity 한테 정복당하기/VrChat 맛보기

VrChat USharpVideoPlayer 탐구 U#

대마법사(진) 2024. 11. 8. 22:09

VrChat 맵개발을 한창 배우는 중이다.
(왁굳형을 위해..)
이세계 아이돌 3주년 기념 방탈출 맵을 제작 중인데 특정 상호작용을 하면 동영상을 재생하는 기능이 필요했다.

먼저 결과부터 보고 드가자


Vrchat 공식 Docs
VrChat에서 동영상을 재생하는 방법은 여러가지있는것으로 보인다.

  1. VideoTXL
  2. ProTV
  3. USharpVideo

Video Player 설치

본인은 3번 USharpVideo를 사용하였다.
USharpVideo 깃허브

위의 링크를 통해 패키지를 설치할수 있다.

패키지를 설치하면 아래의 경로에서 Prefab을 확인 할수 있다.


사실 간단한 비디오 플레이어만을 사용할것이면 그냥 프리팹만 가져다가 쓰면된다.

Inspector


대충 보면

  • General
    • Allow Seeking : 비디오 프로그래스바 조작 권한?
    • Default Unlocked : 누구에게나 URL 접근 권한 부여
    • Allow Instance Creator Control : 누구에게나 비디오 컨트롤러 사용권한 부여
  • Sync
    • Sync Frequency : 싱크 (동기화) 확인 빈도
    • Sync Threshold : ?
  • Audio
    • Default Volume : 기본 볼륨
    • Audio Range : 볼륨 범위
  • Playlist
    • Loop PlayList : 플레이리스트 반복
    • Shuffle PlayList : 랜덤 재생
  • Stream Setting
    • Default Stream Mode : Stream 모드를 기본으로 설정
    • Low Latency Stream : 저지연 모드

Video Play 코드로 접근하기

본인이 구현하려고 하는 기능은 올바른 비밀번호를 입력하면 동영상을 재생하는 기능이다.

키패드

우선은 번호를 입력할 키패드를 대충 만들어주고
(나중에 UI 담당자가 어차피 리소스 주면 다시해야해서 ㅎ)

Enter를 입력하면 번호가 맞는지 체크해주면된다.

자 어디보자....

[SerializeField] string enterEventName; //Enter시 호출할 함수
[SerializeField] private UdonBehaviour udonBehaviour;// Enter시 호출할 함수가 있는 클래스
 public void KeyEnter()
 {
     if (enterEventName != null)
         udonBehaviour.SendCustomEvent(enterEventName);
 }

아시다시피 VrChat U#에서는 SendCustomEvent()로 함수를 호출해야 정상작동한다.(개불편함;;;)
그러면 BeamProjector.CheckCorrect();를 호출하게 되겠구만

//BeamProjector.cs
 [SerializeField] VideoControlHandler videoControl; //USharp VideoPlayer 
 [SerializeField] TextMeshProUGUI value;//정답 TMP
 [SerializeField] public string correctValue;//정답 문자열
 [SerializeField] AudioSource correctAudio;//정답시 효과음
 ///정답인지 확인후 이벤트 발생
 public void CheckCorrect()
 {
     if (value != null)
     {
         if (correctValue == value.text)//정답
         {
             value.text = "Correct";
             Debug.Log("Beam.cs : Correct");
             VideoPlay();
         }
         else//오답
         {
             value.text = "Incorrect";
             SendCustomEventDelayedSeconds("ClearText", 1);
             correctAudio.Play();
             Debug.Log("beam.cs : Incorrect");
         }
     }
 }
 public void VideoPlay()
{       
    videoControl.targetVideoPlayer.SendCustomEvent("PlayNextVideoFromPlaylist");
}


USharpVideo를 보면 하위에 ControlsUI가 있다.

ControlsUI에는 VideoControlHandler가 있는데 우리는 이 컴포넌트를 활용할것이다.
너무 내용이 많아서 설명하지는 않겠다.
어쨌든 VideoControlHandler에는 비디오플레이어(targetVideoPlayer)를 참조하고 있고
얘를 활용해서 사용하면된다.

 public class VideoControlHandler : UdonSharpBehaviour
 {
     /// <summary>
     /// The video player this UI instance controls and pulls info from
     /// </summary>
     [PublicAPI, NotNull]
     public USharpVideoPlayer targetVideoPlayer;
     //... 생략
}

우선 아까 VideoPlayer PlayList에 URL을 입력해놓았다면 실행하자마자 바로 동영상이 재생될것이다. 내가 원하는것은 정답을 맞출때 PlayList를 재생하는것이므로

//USharpVideoPlayer.cs
        private void Start()
        {
            if (_ranInit)
                return;

            //생략
            
            //PlayNextVideoFromPlaylist 주석처리!!!!
            //PlayNextVideoFromPlaylist();

            SetVolume(defaultVolume);

            // Serialize the default setup state from the master once regardless of if a video has played
            QueueSerialize();
            
            LogMessage("USharpVideo v1.0.1 Initialized");
        }
 //원하는 이벤트에서 PlayNextVideoFromPlaylist() 호출
 videoControl.targetVideoPlayer.SendCustomEvent("PlayNextVideoFromPlaylist");

정리

  1. USharpVideo의 PlayList에 미리 URL을 입력해놓으면 실행과 동시에 비디오를 재생한다.
  2. 해당 부분을 주석처리한다. PlayNextVideoFromPlaylist()
  3. 원하는 타이밍에 PlayNextVideoFromPlaylist();를 다시 호출한다.
  • 참고로 USharpVideo는 유니티 에디터에서는 테스트를 해볼수 없다 빌드해야지 정상작동함 (방법이야 있겠지만...)