【Unity】Ariadneのダンジョン内のイベント制御について

【Unity】Ariadneのダンジョン内のイベント制御について

todoでございます。

『Ariadne – 3D Dungeon Maker』という3DダンジョンRPGのダンジョン部分を作れるアセットをアセットストアで公開していて、そのイベント制御の部分について紹介を。

3DダンジョンRPGといえばダンジョンを歩き回って探索するのが醍醐味ですが、宝箱を発見したり、ダンジョン内で暮らしている人がいたりと、なにかしらのイベントがあります。Ariadneではこのイベントを実行する機能を実装しており、イベント用スクリプトを作ることで任意のイベントをカスタマイズすることができます。

どのスクリプトを呼ぶかは専用のエディタウィンドウで設定できるので、柔軟に切り替えができるようになっています。

 

 

Ariadne – 3D Dungeon Makerとは

『Ariadne – 3D Dungeon Maker』は私が作ったEditor拡張系、システム/テンプレートのアセットで、3DダンジョンRPGのダンジョン部分を作ることができるものです。

RPG部分(敵との戦闘など)については他のアセットもあるのでそちらと統合してもらうことを想定していて、このアセットでは3DダンジョンRPGの舞台として使う3Dダンジョンの生成や移動の制御、ダンジョン内のイベントの制御を行っています。

RPGのシステム部分は開発者のオリジナリティも発揮される部分でもあるので、現段階ではアセットに含めていませんが、いずれはそこまでカバーしてこのアセットだけでも3DダンジョンRPGのシステムを作れるようにしたいと考えています。

元々このアセットを作り始めた理由としては、3DダンジョンRPGが好きだから、というそのまんまな理由です(笑)

3DダンジョンRPGを作りたいなーと思っている人にこのアセットを使ってもらって、楽しい3DダンジョンRPGを作ってもらってそれを遊ぶという野望もあります。

どんな感じのシーンが作れるかについては、以下のページからデモシーンを遊んでみてください。

このシーンはサンプルとして同梱している素材を使っていますが、ダンジョンのパーツを切り替えることでオリジナルのダンジョンを作成できます。アセットストアにある建物の3Dモデルを使って3DダンジョンRPGの舞台を作ることもできるので、素材を手に入れればいくらでもあなたオリジナルのダンジョンを作ることができます。

 

1.5.0にバージョンアップしたテンションで書いた記事がこちら。

 

Ariadneのイベントについて

Ariadneでは以下のようにマップを作成し、それをゲーム実行時にインスタンス化しています。

地図上の位置
地図上の位置

 

ここで、階段オブジェクトや宝箱オブジェクトに隣接したときに、なんらかのイベントを発生させたいところです。例えば階段だったら別のフロアに移動させたいですし、宝箱だったら中身を取り出すイベントを発生させたいです。

Ariadneでは各マスでイベントを設定できます。マップ情報として壁や床などの属性を持っていますが、これに加えてどのイベントを実行するかの情報も保持しています。

上のマップではマスの左上に赤い付箋のようなマークが表示されている部分がありますが、この場所にイベントが設定されています。ひとつのマスで一通りの動きしかできないとちょっと柔軟性に欠けるので、条件によって実行するイベントを切り替えることができるようになっています。

例えば宝箱の中身を取得していないなら中身を取り出す処理、取り出した後は「空だよー」とメッセージを表示する処理、といった感じで条件に応じて処理を切り替える機能を実装しています。また、その条件に応じた処理の流れを設定することができて、宝箱が開くアニメーション、アニメーションのウェイト処理、メッセージの表示、アイテムの入手処理、といった感じで処理のパーツを組み合わせて連続的に実行できます。

 

イベントデータの構造

イベントデータは以下のような構造になっています。ScriptableObjectなのでインスペクターウィンドウでも中身を確認できちゃいますが、基本はEventEditorという専用のエディタを使って編集します。

 

EventMasterData

EventMasterDataはイベントに関するデータを保持するファイルです。このデータはダンジョン内の1つのマスにつき1つセットすることができます。

EventMasterDataはEventPartsと呼ばれるイベントのパーツデータを複数持つことができます。これらのEventPartsではどのEventPartsを実行するかの条件を設定することができます。

 

EventParts

EventPartsはどのイベントプロセスを実行するかの条件を保持しているデータです。

該当のマスに関連づけられたEventMasterDataがある場合、その中に含まれるEventPartsを確認して条件を満たしているパーツがあればイベントプロセスを実行します。

このプロセスはEventProcessDataという単位で定義されており、リスト形式で保持することができます。

 

EventProcessData

EventProcessDataはイベントの処理を行う単位で、スクリプトを使用してイベントの動作を定義します。

各EventProcessDataではひとつのイベントカテゴリーが設定されています。イベントカテゴリーでは対応するイベントスクリプトの設定や、引数の型の定義を行うことができ、EventEditor内で引数の値を設定することができます。

 

イメージだと

これらの構造をイメージにすると、EventMasterDataが1冊の本で、マップ上の各マスに1冊置かれているとします。この本を開くといくつかのページ(EventParts)があって、条件に一致したページを読むようになっています。そのページに書かれている内容がEventProcessDataで、処理がいくつか書かれています。

EventPartsはEventPageに変えた方がイメージが湧くかな? とも思いましたが、以前のバージョンの名残でそのままの名前を使っています。

 

イベントを編集するEventEditor

イベントを編集する際はEventEditorという専用のエディタを使います。

 

EventEditor
EventEditor

 

EventMasterDataの中ではEventPartsをリスト形式で持っており、左側の領域ではEventPartsを増やしたり入れ替えたりします。中身を編集したいパーツの [Edit] ボタンをクリックすることで右側の領域で編集を行うことができます。

右側の領域ではこのEventPartsを実行するための条件を設定します。フラグだったり、アイテムや所持金の数で条件を設定できて、さらにどうやってイベントを開始するかも決められます。イベントを実行したいマスに入ったときに実行したり、あるいはキーを押したら実行したりと、イベントに応じて決めることができます。

右下の水色になっている部分がEventProcessDataです。画像ではEventProcessDataがひとつだけですが、こちらもリスト形式でデータを保持していて複数の処理を設定することができます。EventProcessDataではEventCategory(イベントカテゴリー)を選択することで、どのイベントスクリプトを実行するか決めています。カテゴリーごとに引数を決めることができるので、例えば画像のメッセージを表示するイベントならその表示内容を入力することができます。

こうしたイベントを組み合わせていってダンジョン内でのワクワク感を高めていけることを目指しています。

個々のイベントについて、実際の処理内容を書く場合はイベント用スクリプトを作成してEventCategoryEditorで設定します。こちらについては以下の記事でも触れています。

 

まとめ

このページでは『Ariadne – 3D Dungeon Maker』でダンジョン内のイベントをどのように制御しているかを紹介しました。

実際にイベントが実行されている様子はデモシーンから確認できるので良かったらこちらもご覧くださいな。

 

     

ゲーム開発の攻略チャートを作りました!

CTA-IMAGE

「ゲームを作ってみたいけど、何から手を付けていいか分からない!」


そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験を中心に、ゲーム作りの手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。


ゲームを作り始めた時にぶつかる壁である「何をしたら良いのか分からない」という悩みを吹き飛ばしましょう!