事前のお知らせ

RPGツクールMZ 攻略本レベル5 プラグインの作り方

RPGツクールMZ・MVプラグインの作り方入門その9:ツクール内のデータの取得(コンソールの使い方)と初歩的なスクリプトの組み方(プラグインコマンドの中身)

プラグインコマンドの作り方自体は既に情報整理しましたが、「その中身の書き方が分からない」「ツクール内のデータってどこで見つけるの?」という声が聞こえる気がします。
(フォーラムやツクマテの質問を見ていると)

こちらを中心に情報の整理します。

目標

ツクール内ゲームデータの取得方法を知り、利用する。

結論

トリアコンタン氏作成のリファレンス(スプレッドシート)を見る。
もしくは、それを参考にデベロッパーツールのコンソール(以降コンソール)を使って探す。

トリアコンタン氏作成のリファレンス(スプレッドシート)を用意

下記の「取得スクリプト」を利用します。
ダウンロードして、ExcelやLibra Calc等で内部を検索できるととても便利です。

データの分類

スプレッドシート内でシートが複数に分かれています。
この中で、(込み入ったプラグインを作る場合は別として)主に使用するのは下記の2つです。

  • データベース
    ツクールで開くデータベースの事です。
    ゲーム中には変化しません。
  • ゲームオブジェクト
    データベースに基づいて、プレイ中の各種データの事です。
    レベルやステートのようにゲーム中で変化する値です。

コンソールを使ってスクリプトを実行

このシートの中にあるスクリプトを実行します。
コモンイベント等で変数に代入して、それを文章の表示の変数を表示する制御文字を使うというのが、割と思いつきやすいテスト方法だと思います。
(筆者は先日まで、そうしていました)
これを短縮できるのがコンソールです。

まず、テストプレイでマップ画面を出します。
コンソールを表示します。(F8かF12キーを押す)
テストプレイ起動時に先にコンソールを出しても、後からでも問題ありません。
デベロッパーツール内に「Console」が開いていると思います。
開いていない場合、「Console」というタブをクリックしてください。

スプレッドシートにある「アクター名」を出してみましょう。
コンソールの左端にある > の右側をクリックしてください。
カーソルが点滅します。

 

ここに $gameActors.actor(3)._name と入力し、エンターキーを押します。

 

アクター名が出てきました。

「RPGツクールMV/MZでの_始まりの変数やメソッドに対してクラスの外部からアクセスするのは好ましくない」らしいです。
代わりに、 $gameActors.actor(3).name() と入力しても、同じ動作をします。 
基本的にどちらでも動作しますが、 $gameActors.actor(3).name() の形式で動くものは、そちらの方が後々問題が起こりにくいそうです。

つまり、MV向けのトリアコンタン氏作成スプレッドシートの情報は古く、信憑性が低いらしいです。
(MZ版は ._ の記述はありません)

※筆者は「まず動かすことが重要で、『好ましい手法を使うべきという義務感』は、専門家になってから(プログラマを目指すようになってから)で良いんじゃないの?」と考えています。
ツクールでゲームを作ろうとしている大半の人々は「ゲームを完成させたいのであって、プログラマになりたいわけではない」と考えていますし、専門家にこんな記事は必要ないでしょう。
この記述で問題が起こった時には、下記記事を参考にすれば解決策が見つかるかも?と考えています。

【RPGツクールMV/MZ】なぜアンダースコアで始まる変数にクラスの外からアクセスしてはならないのか

よって、MV向けのトリアコンタン氏作成スプレッドシートを引き続き使うつもりです。

例1:覚えているスキルの中から1つを別アクターへ引き継がせたい

直近で筆者がツクマテで質問に答えた内容を例にします。
tm.lucky-duet.com/viewtopic.php?t=10573

スプレッドシートに無い値を探す

スキル情報を得たいのですが、スプレッドシートにはありません。
この理由は以降を試すと分かります。
まず、アクター全体の情報を取得します。
$gameActors.actor(3)._name」の ._name の部分を消した状態をコンソールに入力します。
$gameActors.actor(3)

アクターの色々なデータが並んでいるように見えます。
データの左側にある三角(▶)をクリックします。

中身が展開されました。
ズラッとデータが表示されます。
今回は取得済みのスキルを探します。
_skills を見つけました。
三角を押すと、更に開きます。

