Edited at

ツクール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()[番号]で取得

  • どの処理を行う場合でも、適当な変数に入れて有効な値かどうかをチェックする