【GameMaker:Studio2】GMLを学ぶ際に役立つ情報

この記事は YoYoGamesの公式ブログ 「[USEFUL RESOURCES WHEN LEARNING TO CODE WITH GML](https://www.yoyogames.com/blog/567/useful-resources-when-learning-to-code-with-gml)」 を翻訳したものとなります。

（※意味が取れなかったところは意訳を入れているので、正確な意味が知りたい場合は原文を読むことをおすすめします）

---

この短い技術ブログは、GameMaker Studio 2で Drag and Drop (アイコン) でのゲームの作り方を理解していて、次のステップとして、Game Maker Language (GML) に進みたいと考えている人、またはプログラミング経験のなくで何をすればいいのかわからない人を対象とした記事です。

ここでは具体的なコード例は示しませんが、代わりにどこから始めればよいのか、いくつかの優れた方法を紹介するとともに、優れたGameMakerユーザーによって [GameMaker Community](https://forum.yoyogames.com/index.php) にまとめられたチュートリアルやガイドのリンクを紹介します。

（訳注：GameMaker Communityで検索機能を使用するにはユーザー登録が必要です）

# マニュアルを読もう！
まず、GameMakerのマニュアル (GameMakerでF1キーを押すか、IDEの上部にある[Help]メニューにあります）を開き、[GML Overview (Google翻訳)](https://translate.google.co.jp/translate?hl=ja&sl=auto&tl=ja&u=https%3A%2F%2Fdocs2.yoyogames.com%2Fsource%2F_build%2F3_scripting%2F3_gml_overview%2Findex.html) を読むことをおすすめします。GMLの作成方法と使用法を理解できるので、このセクションのすべてに目を通してください。

**すべてを理解できなくても気にしない！**

重要なことは、これを読んでGMLの仕組みとセクションの内容に注意し、理解できない部分をチュートリアルやガイドを利用して理解してくことです。

とはいえ、マニュアルだけを読むのは退屈かもしれません。その場合は、説明にある機能を実際に試してみてください。
マニュアルには、その機能に関するコードのサンプルが記述されていますが、**それらはコピーせずに、自分で入力して** 動作を確認してみてください。この方法を利用するとより良く、より速く学ぶことができます。

例えば Object を作成し、それを空の Room に配置してから、CreateイベントまたはStepイベントを Objectに追加すると、[Assignments](https://docs2.yoyogames.com/source/_build/3_scripting/3_gml_overview/11_assignments.html)、[Expressions](https://docs2.yoyogames.com/source/_build/3_scripting/3_gml_overview/12_expressions.html)、[Variables And Variable Scope](https://docs2.yoyogames.com/source/_build/3_scripting/3_gml_overview/6_scope.html)、[Data Types](https://docs2.yoyogames.com/source/_build/3_scripting/3_gml_overview/9_data_types.html)などのコードをテストできます。
例えば、[Expressions](https://docs2.yoyogames.com/source/_build/3_scripting/3_gml_overview/12_expressions.html)であれば以下のとおりです。

```js
var a = 10;
var b = 253;
var c = 32.888;
output = (a + b) / c;
show_debug_message(output);
```

このように複雑なプログラムではないので、シンプルにテストできます。
（訳注： `show_debug_message()` は output コンソールにメッセージを出力する関数です。これを使うことで設定された値を簡単に確認できます）
<img width="641" alt="test_-_GameMaker_Studio_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/e8cdc2fe-92f3-671c-d4d1-5403da36ebdf.png">

マニュアルについてはもう1つ重要なことがあります。それはコードエディターで、知りたいプロパティや関数名にカーソルを合わせて、マウスの中央ボタンをクリックするか[F1]キーを押すと、その機能のヘルプがすぐに見つかるということです。たとえば、関数 `point_direction()` について詳しく知りたい場合は、カーソルをコードエディタ内の関数名を記述しているところに移動して「F1」を押す（またはマウスの中央ボタンをクリックする）と、その上にマニュアルがポップアップ表示されます。そして関数のページが開き、関数の機能と使用方法を説明します。

# Tutorialに従う または Demoを確認しよう！

GameMaker Studio 2を起動した直後の **スタートページ** には、YoYo Gamesが作成した公式チュートリアルにアクセスできるリンクがあります。

![StartPage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/431eb77a-e9bd-ee7d-848a-f86ab867b069.png)

これらのチュートリアルにはすべてテキストと動画が含まれています。これらは GameMakerがどのように機能するかをしっかりと理解できるように設計されており、GameMakerLanguage(GML)を使用する際に従うべき実践的な方法と一般的なパラダイムも示しています。そのため、[Space Rocks](https://marketplace.yoyogames.com/assets/7423/space-rocks-gml) や [Breakthough](https://marketplace.yoyogames.com/assets/8003/breakthrough-gml) などの主要なもののうち、少なくとも1つを実行することを強くおすすめします。
繰り返しますが、すべてを理解する必要はありません。ですが、それはゲーム作りを学ぶ最善の方法です。というのも、チュートリアルを行い、短い時間でゲームを作成したことで、結果的には次のステップに進む力を得ることができます。

また **Demos** をチェックするのも価値があります。デモページには、より高度なゲーム開発のコンセプトのほか、いくつかの学習に向いたシンプルなプロジェクトが用意されています。
**Demos** は「ガイドのない」学習であり、後々に自分で独自のゲームを作るための経験を得て、そしてどの機能を使うかを比較する機会を提供します（ゲーム内の何かがうまく動かない場合は、YoYo(Games?) がどのように行ったかを確認してください）

# 自分で作ろう！
GMLの基本に自信が持てるようになったら、次にステップアップできます。小さなテストプロジェクトを作成しましょう。
例えば、ゲームの実行中に画面にテキストを出力する Object を作成します。
次に、キーやボタンの入力に合わせて、このテキストを変更します。

Object に Sprite を追加して、テキストとともに画面に描画してみますか？
待って！
キーが押されたときにスプライトを移動させませんか？
またはマウスボタンを押したままにしたら、マウスカーソルの方向に移動させますか？

このような小さな実験的なプロジェクトを作成し、基本的なことを少しずつ構築していくことは、GameMakerの全体的な使用方法、およびGMLを具体的な方法を理解するための学習となります。
しっかりしたゲームプロジェクトを実際に始める前に、これらの基本を学ぶことはとても重要です。

![CodeExample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/79da3dde-9dbd-a21b-8b20-3e8290d354f5.png)

いくつかのテストプロジェクトを実施したら、知識とスキルを向上させるために次にできることはゲームを作ることです...
しかし、あせらないで！　いきなり背伸びして、超大作ゲームのプロジェクトの作成を開始しないでください！
代わりに、時間をかけて過去のファミコン時代のレトロゲームを作り直してください。……なぜ私たちは（そして他の多くの人も！）これを推奨しているのか？
それは、レトロゲームの時代はハードウェア上のメモリが少なく、GPUとCPUの能力が限られている環境で実行する必要があったため、必然的に、できることが小さく、設計がシンプルになりました。
ですが、これらのゲームは依然として楽しいものであり、優れたゲームプレイを実現しており、現在プレイしているゲームの多くの基礎を築いています。
そのため、優れたレトロゲームを分析して再現することで、すべての最新ゲームの構築に使用されている基本的な要素を学び、優れた一般的なゲームデザインについて学び、そしてGameMakerの使用方法を学ぶことができます。

もちろん、好きなレトロゲームを選択して、それを再構築してもよいですが、検討に値するいくつかのゲームを紹介します。以下は、作成難易度の低い順で並べています。

1. [Pong](https://www.youtube.com/watch?v=fiShX2pTz9A): パドルでボールを打ち合うゲーム
2. [Breakout](https://www.youtube.com/watch?v=AMUv8KvVt08): ブロック崩し
3. [Asteroids](https://www.youtube.com/watch?v=9Ydu8UhIjeU): アステロイド (全方位STG)
4. [Galaga](https://www.youtube.com/watch?v=dvjapcHsqXY): ギャラガ (縦方向STG)
5. [Frogger](https://www.youtube.com/watch?v=WNrz9_Fe-Us): フロッガー (横断アクション)
6. [Boulderdash](https://www.youtube.com/watch?v=n9zf510_9gU): バルダーダッシュ (パズルアクション)
7. [Pacman](https://www.youtube.com/watch?v=dScq4P5gn4A): パックマン (ドットイートアクション)
8. [Gauntlet](https://www.youtube.com/watch?v=HDTsTvxcuTE): ガントレット (アクションシューティング)
9. [Super Mario Bros.](https://www.youtube.com/watch?v=ia8bhFoqkVE): スーパーマリオブラザーズ (プラットフォーマー)

これら過去の名作を再作成することの素晴らしい点は、ゲームのデザインとプログラミングについて学ぶだけでなく、それらに新しい要素を追加するための基盤を作れるようになることです。
実際に小さいプロジェクトを完了すると、プロの方法でプロジェクトをパッケージ化し、コードを洗練して微調整し、完成したプロジェクトをさまざまなデバイスで実行して、他のプラットフォーム（異なるパフォーマンスレベル、画面サイズ、 オーディオ機能の考慮事項）に作るなど、すべてを良いものにしたくなります。

といった具合で、一度このようなプロジェクトを完成させると、それを今流行っているようなゲームデザインにしてみたりと、好きなように作り変えることができます。
……ひょっとしたら、**あなたの考えた新しい追加要素によって、ワールドワイドで通用するようなゲームが生まれることになる**かもしれませんよ！

# 失敗することを学ぼう！
プログラミングを学ぶ上で非常に重要なのは、ミスをして**最初はうまくいかない**ことを受け入れることです。
最初はゲームの作成がうまくいかなくて、すぐにイライラしてしまうかもしれません。ですが、それはすべてプロセスの一部であり、コードがうまく動かないときに落胆してイライラするのではなく、チャレンジとして受け入れます！
問題点の解決に役立つツールがたくさんあることを知っておけば、対処が楽になることを覚えておいてください。

まず始めに、プロジェクトをテストするときに表示されるエラーメッセージがあります。あなたはこれらのメッセージを解釈し、そのメッセージの意味を理解することを学ぶべきです。ここでその内容の概要を簡単に説明します。
このエラーを考えてみてください。

![errorreport.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/4880306b-743f-e6d0-0806-513326d0b02c.png)

```
FATAL ERROR in
action number 1
of Create Event
for object objInit:

Push :: Execution Error - Variable Get -1.snd(100005, -1)
at gml_Object_objInit_Create_0 (line 29) - with (snd) fish = "fish";
```

このエラーメッセージの最初の部分は、エラーが発生したイベント (Create Event) と、イベントが発生したオブジェクト (objInit) を示しています。

次に、変数取得エラー (Variable Get) であることがわかります。これは、コードが変数にアクセスしようとしたときに、表示されている変数が実際には定義されていないことを意味します。最後に、確認のために、エラーが発生したコードエディターの行番号と、そのコード行のスニペットが表示されます。ランナーがゲームをコンパイルする方法が原因で、すべてのプラットフォームで行番号が常に100％正確であるとは限りませんが、これらの情報はエラーを見つける近道となるはずです。

また、コンパイルエラーが原因でゲームが実行されないこともあります。この場合は IDE および コンパイルログ にもエラーを出力します。これにより、ほとんどの場合、問題を追跡できます。ただし、コーディングエラーが発生する理由はいくつかあります。その多くにいては、詳細に説明されているマニュアルを確認してください。

* [Compiler Errors](https://docs2.yoyogames.com/source/_build/1_overview/3_additional_information/errors.html)
* [Compiler Errors(Google翻訳)](https://translate.google.co.jp/translate?hl=ja&sl=auto&tl=ja&u=https%3A%2F%2Fdocs2.yoyogames.com%2Fsource%2F_build%2F1_overview%2F3_additional_information%2Ferrors.html)

エラーメッセージを探すときは、コンパイラログ全体を読む必要があります。(「ビルド失敗(Build Failed)」はエラーではありません。これは最終結果なので、さらに詳しく読んでください)
また、プロジェクトが失敗していて、ウイルス対策クライアントを実行している場合でもコードに問題がないと確信している場合は、一時的に一時停止すると、ビルドがすぐに機能するかどうかを確認します。サポートされている場合は、以下のヘルプデスクガイドを御覧ください。

* [how to configure your protection software to allow GMS2 to work properly](https://help.yoyogames.com/hc/en-us/articles/360022953052-User-Permissions-and-Internet-Access-Required-by-GMS2)
 *  (訳注)フォルダのアクセス権や .NET Framework など動作に必要なランタイム、ネットワークドライブを使っていないかどうか、Dropboxなど頻繁にファイルロックする "live folders" を使っていないかどうか、といった安定した動作環境を保証するための説明が記載されています

最後に、GameMakerで **Debug Mode** を使用する方法を学びます。Debug Modeは、プロジェクトがクラッシュしたり、実行エラーといった問題ではなく、実現したい挙動にならない、または期待どおりに機能しない原因を調査するのに役立ちます。
Debug Modeでゲームを実行すると、IDEには新しいウィンドウのセットが開き、何が起こっているのかを詳細に確認したり、ゲームを一時停止したり、すべてのコードをステップ実行して、値や変数を確認したりできます。
詳細については、以下のマニュアルをお読みください。

* [The Debugger](https://docs2.yoyogames.com/source/_build/2_interface/2_extras/debugging.html)
* [The Debugger(Google翻訳)](https://translate.google.co.jp/translate?hl=ja&sl=auto&tl=ja&u=https%3A%2F%2Fdocs2.yoyogames.com%2Fsource%2F_build%2F2_interface%2F2_extras%2Fdebugging.html)

（正しい値が得られない変数をすばやくデバッグするために、問題が起こっている付近で `show_debug_message()` を呼び出してoutputウィンドウに値を表示する、または `draw_text()` で値を一時的に画面上に表示して、いつ/どのように変化するかを確認できます。 これは多くの場合、うまく原因をつかめる迅速な方法です）

# ユーザーコミュニティを活用しよう！

GameMaker Studioには、豊富なすばらしいコミュニティリソースがあります。 非常に才能のある人たちが集まった [GameMaker Community](https://forum.yoyogames.com/index.php) が独自のチュートリアルとガイドを作成・定期的に更新して、それを共有しています。
これを念頭に置いて、コミュニティから GameMaker Studio 2 を学習するための最新のリソースの一部を以下に示します。

* [What's the Difference: Objects and Instances](https://forum.yoyogames.com/index.php?threads/whats-the-difference-objects-and-instances.29005/) from FrostyCat
    * ObjectとInstanceの違いは何か
* [Basic GML Tutorials](https://forum.yoyogames.com/index.php?threads/basic-gml-tutorials.6390/) from GMWaffle
    * GMLの基本
* [Understanding GML Basics To Follow Harder Tutorials](https://forum.yoyogames.com/index.php?threads/understanding-gml-basics-to-follow-harder-tutorials.62216/) from Obj_Neil
    * 難しいチュートリアルに従うためのGMLの基本の理解
* [Coding Fundamentals In GML](https://forum.yoyogames.com/index.php?threads/coding-fundamentals-in-gml-tutorial-series.70417/) from SamSpade
    * GMLでのコーディングの基礎
* [All Of The Tutorials By Matharoo](https://forum.yoyogames.com/index.php?members/matharoo.2345/) (From his profile, click the "Find" button, and select "Find All Threads by Matharoo")
    * Matharoo氏によるすべてのチュートリアル (彼のプロフィールから、「検索」ボタンをクリックし、「Matharoによるすべてのスレッドを検索」を選択します)
* [Useful Math For Game Development](https://forum.yoyogames.com/index.php?threads/useful-math-for-game-development.71764/) from Xor
    * ゲーム開発に役立つ数学

以下は少し高度なチュートリアルですが、ゲームプログラムやGameMakerへの理解が深まるほど、そこに含まれる情報が非常に貴重であることがわかります！

* [Block Recipe Cards](https://forum.yoyogames.com/index.php?threads/with-block-recipe-cards.25326/) from FrostyCat
    * withブロックの活用法
* [GMS2 Cameras As Simple As Possible](https://forum.yoyogames.com/index.php?threads/gms2-cameras-as-simple-as-possible.56770/) from PixelatedPope
    * できるだけ少ない労力でGMS2でカメラを機能させる方法を示す動画
* [Finite State Machines](https://forum.yoyogames.com/index.php?threads/finite-state-machines.366/) from GMWolf
    * 有限機械状態 (FSM)
* [Flexible Inventory System](https://forum.yoyogames.com/index.php?threads/flexible-inventory-system.34884/) from CloakedGames
    * GMLで柔軟性の高いインベントリシステムを構築する方法
* [Shaders For Hobby Programmers](https://forum.yoyogames.com/index.php?threads/shaders-for-hobby-programmers-newest-video-lut-maps.35832/) from The Reverend
    * シェーダーに詳しくない人のためのチュートリアル

# 練習を完璧にする！

最後に、ゲームを作成する際の「ベストプラクティス」を学ぶのに役立つ、関連する技術ブログをチェックすることをおすすめします。

* [Best Practices When Coding In GameMaker Studio 2](https://www.yoyogames.com/blog/63/best-practices-when-coding-in-gamemaker-studio-2)
* [Best Practices When Coding In GameMaker Studio 2(Google翻訳)](https://translate.google.co.jp/translate?hl=ja&sl=auto&tl=ja&u=https%3A%2F%2Fwww.yoyogames.com%2Fblog%2F63%2Fbest-practices-when-coding-in-gamemaker-studio-2)

(2020.5.29追記)翻訳しました→ [GameMaker Studio 2でコーディングする際のベストプラクティス](https://qiita.com/2dgames_jp/items/e4c86c2caf1e86a120a0)

これで、この技術ブログの説明は終わりです。 ゲームを作成するのは難しいことですが、同時にとても楽しいものであることを忘れないでください。 このブログ投稿があなたの可能性を最大限に引き出し、あなた自身の素晴らしいゲームを作り始めるときに、作り方をできるだけ早く理解するのに役立つことを願っています。

Happy GameMaking！