top of page
  • 執筆者の写真Reo

Random.insideUnitSphere

こんにちは.

8月にはいりましたね,今日も暑い暑い・・・

7月は台風がなく,1951年以来の異常気象だとかなんとか

まぁ学生で学校がやすみになるーという子以外は基本的には来てほしくないんじゃないかなぁと思うので結構なことです. 笑



今日はランダム要素の話です.

とはいっても私は全然知識がないので,ランダムに数を取り出す詳しい説明はできません.あくまで,Unityでゲームを作るときに知ってると役に立つときがある,くらいのことを

少しお話しします.


ランダムな値を取得しよう,としたときUnityではこういうのが一般的かと思います.


using UnityEngine;

void Test()
{
    //0から9までの整数
    var rnd = Random.Range(0, 10);
}

Random.Range(一番小さい値, 一番大きい値)

ただし,注意としてはint型で取得する場合は一番大きい値を

含まない,ランダムな値を取得するという点ですかね.


using UnityEngine;

void Test()
{
    //0から10までの少数
    var rnd = Random.Range(0f, 10.0f);
}

float型でしたら一番大きい値を含みます.




 

Random.insideUnitSphere

で,本題です.

Unityでランダムな値がほしいってなるとき,

1つじゃなくて2,3ほしくなるときってよくありますよね.

たとえば適当に敵AIを作るとき

移動ベクトルをランダムに決定したい.


using UnityEngine;

Vector3 moveVec = default;

void Test()
{
    moveVec.x = Random.Range(-10.0f, 10.0f);
    moveVec.y = Random.Range(-10.0f, 10.0f);
    moveVec.z = Random.Range(-10.0f, 10.0f);    
}

例えばこんな風にそれぞれの軸に対しての大きさをランダムで決定しようとすると書くの面倒くさいですよね結構...



ここでRandom.insideUnitSphereなるものが役に立ちます.

using UnityEngine;

Vector3 moveVec = default;
//半径
float radius = 10.0f;

void Test()
{
    //半径radiusの中で一点のVecotr3を取得する
    moveVec = Random.insideUnitSphere * radius;
}

若干使い勝手は変わるかもしれませんが,最近はやりのハイパーカジュアルなどで

パッとテストするときとかに書く場合は特に重宝する書き方の一つになるんじゃないでしょうか?

超ラクに書くことができました.

ちなみに,二次元(x,y)で良いなら

Random.insideUnitCircleが使えます.




 
使い道を他に考える

応用です.ちょっとトリッキーに考えてみましょう.

Random.insideUnitSphereはVector3(x, y, z)をくれるわけですが

例えば

ランダム方向に回転させたい

とき,こんな使い方ができます.


using UnityEngine;

[SerializeField, Header("回転させるオブジェクトのRigidbody")]
Rigidbody rigid;
//回転のつよさ
float rate = 5.0f;

void Hoge()
{
    rigid.AddTorque(Random.insideUnitSphere * rate);
}

RigidbodyにAddTorqueという関数がありますのでそいつを使ってやると

このようにランダム回転がすぐ実装できます.

キャラが死んだときにランダムに吹っ飛ばして回転させる,なんかをしたくなったら

ぜひ試してみてください.まぁ調整は必要ですが.笑





あとは単にHP,ATK,DEFをランダムに決定したい.というときにこんな感じに...

無理に使う必要はないですが柔軟に考える練習としてくらいの気持ちでイメージしてみましょう.


using UnityEngine;

void Hoge()
{
    var rnd = Random.insideUnitSphere;
    var hp = (rnd.x + 10) * 100f;
    var atk = (rnd.y + 10) * 5f;
    var def = (rnd.z + 10) * 5f;
}



 

Random.insideUnitSphereはまだまだいろいろ使い道がありそうです.

他にもおすすめの使い方があったりしたらぜひ教えてくださいね.

それでは今日はこの辺で.

さて土日は星海の眼のアイテム周りを頑張って完成させてしまいますかねー.

閲覧数:21回0件のコメント

最新記事

すべて表示
bottom of page