Help us understand the problem. What is going on with this article?

ツクール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()[番号]で取得
  • どの処理を行う場合でも、適当な変数に入れて有効な値かどうかをチェックする
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした