Skip to main content

ボールプレハブ

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

プレハブ構築

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

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

image.png

今回も重力を使わないので、「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 のスクリプトをボールにアタッチし、ゲームを実行してみてください。

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

Friction:(魔雑) - 2つの平面の魔雑のこと

 0:魔雑なし  例:凍った池(すべすべ)

 1:超魔雑   例:サンドペーパー(全く滑らない)

 

Bounciness(弾み)- 衝突するとき跳ね返す力のこと

 0:弾みなし  例:粘土、生地

 1:超跳ね返し 例:スーパーボール

 

Friction Combine / Bounce Combine(合成方法)

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

 ・Minimum:最低数値を使う

 ・Maximum:最大数値を使う

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

image.pngimage.png

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

  • Friction:0
  • Bounciness:1
  • Friction Combine:Minimum
  • Bounce Combine:Maximum

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

ランダム向きで発射!

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

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

image.pngimage.png

アイディアとして、ボールが「最低角度」と「最大角度」の間にランダムに発射すること。これは 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;
}