Groups keyboard shortcuts have been updated
Dismiss
See shortcuts

ボイスコレクション機能の実現

84 views
Skip to first unread message

sasa rara

unread,
Feb 10, 2025, 6:54:47 AMFeb 10
to 宴ユーザーグループ
いつもお世話になっております。

ボイスコレクション機能を実現したいと考えています。
具体的には、以下のように:

ゲームのダイアログ画面で、
音声付きのテキストが表示されているときに、
キーボードの特定のキー(例えばCキー)を押すことで、
その音声をボイスコレクション画面にコレクションできるようにしたいです。

さらに、ボイスコレクション画面では、
各キャラクターごとに音声を分類できるようにしたいです。

これを実現することは可能でしょうか?  
サンプルコードをいただけますか?
どうぞよろしくお願いいたします。

マッドネスラボ

unread,
Feb 10, 2025, 11:15:02 AMFeb 10
to 宴ユーザーグループ
できることはできると思いますが、
具体的な実装になると、サンプルというよりもプロジェクトごとの固有の仕様をほぼ丸ごと実装することになります。
殆どはUnityのUI実装の問題なると思いますので、まずは自力で実装してみて、どうしても宴側で必要な部分に絞って具体的な部分を質問してみてください。



2025年2月10日月曜日 20:54:47 UTC+9 159516...@gmail.com:

マッドネスラボ

unread,
Feb 10, 2025, 12:33:03 PMFeb 10
to 宴ユーザーグループ
基本機能では実装はできないので、以下のような実装が必要になります。

・ボイスコレクション情報を管理するマネージャー機能を作成する
・入力があったときに、現在のシナリオページから、ボイスファイル名とキャラクター名を取得し、マネージャーに登録する
・マネージャーには登録情報をセーブロードする仕組みを作る(拡張機能を使うか、JSON化して文字列のパラメーターに登録する)

・ボイスコレクションを表示、再生するUI画面の実装
・その画面遷移処理

UnityやC#プログラムの使い方に加えて、様々な拡張が必要になるので、手軽には実装できないと思います。



2025年2月11日火曜日 1:15:02 UTC+9 マッドネスラボ:

sasa rara

unread,
Feb 10, 2025, 1:56:49 PMFeb 10
to 宴ユーザーグループ
ご返信ありがとうございます。
了解しました。

・入力があったときに、現在のシナリオページから、ボイスファイル名とキャラクター名を取得し、マネージャーに登録する
よろしくお願いします。

シナリオ内のテキスト表示や音声再生を処理するスクリプトはどれか知りたいです。

どうぞよろしくお願いいたします。

2025年2月11日火曜日 1:33:03 UTC+8 マッドネスラボ:

マッドネスラボ

unread,
Feb 10, 2025, 4:14:05 PMFeb 10
to 宴ユーザーグループ
ボイスは、バックログの現在の情報から取得するの形ですと比較的楽に取得できるかと思います。
BacklogManager.LastLog

Assets/Utage/Sample/Scripts/SampleReplayVoice.cs が参考になるかと思います。

ボイスの取得サンプルは次のメソッドになります。
bool TryGetLogVoiceFileName(out string fileName, out string characterLabel)

ボイスの再生のサンプルは次のメソッドになります。
IEnumerator CoPlayVoice(string voiceFileName, string characterLabel)

2025年2月11日火曜日 3:56:49 UTC+9 159516...@gmail.com:

sasa rara

unread,
Feb 12, 2025, 5:30:18 AMFeb 12
to 宴ユーザーグループ

ご返信ありがとうございます。  
また、ボイスに対応するセリフのテキストも取得したいのですが、
どのように取得すればよいでしょうか?
よろしくお願いします。
2025年2月11日火曜日 5:14:05 UTC+8 マッドネスラボ:

マッドネスラボ

unread,
Feb 12, 2025, 7:29:08 AMFeb 12
to 宴ユーザーグループ
テキストは、バックログから次のような形で取得可能です。

            var log = Engine.BacklogManager.LastLog;
            var text = log.Text;

PageCtrlなどで同一ページ内でテキストを分割して表示している場合は、表示中か表示済みのテキストを取得する形になります。(まだ未実行のコマンドのテキストは含まれません)
また、バックログと同じようにローカライズ済みのテキストデータやボイスファイルが取得される点にも留意してください。


もし、まだ未実行のコマンドを含めて、ページ内の全ての詳細な情報が必要なのであれば、以下の形で取得できます。

            //現在のページの情報
            var page = Engine.Page;
            //現在のページのシナリオデータ
            var scenarioData = page.CurrentData;
            //現在のページのコマンドリスト
            List<AdvCommand>commands = scenarioData.CommandList;
            //現在のページのテキストコマンドのリスト
            List<AdvCommandText> textCommands= scenarioData.TextDataList;

