【Unity】Unityで3D野球盤をつくろう日記 17日目:守備の選手(敵?)を増やす(Scriptを付加したObjectの名前を取得)

投稿日:2017年6月14日
最終更新日:2019年1月19日

(日記のまとめページはこちら:https://wakky.tech/unity-baseball-game/

前回、守備の選手を左右に動かすことに成功したので、今回は選手を増やすことに。この前つくったPlayerCenterオブジェクトをコピペして、キャッチャー以外の8人を作成した。

ポジションごとに名前を付け替えている。これで8人全員動くはず!と思いきや↓

……あれ、一人しかいないよ?私がこの前つくったスクリプトMovePlayer.csだが、どうやらtransform.localPositionの仕様を勘違いしていたようだ。そのオブジェクトの初期位置からの相対位置で動くわけではなく、親オブジェクトとの相対位置の関係で動くらしい。そのため、どうも親オブジェクトのPlayersからの相対位置でみんなが同時に動くもんだから、すべての選手が重なってしまい、一人に見えてしまっているようだ。対策として、以下のようにスクリプトを変更した。

https://gist.github.com/WakkyFree/2a48f26d631252737ca72d5dbcdea38e/7989d5c4e5f609fd4cbbaa14d7bede6512e71732

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を、それぞれの位置から相対的に動かすことができた。

ただ、現状は全員同じ方向に同じスピードで動くので、無機質でちょっと気持ち悪い感じ。最終的にはボールの方向に向かって動くようにしたいけど、とりあえず次はスピードや動く方向をランダムに与えて、バラバラの動きをするようにしてみようかな~と思う。


投稿者: wakky

映画と旅行が大好きなエンジニア。お酒、ゲーム、読書も好き。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください