2016-04-18 35 views
1

arrayの変数を一度シャッフルしたいので、私はShuffleメソッドをStart()から呼び出しました。Unityのシャッフル配列

次に、更新からシャッフルされた配列にアクセスしようとしましたが、できません。どうすればそれにアクセスできますか?一度アレイをシャッフルして永遠に使用する方法はありますか?

private System.Random _random = new System.Random(); 
float sec; 
float timecount; 
float starttime; 
void Start() { 
    starttime = Time.time; 
    int[] array = { 1, 2, 3, 4, 5, 6, 7, 8}; 
    Shuffle(array); 
    foreach (int value in array) 
    { 
     Debug.Log(value); 
    } 
} 

void Update() { 
    //time 
    timecount = Time.time - starttime; 
    sec = (timecount % 60f); 
    if (Mathf.Round(sec) == 3f) { 
     //access shuffled array 
     Debug.Log(array[3]); <=====error here 
    } 
} 

//for shuffle number from array 
void Shuffle(int[] array){ 
    int p = array.Length; 
    for (int n = p-1; n > 0 ; n--) 
    { 
     int r = _random.Next(1, n); 
     int t = array[r]; 
     array[r] = array[n]; 
     array[n] = t; 
    } 
} 

答えて

2

現在、配列はStart()関数内で宣言されています。つまり、Start()関数内からのみアクセスできます。 Start()Update()の両方から配列にアクセスできるようにするには、グローバルに宣言してスコープを増やす必要があります。たとえば:

private System.Random _random = new System.Random(); 
float sec; 
float timecount; 
float starttime; 

//declare array globally 
int[] array = { 1, 2, 3, 4, 5, 6, 7, 8}; 

void Start() 
{ 
    starttime = Time.time; 
    Shuffle(array); 
    foreach (int value in array) 
    { 
     Debug.Log(value); 
    } 
} 

void Update() 
{ 
    //now you can access array here, because it is declared globally 
} 

はまた、C#でスコープについてthis MSDN articleを見てみましょう。

+0

しかし、私がグローバルに宣言した場合、例えば配列[1]を呼び出すと、値はシャッフルされているので、まだ配列[1] = 2です。 – Eeva

+0

シャッフル方法? –

+0

私はシャッフルメソッドを最初に呼び出しました。なぜなら、シャッフルしたいのは1回だけですから、シャッフルした数値を更新関数 – Eeva

2

int[] array = { 1, 2, 3, 4, 5, 6, 7, 8};を開始機能の外側に移動します。

private System.Random _random = new System.Random(); 
float sec; 
float timecount; 
float starttime; 

int[] array = { 1, 2, 3, 4, 5, 6, 7, 8 }; 

void Start() 
{ 
    starttime = Time.time; 
    Shuffle(array); 
    foreach (int value in array) 
    { 
     Debug.Log(value); 
    } 
} 

void Update() 
{ 
    //time 
    timecount = Time.time - starttime; 
    sec = (timecount % 60f); 
    if (Mathf.Round(sec) == 3f) 
    { 
     //access shuffled array 
     Debug.Log(array[3]); 
    } 
} 

//for shuffle number from array 
void Shuffle(int[] array) 
{ 
    int p = array.Length; 
    for (int n = p - 1; n > 0; n--) 
    { 
     int r = _random.Next(0, n); 
     int t = array[r]; 
     array[r] = array[n]; 
     array[n] = t; 
    } 
} 

EDITあなたの質問に関連していません。

シャッフル機能にバグがあります。 array[0]は常にのままで変更されません。これを修正するには、シャッフル機能でint r = _random.Next(1, n);int r = _random.Next(0, n);に置き換えてください。

+0

私はそれについても疑問に思っていました..ありがとうございます。<3 – Eeva

関連する問題