プロデューサーレター#21 バージョン2.0の新機能
皆様、プロデューサーの森野です。 いつもACTION GAME MAKERをご利用いただきありがとうございます。先ほどGodotのベースバージョンを4.7に引き上げるバージョン1.4.0を配信させていただきました。これはこれでたくさん語りたいところではあるのですが・・・21回目となる今回のプロデューサーレターでは、引き続きバージョン2.0について紹介させていただきます。 バージョン2.0のメイン機能は新しいUIである「ツクールモード」が中心ですが、合わせてこれまで手を入れたかったが影響範囲が大きく見送っていた機能を一気に導入しています。今回は、特に実際のゲームに関係のある部分をいくつか紹介させていただきます。今回の紹介内容は以下の想定です。
-
新しいアクション「持ち上げる/投げる」
-
マウス/タッチ/スティックへの対応
-
トップビューへの正式対応
-
「速度や勢い」に関わる機能の追加
-
「沢山出す」アイテムやオブジェクトへの対応
-
「共有ボード(ブラックボード)」機能
-
ヴィジュアルスクリプトの機能強化
他にも沢山あるのですが、全部説明するにはあまりに長いのでこのあたりまで説明します。さっそく見ていきましょう。
◆1. 新しいアクション「持ち上げる/投げる」
これに関しては、前作アクツクMVの時代から長いこと・・・昔のゼルダやマリオで出来ていたことがなんでできないんだ!とお叱りを頂いていた内容になります。正確にはオブジェクト接続を使えばできるのですが・・・あまりに複雑な仕組みでしたので、2つの実行アクションを使うだけでサクっと使えるようにしました。

持ち上げるための条件や、持ち上げた際や投げた際に変数/スイッチを変えるといったシステムを用意しているので、グローブを持っているときだけ持てるとか、投げる際に攻撃になるとかの設定ができます。ベルトスクロールや格闘ゲームの投げにも使えるんじゃないかなと思います。
◆2. マウス/タッチ/スティックへの対応
ウェブエクスポートできるのに、タッチ動作のためにGDScriptでボタンを使わないといけない、マウス座標を取得するのが微妙にめんどくさい、スティックの傾きを取得したいのにできない、等、Godotの機能にACTION GAME MAKERが追いついていなかった部分を一気に対応しました。以下のようなことができます。
-
新しい条件で、あたり判定や壁判定にオブジェクトが重なった時、といった動作ができます。持ち上げるアクションと合わせてマウスでオブジェクトを拾って動かしたりができます。

-
投げるアクションや、弾の発射先としてマウス座標やスティック方向を使う。(360度シューターが地味に作りづらかった問題もこれで解決しています。)

-
プレイヤーの移動にスティックを使う。真の360度移動ができ、傾きによって移動速度を変えたりできます。
-
アナログスティックの角度・倒し具合やマウス座標への角度、距離などを変数として保存するアクションの追加。
これらによって、大体のマウス/スティック動作に対応出来たんじゃないかと思います。なお、Godotの動作上タッチ=マウスクリックとして動作するため、タッチ動作にも対応している・・・ということになります。
◆3. トップビューへの正式対応
前回のプロデューサーレターでトップビューに正式対応すると発表しましたが、それに伴って必要不可欠な3つの機能を追加しました。
-
テンプレート移動や、オブジェクト移動アクションへのA-Star形式の経路探索の追加。RPGツクールのクリック経路探索に近いものです。これにより、敵が壁に引っかかって動かなくなるといったことが大きく減ります。

-
トップビュー用の水面の追加。水面機能は人気がありましたが、トップビューでは使えないという問題がありました、そこでトップビュー用の水面を作りました。鏡面反射のほか、水深によってキャラクターが沈んだり、歩くと水紋と音が出るような機能も完備しています。

-
「自身をノックバック」アクションの追加。これまでノックバックの表現は表示方向と逆に移動などや押すで表現するしかなく、なかなか思った通りの動きができませんでした。このアクションでは、判定の中心との角度を元に最適な角度でノックバックしてくれます。なお、これはもちろんサイドビューでも利用でき、サイドビューでは打ち上げ等の設定もできます。
先のスティック対応と合わせて、360度自由に動き回るトップビューアクションゲームが作りやすくなりました。
◆4. 「速度や勢い」に関わる機能の追加
これもGodotの機能を活かしきれていなかった部分への対応になります。GameObjectの元になっているCharacterBody2Dは擬似的な物理処理を行っているのですが、ヴィジュアルスクリプトでは動作上その物理処理・・・特にVelocity(速度や勢い)については打ち消していました。結果として、疑似物理の負の部分(衝突で動いたりめり込み解決で不自然な挙動をしたり)といった部分ばかりが目立ち、良い部分を活かせていませんでした、反省として、2.0からは速度や勢いをうまく扱えるようにしました。
-
新しいアクション「オブジェクトの速度を設定」で対象の速度を強制的に加算できるようになりました、これによりジャンプ台や大砲などの、「打ち上げる」「発射する」動作ができるようになりました。
-
接触しているプラットフォームの速度を離れる際に加算できるようにしました。(CharacterBody2DのPlatform OnLeaveのAddに対応しました。)これにより、跳ね上げをするプラットフォームの勢いで跳ね上げる、吹っ飛ぶ、といったことが可能になりました。ただこちらは注意点として、これまでのオブジェクトにも適用されてしまうため挙動がかわります、挙動を保つためにはPlatform OnLeaveをオフにしてもらう必要があります。