コンソールの一番下に行くと、入力欄があります。
$gameActors.actor(3)._skills と入力してエンターキーを押します。

このように習得済みスキルIDの一覧が出てきました。
[ ] で囲まれて,区切りの形式のこれは「配列」と呼ばれます。
配列のままだと、直接ツクールの変数に代入したり、条件分岐には使用できません。
このためスプレッドシートには載せていないのだと予想します。

配列から値を取得

ここからはJavaScriptの知識が必要になります。
この配列から値を取得し、流用していきます。

本来、JavaScriptの現状では変数を扱うには var let const を理解し、使い分けを学ぶべきです。
しかし、入門で理解しようとすると長くなりすぎるのと、(見た目は)簡易な書き方になるという理由で今は var で情報を整理します。
込み入ったプラグインを書く必要性が出る頃になったら、JavaScriptの入門書を読んで全体を把握する必要があるでしょう。

回答例

var fromActor = 1; // 技を与えるアクターID
var toActor = 2; // 技を覚えるアクターID
var skillArray = $gameActors.actor(fromActor)._skills; //与えるスキルID配列
if (skillArray.length) {
  var skillIdLearning = skillArray[Math.floor(Math.random() * skillArray.length)]; //与えるスキルIDをランダムに選択
  $gameActors.actor(toActor).learnSkill(skillIdLearning); //スキルを覚える
}

コード情報の整理

var fromActor = 1; // 技を与えるアクターID
var toActor = 2; // 技を覚えるアクターID
後から書くスクリプトを読みやすくするために、変数を作成し数値を代入しています。

