(日記のまとめページはこちら:https://wakky.tech/unity-baseball-game/)
前回はバットを回転させるスクリプトを書いた。今回はバットに向けてボールを撃ち出して、それを打ち返すところまでつくる。……とあっさり書いたけど、今回はなかなかの難所だった。
ボールを撃ち出す処理
ボールを撃ち出して転がすには、以下のチュートリアルを参考にすると良さそう。
とりあえず、3D Object → Sphere で適当な大きさのボールを置いて、名前を「Ball」に変更。バットを少し手前に置きすぎていたので、奥の方に位置を調整した。物理演算を有効にするために、右下の Add Component → Physics → Rigidbodyを選択。
また、BatにもRigidbodyを追加した。それと、以下で詳しく書くけど、Fixed JointでBatをつなげるためにBatterにもRigidbodyを追加。そして、Ballに以下のScriptを追加(なんかインデントがおかしいけど・・・)。
Updateに処理を書くと力が加わり続けてしまうので、最初一発だけ力が加わるように、StartにAddForce処理を書いた。これで、再生と同時にボールが撃ち出されるようになった。のちのちゲームとしてつくり込んでいくときには複数回ボールを投げないといけないので、修正が必要だと思う。まぁ、とりあえずボールを打ち返す流れをまず一通り作りたいので、今回はこのままで。
ボールをバットで打ち返す処理
バットのスイング処理は前回つくったので、後は再生してボールでバットを打つだけ・・・なのだが、ボールがバットをすり抜けてしまう。色々調べてみて、最終的にrigidbodyやcollisionの設定を変更すれば対処できた。最終的なBall、Bat、BatterのIncpectorの設定を以下にのっけておく。
細かい部分は省略するが、ポイントだけ以下にまとめておく。
RigidbodyのConstraints設定
Rigidbodyは、Constraintsの設定で、動く方向を制限することができる。今回の場合、Batは高さ方向(Y軸方向)に動くことはないので、Freeze PositionのYにチェックを入れる。Ballも同様に、Freeze PositionのYにチェックを入れる。Batterに関しては、後述のFixed Jointしたときに制約を付けないとフラフラ動いてしまったので、X、Y、Zのすべてのチェックを入れて、完全に固定した。
collisionの範囲指定
collisionでは、オブジェクトの接触判定が有効になる範囲を指定することができるので、BatやBallの大きさに合わせて設定する。RadiusやHeightの値をいじるとcollisionの範囲を表す線の範囲が変わるので、ちょうどいい大きさになるように範囲を変更する。
オブジェクトの接続をFixed Jointに変更
BatterとBatを親子関係にしていると、「IsTrigger」をオフにした場合に、バットが勝手に変な方向に回転してしまい、うまく打ち返せなかった(上の記事にある「ぶつかる対象とのレイヤーを確認」の部分にあたるのかな?)。そのため、BatをBatterから出して同じ階層に配置し、BatにFixed Joint設定を追加してBatterに固定することにした。
Batを選択し、右下の Add Component → Physics → Fixed Jointを選択。そこで、Connected Bodyの右のボタンを押して、接続先を「Batter」に指定する。Fixed Jointでは、Rigidbodyが設定されたオブジェクトしか接続先に選べないので注意。
まだちょっと動作が怪しいけど、とりあえずボールを打ち返す動作はできた。次は、より野球盤っぽくなるようにテクスチャを張り付けたりしてみようかな。