作りやすくて、なんでもできて、翻訳にも対応してて……理想のイベント処理探求「Near The Sun」制作記#19
15期のドッグウッドと申します。
今回は「Near The Sun」におけるイベントシーンの作り方について話します。
2Dアクションにおけるイベントシーン。
作り方をどのように設計するのが良いでしょうか。

作成の準備に手間がかからず、できることに制限を設けないで手直しが簡単でなければなりません。
「Near The Sun」では次のように作成しています。
まずはイベントシーンへの入り方。
1.シーンがロードされた時
2.プレイヤーがWキーでインタラクションした時
3.プレイヤーが特定の領域に入った時
の3つが用意されています。
そして、イベントシーンに入るとメニューが開けなくなり、プレイヤーの動作が出来なくなり、エネルギー残量が最大になります。
そして、会話はインスペクター上で2つのリストに入力することで作成できます。(翻訳のことを考えるとcsv読み込みの方がいいのですが……csv読み込みの切り替えは最後にまとめて行うことを考えています。いちいちcsvファイルを作るのは大変なので。)
基本的にはこれだけです。
オブジェクトにコライダーとスクリプトをつけて、会話と話者を書き込む。単純ですね。
ビジュアルノベル時の機能とは違い、立ち絵を出す機能はデフォルトでついていません。(無理やり出すことはできますが)
しかし、会話のみのイベントを作成することはほとんどありません。音を鳴らしたり、アニメーションを進めたりなどをする必要があります。
それはこちらの機能で行なっています。

下のEvent int Listはイベントが起こるタイミング、上のLineEventsは起こるイベントの内容を示します。
例えばこの場合、「1」つ目のメッセージでEnterが押された瞬間、Event int ListのElement1が「1」になっているので、LineEventsのElement1が起こります。
実装は簡単で、以下の関数をcallbackとしてEnterが押された時に呼んでいるだけです。

これによって、Enterが押されてた瞬間を基準として好きなイベントを起こすことができるようになります。
それでは、よく使うイベントを紹介します。(コンポーネントのenabledとかSetActiveとかの既存のイベントは省略します。)
・ChangeCam.Change(int id)
本プロジェクトではCinemachineを使っています。VirtualCameraのリストを保持し、リスト内のPriorityを制御して特定のVirtualCameraに切り替える関数です。

・ChangeBlendTime.SetBlendTime(float duration)
Cinemachineのblendtimeを設定します。よくカメラ切り替えと同時に設定します。(VirtualCameraのブレンド方式を変更する関数もたまに使います。)
・SimpleMessage.WaitSec(float time)
指定の秒数だけ待った後次のメッセージを表示します。アニメーションを流している間待つのに使います。
・SimpleMessage.TextTmpUnVisible()
次のメッセージまでテキストボックスを非表示にします。
・ChangeAnimatorState.ChangeStateWithId(int id)
あらかじめ指定されたAnimatorのInt型パラメータの数値を設定します。
・LateUnityEvent.Play()
指定秒数後にEventを起こします。
・ImpulseSourceManager.GenerateImpulsewithForce(float force)
画面を揺らします。
・PlaySE.PlaywithClip(AudioClip clip)
SEを再生します。
・FadeController.StartBlackout/FinishBlackout(float duration)
画面の暗転/明転を行います。
・WarpController.Warp()
主人公の位置を移動させます。
正直、これらの機能があれば大抵のイベントシーンは作成できます。
あとはパーティクルの再生、Timelineの再生くらいですが既存の関数が用意されているのでありがたいです。
現在のイベントの作成方法にはかなり満足しているのですが、一つ不満点を挙げるとすれば、複雑な処理をしたくなったときにインスペクターが長くなってしまうことですね。各Elementで折りたたみをしたい……。
他のプロジェクトだとイベントの作成ってどうやっているんでしょうか?
次はマップ機能について考えたことを話します。