Skip to main content

ボールプレハブ

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

プレハブ構築

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

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

image.png

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

ボールの移動を制御する:BallMove

スクリプトフォルダーに新しい「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 のスクリプトをボールにアタッチし、ゲームを実行してみてください。

image.png

問題発見:ボールが止まってしまう!

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

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

image.png

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

image.png

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

image.png