直ってよかったです!!
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
asaさんコメントありがとうございます!
2.3以前→オブジェクトAの変数宣言したものを利用してスプリクトは実行できる。
2.3以降→"functionで包んでいないスクリプト内のコードはゲーム起動のタイミングで実行される。
"「directionという変数が定義されてないのに使おうとしてるよ」というエラーです。しかし変数directionはビルトイン変数なので定義しなくても使えるものです。"と前回asaさんが言っていました。
これはそもそもゲーム起動のタイミングだからスクリプト内のコードをしようとするから何も準備できていないよー!って状況だからビルトイン変数のdirectionが未定義エラーになるということでしょうかね。
なんかかなり腹落ちした気がします……!さらにソース提示までいただいてありがとうございます!
はい、そういうことです!
「グローバルスコープ」とは特定のオブジェクトではなく、ゲーム自身を参照するということです。ゲーム自身にはdirectionは無いのでエラーになるというわけです。