# ボールプレハブ

ボールがシーンに直接に追加するものではなく、実行中に生成するものであるため、プレハブとして作成しなければならない。とりあえず、現在のシーンを活用し、プレハブができたら、削除すれば良いでしょう。

## プレハブ構築

シーンにボールのスクリプトをドラッグドロップで追加し、丸い「CircleCollider2D」を付けてください。ボールも物理的に動かす予定で、リジッドボディも追加してください。

※ボールが見えなければ、「Order In Layer」または Z軸の位置を適切に変えてください

[![image.png](https://class.illogic.games/uploads/images/gallery/2026-04/scaled-1680-/zR0image.png)](https://class.illogic.games/uploads/images/gallery/2026-04/zR0image.png)

今回も重力を使わないので、「Gravity Scale」をゼロにしてね！

## ボールの移動を制御する：`BallMove`

スクリプトフォルダーに新しい「`BallMove`」スクリプトを作成してください。このスクリプトはボールの動きをコントロールするスクリプトである。また、Unityでボールの速度を変えられるようにしましょう。

### スクリプトの変数

```c#
using UnityEngine;

// ボールの移動を管理するスクリプト
public class BallMove : MonoBehaviour
{
    // Inspectorで速度を設定する
    [SerializeField]
    private float speed;

    // 移動するためのリジッドボディ
    private Rigidbody2D _rigidbody;
}
```

プレーヤーと同様に、Unityの物理演算を使い、移動するので、`Rigidbody2D` を使用する。ただし、入力は関係しないので、`Inspector` で設定するのは、速度だけになる。

### 初期化 - `Start()`

とりあえず、ボールが真上に行くようにし、どうなるのか確認しましょう。

```c#
private void Start()
{
    // コンポーネントの参照を取得
    _rigidbody = GetComponent<Rigidbody2D>();
    
    // とりあえず、真上に行くようにしましょう
    _rigidbody.linearVelocity = new Vector2(0, 1) * speed;
}
```

### 確認

`BallMove` のスクリプトをボールにアタッチし、ゲームを実行してみてください。

![image.png](https://class.illogic.games/uploads/images/gallery/2026-04/scaled-1680-/SaOimage.png)

## 問題発見：ボールが止まってしまう！

Unityでは、デフォルトとして衝突が跳ね返しの「弾み」(bounciness) がほとんどない。そのため、ボールと壁が衝突する場合、速度を吸収され、停止してしまう。

これを解決するには、いずれかのコライダーに「弾み強くしろ！」の設定しなければならない。これは「Physics Material 2D」（Physics: 物理、 Material：素材）のデータで調整できるもの。

![image.png](https://class.illogic.games/uploads/images/gallery/2026-04/scaled-1680-/u8Simage.png)

スーパーボールのように、ゴムの「素材」を作ろう。この素材の弾みは100%にする（跳ね返す速度は衝突したときと同じ速度にする）まず、プロジェクトのAssetsフォルダーの中に右クリックし、新しい「Create &gt; 2D &gt; Physics Material 2D」を作成し、名前は「Rubber」（ゴム）にする

![image.png](https://class.illogic.games/uploads/images/gallery/2026-04/scaled-1680-/Mhgimage.png)

Rubberを選択し、Inspectorを見ると、物理的な「素材」のパラメータを調整ができる：

<table border="1" id="bkmrk--4" style="border-collapse: collapse; width: 100%; border-width: 0px;"><colgroup><col style="width: 41.2302%;"></col><col style="width: 58.8492%;"></col></colgroup><tbody><tr><td style="border-width: 0px;">![image.png](https://class.illogic.games/uploads/images/gallery/2026-04/scaled-1680-/WmLimage.png)

</td><td style="border-width: 0px;">**Friction**:（魔雑） - 2つの平面の魔雑のこと

 ０：魔雑なし 例：凍った池（すべすべ）

 １：超魔雑 例：サンドペーパー（全く滑らない）

**Bounciness**（弾み）- 衝突するとき跳ね返す力のこと

 ０：弾みなし 例：粘土、生地

 １：超跳ね返し 例：スーパーボール

**Friction Combine / Bounce Combine（**合成方法）

 衝突には、２つの物体がかかわるので、どう合成するのか？

 ・Minimum：最低数値を使う

 ・Maximum：最大数値を使う

 ・Mean：2つの数値の平均を使う

</td></tr></tbody></table>

![image.png](https://class.illogic.games/uploads/images/gallery/2026-04/scaled-1680-/gzcimage.png)

今回は、スーパーボールを再現したいので：

- Friction：０
- Bounciness：１
- Friction Combine：Minimum
- Bounce Combine：Maximum

にしましょう。「Rubber」のパラメター設定ができてたら、ボールの `CircleCollider2D` に付け、再度確認しましょう。

### ランダム向きで発射！

ボールが真上だけしか行かないと、あまり面白くないので、ボールがある程度ランダムの向きで始まるようにしましょう。高校で学んできた「三角関数」を少し使えば、解決できる！

※：ゲームでよく使う数学は、また「ゲームエンジンII」で会いましょう！

![image.png](https://class.illogic.games/uploads/images/gallery/2026-04/scaled-1680-/JH0image.png)

アイディアとして、ボールが「最低角度」と「最大角度」の間にランダムに発射すること。これは C# にすると（`Start`の編集版）

```c#
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;
}
```

### ボールをプレハブ化

作ったボールを実行中に生成できるため、プレハブにしましょう。まず、Project の中にプレハブ専用の「Prefab」フォルダーを作成してください。ボールをヒエラルキーから Prefab フォルダーへドラッグドロップすれば、プレハブの作成ができる。

[![image.png](https://class.illogic.games/uploads/images/gallery/2026-04/scaled-1680-/VAkimage.png)](https://class.illogic.games/uploads/images/gallery/2026-04/VAkimage.png)

これでプレハブは完成であり、シーンからボールを削除しましょう。