うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】VideoPlayer を RenderTexture を生成せずに利用する

VideoPlayer では 現在のフレームの Texture を参照することが可能なため、RenderTexture を生成して tagetTexture を指定しなくてもお手軽にテクスチャを表示できる

※ 内部的に RenderTexture を生成しているので RenderTexture を利用しないというわけではない

texture: Internal texture in which video content is placed. (Read Only)

しかし、設定や RenderTexture のサイズは指定できない

それを実行できるコンポーネントを以下に示す

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;
 
[RequireComponent(typeof(RawImage))]
[RequireComponent(typeof(VideoPlayer))]
public class VideoPlayerApi : MonoBehaviour
{
    [SerializeField]
    private VideoPlayer _videoPlayer;
    [SerializeField]
    private RawImage _rawImage;
 
    private void Reset()
    {
        _rawImage = GetComponent<RawImage>();
        _videoPlayer = GetComponent<VideoPlayer>();
        _videoPlayer.renderMode = VideoRenderMode.APIOnly;
        _videoPlayer.playOnAwake = false;
    }
 
    private void Awake()
    {
        _rawImage.enabled = false;
    }
 
    public void Play(VideoClip _clip)
    {
        _videoPlayer.clip = _clip;
        _videoPlayer.sendFrameReadyEvents = true;
        // 参照できるのはそのフレームでの Texture なのでフレームごとにテクスチャを更新
        _videoPlayer.frameReady += (vp, frame) =>
        {
            if (!_rawImage.enabled)
                _rawImage.enabled = true;
             
            _rawImage.texture = _videoPlayer.texture;
        };
 
        _videoPlayer.prepareCompleted += vp =>
        {
            _videoPlayer.Play();
        };
         
        _videoPlayer.Prepare();
    }
}