ビデオオブジェクトを無音再生させたい

112 views
Skip to first unread message

sola

unread,
Jul 11, 2025, 3:26:37 AMJul 11
to 宴ユーザーグループ
宴のバージョン:宴4.1.9
UnityのバージョンとOS:Unity6000.1.10f1 Mac

お世話になっております。
例えば2つのビデオオブジェクトを画面上に重複して再生させる場合、
片方のビデオオブジェクトはコマンド等で無音(ミュート)再生させたいです。

可能であればご教示お願いいたします。

マッドネスラボ

unread,
Jul 11, 2025, 10:27:07 AMJul 11
to 宴ユーザーグループ
現状の仕組みはそのまま行うのは不可能なので、
  • 無音のビデオファイルを別に用意して、それを使う
  • ビデオは無音にしておいて、音はサウンド系のコマンドで再生する
というやり方になります。
現状のビデオの音はBGMのマスターボリュームと毎フレーム同期する(BGMのマスターボリューム音量に合わせて音量が変わる)ようになっているのですが、
ダッキング(ボイス再生中にはBGM音量が小さくなる)などのサウンドエフェクトはかかりませんので、
場合によりますがサウンド系のコマンドとして再生するほうが基本的な機能も使えるようになって良いかもしれません。

そのやり方では問題があるようなら、宴の内部コードを改変する必要がありますので、必要であれば拡張しますのでご連絡ください。
宴のプログラムを改変してカスタムボリュームに同期するような機能を追加し、それをSendMessageなどで呼び出す形になります。
ただ、ビデオのサウンドは完全にUnityの内部機能(もっというとおそらくOSレベルの深い部分でサウンド再生機能が別物)なので、
プログラムから操作できるのは音量の指定くらいで、上記のダッキングなどのサウンドエフェクトはかけることができませんのでご注意ください。



2025年7月11日金曜日 16:26:37 UTC+9 sola:

sola

unread,
Jul 11, 2025, 12:02:33 PMJul 11
to 宴ユーザーグループ
ご回答ありがとうございます。
書き忘れてたのですが、制作中のゲーム事情でBGMとは音声再生を分けたかったため
AdvGraphicObjectVideo.cs内でAmbienceVolumeに書き変えてます。


希望としては音声有り無しをシナリオ上で切り替えて再生したかったので、
一旦ご提案頂いた「ビデオは無音にしておいて、音はサウンド系のコマンドで再生する」の方向で進めようと思います。

ちなみに自分でも調べた所、下記コードでビデオオブジェクトの無音再生ができたのですが、
これでは不具合など生じる可能性はありますでしょうか?

 VideoPlayer videoPlayer = GameObject.Find("対象のビデオオブジェクト").GetComponent<VideoPlayer>();
 videoPlayer.SetDirectAudioMute(0, true);

2025年7月11日金曜日 23:27:07 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Jul 11, 2025, 12:10:33 PMJul 11
to 宴ユーザーグループ
マスターボリュームが変更された時のために、
AdvGraphicObjectVideoのUpdateで、SetDirectAudioVolumeを呼び出しているので、そのコードが残っているとおそらくボリュームが次のフレームなどで上書きされて戻ってしまうかと思います。
必要ないのであればUpdateメソッド丸ごとコメントアウトするなどすれば大丈夫だと思います。

また、宴のプログラムを書き変えてしまうと、宴のアップデートしたときに変更した個所が戻ってしまう(最新版の宴のコードに再び上書きされる)ので、その点はご注意ください。


2025年7月12日土曜日 1:02:33 UTC+9 sola:

sola

unread,
Jul 11, 2025, 12:30:12 PMJul 11
to 宴ユーザーグループ
ご回答ありがとうございます。
自分でも完全には理解しきれていないため、先ほどのコードの使用は控えようと思います。
また将来的にご提案頂いた拡張をお願いするかもしれないです。
その際はお手数ですがよろしくお願いいたします。

AmbienceVolumeへのプログラム書き変えに関しては宴のアップデート毎に対応しないといけないことは承知していたのですが、
こちらに関しては対応策とかあったりしますでしょうか?(話しが本題と逸れてしまい申し訳ありません。)

2025年7月12日土曜日 1:10:33 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Jul 11, 2025, 10:08:08 PMJul 11
to 宴ユーザーグループ
コードを書き変える手前の段階として、
C#の継承を使って一部のメソッドをoverrideするということも可能です。

・シーン内にAddComponentされているものは、そのコンポーネントを継承したものに差し替える必要があります。
・今回のAdvGraphicObjectVideoのように、最初シーン内になくてゲーム中に生成されるコンポーネントに関しては次の手法で差し替えられます。

ただ、overrideは必ずしも可能とは限りません。
今回で言うと、AdvGraphicObjectVideoのUpdateメソッドはoverride可能なように作っていませんので、
その場合は、継承可能にしてほしいクラス名やメソッド名をご連絡いただいて、宴のソースコードのほうを継承可能なように書き変えて今後のバージョンアップに入れておく必要があります。

コードを直接書き換えてしまうと、宴のアップデートで元に戻ってしまうのは避けられませんが、
継承を使った場合は、書き換えた部分の元のソースコードに大幅な変更がない限りはアップデートしても問題ありません。
大幅な変更は基本的にはしない予定であるのですが、そういった変更があった場合は影響を受けてしまうというリスクもありますが、その場合はコンパイル時か実行時にエラーか警告がでることが多いかと思います。
これは宴だけではなく、Unity公式のソースコードを継承した場合なども同じです。

  • 基本的には、コードを書き変えないで済む範囲で実装する
  • プロジェクトの固有の拡張が必要な場合は、継承を使用する
  • ノベルエンジンとしての基本的な機能の追加が欲しい場合や、継承不可能なものを継承可能にするには、Q&Aに拡張依頼をする