ローカライズに対応した情報が必要なのであれば、上記のScenarioDataを取得できるようにシナリオラベルやページのインデックス等を記録する形になるかと思います。
ただ、こちらの情報をもとに、適切なボイスやテキストを取得するのは簡単にできるような仕組みはないですので、あまりお勧めはしません。



2025年2月12日水曜日 19:30:18 UTC+9 159516...@gmail.com:

sasa rara

unread,
Feb 12, 2025, 10:13:41 AMFeb 12
to 宴ユーザーグループ

ご協力いただきありがとうございます。

ボイスコレクション機能は実装できました。  
ただ、セーブとロードに少し問題があり、
再起動するとボイスコレクション画面のボタンがすべて消えてしまいます。  
セーブとロードのサンプルをいただけますか?    

また、取得したセリフのテキストのローカライズは実現可能でしょうか?

よろしくお願いします。
2025年2月12日水曜日 20:29:08 UTC+8 マッドネスラボ:

マッドネスラボ

unread,
Feb 12, 2025, 11:04:37 AMFeb 12
to 宴ユーザーグループ
>セーブロード
セーブの拡張方法についてはこちらになります。
通常のセーブデータか、システムセーブデータ(ゲーム全体で一つだけのセーブデータ)か扱いがちがうのですが、
今回のようなギャラリー的な機能であれば、システムセーブデータのほうを使う必要があるかと思います。

TIPS拡張で実際に使用しているので、こちらのソースコードを参考にしてください
Utage/Scripts/ADV/Custom/Tips/TipsManagerSystemSave.cs
Utage/Scripts/ADV/Custom/Tips/TipsManager.cs
TIPS拡張自体のサンプルはこちらです。

宴のセーブロードは、UnityのJson機能ができる前に設計されたため、バイナリ読み書きをする仕様になっています。
そのため、書き方が古くて難しいかもしれません。
セーブデータのシリアライズにUnityのJSONを使用したい場合は、
下記のサンプルのようにJSONを文字列としてBinaryReader/Writerで読み書きするとコーディングしやすいと思います。

JSONを使う場合のサンプル(SaveDataクラスのフォーマットは仮。MakeJsonSaveData、ReadJsonSaveDataを定義して実際のセーブデータを読み書きします)
        [Serializable]
        class SaveData
        {
            [Serializable]
            class SaveDataElelment
            {
                public string text;
                public string filePath;
            }
            public List<SaveDataElelment> SaveDataElelments = ();
        }
       
        public void OnWrite(BinaryWriter writer)
        {
            SaveData savdedata = MakeJsonSaveData();
            string json = JsonUtility.ToJson(savdedata);
            writer.Write(json);
        }

        public void OnRead(BinaryReader reader)
        {
            string json = reader.ReadString();
            SaveData savedata = JsonUtility.FromJson<SaveData>(json);
            ReadJsonSaveData(savedata);
        }


これ以外にもパラメーターに任意のStringのパラメーターを追加して、それにJson形式でReadWriteするという手法もあります。


>ローカライズは実現可能でしょうか?
先述したとおり既にローカライズ済みのテキストが取得されています。ほとんどのケースではこれで問題ないかと思います。
取得後に別の言語に切り替えるのは、バックログの情報では不可能です。(これは通常のバックログを言語切り替えできないの同じ理由です)
なので、先述したとおり、シナリオデータやコマンドデータを解析するしかないです。



2025年2月13日木曜日 0:13:41 UTC+9 159516...@gmail.com:

sasa rara

unread,
Feb 14, 2025, 9:34:29 AMFeb 14
to 宴ユーザーグループ
お世話になっております。
  
現在、IAdvSaveDataを継承して保存と読み込みを実装し、
Save画面でデータを保存し、Load画面でデータを読み込むことができることを確認しました。  

しかし、IAdvSystemSaveDataCustomを使用したいのですが、
以下のエラーが発生します。
 VoiceCollectionSystemSaveis not contains IAdvCustomSaveDataIO

mmexport1739543490653.png
この不具合を解決する方法を教えていただけますか? 
 
どうぞよろしくお願いいたします。

2025年2月13日木曜日 0:04:37 UTC+8 マッドネスラボ:

マッドネスラボ

unread,
Feb 14, 2025, 10:01:59 AMFeb 14
to 宴ユーザーグループ
「Custom Save Data Objects」に設定されている「VoiceCollectionSystemSave」を削除してください。
https://madnesslabo.net/utage/?page_id=3086#AdvEngin-2

こちらは、システムセーブデータの拡張(IAdvSystemSaveData)に対応してないのでエラーが出てしまっています。
AdvEngine以下にVoiceCollectionSystemSaveがある場合は自動的にセーブ拡張機能を追加されますので、「Custom Save Data Objects」に設定しなくても大丈夫です。



2025年2月14日金曜日 23:34:29 UTC+9 159516...@gmail.com:
Reply all
Reply to author
Forward
0 new messages