...
using UnityEngine;
using System.Collections;
public class Stage : MonoBehaviour {
public Material[] material; private string[] layer = { "word1","word2","word3","word4","word5","word6","word7","word8","word9", "word10"};
・
・
・
void Word()
{
wd = Instantiate(WordPrefab, new Vector3(0, 1, 1), Quaternion.identity) as GameObject;
string layer = "word" + 1.ToString();
wd.gameObject.layer = LayerMask.NameToLayer(layer);
Renderer rend = wd.GetComponentInChildren<Renderer>();
rend.material = material[i];
i += 1;
}
・・・
マウスを押すごとにlayerの配列に入れたテキスチャーを表示するようにして実行出来たのですが、配列のまま表示しては面白くないのでアトランダムに表示したいと思います。
初心者でどう書いていいのか分からず詳しく教えていただけませんか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
以下のページが参考になるので、一度読んでみてください。
参考ページ1
参考ページ2
2017/12/18 20:50 コメントを受けて追記
ソースコードはほぼ合っています。
一部 } の数などがおかしいので、動くように直すとこう。
C#
1private string[] layer = {"word1","word2","word3","word4","word5","word6","word7","word8","word9", "word10"}; 2 3for (int j = 0; j < layer.Length; j++) 4{ 5 string temp = layer[j]; //stringで問題無いです。 6 int randomIndex = Random.Range(0, layer.Length); 7 layer[j] = layer[randomIndex]; 8 layer[randomIndex] = temp; 9}
「かと言ってintをstringにかえても??」
何故疑問に思ったか分かりませんが、まさにそれが答えです。
Random.Range
は検索すると分かりますが「第一引数から'第二引数-1'の内、ランダムな数1つを返す」というメソッドです。
layer.Lengthは10なので、Random.Range(0, layer.Length)
は「0から9までのランダムな数字1つ」と同じ意味です。
これ自体はただのintを返すだけで、「Random.Rangeが配列の要素そのものを指すわけではない」ことに注意です。
これを踏まえてfor文の挙動を見てみましょう。
j = 0の時 tempにlayer[0]格納(temp = "word1") randomIndexにランダムな数字が入る(randomIndex = 3とする) layer[0]にlayer[3]が入る(layer[0] = "word4", layer[3] = "word4") layer[3]にtempが入る(layer[0] = "word4", layer[3] = "word1") 現在のlayer:0番目と3番目が入れ替わった {"word4","word2","word3","word1","word5","word6","word7","word8","word9", "word10"} j = 1の時 tempにlayer[1]格納(temp = "word2") randomIndexにランダムな数字が入る(randomIndex = 2とする) layer[1]にlayer[2]が入る(layer[1] = "word3", layer[2] = "word3") layer[2]にtempが入る(layer[1] = "word3", layer[2] = "word2") 現在のlayer:1番目と2番目が入れ替わった {"word4","word3","word2","word1","word5","word6","word7","word8","word9", "word10"} (以下、j=9まで続く)
というように、シャッフルが行われます。
挙動がおかしい場合は、「エラーコードを見て問題点を探す」「初めて見るメソッドはまず検索してみる」「プログラムや実際の挙動を日本語で書いてみる」等すると自力解決しやすいです。
なお、この方法だと低確率で「シャッフルされない」「1項目だけしかシャッフルされない」などのケースが出ます。
- 全てのループでrandomIndexがjと同値になった場合(同じ場所のものを入れ替えるので並び替えされない)
- シャッフル後に元に戻った場合(「j=0の時randomIndex=1、j=1の時randomIndex=0」などが続いた時) など
「絶対シャッフルされたい」「なるべくバラバラにシャッフルされたい」という場合は別の方法を調べてみてください。
2017/12/21 20:50 コメントを受けて追記
「layerの配列をシャッフルしたい」という質問だったのでそう答えましたが、
そもそもの話をすると、質問文のコードはlayer配列を使用していません。
void Word() の中で
string layer = "word" + 1.ToString();
と記載しているので、layer変数には常に"word1"が入っています。
更に言うとこのlayerはレイヤーマスクを指定しているだけであり、テクスチャの変更はしていないです。
順番に表示されているのは「マテリアルの配列(material変数)」です。
これで表示が切り替わるということは、material配列にテクスチャ違いのマテリアルが複数入っているということですね。
もう面倒臭いので「恐らくこういうことがしたいのだろう」という全コード書きますね。
C#
1//配列をシャッフルしてから順番に使用するパターン 2using UnityEngine; 3using System.Collections; 4 5public class Stage : MonoBehaviour { 6 7public Material[] material; 8private string[] layer = 9{ "word1","word2","word3","word4","word5","word6","word7","word8","word9", "word10"}; //定義していますが使っていません 10private int i; 11 12void Start() { 13 Shuffle (); //最初に配列シャッフルする 14} 15 16//配列をシャッフルするコード 17void Shuffle () { 18 for (int j = 0; j < material.Length; j++) 19 { 20 Material temp = material[j]; 21 int randomIndex = Random.Range(0, material.Length); 22 material[j] = material[randomIndex]; 23 material[randomIndex] = temp; 24 } 25} 26 27//シャッフルされた配列を使う 28void Word() 29{ 30 GameObject wd = Instantiate(WordPrefab, new Vector3(0, 1, 1), Quaternion.identity) as GameObject; 31 string layer = "word1"; 32 wd.gameObject.layer = LayerMask.NameToLayer(layer); 33 Renderer rend = wd.GetComponentInChildren<Renderer>(); 34 rend.material = material[i]; 35 i += 1; 36 37 //materialの数以上になるとエラーになるので、その場合0に戻す 38 if (i >= material.Length) { 39 i = 0; 40 } 41}
C#
1//別解:毎回ランダムで取得するパターン(かつ要らない変数をごっそり削除) 2using UnityEngine; 3using System.Collections; 4 5public class Stage : MonoBehaviour { 6 7public Material[] material; 8 9void Word() 10{ 11 GameObject wd = Instantiate(WordPrefab, new Vector3(0, 1, 1), Quaternion.identity) as GameObject; 12 wd.gameObject.layer = LayerMask.NameToLayer("word1"); 13 Renderer rend = wd.GetComponentInChildren<Renderer>(); 14 rend.material = material[Random.Range(0, material.Length)]; 15}
投稿2017/12/18 05:14
編集2017/12/21 11:47総合スコア11427
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/18 11:23
2017/12/18 11:29
2017/12/18 11:57
2017/12/18 12:01
2017/12/19 02:03
2017/12/21 11:08
2017/12/21 11:47
2017/12/22 10:24
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/17 01:58
2017/12/17 03:54
2017/12/17 03:58
2017/12/17 13:08
2017/12/17 15:19 編集
2017/12/17 15:19
2017/12/17 16:26
2017/12/17 16:35 編集