プラグインのノウハウを教えてほしいです

haruchi
記事: 16
登録日時: 2023年10月06日(金) 21:00

プラグインのノウハウを教えてほしいです

投稿記事by haruchi » 2023年10月09日(月) 21:13

数日前同じような投稿をしたものです
先日、プラグインの勉強をするならばまずVXAceのスクリプト入門を読もう、とのアドバイスをいただいたのでそれを読み込んだところです
プラグイン作りの基礎は学べたと思うのですが、まだ実践的なところはなにもわからない状態です
公式のプラグイン講座や、非公式のサイトを改めて見に行きましたが、やはり理解できないところも多く、再び手詰まり状態です

改めて自分にプラグインのノウハウを教えていただける方を探しています
内容としては、既存のプラグインを見ながら、もしくは自分が作りたいと考えているプラグインを作りながら、ソースコードを一つずつ分解して処理や役割の解説をしてもらうといった形です
解説のなかでわからないところはこちらからも質問するつもりです

 厚かましいということは承知していますが、恥をしのんで投稿します
作りたいプラグインも量が多く、誰かに作成を委託するとお金も足りなくなってしまいます
どうしてもゲーム作りは諦めたくありません
どうかよろしくお願いします

アバター
くろうど
記事: 279
登録日時: 2016年1月22日(金) 20:52
お住まい: 東京都
連絡を取る:

Re: プラグインのノウハウを教えてほしいです

投稿記事by くろうど » 2023年10月09日(月) 22:11

こんばんは。
プラグインのノウハウって結局、基礎+調べ方なんですよね。

公式の講座(↓以下のリンク)はひと通り理解できている必要はあるかと思いますが、
暗記する必要はそれほどなく、
それ以上は、適宜コアスクリプトを調べたり、webで検索するで良いかと思います。

RPGツクールMZ プラグイン講座
https://rpgmakerofficial.com/product/mz/plugin/

MDN
https://developer.mozilla.org/ja/docs/Web/JavaScript

というわけで、
一旦、お試し期間として、
このトピックが10件になる程度まで現状確認させてもらおうかと思います。
まずは宿題として以下のプラグインを作ってみてください。

宿題:
「床ダメージを50にするプラグイン」

補足:
毒の沼などのダメージ床のダメージのこと。
デフォルトは10です。

このプラグインを、このトピックに「Code」として貼り付けてください。
(添付ファイルではなく)
貼り付けたコードを見て、解説および次の問題を出したいと思います。

出来なかった場合はその旨を書いてもらえるとサンプルを出したいと思います。

尚、この形式に不満がある場合はその旨お知らせください。
よろしくお願いします。
▼だいたいTwitterにいます。たぶん。
https://twitter.com/kuroudo119
haruchi
記事: 16
登録日時: 2023年10月06日(金) 21:00

Re: プラグインのノウハウを教えてほしいです

投稿記事by haruchi » 2023年10月09日(月) 22:19

わかりました
この形式で特に不満はありません
精一杯やらせていただきます
haruchi
記事: 16
登録日時: 2023年10月06日(金) 21:00

Re: プラグインのノウハウを教えてほしいです

投稿記事by haruchi » 2023年10月10日(火) 21:53

大変お待たせしました
以下の内容でテストプレイでは宿題通りの効果が確認できました
/*:
* @target MZ
* @plugindesc フロアダメージ変更
* @author haruchi
*
* @help 毒や沼などのダメージ床のダメージ変更
*
* @param NewFloorDamage
* @text 床ダメージ
* @desc 変更後の床ダメージの値を入力してください
* @type number
* @default 50
*/

(() => {
"use strict";

const pluginName = document.currentScript.src.match(/^.*\/(.*).js$/)[1];
const params = PluginManager.parameters(pluginName);


Game_Actor.prototype.basicFloorDamage = function() {
return params.NewFloorDamage;
};


})();
アバター
くろうど
記事: 279
登録日時: 2016年1月22日(金) 20:52
お住まい: 東京都
連絡を取る:

