ボールプレハブ
ボールがシーンに直接に追加するものではなく、実行中に生成するものであるため、プレハブとして作成しなければならない。とりあえず、現在のシーンを活用し、プレハブができたら、削除すれば良いでしょう。
プレハブ構築
シーンにボールのスクリプトをドラッグドロップで追加し、丸い「CircleCollider2D」を付けてください。ボールも物理的に動かす予定で、リジッドボディも追加してください。
※ボールが見えなければ、「Order In Layer」または Z軸の位置を適切に変えてください
今回も重力を使わないので、「Gravity Scale」をゼロにしてね!
ボールの移動を制御する:BallMove
スクリプトフォルダーに新しい「BallMove」スクリプトを作成してください。このスクリプトはボールの動きをコントロールするスクリプトである。また、Unityでボールの速度を変えられるようにしましょう。
スクリプトの変数
using UnityEngine;
// ボールの移動を管理するスクリプト
public class BallMove : MonoBehaviour
{
// Inspectorで速度を設定する
[SerializeField]
private float speed;
// 移動するためのリジッドボディ
private Rigidbody2D _rigidbody;
}
プレーヤーと同様に、Unityの物理演算を使い、移動するので、Rigidbody2D を使用する。ただし、入力は関係しないので、Inspector で設定するのは、速度だけになる。
初期化 - Start()
とりあえず、ボールが真上に行くようにし、どうなるのか確認しましょう。
private void Start()
{
// コンポーネントの参照を取得
_rigidbody = GetComponent<Rigidbody2D>();
// とりあえず、真上に行くようにしましょう
_rigidbody.linearVelocity = new Vector2(0, 1) * speed;
}
確認
BallMove のスクリプトをボールにアタッチし、ゲームを実行してみてください。

問題発見:ボールが止まってしまう!
Unityでは、デフォルトとして衝突が跳ね返しの「弾み」(bounciness) がほとんどない。そのため、ボールと壁が衝突する場合、速度を吸収され、停止してしまう。
これを解決するには、いずれかのコライダーに「弾み強くしろ!」の設定しなければならない。これは「Physics Material 2D」(Physics: 物理、 Material:素材)のデータで調整できるもの。
スーパーボールのように、ゴムの「素材」を作ろう。この素材の弾みは100%にする(跳ね返す速度は衝突したときと同じ速度にする)まず、プロジェクトのAssetsフォルダーの中に右クリックし、新しい「Create > 2D > Physics Material 2D」を作成し、名前は「Rubber」(ゴム)にする
Rubberを選択し、Inspectorを見ると、物理的な「素材」のパラメータを調整ができる:
Friction:(魔雑) - 2つの平面の魔雑のこと 0:魔雑なし 例:凍った池(すべすべ) 1:超魔雑 例:サンドペーパー(全く滑らない)
Bounciness(弾み)- 衝突するとき跳ね返す力のこと 0:弾みなし 例:粘土、生地 1:超跳ね返し 例:スーパーボール
Friction Combine / Bounce Combine(合成方法) 衝突には、2つの物体がかかわるので、どう合成するのか? ・Minimum:最低数値を使う ・Maximum:最大数値を使う ・Mean:2つの数値の平均を使う |

今回は、スーパーボールを再現したいので:
にしましょう。「Rubber」のパラメター設定ができてたら、ボールの CircleCollider2D に付け、再度確認しましょう。
ランダム向きで発射!
ボールが真上だけしか行かないと、あまり面白くないので、ボールがある程度ランダムの向きで始まるようにしましょう。高校で学んできた「三角関数」を少し使えば、解決できる!
※:ゲームでよく使う数学は、また「ゲームエンジンII」で会いましょう!

アイディアとして、ボールが「最低角度」と「最大角度」の間にランダムに発射すること。これは C# にすると(Startの編集版)
private void Start()
{
// コンポーネントの参照を取得
_rigidbody = GetComponent<Rigidbody2D>();
// とりあえず、真上に行くようにしましょう
// _rigidbody.linearVelocity = new Vector2(0, 1) * speed;
float minAngle = 45; // 最低角度 - 度単位
float maxAngle = 135; // 最大角度 - 度単位
// 最低と最大の間にランダムに角度を求める
float angle = Random.Range(minAngle, maxAngle);
// 度からラジアンへ変換
angle = angle * Mathf.Deg2Rad;
// 三角関数(サインとコサイン)を使って、向きにする
var direction = new Vector2();
direction.x = Mathf.Cos(angle);
direction.y = Mathf.Sin(angle);
// 速度を与える
_rigidbody = GetComponent<Rigidbody2D>();
_rigidbody.linearVelocity = direction * speed;
}



