アクツクMV：スクリプトでプレイヤーと敵の距離を測る


前回はスクリプトで「自分自身の変数」を読み書きしました。
https://qiita.com/havin_nothin/items/f09d057f2fd4de383829

今回は、自分以外のオブジェクトの変数を取得する方法をつかって、プレイヤーと敵の距離を測ってみます。

１．敵オブジェクトに変数を作ります。「X差」「Y差」の２つ。それぞれ、プレイヤーと敵のX座標の差、Y座標の差を格納するためのものです。

![script106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103492/22f8ebf8-5c12-ffa4-a8be-7ad94cb1cce8.png)

あと、変数のテキスト表示のためのオブジェクト「変数表示」はこんな感じにしています。

```
プレイヤー座標
 \V[プレイヤー,X座標位置,0],\V[プレイヤー,Y座標位置,0]
敵との距離
 \V[敵１,X差,0],\V[敵１,Y差,0]
```
![script107.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103492/0c91835f-8696-f032-2316-c62869d2a81e.png)

２．オブジェクトとインスタンス
スクリプトで変数を使うときは、オブジェクトのインスタンスを指定します。
インスタンスというのは、シーンに配置されたオブジェクトのことです（「レイアウトオブジェクト一覧」と書いてあるところのもの）。
オブジェクトは設計図で、設計図をシーンに配置すると、実体（インスタンス）になって、操作できるようになるというイメージです。

具体的には、シーンの画面で、左下の名前を使うということになります。右上のオブジェクトの名前ではないことに注意してください。
この場合、「敵」ではなく「敵１」を指定します。プレイヤーは同じですが、下の名前です。

![script101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103492/96e58acc-382e-693c-285e-58512f2b8225.png)

３．スクリプトアクションを設置

「敵」オブジェクトの「待機」の横に「プレイヤーとの距離計測」というアクションを作ります。
リンクは「無条件」で待機と行ったり来たりするようにします。
「プレイヤーとの距離計測」に「スクリプトを実行」で以下のスクリプトを入れます。

![script108.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103492/e2aa457f-c949-4497-56d5-8542d9d1454a.png)


```
(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, "プレイヤー"));
と書くということです。

最初の２行で、playerにはプレイヤーのインスタンス、enemyには敵１のインスタンスが入りました。
その次の
const playerX = **player** .variables.get(**player**.variables.getIdByName("X座標位置")).getValue();
const enemyX = **enemy**.variables.get(**enemy**.variables.getIdByName("X座標位置")).getValue();
という部分では、＝の後の、playerとenemyのところに注目してください。
あと括弧の中の先頭のplayerとenemyのところ。
この部分で、どのインスタンスの変数を使うのか指定しています。
この部分以外は同じです。
この２行で、playerXにはプレイヤーのX座標、enemyXには敵１のX座標が入ります。

あとはその差分を計算した値distanceXを「敵１」enemyの「X差」という変数に代入しています。

enemy.variables.get(enemy.variables.getIdByName("X差")).setValue(distanceX);

（先頭のenemyをplayerに変えれば、プレイヤーの変数に代入することができます。）

Y座標についても同じことをしています。

４．さて、それでは、プレイヤーのXY座標と、プレイヤーと敵１との差（X,Y）を表示してみます。
プレイヤーを移動させたり、敵１を移動させたりしてみました。

![script112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103492/0464289f-d272-30e9-d904-5c7f62f4420c.png)
![script113.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103492/a409c56b-91c7-ec52-3b97-c18ea454c2d3.png)
![script111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103492/f9e43bc9-0b5b-1c16-d0a0-d62348598486.png)

というわけで、今回は、自分以外のオブジェクト（インスタンス）の変数を取得して、敵とプレイヤーの距離を測ってみました。

ではまた。

補足：メニュー表示上で、自分自身以外のオブジェクトのインスタンスを名前で指定しても、変数が取得できないです。
　一応、デバッグモードでインスタンスIDを調べて、次のようにIDを直接指定すると取得できます。
![script110.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3103492/61771fc5-66d0-c586-397a-b6642be87264.png)

const hoge = Agtk.objectInstances.get(**10000003**);
const hogeX = hoge.variables.get(hoge.variables.getIdByName("X座標位置")).getValue();

ただし、もしかすると、オブジェクトを移動するとかの何らかの要因でインスタンスIDが変わってしまう可能性があるので、この方法は、あんまりおすすめはできない方法です。（どうすればいいか調べていますが見つからない）。