[Unity] RenderTexture를 사용하지 않고 애니메이션을 등배 크기로 재생하는 [영상 재생기]

4497 단어 C#Unitytech

개시하다


제작 중인 스크립트 엔진에 애니메이션 재생 기능을 추가하기 위해 비디오 플레이어를 조사하던 중 같은 배 크기의 그림을 그리는 데 시간이 좀 걸렸다. 다음은 방법을 소개한다.

비디오 플레이어는 렌더링할 필요가 없습니다.


VideoPlayer에 연결하면 기본 RenderMode는 RenderTexture가 되지만, 이를 API Only로 변환함으로써 VideoPlayer 내부의 texture에서 구현할 수 있습니다.
(하지만 스크립트를 작성해야 함)
그런 다음 스크립트에서 재생성하려면 PlayOn Awake 검사를 취소합니다.

스크립트를 쓰다


RenderMode를 API Only로 설정하는 Video Player를 사용하려면 스크립트가 필요하므로 만듭니다.
아무튼 이름은 무비이미지.

추가할 매개변수


애니메이션용 Video Player 및 드로잉 대상의 RawImage를 재생해야 합니다.
MovieImage.cs
[SerializeField]VideoPlayer videoPlayer = null;
[SerializeField]RawImage rawImage = null;

비디오 크기로 이미지 크기 조정


이미지의 크기를 애니메이션 크기와 일치시키기 위해서는 먼저 애니메이션 크기를 얻을 수 있는 상태로 해야 한다.
그런 다음 재생성 준비를 위해 Prepture 방법을 사용합니다.
비디오 플레이어에 prepare Commpleted 이벤트가 있어서 재생 준비가 끝난 후에 호출되기 때문에 사용합니다.
MovieImage.cs
public void Play(VideoClip videoClip)
{
    // 動画の設定
    videoPlayer.source = VideoSource.VideoClip;
    videoPlayer.clip = videoClip;

    // 再生準備の開始
    videoPlayer.prepareCompleted += OnPrepareCompleted;
    videoPlayer.Prepare();
}
재생성 준비가 완료되면 Video Player의 texture를 사용할 수 있습니다.
rawImage에서 texture를 설정하여 RectTransform의 크기를 무늬의 크기로 조정합니다.
MovieImage.cs
void OnPrepareCompleted(VideoPlayer vp)
{
    // イメージに動画テクスチャをセットする
    rawImage.texture = videoPlayer.texture;

    // イメージサイズを動画と同じ大きさにする
    RectTransform rt = GetComponent<RectTransform>();
    rt.sizeDelta = new Vector2(videoPlayer.texture.width, videoPlayer.texture.height);
}

깜빡임 방지


이렇게 하면 재생성을 준비하는 동안 RawImage 원래 상태로 그려지기 때문에 흰색으로 반짝입니다.
비디오 재생은 재생을 시작할 때 호출된 started 이벤트가 있기 때문에 재생을 시작하기 전에 rawImage를 표시하지 않습니다.
MovieImage.cs
private void Awake()
{
    // 最初はイメージを表示しない
    rawImage.enabled = false;
}
MovieImage.cs
void OnPrepareCompleted(VideoPlayer vp)
{
    // イベントハンドラをセットして再生する
    videoPlayer.started += OnMovieStarted;
    videoPlayer.Play();
}
MovieImage.cs
void OnMovieStarted(VideoPlayer vp)
{
    // 再生が開始されたらイメージを表示する
    rawImage.enabled = true;
}

방영하다


만든 스크립트를 재생하는 방법입니다.
MovieTest.cs
public class MovieTest : MonoBehaviour
{
    [SerializeField]MovieImage movieImage = null;
    [SerializeField]VideoClip videoClip = null;

    public void Start()
    {   // 動画を再生する
        movieImage.Play(videoClip);
    }
}

최후


MovieImage.cs 전문 첨부
MovieImage.cs
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Video;

public class MovieImage : MonoBehaviour
{
    [SerializeField]RawImage rawImage = null;
    [SerializeField]VideoPlayer videoPlayer = null;

    private void Awake()
    {   // 最初は表示しない
        rawImage.enabled = false;
    }

    /// <summary>
    /// URLを指定して再生する
    /// </summary>
    public void Play(string url)
    {
        // 動画の設定
        videoPlayer.source = VideoSource.Url;
        videoPlayer.url = url;

        // 再生準備の開始
        videoPlayer.prepareCompleted += OnPrepareCompleted;
        videoPlayer.Prepare();
    }

    /// <summary>
    /// ビデオクリップを指定して再生する
    /// </summary>
    public void Play(VideoClip videoClip)
    {
        // 動画の設定
        videoPlayer.source = VideoSource.VideoClip;
        videoPlayer.clip = videoClip;

        // 再生準備の開始
        videoPlayer.prepareCompleted += OnPrepareCompleted;
        videoPlayer.Prepare();
    }

    /// <summary>
    /// 再生準備が完了した
    /// </summary>
    void OnPrepareCompleted(VideoPlayer vp)
    {
        // イメージに動画テクスチャをセットする
        rawImage.texture = videoPlayer.texture;

        // イメージサイズを動画と同じ大きさにする
        RectTransform rt = GetComponent<RectTransform>();
        rt.sizeDelta = new Vector2(videoPlayer.texture.width, videoPlayer.texture.height);

        // イベントハンドラをセットして再生する
        videoPlayer.started += OnMovieStarted;
        videoPlayer.Play();
    }

    /// <summary>
    /// 再生が開始されたときに呼ばれるイベント
    /// </summary>
    void OnMovieStarted(VideoPlayer vp)
    {
        // 再生が開始されたらイメージを表示する
        rawImage.enabled = true;
    }
}

좋은 웹페이지 즐겨찾기