忍者ブログ

へぷたなすくろーる

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

Home > > [PR] Home > 道しるべ > スクリプトの競合と対処法、メソッドの「マージ」について

[PR]

×

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

スクリプトの競合と対処法、メソッドの「マージ」について

「○○と××のスクリプトを入れたら動きません」という現象をスクリプトの競合と言います。
競合は複雑な問題であり、それなりのスキルと高い根気が必要です。
ですので経験者でも敬遠して、初心者は諦めるしかないということが多いです。
尤も、リストに置く順序を入れ替えるだけでも解決することもあるので注意。

ここでは初心者向けに競合の説明とマージという対策を紹介します。
私が良く使っている方法ですが、単純な競合ならこれで解決できます。
逆に言うと、これで解決できないものは経験者でも面倒だと言えます。


競合の起きるワケ
まず適当にスクリプトを開いて眺めてください。
上の方にclass ~というのがあり、その下にdef ~というのが並んでいます。
この2つがセットです。classはクラス、defはメソッドと呼ばれるものです。

そして、スクリプト全ての中に、同じクラスの同名メソッドがある場合
「下にある方で上書きされる」という仕様です。これが一番大事なポイントです。

大抵のスクリプトは、デフォルトのスクリプトを上書きすることで機能します。
一方、競合というのは多くの場合
この上書きによって上の方のスクリプトの処理が消えるのが原因です。

処理の確認と「マージ」
スクリプトの中で共通する(クラスも同じ)メソッドを探します。
#デフォルトスクリプト
class abc
 def update
  check
 end
end
#スクリプトA
class abc
 def update
  check
  change_chip
 end
end
#スクリプトB
class abc
 def update
  pre_check
  check
 end
end
この場合、スクリプトAではchange_chipが、スクリプトBではpre_checkが追加されています。
しかし下にあるスクリプトBが上書きしてしまうため、change_chipの処理が起きません。
そこで、スクリプトAの処理とスクリプトBの処理を合わせた(マージ)スクリプトを追加します。
#スクリプトC
class abc
 def update
  pre_check
  check
  change_chip
 end
end
実際の対策について
大抵はNoMethodErrorが起きるので
そのメソッドや、呼び出されているメソッドを全体検索に掛ければ良いでしょう。
同じメソッド名があった場合はクラスを確認して下さい。

同じクラスだった場合の対処法は上記の通りです。
また、違うクラスであってもスーパークラスが設定されていて
親子関係になっている場合は競合する可能性があります。
#スクリプトA
class abc
 def update
  check
  change_chip
 end
end
#スクリプトB
class xyz < abc
 def update
  pre_check
  check
 end
end
この場合は子のクラスの方に、マージする必要があります。
#スクリプトC
class xyz < abc
 def update
  pre_check
  check
  change_chip
 end
end

拍手[4回]

PR
-->
Responses0 Responses
  • お名前
  • タイトル
  • メールアドレス
  • URL
  • パスワード

ブログ内検索

アーカイブ

最新コメント

[10/13 深海樹]
[08/02 ダイ二ホケンシツ]
[07/29 ダイ二ホケンシツ]
[07/29 ダイ二ホケンシツ]
[07/29 ダイ二ホケンシツ]

プロフィール

バナー

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