GameMaker 日本語掲示板

【解決済】YoutubeでARPG制作チュートリアルに出てきたnot set before reading it.のエラー解消について / 8

13 コメント
views
17 フォロー
8
asa 2021/10/09 (土) 13:38:53 修正

直ってよかったです!!

2.3以前のチュートリアルを参考にされたのだと思います。
古いチュートリアルで学習すると同じことが起こるので、今後の参考に簡単に説明します。

バージョン2.3以前の形
scriptには処理を直接記述していました。1つのscriptは1つの関数の定義になっていました。

例:
script "PlayerAnimateSprite"

player_direction = direction + 5;



バージョン2.3以降の形
処理をfunctionで包む形で記述し、これを関数定義とするようになりました。例は1つのfunctionだけですがscriptの中に複数のfunctionを書けるようになりました。
例:
script "PlayerAnimateSprite"

function PlayerAnimateSprite() {
 player_direction = direction + 5;
}



なので、古いチュートリアルのコードは全て、この読み替え、書き換えが必要になります。
以下に少し説明しますが、説明が雑で逆に混乱するかもしれないので、参考程度に読んでみてください


2.3以前では、Runしてもscript "PlayerAnimateSprite"は実行されません。関数"PlayerAnimateSprite"が定義されるだけです。オブジェクトAからPlayerAnimateSprite();を呼び出した時点でオブジェクトAのスコープで実行されます。コードにあるdirectionはオブジェクトAのdirectionが参照されるのでエラーになりません。

2.3以降では、Runしたらscript "PlayerAnimateSprite"に書かれたコードはグローバルスコープのコードとして全て実行されます。functionで包んでないコードは全てゲーム起動のタイミングで実行されます。そこでオブジェクトの変数であるdirectionを参照すればエラーになります。
functionで包めば、それが関数定義になります。Runした時点で関数が定義され、オブジェクトから呼び出した時点で実行されます。

関連資料
https://www.yoyogames.com/en/blog/gamemaker-studio-2-dot-3-new-gml-features

通報 ...
  • 9

    asaさんコメントありがとうございます!

    2.3以前→オブジェクトAの変数宣言したものを利用してスプリクトは実行できる。

    2.3以降→"functionで包んでいないスクリプト内のコードはゲーム起動のタイミングで実行される。

    "「directionという変数が定義されてないのに使おうとしてるよ」というエラーです。しかし変数directionはビルトイン変数なので定義しなくても使えるものです。"と前回asaさんが言っていました。

    これはそもそもゲーム起動のタイミングだからスクリプト内のコードをしようとするから何も準備できていないよー!って状況だからビルトイン変数のdirectionが未定義エラーになるということでしょうかね。

    なんかかなり腹落ちした気がします……!さらにソース提示までいただいてありがとうございます!

    10

    はい、そういうことです!
    「グローバルスコープ」とは特定のオブジェクトではなく、ゲーム自身を参照するということです。ゲーム自身にはdirectionは無いのでエラーになるというわけです。