RPGツクールMV
ツクールMV

ツクールMVにおけるアクターの取得

More than 1 year has passed since last update.

ツクマテさんでの質問に回答する中で、アクター(Game_Actor)関連の質問が多かったので記事にまとめます。

アクターの格納場所

ツクールMVのグローバル変数(\$~となっている変数)で、アクターに関連するものは主に以下の3つです。
ツクールMV全体での特徴として、実行中に書き換えることを想定された変数は\$game~・実行中も内容が変わらないものは\$data~という名前になっています。

変数名 型(クラス) データ内容 格納順
$dataActors Object[] ゲーム開始時のアクター 管理番号順(1スタート)
$gameActors Game_Actors ゲーム実行中のアクターのデータ 管理番号順(1スタート)
$gameParty Game_Party 加入しているアクター 加入順(0スタート)

$dataActors

アクターの初期データが格納されています。
設定されたデータはActors.jsonに格納されています。
ツクールのエディタでアクターの設定を変更すると、ここが変更されます。
よく\$dataActorsを編集しようとしたり、\$dataActorsをGame_Actorだと勘違いしてメソッドを呼び出そうとしたりするのを見ますが、そもそもできません。
\$data~系の変数は全てObject型であり、メソッドを持ちません。

$gameActors

Game_Actorsというクラスが格納されています。
ただし、このクラスには以下のactor()というメソッドしか存在せず、実質Game_Actorの配列のように使います。

rpg_objects.js
Game_Actors.prototype.actor = function(actorId) {
    if ($dataActors[actorId]) {
        if (!this._data[actorId]) {
            this._data[actorId] = new Game_Actor(actorId);
        }
        return this._data[actorId];
    }
    return null;
};

このメソッドですが、特定の番号のアクターを取得する場合にアクターが作成されていなければ新規に作成するという処理だけです。
パーティから外しても一度生成されたアクターは削除されません。

$gameParty

ゲーム実行中のパーティが格納されています。
パーティ以外に所持金やアイテムなども含まれており、プレイヤーのデータ全般を扱うクラスです。
パーティに加入しているメンバーを取得する場合、以下の方法で行います。
例えば名前を取得したいのであれば以下のようなコードです

var actor = $gameParty.members()[0];
if(actor){
  console.log(actor.name());
}

この場合、F8で開けるコンソール画面に名前が出力されます。
画面に出したければ$gameMessage.add(actor.name())にしてみましょう。
nameのあとにカッコが必要なことに注意しましょう。

実際に試してみる

プロジェクトを初期データで作成し、アクターをすべて加入させた後、以下のイベントコマンドを実行してみましょう。

◆変数の操作:#0001 = $dataActors[1].name
◆変数の操作:#0002 = $gameActors.actor(1).name()
◆変数の操作:#0003 = $gameParty.members()[0].name()
◆文章:なし, ウィンドウ, 下
:文章:dataActor \v[1]
:文章:gameActor \v[2]
:文章:gemaParty \v[3]

この場合、ハロルドと3回表示されると思います。
パーティを並び替えてみると、一番下のパーティメンバーの表示が変更されるのがわかると思います。
また、イベントコマンドでハロルドの名前を変えてみましょう。
そうすると、2番目のgameActorの表示が変わることがわかると思います。
また、どの場合も1番目のdataActorが変化しないことがわかります。

逆引きしてみる

Game_Actorは取得できたけど、これがパーティの何番目なのか知りたいという場合もあると思います。
この場合、Game_Actorのindex()メソッドを使います。
また、$gameActorの何番目に格納されているかを取得したい場合、Game_ActorのactorId()メソッドを使います。
スキルのダメージ式に以下の記述をして、スキルを味方に使わせてみてください。
a.actorId()*100
a.index()*100
(分散度は0%にしてください)
後ろのキャラが使うほど大ダメージになります。

まとめ

  • 特定のアクターのデータを取得したい場合、$gameActors.actor(番号)で取得
  • パーティの順番に応じて取りたいときは、$gameParty.members()[番号]で取得
  • どの処理を行う場合でも、適当な変数に入れて有効な値かどうかをチェックする