前回はスクリプトで「自分自身の変数」を読み書きしました。
https://qiita.com/havin_nothin/items/f09d057f2fd4de383829
今回は、自分以外のオブジェクトの変数を取得する方法をつかって、プレイヤーと敵の距離を測ってみます。
1.敵オブジェクトに変数を作ります。「X差」「Y差」の2つ。それぞれ、プレイヤーと敵のX座標の差、Y座標の差を格納するためのものです。
あと、変数のテキスト表示のためのオブジェクト「変数表示」はこんな感じにしています。
プレイヤー座標
\V[プレイヤー,X座標位置,0],\V[プレイヤー,Y座標位置,0]
敵との距離
\V[敵1,X差,0],\V[敵1,Y差,0]
2.オブジェクトとインスタンス
スクリプトで変数を使うときは、オブジェクトのインスタンスを指定します。
インスタンスというのは、シーンに配置されたオブジェクトのことです(「レイアウトオブジェクト一覧」と書いてあるところのもの)。
オブジェクトは設計図で、設計図をシーンに配置すると、実体(インスタンス)になって、操作できるようになるというイメージです。
具体的には、シーンの画面で、左下の名前を使うということになります。右上のオブジェクトの名前ではないことに注意してください。
この場合、「敵」ではなく「敵1」を指定します。プレイヤーは同じですが、下の名前です。
3.スクリプトアクションを設置
「敵」オブジェクトの「待機」の横に「プレイヤーとの距離計測」というアクションを作ります。
リンクは「無条件」で待機と行ったり来たりするようにします。
「プレイヤーとの距離計測」に「スクリプトを実行」で以下のスクリプトを入れます。
(function(){
//プレイヤーと敵を変数に入れる
const player = Agtk.objectInstances.get(Agtk.objectInstances.getIdByName(-1, "プレイヤー"));
const enemy = Agtk.objectInstances.get(instanceId);
//プレイヤーと敵のX座標の差を求め、敵の変数「X差」に入れる
const playerX = player.variables.get(player.variables.getIdByName("X座標位置")).getValue();
const enemyX = enemy.variables.get(enemy.variables.getIdByName("X座標位置")).getValue();
const distanceX = playerX - enemyX;
enemy.variables.get(enemy.variables.getIdByName("X差")).setValue(distanceX);
//プレイヤーと敵のY座標の差を求め、敵の変数「Y差」に入れる
const playerY = player.variables.get(player.variables.getIdByName("Y座標位置")).getValue();
const enemyY = enemy.variables.get(enemy.variables.getIdByName("Y座標位置")).getValue();
const distanceY = playerY - enemyY ;
enemy.variables.get(enemy.variables.getIdByName("Y差")).setValue(distanceY);
})()
いま、「敵」オブジェクトが自分自身ですので、「プレイヤー」は自分自身ではないオブジェクト(インスタンス)になります。
自分自身を指定する場合は、
Agtk.objectInstances.get(instanceId)
と書きますが、自分自身でない場合は
Agtk.objectInstances.get(Agtk.objectInstances.getIdByName(-1, "プレイヤー"));
と書くということです。
最初の2行で、playerにはプレイヤーのインスタンス、enemyには敵1のインスタンスが入りました。
その次の
const playerX = player .variables.get(player.variables.getIdByName("X座標位置")).getValue();
const enemyX = enemy.variables.get(enemy.variables.getIdByName("X座標位置")).getValue();
という部分では、=の後の、playerとenemyのところに注目してください。
あと括弧の中の先頭のplayerとenemyのところ。
この部分で、どのインスタンスの変数を使うのか指定しています。
この部分以外は同じです。
この2行で、playerXにはプレイヤーのX座標、enemyXには敵1のX座標が入ります。
あとはその差分を計算した値distanceXを「敵1」enemyの「X差」という変数に代入しています。
enemy.variables.get(enemy.variables.getIdByName("X差")).setValue(distanceX);
(先頭のenemyをplayerに変えれば、プレイヤーの変数に代入することができます。)
Y座標についても同じことをしています。
4.さて、それでは、プレイヤーのXY座標と、プレイヤーと敵1との差(X,Y)を表示してみます。
プレイヤーを移動させたり、敵1を移動させたりしてみました。
というわけで、今回は、自分以外のオブジェクト(インスタンス)の変数を取得して、敵とプレイヤーの距離を測ってみました。
ではまた。
補足:メニュー表示上で、自分自身以外のオブジェクトのインスタンスを名前で指定しても、変数が取得できないです。
一応、デバッグモードでインスタンスIDを調べて、次のようにIDを直接指定すると取得できます。
const hoge = Agtk.objectInstances.get(10000003);
const hogeX = hoge.variables.get(hoge.variables.getIdByName("X座標位置")).getValue();
ただし、もしかすると、オブジェクトを移動するとかの何らかの要因でインスタンスIDが変わってしまう可能性があるので、この方法は、あんまりおすすめはできない方法です。(どうすればいいか調べていますが見つからない)。