0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-01-25

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

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

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

script106.png

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

プレイヤー座標
 \V[プレイヤー,X座標位置,0],\V[プレイヤー,Y座標位置,0]
敵との距離
 \V[敵1,X差,0],\V[敵1,Y差,0]

script107.png

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

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

script101.png

3.スクリプトアクションを設置

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

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

最初の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を移動させたりしてみました。

script112.png
script113.png
script111.png

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

ではまた。

補足:メニュー表示上で、自分自身以外のオブジェクトのインスタンスを名前で指定しても、変数が取得できないです。
 一応、デバッグモードでインスタンスIDを調べて、次のようにIDを直接指定すると取得できます。
script110.png

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?