(日記のまとめページはこちら:https://wakky.tech/unity-baseball-game/)
前回、守備の選手を左右に動かすことに成功したので、今回は選手を増やすことに。この前つくったPlayerCenterオブジェクトをコピペして、キャッチャー以外の8人を作成した。
ポジションごとに名前を付け替えている。これで8人全員動くはず!と思いきや↓
……あれ、一人しかいないよ?私がこの前つくったスクリプトMovePlayer.csだが、どうやらtransform.localPositionの仕様を勘違いしていたようだ。そのオブジェクトの初期位置からの相対位置で動くわけではなく、親オブジェクトとの相対位置の関係で動くらしい。そのため、どうも親オブジェクトのPlayersからの相対位置でみんなが同時に動くもんだから、すべての選手が重なってしまい、一人に見えてしまっているようだ。対策として、以下のようにスクリプトを変更した。
transform.nameで、スクリプトを付加したオブジェクトの名前を取得している。例えばPlayerCenterオブジェクトにスクリプトを付加した場合、transform.nameの返り値は、付加したオブジェクトの名前である「PlayerCenter」になる。これによって、スクリプトを付加したそれぞれのPlayers内オブジェクトの名前を勝手に取得してくれる。以下の部分では付加したオブジェクトのx、y、z軸絶対座標を取得している。
Vector3 player = GameObject.Find(transform.name).transform.position;
player_x = player.x;
player_y = player.y;
player_z = player.z;
あとは、以下のようにすれば、オブジェクトの初期絶対座標にx_sumを加えて移動させることができる。(transform.localPositionをtransform.positionに変更している点に注意)
transform.position = new Vector3(player_x + x_sum, player_y, player_z);
これで、それぞれの守備位置のPlayerを、それぞれの位置から相対的に動かすことができた。
ただ、現状は全員同じ方向に同じスピードで動くので、無機質でちょっと気持ち悪い感じ。最終的にはボールの方向に向かって動くようにしたいけど、とりあえず次はスピードや動く方向をランダムに与えて、バラバラの動きをするようにしてみようかな~と思う。