var skillArray = $gameActors.actor(fromActor)._skills; //与えるスキルID配列
先程見つけた「$gameActors.actor(アクターID)._skills」で相手に習得させるスキルIDの配列をskillArrayという変数に代入しています。

 if (skillArray.length) {
下記を読んでみてください。
ツクールでの条件分岐でスクリプトを使った場合と同じです。
developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/if...else

配列はその名前の後ろに .length とつけると、その内容の数が得られます。
skillArray.length」は「skillArray(与える側のスキル配列)」の中身の数を取得します。
今回、skillArray の中身は [74, 75, 76, 92, 99, 100, 101, 103, 104, 132, 187, 189, 193] の13個の値が入った配列なので、skillArray.length からは13が返ってきます。
これが0(何も覚えていない)の場合、その後の処理が必要ないからです。
if(condition){ の condition が数値の場合、0だとfalse(偽・Noの意)の判定を返し、何かしら値があればtrue(真・Yesの意)を返します。

var skillIdLearning = skillArray[Math.floor(Math.random() * skillArray.length)]; //与えるスキルIDをランダムに選択
「JavaScript 配列 ランダム」を検索します。
qiita.com/_shimizu/items/eb6834f255d76b1ed8cf
この記事に書かれている「array」を「skillArray」に置換しました。
この処理で、覚えているスキル配列からランダムに1つだけ値を取得します。
この式の意味は、JavaScriptの Math.floorMath.random の2つを調べると何をしているか分かります。
var skillIdLearning = skillArray[Math.floor(Math.random() * skillArray.length)]
を2つに分けると下記のようになります。

var randomSelect = Math.floor(Math.random() * skillArray.length); // skillArrayの値の数からランダム数を発生(0から12)
var skillIdLearning = skillArray[randomSelect]; // skillArrayの中から randomSelect 番目の値を代入

skillArray[x] のx に0から12のランダム値を発生して、配列内からx番目の値(例えば skillArray[0]では、今回は最初のIDである74)を返します。

$gameActors.actor(toActor).learnSkill(skillIdLearning); //スキルを覚える
スキルを覚えるスクリプトになります。
これはツクール独特の命令なので、「RPGツクールMV スクリプト スキル」で検索します。

rpgmaker-script-wiki.xyz/skill_mv.php
//スキルを覚えさせる
$gameActors.actor(アクターID).learnSkill(スキルID)

こちらを使って、それまでに設定した変数をアクターIDとスキルIDに置換しています。
このようにちょっとした処理のスクリプトを組んでいます。
「JavaScript 配列 ~」と検索すると、色々な機能が見つかるので、試してください。
また、配列内の1つずつの値を取得する方法は、
プラグインの作り方入門その7:プラグインコマンドの作り方(JavaScriptの配列)
で情報整理しています。

おまけ:短縮した(JavaScriptの変数を使用しない)コード

JavaScriptの変数を使わないと、下記のようになります。
短くはなりますが、「アクターのIDを変えたい」とか後から変更する時に、とても読みにくいのが分かると思います。
ある程度、分かりやすい変数名をつけて、それを利用していくことをお勧めします。

if ($gameActors.actor(1)._skills.length) {
  $gameActors.actor(2).learnSkill($gameActors.actor(1)._skills[Math.floor(Math.random() * $gameActors.actor(1)._skills.length)]);
}

おまけ2:理想的(らしい)コード

ツクールでの _ から始まる変数を回避したコードはこう書くそうです。

const fromActor = 1; // 技を与えるアクターID
const toActor = 2; // 技を覚えるアクターID
const masterSkills = $gameActors.actor(fromActor).skills();
if (masterSkills.length !== 0) {
	const moveSkill = masterSkills[Math.randomInt(masterSkills.length)];
	$gameActors.actor(toActor).learnSkill(moveSkill.id);
}

例2:並び替えで特定のメンバーを先頭に

下記質問での回答です。
tm.lucky-duet.com/viewtopic.php?t=10489

スクリプト実例集

トリアコンタン氏作MV用スプレッドシートには「スクリプト実例集」があります。
これを使わない手はありません。
この中に下記があります。

  • 39:パーティメンバーの記憶
  • 40:記憶したパーティメンバーの復元

これを使わせていただきました。
(ググったら別質問で出てきたのでメモしておいたのですが、後からここを見つけたもので…今見返すと、質問にプラグインで答えていたのがアホだったのもチラホラと見られます…)

パーティの並び順を調べる

残る課題はパーティの並び順ですが、これもスプレッドシートにはありません。
「情報の種類」に「ゲームパーティ」があるので、これを使いましょう。

パーティの所持金 $gameParty._gold で実験します。
0が返ってきました。

では、例1と同様に ._gold を削除して、コンソールに入力します。
$gameParty

展開すると下記のようにデータが出てきます。

_actors にアクターIDが並んでいるようです。
$gameParty._actors をコンソールに入力します。

パーティの並び順が配列に順にアクターIDが入っているようです。
心配な場合、並び替えをして同じことを試しましょう。
合っているようです。

回答例

//パーティメンバーの先頭と交代
var newFirst = 4;  //先頭に行くアクターID
$gameParty.removeActor(newFirst);  //先頭アクターを削除
$gameParty._actors.unshift(newFirst);  //newFirstを先頭に追加
$gamePlayer.refresh();  //プレイヤーキャラクターの変更を反映
$gameMap.requestRefresh();//マップ画面の変更を反映

コード情報の整理

var newFirst = 4;  //先頭に行くアクターID
newFirst という変数を作り、そこに先頭にしたいアクターIDを代入します。

$gameParty.removeActor(newFirst);  //先頭アクターを削除
パーティから先頭へ行くアクターを一度外します。

$gameParty._actors.unshift(newFirst);  //newFirstを先頭に追加
先頭へ行くアクターIDを配列の最初に挿入します。
「JavaScript 配列 挿入 先頭」で検索します。
developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/unshift

$gamePlayer.refresh();  //プレイヤーキャラクターの変更を反映
$gameMap.requestRefresh();//マップ画面の変更を反映
これはツクール特有です。
パーティの並び順の配列を書き換えただけでは、画面表示が変わらない(マップ移動などすれば別ですが)ので、ここで変更を反映しています。

まとめ

このように作成したコードを頻繁に値を変えて実行するのにプラグインコマンド化すると便利です。
詳しくは、下記記事を参照ください。

謝辞

この記事は下記アーヴェル氏の記事を参考にさせていただきました。
スクリプトの知識がなくても、自分と一緒に簡単なプラグインを作ってみましょう!

スポンサードリンク

スポンサードリンク

-RPGツクールMZ, 攻略本レベル5 プラグインの作り方

Copyright© RPGツクールMZ・MV初心者的備忘録 - ムノクラのメモ帳 , 2021 All Rights Reserved.