GDevelop Tips 一作完成させて学んだこといろいろ
GDevelop Tips 一作完成させて学んだこといろいろ
おかか容疑者です!
Q.ゲームレビュー全然書いてねえじゃねえか!?
A.自作ゲーム開発が佳境に入ってたのでそっちに注力してました!サーセン!!
というわけで、しばらく開発を続けていたゲームがようやく公開直前というところまで来ました。
ただいまGoogle様の審査待ち状態。
せっかく一作品を完成させたので、覚えているうちに私が使用したゲームエンジン「GDevelop」について大事かな?と思った部分を書き残しておこうかと思います。
備忘録として とか書いておくと閲覧数上がりそうなので書いておこう。
先に言っておくと長くなりそうなので必要な部分だけ読んでね!!
あとあくまで素人が一回使ってみただけの話なので私の知識不足な話もあると思います。あまり鵜呑みにはしないでね!!
そもそも何ぞやコレ?
みんなのゲーム制作ツール
GDevelopは、オープンソースでマルチプラットフォームのゲーム制作ツールです。使いやすいようにデザインされており、誰でもゲームクリエーターになることができます!
以上!!
真面目に書くと、マウス操作でカカッとイベントを作っていくだけでゲームができるという魔法のツールです。
「プログラミングの知識は不要です」などと宣(のたま)っておりますが、あくまでコードを書かなくてもいいよってだけで実際はプログラミングをやってるんだぞっていうのはClickteam Fusionと同じです!!
とはいえ日本語対応もだいぶしていますし、とっつきやすい形でゲーム開発を経験できるのでいいツールなんじゃないですかね。実際私も助けられてますんで。
GDevelopの日本語情報に関しては↑のパンダコ先生のブログが非常に参考になります。
というか2021年11月現在、公式かこのブログくらいしか日本語でGDevelopの情報発信している場所を見たことがありません。
でえじょうぶだ!チュートリアルやれば何とかなる!!
というわけで以下から本題です。
関数のオブジェクトタイプはきっちり指定すべし!
関数、便利ですね。
同じ処理を繰り返す際はどんどん作っていった方がプログラマーですって感じがしてテンションが上がります。
ただ仕様が独特なので、意味が理解できるまではうまく動かなくて割と困りました。
とりわけ詰まったのがタイプで「オブジェクト」を選んだ際の「オブジェクトタイプ」。
これ、最初は「任意のオブジェクト」ってなってるので、「ああ、これにしておけばどんなタイプのオブジェクトでも認識してくれるんだな!」という考えだったんですよ。
でもそれだとダメ。実際に使いたいオブジェクトの型に合わせてしっかりと指定してやる必要があるのです。
「じゃあこの「任意のオブジェクト」って何のためにあんねん!!」ってキレてたわけですが、使い道ありました。
オブジェクトグループを作ってそれを関数で使用する際、そのグループの中に「異なるタイプのオブジェクト(スプライトとタイルスプライトが一緒のとき等)」が一緒に入っている場合。
この場合に任意のオブジェクトで指定してみたら問題なく動いてくれました。グループには単一の型しか入れちゃいけないのかとヒヤヒヤした😰
グループ分けはしておこう
グループってありますよね。
これ何のために存在しているのかわからなかったので、イベント内でどういう処理なのか分ける際にはコメントだけで分類してたんですよね。
一通り開発が終わった後に用途を知りました。
↑はプロファイラの写真です。
一応書いておくと、プロファイラはどんな処理にどれだけ時間使ってるのかを把握できるツールで、GDevelopの場合はデバッカーの左下に出てきます。ライブラリ入れなくていいんだ……(LOVE2D脳)
で、これ見てもらうとわかるんですが、「events」という場所が全く分類分けされてないんですよね。
どういうことかと言うと、events=イベントで消費している時間を表示しているんですが、「イベント全部でこれだけ時間使ってるけどどのイベントでリソースいっぱい消費してるかわかりません!ごめんね!」って言われてるんですわ。
直しようがないやん……。
そこで先のグループが出てきます。
グループをイベント内に作り、そのサブイベントとして必要なイベントをくっつけることでグループ分けをします。(グループを置くだけでなく、グループに関連づける必要があるってことですね)
そうすればプロファイラでもグループごとに分けて時間が表示されるんですね😊
先に言えや!!!!!!(一応公式には書いてあります)
「インスタンスごとに繰り返し」は常時では使わない
上の件に関連して。
一つ一つのオブジェクトに対してイベントを実行できる「インスタンスごとに繰り返し」。
特に多くのオブジェクトを使うゲームでは必要不可欠な処理ですね。
ただ、コイツを常時動かしていると負荷がハンパないです。大迫よりハンパないです。
私が作ったゲームが重かった原因はコレでした。
全く使わないなんてわけにもいかないので、使う場合は
・そもそもの条件から変えて他の処理で代用してみる
・タイマーで数秒に一回だけ使用する
みたいにすると改善できるのではないかと。
テキスト折り返し処理の話
テキストの自動折り返し機能もGDevelopの便利機能。
ラッピング幅を決めることで好きな文字数で折り返して文章の表示ができるようになります。
ラッピング幅を決める場合、あらかじめ一行あたりの文字数がわかっている場合は↑のように「表示したい文字数 ✕ フォントサイズ」にしてやるといい感じに表示できます。
また、テキストを記入する部分で改行ができるんですが、この改行も表示に反映されます。
確実にここで改行させたいという場面では改行入れていきましょう。
私はこれに気づかずスペースいっぱい入れてがんばって改行調整してました(半ギレ)
特定の音だけ操作したい場合はチャンネル設定
GDevelopで音楽やサウンドを流す際には「オーディオ」から選択します。
が、この「オーディオ」は、「グローバルサウンド音量を変更する」「音楽ファイルを再生する」しかできることがありません。家庭用連ザ1のオプションの如く充実しています。
なので、もっと細かく音楽操作したい場合は「チャンネルのオーディオ」からイベントを設定しましょう。
チャンネルというと何か小難しそうですが、要は音楽に番号をつけるだけみたいな意味合いです。この番号の音楽だけ止めるとか音量変えるってことができるのでジャンジャン使いましょう。
あと音楽再生時にループの有り無しを決められますが、ループ有りにするとたまに変なところで音が鳴り出したりすることもありました。
なのでチャンネル指定で「再生中である」の反転を条件にして、再生されていない場合に音楽再生するって処理の方がいいかもしれません。知らんけど。
シーン移行した時に音楽を消さない方法
基本的にシーンが変わるとそれまで流れていた音楽は消えます。
普段は問題ないと思いますが、ポーズ画面を別で作っていてステージの音楽を流し続けたい!って場面もあるかと思われます。というかありました。
そういう時はシーンプロパティを開き、「シーン開始時に音楽とサウンドを停止」のチェックボックスを消しましょう。
ドット絵ゲームはニアレストネイバー
ドット絵ゲーム作ってる人だけの話ですが、「ゲーム設定」の「プロパティ」で設定できる「スケールモード」はリニアでなくニアレストネイバーを選択して、ついでにその下のチェックボックスも付けておいた方がよさそうです。
左がリニア、右がニアレストネイバーの画像です。見比べると確かに左がボヤーってしてる感じありますね!
先の画像の下にリソースエディターで云々書いてありますが、↑写真ではそこまでの処理はしていません。それでもこれだけドットらしく見えるので無理に入れなくてもいい処理かなと。
リソースで不要なデータ削除
リソースの話を出したのでついでに。
「ゲーム設定」の「リソース」を開き、右側に出ている使用しているデータの上で右クリックすると↑のウインドウが出ます。
ウインドウ下部に使っていないものを削除する項目があるので、リリース前にでもまとめて消してしまえばええかなと。
データのセーブロードはJSONで
開発中に悩んでいたセーブロード問題。
パンダコ先生にもご教示いただき、JSONを使うことでむっちゃ簡単に実装することができました!
さっそく方法を
と思ったら先生が既に記事書いてるやないかーーーい!!!
これを読んで下さい。全国民必読の書。
ちなみにPCだろうがスマホだろうがどれでも問題なく機能しました。すげえ。
スクリーンショット撮影
公式にも書いてあるんでそっちでいいんですがここにも一応書いときます。
スクリーンショットで指定するフォルダの場所は
FileSystem::PicturesPath() + FileSystem::PathDelimiter() + "my_screenshot.png"
公式に「高度な話題」として変数タイマーの話が書いてありました。
をコピペすることでピクチャフォルダにmy_screenshot.pngという名前で保存されます。
保存してすぐファイル名を変更することで次のスクショもすぐ撮れる。
itch.ioに写真を上げたい場合なんかには特に便利ですね。
「真のあいだ一度だけ実行」は条件欄の一番下に置くのがベネ
「真のあいだ一度だけ実行」はボタンを押した際などに効果を発揮する条件。
だいぶ強力に効いてくれるんですが、強力すぎて条件欄の途中にコレを入れるとその下の条件が認識されないみたいなんですよね。
何か別の要因があったのかもしれませんが、条件欄の順番を入れ替えたら問題解決したので、この条件は一番最後に置いておくのがいいなと思いました。
タイマーはフラグとセットにして扱うべし
CFのときは変数をタイマー代わりにして使うという奇天烈な方法がむしろ一般的になっていたのですが、GDevelopちゃんはそんなことはない!
標準機能としてタイマーを完備!コイツで時間管理はカンペキだぜ!!
よい機能なのですが、どうもこのタイマーは「スタート(リセット)する」という処理を一度も挟んでいない場合にも進んでいるような挙動をしているんですよね。
条件にタイマーの経過時間だけつけたイベントが勝手に発動したりしてしまっていたので。
なのでタイマーには必ずフラグ用の変数を用意して、「タイマーが規定の時間を過ぎ、かつフラグが真のとき」にイベントが起こるように設定してうまいこといってます😄
シーンタイマー最高や!!変数タイマーなんかいらんかったんや!!と叫んでいたら
これ変数2個用意するの煩わしくて嫌いだったのにいいいいいい!!!
AngleBetweenPositions()の数値について
AngleBetweenPositions()は「2点間の角度」を出せる式です。
これを用いると「敵がプレイヤーに向けてショットを撃つ際、この角度ならショットのアニメーションをコレにしてね」などという設定ができるわけです。ワザマエ!
というわけで使ってみてたんですが、この式で算出される数値の意味がわからねえ………
なので自前で調べてみました。
こんな感じらしいです!!
0と180はわかるけども、90は真下、そして真上は-90となりました。
なんで上半分がマイナス表示になるのかとかよくわかりませんが、コレを元に設定してみたら理想通りの処理ができました。
何か基準となった数値はあると思うのですが数学無知侍なので誰かわかる方教えてくだち。
以上となります!
久々に朝4時から長文打ってまあまあ疲れたけど、これがGDevelopを使う誰かの助けになってくれたら まん……ぞく…………
あ、ただいま審査中のゲーム「ペイガンシューターズSP」、公開できたら当ブログでもいろいろ書きますので見てね!
頼むね!!
コメント
コメントを投稿