Re: プラグインのノウハウを教えてほしいです

投稿記事by くろうど » 2023年10月10日(火) 23:00

こんばんは。
プラグインパラメータを使うのは次の宿題にしようと思っていたのですが、そこは勉強済みとのことで良いと思います。

内容としては良いと思います。
(「params.NewFloorDamage」って中身は文字列だよな……って点が気になりますが現時点ではOKです)

前回『「Code」として貼り付けてください』と言ったことの補足をしますと、

コード: 全て選択

return params.NewFloorDamage;

↑このような表示ができるのでこれにしてくださいって意味だったのです。

次回は書き込む時に、上の欄にある「Code」ってボタンを押して、[ code ] と [ /code ] の間にソースコードを書いてください。

さて、今回の宿題ですが、この「フロアダメージ変更」プラグインを以下のように改造してください。

A. アクターのメモ欄に <FloorDamage:100> とあるアクターは、その値のダメージ(左記の場合は100)とする。
B. 上記A以外のアクターは、デフォルトと同じダメージにする。

これでお願いします。
▼だいたいTwitterにいます。たぶん。
https://twitter.com/kuroudo119
haruchi
記事: 16
登録日時: 2023年10月06日(金) 21:00

Re: プラグインのノウハウを教えてほしいです

投稿記事by haruchi » 2023年10月11日(水) 17:26

ここまででギブアップです
これではactoridが取得できないようです


コード: 全て選択

/*:
 * @target MZ
 * @plugindesc フロアダメージ変更
 * @author haruchi
 *
 * @help 毒や沼などのダメージ床のダメージ変更
 *
 * @param NewFloorDamage
 * @text 床ダメージ
 * @desc 変更後の床ダメージの値を入力してください
 * @type number
 * @default 50
 */

(() => {
    "use strict";
   
    const pluginName = document.currentScript.src.match(/^.*\/(.*).js$/)[1];
    const params = PluginManager.parameters(pluginName);

   
    Game_Actor.prototype.basicFloorDamage = function() {
        for(let n = 1;n < 5;n++){
            if($dataActors[$gameParty.members[n].actorId() ].note.includes("<FloorDamage:100>" )){
            return 100;
            }
            else{
            return params.NewFloorDamage;
            }
        }
    };


})();
アバター
くろうど
記事: 279
登録日時: 2016年1月22日(金) 20:52
お住まい: 東京都
連絡を取る:

Re: プラグインのノウハウを教えてほしいです

投稿記事by くろうど » 2023年10月11日(水) 18:55

なるほど……。
それではサンプルを置いておきますね。

尚、プラグインとしての記述や即時関数は省略してます。

コード: 全て選択

const _Game_Actor_basicFloorDamage = Game_Actor.prototype.basicFloorDamage;
Game_Actor.prototype.basicFloorDamage = function() {
   const damage = this.actor().meta.FloorDamage;
   if (damage) {
      return damage;
   } else {
      return _Game_Actor_basicFloorDamage.call(this);
   }
};


では、今回の要点を解説しますね。

■フックって呼ぶらしい
1行目は _Game_Actor_basicFloorDamage という変数にその時点での「basicFloorDamage関数」を入れています。

これは7行目(else の中のreturn)で使っています。
_Game_Actor_basicFloorDamageに call を使って関数を呼び出しています。

これは「デフォルト値」を使うために使っています。

■this
詳細は「オブジェクト指向のインスタンス」辺りを調べてもらうとして……。

今回の this は Game_Actor です。
rmmz_objects.js ファイルの中の Game_Actor が持っている変数と関数が使えます。

this.actor()
と書くことで
Game_Actor.prototype.actor
を呼ぶことができます。

データベースに設定したアクターデータはゲーム実行中は $dataActors に入っているので、これを取得しています。

尚、Game_Actor自身がアクターIDを知っているのでアクターIDを取得する必要はありません。

