CRIWARE Unity Plugin Manual  Last Updated: 2024-04-24
CRI Manaコンポーネント

CriManaMovieController

CRI Sofdecにおけるムービ再生の制御は、「CriManaMovieController コンポーネント」により行います。
CriManaMovieController コンポーネントのムービ再生パラメータを「Inspector」で設定することができます。
各種パラメータについては CriWare.CriManaMovieController の詳細をご確認ください。 以下、シンプルな使い方を説明します。
sfd2u_inspector_moviecontroller.png
Unity Editor の Inspector 上から MoviePath にムービファイル名を入力してください。 ディレクトリ名を付けずに、ファイル名だけを指定するようにしてください(例:sample_256x256.usm)。 ムービファイルは StreamingAssets フォルダ下に配置してください。

カスタムシェーダの利用

CriManaMovieController では、ムービの描画に使用するシェーダを変更することができます。 シェーダを変更するには、CriManaMovieController.player.SetShaderDispatchCallback メソッドを使います。 本メソッドを使うことで、シェーダ割り当てのためのコールバック関数を登録することができます。 例えば、CriManaMovieController コンポーネントがアタッチされたオブジェクトに対して、次のようなクラスをアタッチするのが容易です。
public class AttacheUserCustomShader : MonoBehaviour {
void OnEnable () {
CriManaMovieController controller = GetComponent<CriManaMovieController>();
controller.player.SetShaderDispatchCallback(ShaderDispatch);
}
// movieInfo, additiveMode の2引数を取り、シェーダを返す関数
static UnityEngine.Shader ShaderDispatch(MovieInfo movieInfo, bool additiveMode)
{
// ここでは、movieInfo と additiveMode からシェーダを決定します
// 通常は movieInfo.codecType、movieInfo.hasAlpha と additiveMode からシェーダを決定します
// この例では movieInfo.codecType と additiveMode のみを参照し
// Sofdec.Prime コーデック用のカスタムシェーダを返します
// 必要に応じて、他の情報を参照してください
if (movieInfo.codecType != CodecType.SofdecPrime) {
Debug.LogError("Unknonw codec type");
return Shader.Find("VertexLit");
}
return Shader.Find(additiveMode ? "加算合成用のシェーダ名" : "加算合成用でないシェーダ名");
}
}
なお、登録はムービの再生前に行う必要があります。ご注意ください。
カスタムシェーダの作成
カスタムシェーダはShaderLab言語で記述します。
デフォルトのシェーダは以下の場所にありますので、これを参考にしてカスタムシェーダを作成してください。
なお、ShaderLab言語についてはUnityのリファレンスを参照してください。
デフォルトのシェーダの格納場所
  * Unityのプロジェクトルート

  \ * Assets

    \ * CRIMW

      \ * CriWare

        \ * Runtime

          \ * Scripts

            \ * CriMana

              \ * Resources

                \ * CriMana

                  o * SofdecPrimeRgb

                  o * *SofdecPrimeRgb.shader

                  o * SofdecPrimeYuv

                  \ * *SofdecPrimeYuv.shader

 

 

 

 

 

 

 

 

 

 

: RGBテクスチャを描画するシェーダ

 

: 色変換を行い、RGBを描画するシェーダ

 

CriManaMovieControllerForUI

本コンポーネントは Unity UI 上でムービ再生するために使います。基本的な使い方は CriManaMovieController と同じですが、CriManaMovieControllerForUI.target は UnityEngine.Renderer ではなく UnityEngine.UI.Graphic を受け取ります。

コンポーネントを破棄する際の注意事項

本コンポーネントに対しDestroyを実行する際、内部的には状態遷移の完成を待つ停止関数を呼び出しており、再生中の破棄にも対応はしています。
ただし、テクスチャに対する描画中に破棄処理を実行すると、タイミングによっては意図しない不具合が顕現する可能性があります。
そのため、可能な限り明示的に再生を停止し、停止状態への遷移を待ってからコンポーネント破棄するような使い方をおすすめしております。

CriManaPlayerからCriManaMovieControllerへの移行

CriManaPlayer から CriManaMovieController に以降する際の注意点について説明します。

UnityEditor 上での移行

  • CriManaPlayer コンポーネントがアタッチされているオブジェクトをインスペクター上に表示してください
  • CriManaPlayer コンポーネントをRemoveしてください
  • CriManaMovieController コンポーネントをアタッチしてください

CriManaPlayer コンポーネントの以下のプロパティは、CriManaMovieController コンポーネントにはありません。

  • Flip Top/Bottom
  • Flip Left/Right
  • Volume

Flip プロパティは、 Unity API の Material クラスの SetTextureOffset メソッドを使うことにより、プログラム上で置き換えが可能です。
Volume プロパティは、CriMana.Player クラスの SetVolume メソッドで置き換え可能です。

スクリプト上での移行

CriManaPlayer コンポーネントを CriManaMovieController コンポーネントに置き換えてください。
メソッド、プロパティの主な(基本的な)メンバの対応関係を以下に示します。

CriManaPlayer と CriManaMovieController の対応関係
CriManaPlayer CriManaMovieController
SetFile player.SetFile
Play player.Start
Stop player.Stop
status player.status

以下にスクリプトの実装方法の置き換え例を示します。
置き換えの際の参考にしてください。

  • CriManaPlayer(置き換え前)
    public GameObject movieObject;
    private CriManaPlayer moviePlayer;
    /* binder handle */
    private CriFsBinder binder;
    /* Perform the AddComponent of CriManaPlayer to movieObject. */
    moviePlayer = movieObject.AddComponent<CriManaPlayer>();
    /* Set the binder and the file name. */
    moviePlayer.SetFile(binder, "sample.usm");
    /* Start a playback. */
    moviePlayer.Play();
  • CriManaMovieController(置き換え後)
    public GameObject movieObject;
    private CriManaMovieController moviePlayer;
    /* binder handle */
    private CriFsBinder binder;
    /* Perform the AddComponent of CriManaPlayer to movieObject. */
    moviePlayer = movieObject.AddComponent<CriManaMovieController>();
    moviePlayer.useOriginalMaterial = true;
    /* Set the binder and the file name. */
    moviePlayer.player.SetFile(binder, "sample.usm");
    /* Start a playback. */
    moviePlayer.player.Start();