Unityでシナリオの記載されているGoogleSheetからシナリオデータとVOICEVOXを使ってキャラボイスを自動更新を行う
概要
MidraLabで作成した ひと時の旅の物語を5分で楽しめるビジュアルノベル 「Meow the mule」を公開した。
今回の制作ではシナリオ管理はGoogle Sheetで行い、VOICEVOXを用いてキャラクターのボイスを自動生成しています。
今回の制作では、Unityでのシナリオの更新及びキャラボイスの更新を自動化を行いました。Google Sheetでキャラセリフが管理されている場合に、UnityとGoogle SheetおよびVOICEVOXを連携してシナリオおよびキャラボイスの自動更新を行う連携を行いました。
連携した内容の紹介を行います!
MiraLabでは インディーズゲーム向け ADVフレームワーク「easy-adv-framework」を作成しています。今後フレームワークにして公開する予定ですので、公開時には是非ご利用ください。
制作環境
デモ
全体の処理の流れは以下の通りです。
解決した課題
- ADVでのシナリオデータの管理
- Unityでのシナリオデータの更新及びキャラボイス管理の工数
- シナリオライターとエンジニアのコミュニケーションコスト
全体の制作の流れ
実際にどのような制作フローを行ったのかを説明していきます。実装の詳細は省きますので、ご了承ください
(フレームワーク公開時に説明させていただきます)
1. Google Sheetでシナリオデータを作成
まずは以下のようにシナリオライターの方に Google Sheetにシナリオデータを記載していただきます。
このときに、以下のように使用する画像や音声ファイルを特定のフォルダに入れることで、プルダウンから選択できるようになっています。
この際にプルダウンは特定のフォルダからファイル一覧を以下のように取得してプルダウンの項目を更新できるようにしています。
これによって素材ファイルをアップロードする人とシナリオデータを書く人がお互いのコミュニケーションコストを下げることができます。
function UpdateAllPulldownValues(){
const sheet = SpreadsheetApp.getActiveSpreadsheet();
UpdatePulldownValues(sheet,characterImageFolder,'D2:D100')
UpdatePulldownValues(sheet,backgroundImageFolder,'E2:E100')
UpdatePulldownValues(sheet,soundFolder,'F2:F100')
}
function UpdatePulldownValues(sheet,folderId,range){
let fileName = GetAllFiles(folderId);
//入力規則を作成
const rule = SpreadsheetApp.newDataValidation().requireValueInList(fileName).build();
//リストをセットするセル範囲を取得
const cell = sheet.getRange(range);
//セルに入力規則をセット
cell.setDataValidation(rule);
}
function GetAllFiles(folderId){
let folder = DriveApp.getFolderById(folderId);
let files = folder.getFiles();
let fileNames = []
while(files.hasNext()){
var file = files.next();
fileNames.push([file.getName()])
}
console.log(fileNames)
return fileNames;
}
2. Unityでシナリオデータを更新
シナリオの更新は UpdateScenarioFromGoogleSheet
スクリプトを特定のオブジェクトにアタッチして、Inspectorのボタンを押すことで実行することができます。
Unity側でのシナリオ実装には Fungusを使用しているため、更新後は以下のようにFungusのFlowchart内にシナリオデータが反映されます。
3. Unityでキャラボイスの更新
Unityでシナリオデータを更新時にキャラボイスも自動でセリフデータに基づいて、更新できるようにしています。
キャラボイスの生成には、VOICEVOXをローカルで立ち上げてAPI経由で文字列から音声を取得しています。
この際にFlowchart内の各セリフコンポーネントと音声データが以下のように紐づくように処理を行っています
おわりに
インディーズゲームでは時間と人が足りない中で、ゲームの制作を行うことが多いと思います。そのため、より効率的に簡単に制作できるワークフローを作っていければと考えています。
これからいくつかコミュニティ内でワークフローを検証しつつより使いやすいフレームワークを作成を行っていきます。
midra-lab.notion.site/MidraLab-dd08b86fba4e4041a14e09a1d36f36ae 個人が興味を持ったこと × チームで面白いものや興味を持ったものを試していくコミュニティ
Discussion