■meta
メモ欄に <key:value> の書式で書かれているもの(タグ)は
ツクール側で meta って所に入れてくれますので、
meta.key で value を取得できます。

今回はアクターのメモ欄に書いたので、アクターデータ.meta.FloorDamage で100を取得しています。

だいたいこんな感じです。

今回の宿題は一旦お休みしますので、ここまで理解できたかどうかお返事ください。

※私のJavaScriptは独学なのでJavaScript用語は間違っているかもしれません。
▼だいたいTwitterにいます。たぶん。
https://twitter.com/kuroudo119
haruchi
記事: 16
登録日時: 2023年10月06日(金) 21:00

Re: プラグインのノウハウを教えてほしいです

投稿記事by haruchi » 2023年10月11日(水) 20:37

 おおよそは理解しましたが、二つわからないところがあります
 一つ目が、三行目のthis.actor().meta.FloorDamage;という一文です
ここのthis.actor()は()のactoridのアクターを返すメソッドのはずですが、なぜactoridを入れずとも各アクターのメモ欄を参照できるのでしょうか
 二つ目は、七行目です
説明にあったデフォルト値をパラメータのデフォルト値と解釈するならば、デフォルト値を使うためにcallを使う理由がわからないです
同じファイル内なのでcallがなくてもパラメータは変わらず取得できるのでは?と疑問に思いました
アバター
くろうど
記事: 279
登録日時: 2016年1月22日(金) 20:52
お住まい: 東京都
連絡を取る:

Re: プラグインのノウハウを教えてほしいです

投稿記事by くろうど » 2023年10月11日(水) 21:25

ひとつ目ですが、
そのためには「インスタンス」についての理解が必要になります。

Game_Actor.prototype.actor 内の this._actorId にはアクターごと(インスタンスごと)のアクターIDが入っているからです。

具体的には、
new Game_Actor(actorId)
した時に、インスタンスが作成され、constructor が実行されます。
ツクールの場合は initialize が実行されます。

initialize から処理の流れを追ってもらうと良いと思います。

ふたつ目ですが、

コード: 全て選択

return _Game_Actor_basicFloorDamage();

こう書いても良いのでは?という話でしょうか?

今回は中身に this が無い 「return 10」だけの処理なのでそう書いても同じ結果になります。
なので、thisがある場合のための、他のプラグインとの競合回避のための、習慣のようなものです。

thisの有無については以下の2つを実行して比べるとよいでしょう。
他のプラグインで床ダメージがアクターIDと同じ値に変更された想定です。

■パターン1(callしない)

コード: 全て選択

(() => {

Game_Actor.prototype.basicFloorDamage = function() {
   return this._actorId;
};

const _Game_Actor_basicFloorDamage = Game_Actor.prototype.basicFloorDamage;
Game_Actor.prototype.basicFloorDamage = function() {
   const damage = this.actor().meta.FloorDamage;
   if (damage) {
      return damage;
   } else {
      return _Game_Actor_basicFloorDamage();
   }
};

})();


■パターン2(callする)

コード: 全て選択

(() => {

Game_Actor.prototype.basicFloorDamage = function() {
   return this._actorId;
};

const _Game_Actor_basicFloorDamage = Game_Actor.prototype.basicFloorDamage;
Game_Actor.prototype.basicFloorDamage = function() {
   const damage = this.actor().meta.FloorDamage;
   if (damage) {
      return damage;
   } else {
      return _Game_Actor_basicFloorDamage.call(this);
   }
};

})();

よろしくお願いします。
▼だいたいTwitterにいます。たぶん。
https://twitter.com/kuroudo119
haruchi
記事: 16
登録日時: 2023年10月06日(金) 21:00

Re: プラグインのノウハウを教えてほしいです

投稿記事by haruchi » 2023年10月12日(木) 21:10

一つ目について、色々調べてみたらprototypeについて自分が無知だったことが原因でした
二つ目も、callについて調べたことで解決できました
両方とも理解できました
お手数おかけしました

“MZ:質問” へ戻る