Auto機能中に音声終了後次の処理へ

111 views
Skip to first unread message

FF

unread,
Aug 11, 2019, 11:30:22 AM8/11/19
to 宴ユーザーグループ
宴のバージョン: 例)3.6.3
UnityのバージョンとOS: 例)Unity2018.3.0f2 Windows10 64bit

メッセージウィンドウを表示させずに音声を再生しクリックされると次に進むというものを実装したいです。
現在FadeIn→Se→WaitInput→StopSe→FadeOutという流れで実装しています。

この流れでAuto機能を実行した際にWaitInputの箇所で止まらないようにしたいです。
丁度メッセージテキストありでボイスを流している時のような感じで音声の再生が終わるのを待ってから次へというものにしたいです。

WaitInput自体Autoでも止まる仕様だということですよね?
上記の流れでWaitInputを消してしまうとSe終了まで待機してくれない。
3.50でVoiceコマンドの仕様が修正されAutoで終了まで待機するようになったとあるように、VoiceだとAutoに対応してくれるのかとSeではなくVoiceコマンドでの実装も考えてみました。(FadeIn→Voice→FadeOut)しかしVoiceはそもそもNoWaitのような形で次にテキストが表示される前提でのものなのでしょうか?メッセージウィンドウを表示しない今回の仕様ですとAutoでなくてもすぐに次のFadeOut処理に進んでしまいます。
VoiceのPageCtrlをInputBrPageとしてみたりWaitTypeをInputWaitにしてみたりしたのですがVoiceで止まってくれずにFadeOutされてしまいます。


音声を再生しクリックされたらFadeOut(再生中にクリックされたら音声を止めつつFadeOut)。
Autoの場合は音声の終了を待ってからFadeOutというようなものにしたいのですがVoiceコマンドをうまく使えば実装できるのでしょうか?
またほかに方法がありましたら教えていただきたいです。

すみませんがよろしくお願いします。

マッドネスラボ

unread,
Aug 12, 2019, 9:23:02 AM8/12/19
to 宴ユーザーグループ
WaitInputのArg6に時間を指定すると、「指定時間経過するか入力するまで待機する」となります。
なので、WaitInputのArg6にボイスの再生時間を指定すればそれでできるかと思います。

FF

unread,
Aug 12, 2019, 11:01:16 AM8/12/19
to 宴ユーザーグループ
Autoでない場合はクリックを待ちたいです。
WaitInputのArg6に時間を指定するとおそらくAutoでない状態の時も再生が終わると同時に次に進んでしまうのではないでしょうか?

マッドネスラボ

unread,
Aug 12, 2019, 3:47:26 PM8/12/19
to 宴ユーザーグループ
そうなると既存のコマンドでは処理できないので、
カスタムコマンドの仕組みを使って、そのような動作をするコマンドのプログラムを書くしかないです。
カスタムコマンドの詳細はこちら

以下はサンプルです。
下記のようなコンポーネントを作って、AdvEngineオブジェクトにAddComponentすれば
エクセルのシナリオデータから 「WaitInputOrAutoVoice」コマンドを呼びだせば、
「Auto時はボイスの再生終了まで待機。通常時は入力があるまで待機」という動作になるはずです。
もしその他にも細かな調整などが必要であれば、サンプルプログラムを改変することで調整できるかと思います。


using UnityEngine;
namespace Utage
{
public class SampleCustomCommandWaitInputOrVoice : AdvCustomCommandManager
{
public override void OnBootInit()
{
Utage.AdvCommandParser.OnCreateCustomCommandFromID += CreateCustomCommand;
}
public override void OnClear()
{
}
 
public void CreateCustomCommand(string id, StringGridRow row, AdvSettingDataManager dataManager, ref AdvCommand command )
{
switch (id)
{
case "WaitInputOrAutoVoice":
command = new AdvCommandWaitInputOrAutoVoice(row);
break;
}
}
}
public class AdvCommandWaitInputOrAutoVoice : AdvCommand
{
public AdvCommandWaitInputOrAutoVoice(StringGridRow row)
: base(row)
{
}
public override void DoCommand(AdvEngine engine)
{
if (CurrentTread.IsMainThread)
{
engine.Page.IsWaitingInputCommand = true;
}
}
public override bool Wait(AdvEngine engine)
{
bool waiting = IsWaitng(engine);
if (waiting)
{
return true;
}
else
{
//ボイスを止める
if (engine.Config.VoiceStopType == VoiceStopType.OnClick)
{
//ループじゃないボイスを止める
engine.SoundManager.StopVoiceIgnoreLoop();
}
engine.UiManager.ClearPointerDown();
if (CurrentTread.IsMainThread)
{
engine.Page.IsWaitingInputCommand = false;
}
return false;
}
}
bool IsWaitng(AdvEngine engine)
{
if ((engine.Config.IsAutoBrPage))
{
//オート中はボイス再生が終わるまでは待機
return engine.SoundManager.IsPlayingVoice();
}
else
{
//それ以外は入力があったら待機解除
if (engine.Page.CheckSkip())
{
return false;
}
if (engine.UiManager.IsInputTrig)
{
return false;
}
return true;
}
}
}
}

Reply all
Reply to author
Forward
0 new messages