『RPG Developer Bakin』のマップでアクションRPGみたいな挙動を実現する

目次

概要

RPG Developer Bakin (以下Bakinと呼称)はHD-2DなRPGを制作することができるゲームエンジン(公式ではRPG制作ツールと記載されている)です。

競合ソフトウェアにRPGツクールシリーズがあります。使い方もかなり似ているためツクールシリーズを触ったことがあるならあまり戸惑わないかと思います。

ツクールシリーズは基本的には2Dのゲームしか制作できないですが、Bakinは2Dと3Dどちらのゲームも制作可能なのが強みです。

それぞれのツールの細かい話は置いておき…この記事では私自身の備忘録も兼ねてBakinでアクションRPGみたいな挙動を実現する方法の考え方の1つを書いておこうと思います。

このBakinなのですが、ツクールシリーズにはない謎の強みがあります。それはマップ上でジャンプが可能なことです。

ジャンプ

こんな感じですね。なぜジャンプする必要が?という疑問はさておきこの機能があるせいかアクションゲームを作ろうとする動きが活発です。

実際にアーリーアクセスから1年経ち既にいくつかBakin製のアクションゲームもリリースされているみたいです。興味がある方はぜひ調べてみてください。

表題にあるアクションRPGみたいな挙動に関してはこの記事では以下のような挙動のことを示します。

  • マップ上でジャンプできる
  • マップ上でボタンを押下するとプレイヤーの攻撃モーションが表示される
  • 攻撃モーションが敵にあたると敵がダメージを受ける
  • 敵のHPが0になったら敵が消滅する

上記挙動を実現する方法は調べれば出てくるのですが…意外と文章というか記事形式でノウハウが引っ掛からなかったりするので私なりに見つけた方法を書いておこうと思います。

動作は rev.1.5.0.7.r59092 で確認しています。Bakinはまだアーリーアクセスの段階なのでこの記事にある方法が使えなくなる可能性があり、アクションゲームの実現方法は1つではないのでこの記事のノウハウは参考程度に留めて頂けると助かります。

基本操作とチュートリアルについて

偉そうなことを記事にしていますが私も実際のところゲーム制作は素人です。この記事の内容もどこまで使えるのか自信はまったくないです。そもそもゲーム完成させたことないし…

ソフトウェアの操作方法やBakinでの本来のゲーム制作の流れは公式で解説があるのでそちらを視聴、あるいは一読しておくことをお勧めします。この後の解説でこいつ何言ってんだ?みたいなことが多々あると思うので下記資料を参考に脳内補完してください。

プロジェクト作成

実際に挙動の作成方法を説明するためにプロジェクトの作成から始めます。とりあえず以下のキャプチャの手順と設定でプロジェクトを作成します。

プロジェクトの基本

新規作成からプロジェクトを作成します。項目は適当に埋めてください。

最初から入っているアセットの量

とりあえずアセットがある程度追加済みのノーマルを選択します。

プレイヤーの設定

これは一旦何も設定しなくて良いです。

カメラの設定

これは作りたいゲームによりますが、とりあえずはプレイヤー中央視点で良いと思います。

操作方法

これも上操作視点で良いでしょう。

アクションの設定

ジャンプ挙動は必要なのでジャンプありで設定します。

プロジェクト作成完了 初期地形選択ダイアログボックス

「ゲームの編集をはじめる」をクリックするとダイアログが出ます。この記事では平らな地形を選択しています。

初期画面

編集開始時はこのような状態になっているかと思います。このままだとテストプレイ時にプレイヤーが表示されないため何かしら設定します。

データベースをクリック プレイヤー(hero)のキャストを選択 移動用グラフィックにスプライトを設定 設定が確認出来たら完了 テストプレイで確認

キャプチャの順で操作して何も設定されていないプレイヤー(hero)に移動用グラフィックを設定します。