のようにしていただけばと思います。

2025年7月12日土曜日 1:30:12 UTC+9 sola:

sola

unread,
Jul 12, 2025, 3:41:53 AMJul 12
to 宴ユーザーグループ
ご説明ありがとうございます。
以下2点お伺いしたいです。

(1)AdvGraphicObjectVideo内のUpdateメソッドを継承可能なようにご対応お願いしてもよろしいでしょうか。

(2)
>・今回のAdvGraphicObjectVideoのように、最初シーン内になくてゲーム中に生成されるコンポーネントに関しては次の手法で差し替えられます。
>https://madnesslabo.net/utage/?page_id=11689

上記URL内の「その1 プログラム上から動的にコンポーネントを変える場合」を採用しようと思うのですが、今回の場合用に修正した下記コードの記述場所が分かりません。
例えばHierarchy上に作成したGameObject上の自作C#コンポーネント内に記述でも問題ないでしょうか?
※AdvGraphicObjectVideoCustomは継承を利用して作成済みです。

private void Awake(){
AdvGraphicInfo.CallbackCreateCustom += CreateCustom;
}

private void CreateCustom(string filetype, ref Type type){
switch (filetype)
{
case AdvGraphicInfo.FileTypeVideo:
//ビデオオブジェクトタイプのコンポーネントを自作のものに変える
type = typeof(AdvGraphicObjectVideoCustom);
break;
default:
break;
}
}

2025年7月12日土曜日 11:08:08 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Jul 12, 2025, 11:06:50 AMJul 12
to 宴ユーザーグループ
>(1)AdvGraphicObjectVideo内のUpdateメソッドを継承可能なようにご対応お願いしてもよろしいでしょうか。
承知いたしました。
作成しましたので、添付のパッケージファイルを適用してください。
(ダウンロードした添付ファイルの拡張子が *. gzになっている場合は、*.unitypackageに変えてからプロジェクトに適用してください)
この変更は、次回の宴のアップデートにも反映させる予定です。

Updateを以下のようにして、override可能にしました。
protected virtual void Update()

また、サウンド用のボリューム値を取得をするメソッドも追加し、これ経由でボリュームを取得するようにしました。
protected virtual float GetVolume()

継承先のクラスで、次のようにすればAmbienceVolumeをマスターボリュームとしたうえで、
CustomVolume でもボリューム値を操作できるようになると思います。

public float CustomVolume { get; set; } = 1.0f;

protected override float GetVolume()
{
Engine.SoundManager.AmbienceVolume * Engine.SoundManager.MasterVolume;  *CustomVolume;
}

対象の名前のAdvGraphicObjectVideoCustomを見つけて、CustomVolume を操作するプログラムを書いて、
SendMessageなどで呼び出せば、オブジェクト単位でボリューム変更が可能になると思います。

>上記URL内の「その1 プログラム上から動的にコンポーネントを変える場合」を採用しようと思うのですが、今回の場合用に修正した下記コードの記述場所が分かりません。
>例えばHierarchy上に作成したGameObject上の自作C#コンポーネント内に記述でも問題ないでしょうか?
はい。任意の独自コンポーネントを作成してそこに記述してください。
ただ、Awakeが呼ばれないと(Activeがオフのままだと)動作しない点だけ注意してください。
AdvEngineオブジェクトなどAdvEngineの開始時にはActiveがオンになっているGameObjectにAddComponentするようにしてください。


    //プログラム上から動的に作成されるAdvGraphicObjectのコンポーネントを変えるサンプル
    public class SampleCreateCustomAdvGraphicObjectComponent : MonoBehaviour
    {

        private void Awake()
        {
            AdvGraphicInfo.CallbackCreateCustom += CreateCustom;
        }

        private void CreateCustom(string filetype, ref Type type)
        {
            switch (filetype)
            {
                case AdvGraphicInfo.FileTypeVideo:
                    //ビデオオブジェクトタイプのコンポーネントを自作のものに変える
                    type = typeof(AdvGraphicObjectVideoCustom);
                    break;
                default:
                    break;
            }
        }
    }

2025年7月12日土曜日 16:41:53 UTC+9 sola:
VideoObject.unitypackage

sola

unread,
Jul 12, 2025, 11:15:20 PMJul 12
to 宴ユーザーグループ
下記のように独自メソッドを作成し、シナリオシートでBroadcastMessageByNameコマンドを
使用することで当初の目的であったビデオオブジェクト個別での無音再生もできました。
もし間違いがあればご指摘お願いいたします。

拡張パッケージのご対応含め誠にありがとうございました。

public class AdvGraphicObjectVideoCustom : AdvGraphicObjectVideo
{
public float CustomVolume { get; set; } = 1.0f;

protected override float GetVolume()
{
return Engine.SoundManager.AmbienceVolume * Engine.SoundManager.MasterVolume * CustomVolume;
}

//無音再生用の独自メソッド
void MuteVolume(AdvCommandBroadcastMessageByName command)
{
CustomVolume = 0;
}
}

2025年7月13日日曜日 0:06:50 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Jul 13, 2025, 12:40:28 AMJul 13
to 宴ユーザーグループ
はい。これで大丈夫だと思います。
無事に解決されたようで何よりです。
今後も対応が必要な際には、ご相談いただければと思います。

2025年7月13日日曜日 12:15:20 UTC+9 sola:
Reply all
Reply to author
Forward
0 new messages