【かめふぃ】が語るハンカクの世界
犯罪者隔離世界へようこそ。
【制作チームが語るハンカクの世界】vol.4です!
本日はエンジニアのかめふぃさんに記事を書いていただきました。
かめふぃさんは、1~12話全話を通じてADVの総監督を務めてくださっています。また、5話・9話のミニゲームも担当してくださいました。
それではどうぞ。
***************
はじめまして。かめふぃです。
本作品のADVやシステム基盤周り、今後公開される5話と9話のミニゲームを担当しています。
今回、本作品の執筆の機会を頂きましたので
自己紹介やきっかけを始め、エンジニア視点でのノベルパートやそれに関する実装したことや工夫したことなどを軽く紹介していこうと思います。
自己紹介
改めて、本記事を書いているかめふぃです。
趣味でunity1weekというゲームジャムで1週間でゲームを作ったり、ゲームアプリを開発してストアで配信しています。
きっかけ
とあるコミュニティで開かれた自己紹介LTがきっかけでした。
それは簡単にいうと「10分で自己紹介や自分の好きなことを発表しよう」というものでして、それに主催のあざみさんが登壇されていました。
そこであざみさんがチーム開発をやっていることを知ることになります。
どうやらその企画ではミニゲームのエンジニアも募集しているとのことでした。
前々から「誰かと一緒にゲーム作ってみたいな〜」とぼんやり思っていたのもあって「チーム開発気になるな〜」と呟いたんです。
するとどうでしょう。
あざみさんから「興味があるようでしたら是非!」という旨のDMを受け、参画することになりました。
使ったツールについて
本作品は「Unity」というゲームエンジンを使用しています。
ゲームに詳しい方なら、一度は聞いたことがあるかも知れません。
それに加えて、
Unity向けのビジュアルノベルツール「宴」というものを使っています。
このツールの特徴としてエクセルでノベルパートを実装できることです。
もちろん、立ち絵や音声などの設定は必要とはなりますが、一度設定を済ませてしまえば、
話者名やセリフテキストを入れるだけでノベルパートが実装できる便利なツールとなってます。
同期させる仕組み
本プロジェクトはGitというバージョン管理システムを使って管理しています。
これにより、複数人で同時並行に作業をすることができます。
もし同じファイルを編集してしまった場合は、
「ここの行はA側を採用してここの行はBを採用する」と言ったことを自動または手動で行うことで2つの作業を混ぜることで解決していきます。
難しそうに聞こえますが、本プロジェクトでは作業領域が極力被らないように作業分担しているので作業がぶつかってしまうことはあまりないわけです。
1つ問題点が…
ただ、ここで厄介なのがテキストファイル以外が競合してしまった時です!
そう、エクセルファイルが競合してしまった場合です。
宴のノベルの作成はエクセルファイルで使われるため、エクセルファイルが競合してしまうと2つの作業を混ぜるのが大変なのです……。(便利がゆえの代償)
Google Spreadsheetに移してみた
これを解決するためにエクセルファイルをクラウド上で扱える「Google Spreadsheet」を採用しました。
Googleドライブに宴のエクセルファイルをアップロードし、いつでも編集できる上に常に最新が保つようにしました。
ただ、このままではUnity側に反映するたびにGoogleドライブからダウンロードしてUnityに入れて、エクセルファイルを宴のシナリオビルドにかけて、Gitにコミットして……と反映するのになかなか面倒になってしまいます。
Unity側の更新ツール
先述の問題を解決するためにUnity側にツールを新規で作りました!
設定ツールウィンドウにて、各種URLや更新したいエクセルを指定する設定ウィンドウを実装しました。
その設定データをもとに各種URLからエクセルをダウンロードし、
Unity Project内のエクセルを自動で更新するようにしました。
仮にGitにて、複数のブランチで同じエクセルを編集し競合したとしても、
その場では片方を採用、このツールでGoogleドライブ上のシナリオデータをプロジェクト側に反映し、再ビルドすれば競合を簡単に解決できるようになりました。
(あくまでGoogleドライブ上のエクセルが正という前提)
歩行パート
このゲームには「自由に歩行するパート」があります。
大きく分けて「ノベルパート」と「自由にキャラクターを操作できるパート」があり、これらをシームレスに繋ぐために宴のシナリオを一旦終了させ、それをコード側で検知してキャラクター操作を可能な状態にしています。
歩行パートで会話など次の会話パートが発生した時にまた宴側に対して、「このラベルから開始」という命令を送ることで各パートを行き来できるようにしています。
プレイヤーが操作する「歩行パート」では、 Rigidbodyベースで座標移動していて、壁に当たるとそれ以上進めなくしています。
また、移動に伴ったキャラクターへのカメラ追従は、CinemachineのVirtualCameraのFollowで追従させつつ、画面外が見えないようにCinemachine Confinerを使った制御なども行っています。
演出
本ゲームのノベルパート中は、手前でキャラクターの立ち絵があり、その後ろでドット絵が動きリアクションをさせる演出が組み込まれています。
キャラクターの移動や場面が変わったりなど様々な演出がノベルと並行して行われます。
これを実現するにはいくつか方法がありいくつか検討しました。
案1. 宴を使ったアニメーション
最初に案として上がったのが「宴のアニメーション機能」です。
立ち絵キャラクターを動かす要領でキャラクター毎の掛け合いもやってしまう方法です。
こちらはやろうと思えば可能ではありますが、
キャラクターの移動やカメラの移動、効果音やエフェクトなど多数のものを同時または並行して動かす必要があり、それらの各パラメータを1つ1つエクセルに全て記述していかなければならないのでとても大変です。
また、エクセル側の記述が会話の間に大量のアニメーションコマンドが乱立することが予想されます。
以上の理由からこの案は見送ることにしました。
案2. Unity Timeline
次に紹介するのが採用した方法で「Unity Timeline」を使う方法です。
UnityのTimelineは、キャラクター等のアニメーションやカメラの演出、効果音やBGMなどの音声も再生できます。
Unityで「こういった演出」を組むのにはとても適していました。
Animatorに既に組み込んでいるアニメーションも再生可能なので再利用性も高くとても便利に思いました。
まとめ
ADVの開発に関して、演出などを組むあざみさんから「こういうことがしたい」というのを元に組み立てていき、フィードバックをもらいつつ改修……というのを繰り返して今の仕組みができました。
使わないであろう不要な機能は極力減らしつつ、
シンプルに要件を満たせるようにADV実装できて良かったです。
「あざみさんの必要な要件の洗い出し」や「指示の的確さ」のお陰だと思います。
また、この記事を書いてる時点では次回のアップデートに向けて絶賛開発中です!
僕の担当している分のミニゲームも開発中なので引き続き、がんばっていきたいと思います。
以上、かめふぃでした。