グラフィックはデフォルト設定でプロジェクトを作成していれば「reserved」フォルダにヒーローキャストのグラフィックがあるのでそれを選択して適当なモーションを設定すればプレイヤーが表示されます。

テストプレイを実行して操作できればゲーム制作の準備完了です!

テストプレイ

Bakinではゲームの挙動制御はすべてイベントで実装されます。イベントと呼ばれていますがつまるところプログラミングです。イベントは実行タイミングを制御可能でマップ上にイベント単独で設置することもできます。また関数のようにイベントからイベントを呼び出すことも可能です。

キャストとはそのイベントにグラフィックであったり設定項目(属性)が追加されたものだと考えて良いと思います。イベントをキャストにすることでデータベースに登録されるためイベントの動的な生成が可能になります。

キャスト≒イベントと考えて差し支えないかと思います。

そしてゲームで大抵使うイベント挙動やキャストはスタンプとして用意されています。スタンプとは公式Wiki曰く下記の通りの説明です。

  • 「スタンプ」とは、モデル、モーション、マテリアルなどの素材をゲーム内で使用するために一つに組み合わせたものです。

スタンプとして登録されることでキャストをマップに張り付けることが可能になります。

この先の説明のためにBakinの仕様概念の最低限の説明を記載させて頂きました。詳しくは公式Wikiを読んで頂ければ良いと思います。

攻撃の実装

ここからアクションを実装します。アクションもイベントの組み合わせによって実装を実現します。

先ほど、スタンプをマップに張り付けてゲームを制作するとありましたが…ある程度あらかじめイベントを配置することでゲームを実現するRPGと異なりアクションはイベントを動的、つまりプレイヤーの入力挙動に合わせて実行する必要があります。

例えばですが、特定の位置だけで剣を振るみたいな挙動で良ければ宝箱を開く挙動のイベントを応用すれば良いだけだったりしますがそれだとアクションゲームとまでは言えません…プレイヤーの位置も敵の位置も常に変わり攻撃するモーションを行って攻撃が敵に当たればダメージが入る、そういった挙動を実現するにはさすがに自前で実装する必要があります。

敵の配置

まずは敵を1体配置しておきましょう。キャプチャの青枠を付けた個所を選択してマップに何でも良いので配置します。

テストプレイで敵が表示されていれば良いです。この時点では表示されているだけです。

