GameMaker Studio2 DnDの記事を書く
- BTA(Kelorin Jo)
- 2019年11月16日
- 読了時間: 7分

GameMaker Studio2のスクリプト…GMLでのチュートリアルはままあれど
ビジュアルスクリプトのDnDの方はほぼなしなので、
DnDでキャラクターコントローラを完成させたら-しかもコメントは日本語
てなの出したら需要あるかな?と思い立って記事を書きます。
素人だからへちょいけど
DnDのメリットは、アルファベット打つのが死ぬほど苦手な人に優しいということです。これに尽きる
コードのブロックが程よく少なくて、全てアイコン表示でリストアップできる量なのも強いです。

カンバスにアイコン一つ選んでドラッグ&ドロップすればプログラムになります。
かたやUnityのビジュアルスクリプトは、できることが多すぎるせいで
コードの数が膨大すぎてアイコンリストどころじゃない、
目当てのコードを出すのに検索で結構文字うちしなくてはならず、さらに各種引数の入力にも結構な文字数を打つことを強いられます…テキストエディタにある頭の数文字打ったら候補がリストアップされる、ができないとそうなります。
GM2ではDnDでも変数など入力欄には頭の2-3文字タイプするだけでほとんどの変数・組み込み変数・関数・オブジェクト名が出てくれます。超快適

並べたブロックは内部的にはちゃんとしたコードに変換されてて、ライブプレビューで確認できるからGML(文字打ちでコーディングする従来の方法)を覚える補助輪になるでしょう。いきなりアルファベットの羅列コードがスルスル入る人は、プログラマーになるため生まれてきた人でしょう(デザイナーとは脳の構造が違うと断言していいと思う)
DnDのデメリットは、GMLよりやれることが制限されてるということです。
わかりやすい例では、ifにAndはあるけどorがない、変数ではenumが使えない、など
そのへんは今の所我慢するか、書き方を工夫するとかで対処してますが、スクリプトじゃなきゃ詰むっていう壁があるかは不明です。プログラムの素人なんでその域まで達してない
テク
・orのかわり
1か0か、○か☓か、是か非か、trueかfalseか
いわゆるフラグにつかうbool変数ですが、if構文には複数の条件に対してand判定しかありません

フラグ判定だけするif Expressionは、+で参照するフラグを追加、notでfalseで成立、とできるけど全部成立しないと=and条件でしかthenにいけません
複数のフラグのうち一つでも満たせば成立するorで使いたいときは、Expression欄のところに
フラグの変数名1+フラグの変数名2
みたいに書けば、or判定にできます。

フラグの変数名1*フラグの変数名2だと、andと同じ結果になります。書く欄に収まらなくて視認できないからやらんほうがいいけど
実のところDnDでは変数の扱いが曖昧で、variableで新規作成した変数は
整数とか実数とかブールとかの区別がつけられないです。全部実数形式です。文字列は流石に区別されるけど

if Expressionでフラグとして扱う変数は、1と言わず2以上でもtrueとして成立します。
・スクリプトを使う
Unityでいうユーザー関数を、GameMakerでは「スクリプト」と称します(もうちょっといい呼び名は…)
スクリプトにはコードだけでなくDnDも普通に使えます。

引数を渡して複雑な処理を実行して戻り値を取得…という使い方もできますが、
引数なしでローカル変数をふつうに使って書けるというか、本コードの一部を別のファイルにカット&ペーストで移しただけの状態でも、別に問題なく動きます。
当然それだと、引数がないから他に流用できないですが、DnDではこの使い方でも重要です。
というのもDnDでコードを書くとすごくかさばるため、デバッグのさい全体を見渡すなど到底できない
のぞき穴状態で、似た構造の部分を見間違えていじって大ピンチになることが多々あります。
しかもDnDは時々アンドゥが効かなくなるし常時セーブ状態。ワンミスでわりと詰みます!
不具合がない安定してる部分、これから弄り倒す不安定な部分をスクリプトとしてまとめれば、
リスクを減らしコードをデバッグしやすくできます。
なおスクリプトやオブジェクトのファイルは普通に複製できるのでセーブ代わりにできます。取り返しつかなくなったらリネームして復帰、もしくはプロジェクト全体を別名保存もいいです。開発序盤はファイルサイズ小さいからさくっとできます
・コメントに日本語を使う
コードにはコメントが付けられます。

