Unityで乱数計算を簡単にする便利クラスの紹介!【初心者向け】

3 min
Unityで乱数計算を簡単にする便利クラスの紹介!【初心者向け】

こんにちは! 個人でゲーム開発をしている、みどー(@mido_app)です。

おそらく個人ゲーム開発をしている人は自分の開発生産性を上げるために、各々が自分がよく使う処理をユーティリティ的に抜き出してオレオレライブラリのようなものを作っているのではないかと思っています。

そこで、今回から私が自分で作ってみて便利だなーと感じた自作のユーティリティを晒す記事を書いてみようと思い立ちました。

この記事では、用意しておくと乱数の計算や範囲設定がちょっとだけ便利になるユーティリティとして「特定の範囲内にある乱数を簡単に取得するためのユーティリティクラス」を紹介します。

乱数生成ユーティリティクラスの実装はこちら(整数の乱数編)

早速、ユーティリティクラスの中身を見てみましょう!

以下は、整数の乱数をMin〜Maxの範囲で簡単に取得するための便利クラスです。

using System;
using UnityEngine;

[Serializable]
public class IntRange
{
    [SerializeField]
    private int _min;
    public int Min
    {
        get { return _min; }
        set { _min = value; }
    }

    [SerializeField]
    private int _max;
    public int Max
    {
        get { return _max; }
        set { _max = value; }
    }

    public int GetRandomValueInRange()
    {
        return UnityEngine.Random.Range(Min, Max);
    }
}

解説の必要がないくらいにシンプルですが、Serializableをつけたクラスにすることでインスペクタから値を設定することができるので、Unityエディタ上でゲームを実行中に値を変えながらバランス調整することができる…というところがお気に入りポイントです。

また、UnityEngine.Random.Range関数の仕様から、Minは乱数の範囲に含まれますがMaxは含まれません。つまりMinを0にして、Maxを10にした場合、0 <= x <= 9の整数が出力候補になります!

乱数生成ユーティリティクラスの使い方例

使い方は非常に簡単で、乱数を使いたいMonoBehaviorのスクリプトのフィールドの1つにSerializeFieldとしてこのクラスを使ったフィールドを用意します

例えば、ランダムなHPと攻撃力を持つ敵キャラクタークラスを作りたい場合は以下のように実装します。

using UnityEngine;

public class Enemy : MonoBehaviour
{
    [SerializeField]
    private IntRange _maxHpRange;

    [SerializeField]
    private IntRange _attackRange;

    private int _maxHp;
    public int MaxHp => _maxHp;

    private int _attack;
    public int Attack => _attack;

    void Start()
    {
        _maxHp = _maxHpRange.GetRandomValueInRange();
        _attack = _attackRange.GetRandomValueInRange();
    }
}

実際にGameObjectにこのスクリプトをAdd Componentしてみた時のインスペクタの見た目はこんな感じです!

Start関数の中で最大HPと攻撃力を乱数によって決める実装になっているので、1つ1つの敵キャラクターのステータスが乱数によってランダムに決まる形になっています。

みどー

みどー

いちいちMinとMaxを別々のフィールドで管理する必要がなくなるのでEnemyクラスのコードもスッキリシンプルになっています!

乱数生成ユーティリティクラス(整数以外にも使えるよ編)

すでにお気づきだと思いますが、同じ方法は数値型であればどんな型にでも使うことができるので、整数以外にも同様のことができます。

例えばfloat型の小数の場合はこのようになります。

using System;
using UnityEngine;

[Serializable]
public class FloatRange
{
    [SerializeField]
    private float _min;
    public float Min
    {
        get { return _min; }
        set { _min = value; }
    }

    [SerializeField]
    private float _max;
    public float Max
    {
        get { return _max; }
        set { _max = value; }
    }

    public float GetRandomValueInRange()
    {
        return UnityEngine.Random.Range(Min, Max);
    }
}

また、UnityEngine.Random.Range関数の仕様からMinもMaxも生成される乱数の範囲に含まれます。つまりMinを3.5fにして、Maxを10.0fにした場合、3.5f <= x <= 10.0fの値が出力されます。

みどー

みどー

整数の場合と小数の場合で、UnityEngine.Random.Range関数の含む・含まないの基準は違うので注意してね!

おわりに

ブログを更新していきたいけどなかなか時間が取れないので、サクッと書けそうな題材ということでユーティリティの紹介をしてみました。

Unityに慣れている人には簡単すぎるかもしれないですが、インターネットの海から流れ着いたUnity初学者の方の参考になればなーと思います、

今後も、自分が開発する中で他の方にも有用と思ったユーティリティを、ブログ内に「Unityの自作ユーティリティ晒し」タグを作って、不定期に更新していこうと思います!

Unity関連のおすすめ記事

みどー

みどー

ITコンサル→フリーランスエンジニア→プロダクト開発会社の経歴を経て、現在はAIスタートアップ企業のお手伝いをしています。本業でWeb系→デスクトップアプリ系→AIエージェント開発とやってきて、趣味でスマホアプリ・ゲーム開発をしているので、簡単なものならなんでも作れる人間に育ちました。本業の稼ぎがそれなりになってきたので、今後は自分自身のプロダクトを作って生きていくことを目標に副業開発やブログ発信をしています。

FOLLOW

カテゴリー:
関連記事