忍者ブログ

へぷたなすくろーる

RPGツクールのブログです。イベント講座とRGSS3スクリプト配布をやってます♪

Home > > [PR] Home > 道しるべ > スクリプトエラー撲滅キャンプ(2) 続NoMethodError

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

スクリプトエラー撲滅キャンプ(2) 続NoMethodError

スクリプトのエラーが起きた場合の初心者なりに原因と対策を調べる方法~♪
スクリプト導入でエラーが出る人や、手探りで書いてみてエラーが出る人の参考になれば。
あくまで私の知識と経験則に基づいているのと
ツクール始めたての人には流石に難しいかもしれない
という2点は先にお断りしておきますね。

第二回も引き続きNoMethodErrorの対処法を見ていきましょう。
原因その4「ローカル変数が定義されてない」
ローカル変数というのはそのメソッドの中だけの一時的な変数です。
ヘルプにも載っていますがメソッド呼び出しと同じ書き方をするため
エラーもNoMethodErrorという形で報告されます。
ローカル変数を使うためには「メソッド内で定義(=代入)する」決まりがあります。
def abc
test = 0
test += 1
end
この場合だと1行目でtestがローカル変数として定義されているので
「ああ、testは0だからそれに1を足すのね」と理解してくれます。
ところがいきなり2行目だけ書くと
「testって何?そんなメソッドないよ!あーもう駄目だエラー出してやる!」
とヒスってNoMethodErrorになります。時々NameErrorにもなります。

原因その5「文字列""の付け忘れ」
スクリプトの決まりで、文字列は""で囲うというものがあります。
def abc
@name = "アレックス"
end
この例ではちゃんと@nameに「アレックス」という文字列が入ります。
しかし@name = アレックスと書くと「def アレックス」の参照と見なされるため「アイヤー(ry」となります。

原因その6「インスタンス変数にアクセスできない」
インスタンス変数@は便利なので多用されていますが
呼び出しにちょいと制約があるためアクセサという仕組みを使って呼び出されます。
例えば@abcにアクセスしたいがエラーになった場合
まずattr_writer :abcやattr_reader :abcを探して、これをattr_accessor :abcに差し替えます。
或いは↑がない場合でもどのクラスのインスタンス変数か理解しているなら
直接attr_accessor :abcを追加してアクセス可能にすることも出来ます。
それから、実際にGame_Actorにある例ですが
def id
@actor_id
end
こんな形でアクセサが組まれていることがあります。
この場合だと@actor_idを参照する書き方が
×@actor.actor_id
○@actor.id
となります。この辺りはとにかく検索して試していくのが近道かと思っています。

原因その7「nilの子はnil」
最後に、一見すると問題がなさそうな記述で起こるエラーです。
イベントのすゝめ(10)でちょろっと触れていますが
nilが入っている変数より以下のメソッドを参照してしまうとエラーになります。
特に$game_actorsの様な多段の入れ子構造になっているもので起きやすく
「IDを指定して特定のアクターを呼び出す」「ループで全てのアクターを呼び出す」処理には
ifやunlessを上手く使ってnilを弾くようにする必要があります。

実際の楽~な探し方は?
というわけでNoMethodErrorは実際いくつものパターンがあります。
ここまで長々と読まれてうんざりしてきた方もいると思いますが
これを全て頭に叩き込め、1つ1つ確認していけ!などと言うつもりはありません。
効率的な調べ方で存分に手を抜きましょう。

まず最初にするのがスクリプトの全検索です。
候補がない、明らかに関係のないクラスのものしかない場合は
ヘルプの方にもキーワード検索をかけます。
・エラー箇所以外にはヒットしない
その1のスペルミスか、その5の""の付け忘れ
その4のローカル変数の宣言し忘れが考えられます。
・幾つかヒットするがdef ○○というのがない
その2のメソッドがない可能性が高いです。
・@○○ばかりがヒット
その6のアクセサをチェックしてみましょう。
・沢山ヒットするし、問題がなさそう
その3のメソッドとの関係性や、その7のnil関係を探ります。
pを使えばコンソールに変数の中身を表示できるので
エラー箇所で使われている変数のクラスやnil含みを調べていきます。
最悪自力で解決できなくとも、ここまで絞り込めば質問もスムーズに行くでしょう。

拍手[4回]

PR
-->
Responses1 Responses
1.無題 NONAMEさん (2021/08/25 09:33) [Edit]

初めまして。突然すみません、NoMethodErrorのどれに当てはまるかわからなかったので質問させて頂きました。
下記のスクリプトを使っているのですが、
i_actor(index).fv_prm.update_hp
redraw_actor_mp(index) unless i_actor(index).fv_prm.update_mp
redraw_actor_tp(index) unless i_actor(index).fv_prm.update_tp
の部分が全部エラーになります。
どこを変えたらいいですか?

#--------------------------------------------------------------------------
# ● フレーム更新 : アクターステータス
#--------------------------------------------------------------------------
def update_status(index)
redraw_actor_hp(index) unless i_actor(index).fv_prm.update_hp
redraw_actor_mp(index) unless i_actor(index).fv_prm.update_mp
redraw_actor_tp(index) unless i_actor(index).fv_prm.update_tp
update_states if BtlrFv::USE_ROULET_ST
end
end

Re:無題 奈々(なな) (2021/08/26 11:02)

はじめまして。
まず大前提として
そのエラーがどれに当てはまるもので、どうすれば直るかというのは
エラーを起こしているゲームプロジェクトを調べていくしかありません。

そのプロジェクトの現物を持っていない以上
エラーを起こしている箇所だけ教えて頂いても、私には原因は分かりません。
今の情報だと、どれにも当てはまる可能性があります。

第一に、エラーメッセージをしっかり読むことです。
3行とも、unlessの前後で2文に分かれているため
合計で6箇所のメソッドを参照しています。具体的にどこでエラーを吐いているのか。

それが特定できれば、次は原因を特定します。
例えば原因の1つとしてスペルミスを紹介しています。
なのでスクリプト内検索を使ったりして、スペルミスでないかどうかを調べます。
こうやって1つ1つ確認して原因を探します。


もちろん、どの原因がありそうか、という山勘はあります。
今回のケースだと、比較的単純な参照が全滅しているため
細かいスペルミスなどではなく、そもそも何か間違って使っているという感じがします。

これがスクリプト素材で、特に自分で弄っていないのであれば、前提となる素材が入っていないか、コードの貼り付け時にミスをしている可能性が高いです。
自分で作成、または改造した素材であれば、メソッド参照の基本的なルールが間違っている(別のクラスからコピペした等)可能性などが考えられます。

記事に書いていないことで、現状アドバイスできるのはこれくらいになります。

  • お名前
  • タイトル
  • メールアドレス
  • URL
  • パスワード

ブログ内検索

アーカイブ

最新コメント

[01/20 NONAME]
[01/16 NONAME]
[12/30 NONAME]
[12/13 NONAME]
[12/01 NONAME]

プロフィール

バナー

HN:奈々(なな)
RPGツクールVXAceを中心に製作を行っています。 スクリプト、イラスト、ドット絵など広くちょこちょこ手を出していますので、 できる範囲で他のツクーラーさんのお手伝いができたらなと思っています。