見出し画像

5-4ボールの動きをイイ感じにする【Unityゲーム開発の基礎】作って学ぶブロック崩し

ブロック崩しを作りながらUnityを学んでいこう!
フェーズ1で「ブロック崩しの骨格」を作り
フェーズ2で「見た目をかっこよく」して
フェーズ3で「タイトル画面やゲームオーバーなどの画面」を作って
フェーズ4では「アニメーション」させることができました。

フェーズ5の目標は「ステージの作成」です。

今回はボールの動きをイイ感じに調整していきます。
ボールの反射の仕方などは物理エンジンにおまかせしているので、自分で計算する必要なくわりとイイ感じに動いてくれていますが、いくつか気になる部分もあるので調整してみようと思います。


発射方向をランダムにする

ゲームがスタートするとボールが動き出しますが、いつも同じ方向に飛んでいくとなんだかつまらないですよね。
そこで、スタート時の動き出す方向をランダムに変化させてみます。

ボール用のスクリプト BallBehaviour を以下のように変更しました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BallBehaviour : MonoBehaviour
{
    public float speed = 5;
    private MainManagerBehaviour mainManager;
    private Rigidbody2D rigidBody2D;


    public void Startup(MainManagerBehaviour manager)
    {
        this.mainManager = manager;
        this.rigidBody2D = this.GetComponent<Rigidbody2D>();

        this.transform.position = new Vector3(0.0f, -3.5f, 0.0f);
        this.gameObject.SetActive(true);

        float deg = Random.Range(-45.0f, 45.0f);           // ←この辺を変更
        Vector2 vec = new Vector2(0.0f, speed);            // ←この辺を変更
        vec = Quaternion.Euler(0.0f, 0.0f, deg) * vec;     // ←この辺を変更

        rigidBody2D.velocity = vec;                        // ←この辺を変更
    }

    void Update()
    {
        if (null == mainManager) return;
        if (transform.position.y < -4)
        {
            mainManager.OnBallLost();
        }
    }
}

Random.Rangeメソッドを使うと指定した範囲でランダムな値を取得できます。ここでは±45度の範囲でランダムな角度を生成しています。
上方向のベクトルをランダムな角度に回転させるという感じです。

ベクトルを回転させるにはクオータニオンというのを使うと簡単に計算できるようです。クオータニオンは回転軸と角度を持った構造で、クオータニオンにベクトルを掛けると回転後のベクトルで取得できます。

Quaternion.Eulerメソッドを使うと x,y,z それぞれの軸に対する角度からクオータニオンを生成できます。

こうして作成したベクトルを rigidBody2D.velocity へセットしてあげれば発射時の向きをランダムにすることができます。


反射角度を調整する

物理エンジンにまかせていると、反射方向が水平にちかい角度になってしまうことがあります。こうなると左右の壁を行ったり来たりしてなかなか落ちてこないってことになってしまいます。

そこで、反射した時の角度を確認して水平に近い角度の場合は角度を変えてしまいましょう。

public class BallBehaviour : MonoBehaviour
{
       :
       :

    void OnCollisionEnter2D(Collision2D collision)
    {
        Vector2 vec = rigidBody2D.velocity;
        vec.Normalize();
        if (0.25f > Mathf.Abs(vec.y))
        {
            if (0.0f <= (vec.x * vec.y))
                vec = Quaternion.Euler(0.0f, 0.0f, 15.0f) * vec;
            else
                vec = Quaternion.Euler(0.0f, 0.0f, -15.0f) * vec;
        }
        vec *= speed;
        rigidBody2D.velocity = vec;
    }
}

OnCollisionEnter2Dは何かと衝突した時に呼び出されるメソッドです。
ここに角度を調整するコードを追加していきます。

現在のボールのベクトルは rigidBody2D.velocity から取得できます。
取得したベクトルを Normalize していますが、これは速度1のベクトルへ正規化することで角度が分かりやすいようにしています。
正規化したベクトルの Y が 0 に近いという事は角度が水平っぽいという事なので 15度回転させてしまいます。

正規化したベクトルに速度をかけて元のスピードに戻したら rigidBody2D.velocity へセットします。


つづく


次回:6-1ボールが跳ね返るときに効果音をならす


いいなと思ったら応援しよう!

この記事が参加している募集