ツクマテさんでの質問に回答する中で、アクター(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の配列のように使います。
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()[番号]で取得
- どの処理を行う場合でも、適当な変数に入れて有効な値かどうかをチェックする