0 支持
87 閲覧

~作っているもの~
ブロック崩し

~問題~
稀にボールが水平に近い軌道のまま移動を続け、上の壁に当たるとそのまま壁に沿って完全に水平移動してしまい、戻ってこないこと。

~試したこと~
とあるサイトにて「常にボールの移動方向を確認し、単位ベクトルを得て、水平に近ければ補正する」という方法があったため、それを試してみました。しかし、うまく反映されていません。

アドバイスなどをよろしくお願いします。なお、現在のボールにアタッチしているスクリプトは下のとおりです。試したことの内容は VectorChange() のとおりです。

~現在のボールのスクリプト~

Rigidbody2D rb;

private float limitV = 10f;
private float limitH = 45f;

void Start()
{
    rb = this.gameObject.GetComponent<Rigidbody2D>();
}

void Update()
{
    VectorChange();
}

void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.tag == "Player")
    {
        Vector3 playerPos = collision.transform.position;

        Vector3 ballPos = transform.position;

        Vector3 direction = (ballPos - playerPos).normalized;

        float speed = rb.velocity.magnitude;

        rb.velocity = direction * speed;
    }
}

private void VectorChange()
{
    Vector2 velocityNormalized = rb.velocity.normalized;

    if (velocityNormalized.x >= 0.0f)
    {
        velocityNormalized.x = Mathf.Clamp(velocityNormalized.x, Mathf.Cos(Mathf.Deg2Rad * (90 - limitV)), Mathf.Cos(Mathf.Deg2Rad * (0 + limitH)));
    }
    else
    {
        velocityNormalized.x = Mathf.Clamp(velocityNormalized.x, Mathf.Cos(Mathf.Deg2Rad * (180 - limitH)), Mathf.Cos(Mathf.Deg2Rad * (90 + limitV)));
    }

    if (velocityNormalized.y >= 0.0f)
    {
        velocityNormalized.y = Mathf.Clamp(velocityNormalized.y, Mathf.Sin(Mathf.Deg2Rad * (180 - limitH)), Mathf.Sin(Mathf.Deg2Rad * (90 + limitV)));
    }
    else
    {
        velocityNormalized.y = Mathf.Clamp(velocityNormalized.y, Mathf.Sin(Mathf.Deg2Rad * (270 - limitV)), Mathf.Sin(Mathf.Deg2Rad * (180 + limitH)));
    }
}
初心者 (140 ポイント) | 87 閲覧

ログインまたはユーザー登録してから回答してください。

回答 1

0 支持

VectorChange()メソッドに、補正されたvelocityNormalizedの値をrbに反映させる処理が記述されていませんね。

なので、VectorChange()メソッドの最後に以下の文を追加すると動作すると思います。

rb.velocity = velocityNormalized * rb.velocity.magnitude;

初心者 (440 ポイント)
0
冗長かもしれませんが、rb.velocity.magnitudeの処理には平方根の計算を用いますので、処理が重く、毎回Update()メソッドで処理させるには端末に大きな負荷をかけます。したがって、bool変数のフラグを用いて「velocityNormalizedの値が更新された場合のみ、rb.velocityの値を更新する」という処理に書き換えるとスマートだと思われます。
0
回答ありがとうございます!助かりました!

関連する質問

0 支持
1 回答
tensaku 初心者 (440 ポイント) 2020 8/30 質問 | 254 閲覧
0 支持
1 回答
0 支持
0 回答
bassan 初心者 (120 ポイント) 3 週間 質問 | 22 閲覧
0 支持
0 回答
kumao23 初心者 (220 ポイント) 3 週間 質問 | 21 閲覧
2021-02-08 質問・回答をMarkdownで入力できるようにしました。
2020-09-03 新たなスパム対策を導入しました。

160 質問

154 回答

160 コメント

193 ユーザー