(ちなみにゴブリンを設置した場合プレイヤーが触れただけでゲームオーバーになるかと思いますが正常な挙動です。1

攻撃起点キャストの作成と発射ボタンの割り当て

攻撃起点キャストを作成

まずはデータベースから新規キャストをキャプチャの手順で作成してください。

続いて作成した新規イベントの設定を行います。

攻撃起点キャストの設定1 攻撃起点キャストの設定2

「基本タブ」を選択して、キャスト名を変更したら種別設定をなしに設定します。グラフィックの設定は必要ありません。 「その他」タブを選択して、図鑑登録を無効に設定します。

この作成したキャストを使用してアクションRPGでの攻撃を実現します。

ルールと操作を開く ルールと操作

続いてゲーム定義から「ルールと操作」のダイアログを開いてください。

「イベントの発射(動的生成)」の項目に先ほど作成したキャストをすべて設定します。どのキーを押下しても同じキャストを動的に生成して射出させます。

これだと攻撃の種別を切り分けられないのでは?と思うかもしれませんが、先ほど作成したキャストにカスタムイベントを設定してそこで判定を行うので同じキャストで問題ありません。

発射ボタンのキー割り当てを変更したい場合は入力デバイスの割り当てのコードをカスタマイズしてください。

どのキーがどういう文字列で定義されているのかは以下を参考にすると良いと思います。

入力キーの受付イベントの作成

続いて入力キーを受け付ける共通イベントを作成します。入力キーとはたとえばゲームパッドでの〇×△□やL2、R2ボタン等の事です。

これらの入力を受け取りそれに応じたアクションを実行できればアクションRPGみたいなはずです。先ほど、イベントの発射でそれぞれの発射ボタンに対してキャストを設定しました。キャストをボタンの種類ごとに作成して処理を切り分ける方法もありますがこの記事の方法ではどの発射ボタンを押下しても生成するキャストは同じです。

別途、どのキーが押されたかを取得する共通イベントを作成し、そのイベントから取得できた値を使用して処理を分岐させます。

共通イベントからのカスタムイベントの作成

キー入力を受け付けるイベントはコモンイベントで作成します。

コモンイベントとは、通常のイベントと異なりマップに配置しません。別のイベントから呼び出したりゲーム開始時に自動的に実行させることを目的としたイベントです。

コモンという名称から推察される通りどのマップからも呼び出すことが可能なためゲーム全体の初期化処理や、どういう状況でも受け付けて欲しいようなキー入力のようなイベントを処理するのに適しています。

ある程度、テンプレートが用意されていますがここでは新規にカスタムイベントで作成します。

カスタムイベントパネル

カスタムイベントパネルが開きます。このキャプチャではすでに処理がありますが新規作成時は何も処理はないはずです。

イベントの開始条件を「自動的に開始(並列して繰り返し実行)」に設定します。

入力されたアクションキーを取得する処理を記述

「複雑な変数ボックスの操作」処理を使い、プレイヤーが入力したアクションキーの値を取得する処理を追加します。

コマンドセレクタ

処理は+ボタンをクリックすると、コマンドセレクタが開くのでそこから該当のコマンドを探してください。この先はどのコマンドがどこにあるかは解説しないのでイベントを組む際にコマンドを探す場合はWikiで探すと良いです。

変数ボックス

変数ボックスから変数を新規作成することが可能です。変数の名前は適宜適した名前で作成しましょう。日本語でも大丈夫です。

アクションキー1、アクションキー2、アクションキー3の入力を変数に代入する処理を作成したコモンイベントに記述できれば適用をクリックしてください。

攻撃キャストの作成と攻撃種別の判定

プレイヤーがゲーム実行中に入力した発射キーを受け付ける処理は作成できました。続いて、押したボタンごとの攻撃をキャストで作成します。

攻撃キャスト設定1 攻撃キャスト設定2

キャストの作成方法は攻撃起点キャストの作成と発射ボタンの割り当てと同じです。設定する項目が違う部分があるので注意してください。

「イベントの消滅条件」を以下のように設定してください。

  • 「経過時間」は0.5
  • 「「種別指定なし」イベントとの衝突」は有効
  • 「敵と衝突」は有効
  • 「画面外に出た時」は有効
  • それ以外は無効

攻撃キャストを作成することができたら続いて攻撃起点キャストにカスタムイベントを設定します。

キャストへカスタムイベントの設定 攻撃起点キャストのカスタムイベント

キャストにある「カスタムイベントを設定…」をクリックすると入力キーの受付イベントの作成と同様のイベントパネルが開きます。ここに入力キーに応じて攻撃種別を切り替えるイベントを組み立てます。

入力キーの受付イベントの作成で作成したコモンイベントがゲーム開始と同時に動き続けます。プレイヤーが発射ボタンに応じたキーを押すと、それに対応した変数に1の値を代入します。該当のコモンイベントは常に並列して繰り返し実行されているため押されていないキーの変数は常に0が入ります。

押された瞬間は変数に1が入るのと攻撃起点のイベントはルールと操作で設定したようにどの発射ボタンを押されても生成されるので生成時は押された瞬間とほぼ一致する2のでその値でどの発射ボタンを押されたか判別が可能になります。

では、キャプチャを参考に攻撃種別判別イベントを組んでみてください。注意点は以下の通りです。

  • イベント開始条件は「自動的に開始(並列して1回だけ実行)」を選択する
  • 処理の終了直前にイベントを削除するコマンドを追加する

攻撃表現の表示

ここまで作成できると攻撃の射出自体は既にできるようになっているはずです。ですがこのままだとキーを押されてもプレイヤーが何も変わらないため見た目では何も起きていない状態になります。デバッグプレイで試してみてください。

ということでキーを押されたら剣を振るようにします。

変数初期化のコモンイベント

まずはキャプチャを参考にゲーム開始時に変数を初期化するコモンイベントを作成してください。

剣を振る動作を行うとき見た目を制御するために待機時間を格納する変数を作成して代入します。

剣を振るモーションのコモンイベント

もう1つコモンイベントをキャプチャを参考に新規作成してください。組むイベントもキャプチャを参考にしてください。ポイントは以下の通りです。

  • このコモンイベントは他のイベントから呼び出したいので開始条件を「開始条件なし(他のイベントから実行)」にすること

この2つのコモンイベントを作成したら、攻撃キャストのカスタムイベントを開いてください。

攻撃キャストのカスタムイベント

キャプチャを参考にイベントを組んでください。ポイントは以下の通りです。

  • イベント開始条件は「自動的に開始(並列して1回だけ実行)」を選択する
  • 当たり判定を行う際にどの攻撃が当たったかを判別したいので攻撃キャスト名を変数へ代入しておく
  • 作成したモーションの処理があるコモンイベントを呼び出す
    • 呼び出したコモンイベントの処理が終わるまで待機する必要はなし

テストプレイでのコリジョンを表示

恐らくここまで実装出来たら剣を振るモーションが実現できていると思います。テストプレイをしてみましょう。

剣を振る

発射ボタンを押したら剣を振るモーションが表示されればOKです!

コリジョンの表示

キャプチャにある「コリジョン表示」から「プレイヤーとイベント」をクリックしてください。

剣を振る(コリジョン表示)

剣を振るとイベントが射出できるのが確認できます。

この射出されたイベントが敵のイベントと接触した際にダメージが入るようにすればアクションRPGみたいな挙動を実装できます。

ここまででプレイヤー側の挙動の実装は完了です。

当たり判定の実装

続いて攻撃が敵に当たったどうかを判定して当たっている場合は敵にダメージが入る処理の実装に移ります。

ダメージ計算

まずは当たり判定側で使用するコモンイベントを作成します。

ダメージ計算のコモンイベント

攻撃が当たった際に敵に与えるダメージを計算して変数へ格納するコモンイベントです。他のイベントから呼び出せるよう「開始条件なし(他のイベントから実行)」を設定してください。

今回はとりあえず固定値を用意しています。実際にはコマンドセレクタからキャストの防御力やプレイヤーの攻撃力を取得可能なためそれらの値を組み合わせてダメージを算出したものを変数へ格納すると良いでしょう。

当たり判定

いよいよ大詰めです。当たり判定を実装します。

ローカル変数の初期化

私は今回ゴブリンの敵キャストをマップに配置したのでゴブリンのキャストを選択していますが他の物を選んでいる場合はそのキャストのカスタムイベントを開いてください。

まずは通常のカスタムイベントのシートの他にもう1つ並列実行されるシートをキャプチャを参考に追加してください。

追加されたシートにローカル変数にイベントの現在のHPを代入するコマンドを追加します。イベントの開始条件は「生成時(並列して実行)」を選択します。

ローカル変数はイベント内のみで参照可能な変数です。今まで作成した変数は他のイベントからも参照可能ですが、ここで作成した変数はこのイベントのみから参照できます。

ローカル変数の追加

変数ボックスからローカルタブを選択して新規追加することでローカル変数を作成可能です。

ローカル変数を使用することで、このゴブリンのキャストを例えば10体配置したとしてもそれぞれのイベントが個別にHPを保持する変数を持つことになり互いに干渉しないです。つまりゴブリンAに攻撃を当てたらゴブリンAのみのHPを減らすことができます。

ゴブリンのキャストとカスタムイベント

デフォルトであるシートに処理コマンドを追加します。開始条件は「自動的に開始(並列して繰り返し実行)」を選択します。

衝突判定方法は「接触状態の確認」コマンドを使用します。このコマンドはイベント同士が接触すると条件分岐で「はい」のブロックに進み、ついでに接触したイベントの名前も取得できます。

接触が確認出来たら接触したイベントがどの攻撃種別なのかを判定します。これは「文字列変数の確認」コマンドで行います。

攻撃表現の表示で攻撃キャストのカスタムイベントで変数に攻撃の名称を代入していました。その変数と比較することでどの攻撃を受けたかを判別できます。

これにより例えば弱攻撃を受けた時のエフェクトとダメージ量、強攻撃を受けた時のエフェクトとダメージ量のような感じで処理を切り分けることができます。

ダメージ量の表示

せっかくダメージを与えたら与えたダメージ量を表示したいですよね。参考までにキャプチャに載せてあります。他にも色々な方法があると思います。

敵の消失

敵のHPが0になったら敵を消失させましょう。

敵の消失

接触の確認と攻撃種別が判定出来たらダメージ計算のコモンイベントを呼び出しダメージ量を取得したあと、先ほどローカル変数に代入したHPからダメージ量を引きます。これにより当たり判定の実装になります。

そしてローカル変数のHPが0以下になったことを「変数ボックスの確認」コマンドで確認して「はい」の場合に「イベントの消失」コマンドでイベントを削除することでマップからキャストが消失します。

実際に攻撃を受けた際のエフェクトやSEはお好みに合わせて処理を追加してください。センスが問われる個所なのでこの記事では深く言及しません。

テストプレイ

ここまで実装出来たらほぼ実装完了です!とりあえずこの状態でテストプレイしてみましょう。

テストプレイ

容量を落としたGIFなのでこの画像だとダメージ表示が見えませんがこんな感じです。操作性も悪く課題は多いですが考え方としては実装出来ていると…

最後に修正を加えてほんの少しだけアクションRPGみたいにしてみます。

敵のHP

まず敵キャストのHPを20に変更します。

敵の移動設定1 敵の移動設定2

敵の移動設定です。倒されたときは移動を停止して消失します。キャプチャを参考に実装してみてください。

敵を複数配置

実装出来たら敵を複数配置します。

複数の敵配置でテストプレイ1 複数の敵配置でテストプレイ2

どうでしょうか?完ぺきとは全然言えませんが…とりあえず概要に記載した仕様は満たせた気がします!

まとめ

エフェクトだったり、攻撃のタイミングや当たり判定のタイミング、見た目の課題は非常に多いもののBakinを使ってマップでアクションRPGみたいなことを行う方法の1つの参考にしてください。

プレイヤー→敵が実装出来ているので敵→プレイヤーも同じ要領で実装可能なはずです。要はイベントの射出が敵の場合は何かしらの条件になるということです。攻撃種別を増やす方法もキャストを作成することで可能です。

RPG Developer BakinはあくまでRPGを制作するソフトウェアであるためやはりアクションゲームを制作するとなるとどうしても標準機能の組み合わせのみだと難しい場面が多いです。ですがツクールシリーズにも言えることですが思わぬ発想で様々な機能の実装を行っているゲーム例もたくさんあるので面白いネタを思いついたらまた記事にしようと思います。

補足

質問に対する回答

現在のHPを代入するコマンドを追加 が、存在しません どうすればいいですか?

イベントの現在のHPを代入

複雑な変数ボックスの操作コマンドから取得できます。ただ、rev.61429のバージョンだと非推奨になってしまっているようです…


  1. 触れた時にダメージを受けたくない場合はゴブリンキャストのカスタムイベントでプレイヤーとのイベント衝突を無効にするか、キャストの種別設定で味方にします。
  2. ほぼ一致する…つまり一致しないタイミングもあります。