見出し画像

UnityでArrayをシャッフル

以前とあるゲーム制作をした時に

「どんな」「もの」

例)黄色い食べ物

のようなお題を作成することがありました。

文字列の配列をシャッフルする方法としていろいろ試してみたのですが、以下の方法がかなり簡単かなと思ったので紹介します。

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

public class odaimaker : MonoBehaviour
{

public string[] odai;
public string[] odai2;
public Text odaitext;
public GameObject odaiOBJ;


// Start is called before the first frame update
void Start()
{
odaiOBJ.SetActive(false);
}

public void OdaiButton()
{
odaiOBJ.SetActive(true);
for (int i = 0; i < odai.Length; i++)
{
string tmp = odai[i];
int randomIndex = Random.Range(0,odai.Length);
odai[i] = odai[randomIndex];
odai[randomIndex] = tmp;
}
for (int i = 0; i < odai2.Length; i++)
{
string tmp = odai2[i];
int randomIndex = Random.Range(0, odai2.Length);
odai2[i] = odai2[randomIndex];
odai2[randomIndex] = tmp;
}
odaitext.GetComponent<Text>().text = odai[1] + odai2[1];

}
}

odaiとodai2という名前のインプットを作成し、Odaibuttonを押すとお題が作成されてodaitextにある文字を書き換えるという仕組みです。


using UnityEngine.UI;

まずは上の一文を一番上のUnityEngineの下に書き込みます。

これがないとテキストを書き換えることができません。


public string[] odai;
public string[] odai2;
public Text odaitext;
public GameObject odaiOBJ;

次に上の文をMonoBehaviour直下に書き込みます。

public 型 変数名; の書き方をMonoBehaviour直下にすることで

Unity上でインプットとして認識されます。

odaiOBJ.SetActive(false);

次にStartの中に上の一文を書いて、お題のシャッフルボタンをクリックするまで文字を非表示にします。


public void OdaiButton()
{
odaiOBJ.SetActive(true);
for (int i = 0; i < odai.Length; i++)
{
string tmp = odai[i];
int randomIndex = Random.Range(0,odai.Length);
odai[i] = odai[randomIndex];
odai[randomIndex] = tmp;
}
for (int i = 0; i < odai2.Length; i++)
{
string tmp = odai2[i];
int randomIndex = Random.Range(0, odai2.Length);
odai2[i] = odai2[randomIndex];
odai2[randomIndex] = tmp;
}
odaitext.GetComponent<Text>().text = odai[1] + odai2[1];

}

さて、ここからが本題です。

上の文ではとあるルールに従って文字列の配列をシャッフルしています。


仕組みがややこしいのですが、

簡単に言うと、配列のランダムな順番の単語をとってきて、それを

現ループ回数の単語と入れ替えます。

これを配列の長さだけ繰り返していきます。

よくわからなくても、じっくりコードを観察すると意味が分かってくると思います。


ちなみにどういった挙動をしているか、は

上の動画から確認することができます。

Youtubeのチャンネル登録もしてもらえると嬉しいです。


質問があれば積極的に答えていこうかな、と思っています。

ではまた~