meimaru’s blog

やってみて詰まったことを備忘録として残すブログ

【Unity 2D】角度と方向をランダムに選んで動かす方法

unityのバージョン 2020.3.5f1

この間GW潰しという悲しきゲームを
作ったのですが
角度をランダムに選んでその方向に動かす
処理の実装に詰まったので
やったことを残しておきます。

角度をランダムに選ぶ

結構迷ったのですが探したら
Forumに完璧な回答がありました

var direction = Random.insideUnitCircle.normalized;

これでできます。

AddForceで動かす

単純に動かすのであれば下記のコードで
動きます。

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

public class Mover : MonoBehaviour
{
    private float speed = 10;

    void Start()
    {
        var rb = GetComponent<Rigidbody2D>();

        var dir = Random.insideUnitCircle.normalized;

        var force = dir * speed;
        rb.AddForce(force);
    }
}

しかしこれだと質量が乗っているので
結構強めの力を加えないと大きく動きません。

今回作ったゲームでは質量を無視して
動かしたかったので
ForceMode.VelocityChange
使ってみます。

ForceModeを指定する

ForceMode2DでVelocityChangeを選んで
動かして見ようと思ったのですが・・・

f:id:meimaru:20210427110526p:plain
ForceMode2DにはVelocityChangeが
無い
ということを知ります。

困ったので色々調べていたら
同じ問題に当たった人の質問を見つけました。
ここでどう書けばVelocityChangeを指定した
時の動きになるかがわかったので
使ってみます。

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

public class Mover : MonoBehaviour
{
    private float speed = 10;

    [SerializeField]
    private bool velocityChange = false;

    void Start()
    {
        var rb = GetComponent<Rigidbody2D>();

        var dir = Random.insideUnitCircle.normalized;

        var force = dir * speed;

        if (velocityChange)
        {
            rb.AddForce(force * rb.mass / Time.fixedDeltaTime);
        }
        else
        {
            rb.AddForce(force);
        }   
    }
}

白い弾がmodeの指定なし
赤い弾がVelocityChangeらしきものを
使ってます。
f:id:meimaru:20210427110959g:plain

だいぶ動き変わりましたね。

これでランダムな方向を選んで
動かすことができました。