『NameError: name '(変数名)' is not defined』
変数が定義されていない…Ren'Pyで開発を行っているとしばしば遭遇するエラーです。
確かにこの変数は定義していませんでした、確かにスペルミスでした、で済めばよいのですが…
「いや、定義したけど?!」と困惑するケースもあると思います。その場合にご確認いただきたいのが以下の内容です。
変数の有無ってどう確認するの?
Ren'Pyのプログラムってどういう順番で走ってるの?
…それと、「Ren'Py(Python)では変数に値を代入した時に変数が定義される」(他のプログラミング言語のように敢えて"定義"するという作業は基本的に必要無い)という点は認識しておいておいてください。…という文言がよくわからない、という方はスルーで大丈夫です。
1. 変数の有無ってどう確認するの?
Ren'Pyランチャーからゲームを起動し「ctrl + D」をクリックすると開発者メニューを開くことができます。
開発者メニューの「変数ビューアー」を選択すると定義済の変数を確認できます。定義した記憶の無い変数も一部ありますがご愛嬌…。
または、開発者メニューの「コンソール (Shift+D)」をクリックし、変数名を入力してエンターを押します。変数がきちんと定義されていれば値が返ってきます(図の後半)。変数ビューアーに表示されていない変数でもこの方法で見つかることがあります。
2. Ren'Pyのプログラムってどういう順番で走ってるの?
まず、
ものすごく大原則
原則として、上の行から下の行へと順に処理が実行されます。
rpyファイルが複数あれば、ファイル名が若いファイルから順に実行されます。
こちらを頭の片隅に置いた上で、
Ren'Pyの中でのルール
「init python:」の中身や「define ichirei = "example"」のように書かれたものはゲーム開始時(厳密にはMainMenu表示前?)に実行されます
「label xxxx:」の中に書かれている内容は、そのラベルにジャンプしたときに上から順に実行されます(そのラベルにジャンプしなければ実行されません)
です。
そして、変数の値を使う箇所より前に変数に値を与える箇所が無いと「無いぞ!」と怒られます。
平たく言うと
「init python」か「define」で変数に初期値を与えておくといいよ!
ということです。
define hensu_teigi = True
label start:
if hensu_teigi == True:
"変数が定義できているよ(てきてなければ今頃エラーが出てるよ)"
「init python」と「define」の違い。「define」は変数の定義しかできませんが「init python」はどんなpythonコードでも書けます。
もう少し詳しく、ドキュメントの当該ページから引用します。
define ステートメントは初期化時、変数に値を設定します。例えば
define e = Character("Eileen")
これは (後述のいくつかの利点を除いて) 次と等しいです。
init python:
e = Character("Eileen")
《中略》
define ステートメントを使用する利点の 1 つは代入が行なわれたファイル名と行番号を記録し、ランチャーのナビゲーション機能が利用可能になることです。もう一つの利点は Lint で例えば、同じ変数が2重定義されているかを検出して、異なる値を持つ定義された変数を確認できることです。
define ステートメントを使用して定義された変数は定数として扱われ、セーブロードされないため、変更しないべきです(Ren'Py はこれを強制しませんが、守らない場合、未定義の動作をします)。
できればドキュメントの当該ページを開いて前後の内容も見てみてください。多少マニアックなところまで言及されているので意味不明な部分もあるかもしれませんが、ざっと見て理解できるところだけフムフムと思っていただくだけで結構です。
今回はここまでにします。多少なりとも参考になれば幸いです。
疑問点などありましたらお問合せフォームなどからお気軽にお申し付けください。