見出し画像

「Game Maker Studio 2」StateMachineについて

はじめまして&ご無沙汰しております。霧崎明良です。

今回はGame Maker Studio 2でStateMachineを実装した時の話です。

StateMachineとはなんぞや?についてはShaunさんという方が動画でとても詳しい解説をしてくださっているので少しだけ触れる程度にします。

Shaunさんによる解説動画

こちらもShaunさんによるStateMachineを使った攻撃を実装するチュートリアル

StateMachineはざっくりと説明するとプレイヤーやエネミーなど、オブジェクトの状態をスクリプトで分けて、オブジェクトのStepイベントで切り替える…みたいな感じです。プログラミング素人が読めない英語のチュートリアルをなんとか読んでなんとなくわかった程度の理解の説明なので、ちゃんとした説明が欲しいという方は上のShaunさんの動画を見てください。

Shaunさんのチュートリアル動画はどれも丁寧な説明をしてくれるので英語ではありますが私のような素人だけどGame Maker Studioで作りたい!という人間には目から鱗のような解説が聞けるので見ることをおすすめします。

下の画像はscr_playerstate_~でプレイヤーの状態でスクリプトを分けています。

画像1

こちらはプレイヤーオブジェクトのStepイベントです。StateMachineを使わない場合はここにズラッと長いスクリプトを書くかと思いますが非常にすっきりしていますね。switchでプレイヤーの状態(state)に対応したスクリプトを呼び出すようになっています。

画像2

StateMachineの利点としてはイベントにごちゃごちゃと詰め込まずにそれぞれシンプルな(簡単に書けるとは言ってない)スクリプトを用意すればオブジェクトの状態ごとにスクリプトを書けるので管理がしやすい、という点かなと思います。例えば「立ち」「しゃがみ」「ジャンプ(空中)」「攻撃」でそれぞれ独立したスクリプトがあって、それぞれのスクリプトでまたオブジェクトの状態を切り替えてオブジェクトのStepイベントで該当のスクリプトを呼び出し…といった形です。

いくらでもStateは分けることは可能なのですが何でもかんでも分けるのも面倒になるのかなーと思います。そのへんは実装とか規模によって決まる感じでしょうか。

StateMachineの実装に関しては1つつまずいた点があるのでそこのところを書いていきたいと思います。

Shaunさんの動画を見ながらスプリクトを書いて、早速テストプレイしてみようとしたところ、各stateのスクリプトで「宣言されてない変数が呼び出されてる」みたいなエラーを吐いて起動できなくなりました。

変数はちゃんとオブジェクトのcreateイベントで宣言しているのになんでだろう?と悶々としていたのですが、Shaunさんの配布しているプロジェクトデータを拝見させていただいたところ1つ私のスプリクトと違いがありました。

これです

画像3

私のスクリプトではfunctionの関数を消してしまっていたのでした。

早速スクリプトの冒頭にfunction関数を記述してみたところ

画像4

無事起動!

画像5

Shaunさんの動画では記述されていなかったので、同じように消してからスプリクトを書いていたのですが必要だったんですね…反省。

これでStateMachineの実装ができました。

現在はジャンプの実装に悪戦苦闘しています…

次回はそのあたりの話題になるかなーと思います。

ではでは

この記事が気に入ったらサポートをしてみませんか?