プログラムフォルダかプロジェクトフォルダに日本語フォントを入れといて、
Preference-General Setting-Output Windowから日本語フォントを実装すれば、GM2は日本語入力ができるようになり、コメント欄に注釈をつけて大幅にわかりやすくできます。
・キャラクターコントローラは自作 ステート仕立てに
Unityのアニメーターコントローラは、複数のモーションをユーザーが自作したパラメータで条件つけて
切り替え・ブレンド具合を制御できる仕様になってましたが、
GameMakerでは1から自作する必要があります。
せっかくなのでスプライトのアニメーションだけといわず、移動・ジャンプ・攻撃などはキー入力による実行命令=アクションと、
棒立ち・歩行・走り・しゃがみ・ジャンプ・落下中(下方向以外動けない)・ダメージ受けてのけぞり中(動けない+無敵)などの状態=ステートというパラメータにする作りかたを心がけると、整理できます。つまり、他の人にも扱いやすくできます。
例
キー入力イベントで行動を決定、アクションの変数(ブール型)を1にする
↓
stepイベント(Unityでいうon update、毎フレームごとの処理)で、地形との当たり判定やステートと照らし合わせてアクション実行できるか判定、実行できないアクションの変数は0に戻す
↓
アクション成立できるなら、ステートのフラグを変更
↓
アクションやステートの結果を見て、キャラの座標や体力などの数値を変動
↓
描画イベントで、ステートやアクションに応じてスプライトのインデックスを書き換えたり、
エフェクトを出したりして出力
まあ現実には、きれいにできずキー入力の段階で当たり判定も調べちゃったり、何故かうまく動かないから落下判定の順番を入れ替えたり、綺麗にいかないんですが
アクションが同時に複数あった場合の判定とか、ステートマシンは凝るとめっちゃ複雑化するから私が低能なせいではないはず…
アクションのフラグ立てはキー入力だけでなく別の方法でフラグを書き換えれれば、イベントシーンで自動で動くようなのも可能かも
・AIの制御にはビヘイビアツリー
AI行動は条件分岐のビヘイビアツリー方式が良いとどっかで聞きました。
https://yttm-work.jp/game_ai/game_ai_0004.html
http://ai-gaminglife.hatenablog.com/entry/2017/12/13/212644
ステートマシンはすべて自由行動なプレイヤー向きで複雑、ビヘイビアツリー方式は決まった行動しかしないAI向き、だとか。
全部自作する必要があるのに変わりはないけど。(ごめんまだ敵AIはやってないから適当書いた)
・Drawイベントは少し特殊
すごい序盤だけですが、Drawイベントはなくてもスプライトは表示されます。
ただ、スプライトの切り替え処理とかはDrawイベント以外に書いても無視されるので、複雑なことしたくなったらDrawイベントを使うことになるし、DrawイベントがあるのにDrawコードを使わないと一切表示されなくなりますが。
他にも、知らないと引っかかるものが割と少し。
Drawイベントは基本、Stepイベントが完走したあと実行されます
Drawイベント内で使わないと無視されるコードが幾つかあります
・他のインスタンスのローカル変数を取得する
公式ではインスタンス変数と称するみたいだけど、便宜上ローカル変数で
変数をあつかう欄で、
[他のオブジェクト名..ローカル変数] または[インスタンスID.ローカル変数名]
という書き方をすると、他のインスタンスのローカル変数を操作できます。
オブジェクトをペアレント設定にしてても、そういう書き方しないと取得できないようです。(むしろペアレントにすると不具合がふえるような)
なお同オブジェクトが複数あった場合どうなるかと、IDの取得方法は不明です
ひとまずここまで。
本業のモデリングのために中断してたらもうすっかり忘れてる…頭切り替えるのに時間を要する…