-
新しいカスタムノード強制移動エリアを追加しました。これは、エリア内にいるオブジェクトを一定方向に動かすエリアを作る機能で、徐々に加速や一定速度で常に移動などを指定できます。具体的には、ベルトコンベアや水流・ジェット気流、トラクタービーム、前に進みづらい強風エリアなどを作ることができます。

これは既存の挙動に影響があるため見送っていたものなのですが、思い切って実装しました、Godotの疑似物理の良さをこれで体感してもらえると良いなと思っています。
◆5. 「沢山出す」アイテムやオブジェクトへの対応
これまでヴィジュアルスクリプトの軽量化を進めてきましたが、昨今のゲームでは、数千個単位のオブジェクトをほぼ同時に出すこともあります、さすがにこれはヴィジュアルスクリプトでは厳しい・・・ことから、機能を絞るかわりに沢山配置しても重くならないものを用意しました。イメージとしては弾幕システムの弾幕のようなものです。
-
コインや経験値オーブなどの、沢山散らばって、オブジェクトが近づくと移動し、拾われると変数を変える、という機能に特化した「スコアドロップ」を追加しました。数千個単位で同時に出しても動作するはずです。
-
前作の「ギミックタイル」に相当する「ギミックオブジェクト」を追加しました。沢山置くことになる破壊できる壁などをこれにすることで、数百単位で配置しても動作性の問題がおきなくなるはずです。また、これは趣味レベルの話ですが某ピンク色の玉のキャラのゲームでよくある連鎖して壊れる壁が好きだったのでその機能も盛り込みました。

ヴィジュアルスクリプトの重さ対策は継続して行っているのですが、弾幕やこれらのように限界がある部分はこういった新しいモノを用意することで対応していこうと思っています。
◆6. 「共有ボード(ブラックボード)」機能
ブラックボードはAI開発などでよく使われる機能なのですが、便利そうなので取り入れました。概念としてはちょっと難しいのですが・・・とりあえずは色々できることが増えた変数/スイッチと思ってもらっておけば良いと思います。 変数ではfloat(浮動小数点)型しか扱えなかったのですが、int(整数)型やstr(文字列)型を扱うことができるようになりました。
floatの制約上、小数点合わせて6桁までしか扱えなかったのですが、これで数億のスコア等も扱えるようになります。 これだけだと、だから?と思われると思うのですが、一番大きな点として、「対象オブジェクト」をリストで格納できるようになりました。
例えば、プレイヤーから半径500px以内で、最も「HP」変数が高いオブジェクトから順に3つのオブジェクトを共有ボードに記録、といったことができます。 そして、プロパティを変更アクションの対象や、弾の発射・ホーミング先としてこの共有ボードのオブジェクトを使えます。

うまく使うことで、例えば「HP」が一番高い相手の「毒」スイッチをオン。といったことができるようになりました。さらに、ホーミング先としてリストを指定することで、自分の近くの敵3体にホーミングミサイルを放つ、といったマルチロックのような動作をすることができます。
◆7. ヴィジュアルスクリプトの機能強化
一番大きな変更になります。「サブレイヤー機能」と「アクツクデバッグモニター」という2つの機能を用意しました。
◯「サブレイヤー機能」
これは、1つのヴィジュアルスクリプトで複数の処理を同時に扱うための機能です。例えば、これまで「スーパーアーマー」のような被ダメージ動作はしないが被ダメージに関する処理を行いたい・・・といったことを考えると、複数のゲームオブジェクトを組み合わせて使うという手段しか取れませんでしたが、この機能を使うことで1つのゲームオブジェクトで様々な処理ができるようになりました。 ゲームオブジェクトの数を減らせるので軽量化になりますし、複数のオブジェクトを組み合わせることで複雑になることを避けることができます。 注意点として、競合を避けるためアニメーションを扱えるのは「メインレイヤー」のみとなっています。
◯「アクツクデバッグモニター」
これまでデバッグ機能は「コンソールに出力」やGDScriptに頼っており、公式として用意することができていませんでしたが、ようやく用意することができました。前作アクツクMVのF1メニューから表示できた機能を強化したものとなっており、オブジェクトの状態や入力、変数の状態、遷移状態などをチェックできます。
変数はデバッグモニター側に打ち込んで強制的に変更できるので、これでだいぶデバッグもしやすくなったんじゃないかと思います。
◆おわりに
あまりに紹介が長くなってしまうので今回の紹介はここまでですが、他にも新機能があります、せっかくなので言葉だけ乗せておきます。はしごに捕まる、ロードを挟まないクイックリスタート、最後に乗っていた足場に戻る、オートセーブ、コースに沿って動くプラットフォームオブジェクト、「最後に触れた」オブジェクトをターゲットにする・・・などです。
そのうちきちんと紹介したいところでもありますが、もはや触ってもらったほうが早いかもしれません。
バージョン2.0「ツクールモード」ですが、近日中に「ベータ版」を公開予定です。 Steamで専用のブランチに切り替えていただく形を予定しています。
是非試してほしいのですが、公開するものはあくまで「ベータ版」です。既存プロジェクトへの不可逆の影響は起きないようにしているつもりですが、可能性は0ではありませんので、ご利用の際には必ずバックアップを取ってください。
また、特に2.0で追加される新機能については予告無く変更される場合があります、その際、新アクションで設定済みのプロパティが消えてしまうといったことはありえますので、そこだけご了承をいただければと思います。
それでは、引き続きACTION GAME MAKERをよろしくお願いいたします。

