2017-12-25 28 views
1

4 가지 색상이 있습니다. 플레이어가 같은 색으로 2 번 연속으로 나올 수 없도록 만들고 싶습니다. 플레이어가 오브젝트와 충돌하면 RandomColor()이 호출됩니다. 따라서이 함수는 게임 중에 여러 번 호출되며 때로는 플레이어가 자신의 색을 변경하지 않습니다.매번 난수를 생성하고 마지막 숫자를 포함하지 않음

using UnityEngine; 

public class ColorManager : MonoBehaviour { 

    public SpriteRenderer player; 
    public string playerColor; 

    public Color[] colors = new Color[4]; 


    private void Awake() 
    { 
     RandomColor();   
    } 

    public void RandomColor() 
    { 
     int index = Random.Range(0, 4); 

     switch (index) 
     { 
      case 0: 
       player.color = colors[0]; //colors[0] is orange 
       playerColor = "orange"; 
       break; 

      case 1: 
       player.color = colors[1]; //colors[1] is pink 
       playerColor = "pink"; 
       break; 

      case 2: 
       player.color = colors[2]; //colors[2] is blue 
       playerColor = "blue"; 
       break; 

      case 3: 
       player.color = colors[3]; //colors[3] is purple 
       playerColor = "purple"; 
       break; 
      }  
    }  
} 

while 루프를 사용해 보았습니다.하지만 while 루프에서는 동일한 색상을 때때로 두 번 받게되므로 분명히 잘못하고 있습니다. 누군가가 문제를 파악하고 설명하는 방법/이유를 설명하면 좋을 것입니다. 문제에 많은 시간을 할애하여 매우 궁금합니다.

+0

youz에는 4 색이 있습니다. 새로운 색을 선택할 때 플레이어 색이 현재 가지고있는 색과 다를 때까지 임의 번호를 다시 지정하십시오. –

+0

더 나은 기술 : 현재 유효한 색만 ​​포함 된 모음을 만든 다음 해당 컬렉션에서 임의의 요소를 선택하십시오. 불변의 컬렉션을 사용하면 도움이 될 것입니다. –

답변

3

먼저 제외를 사용하여 임의의 숫자를 생성 할 수있는 함수가 필요합니다. 당신은 당신이 다시 호출 exclusion 매개 변수 다음에 그것을 통과 할 수 있도록

int RandomWithExclusion(int min, int max, int exclusion) 
{ 
    int result = UnityEngine.Random.Range(min, max - 1); 
    return (result < exclusion) ? result : result + 1; 
} 

당신이 그것을 호출 할 때마다, 당신은 전역 변수에 결과를 저장할 필요가 : 아래는 내가 그것을 위해 무엇을 사용합니다.

함수를 호출 할 때마다 호출 할 필요가 없도록 함수를 수정했습니다. 새로운 RandomWithExclusion 함수가 대신 해줍니다.

int excludeLastRandNum; 
bool firstRun = true; 

int RandomWithExclusion(int min, int max) 
{ 
    int result; 
    //Don't exclude if this is first run. 
    if (firstRun) 
    { 
     //Generate normal random number 
     result = UnityEngine.Random.Range(min, max); 
     excludeLastRandNum = result; 
     firstRun = false; 
     return result; 
    } 

    //Not first run, exclude last random number with -1 on the max 
    result = UnityEngine.Random.Range(min, max - 1); 
    //Apply +1 to the result to cancel out that -1 depending on the if statement 
    result = (result < excludeLastRandNum) ? result : result + 1; 
    excludeLastRandNum = result; 
    return result; 
} 

시험 :

void Update() 
{ 
    Debug.Log(RandomWithExclusion(0, 4)); 
} 

마지막 번호는 다음 함수 호출에 표시하지 않습니다.

특정 솔루션에 대한

, 단순히 대체

int index = RandomWithExclusion(0, 4); 
+0

(최소, 최대 -1) 이유는 "-1"이 왜 있는지 설명해 주시겠습니까? 그게 제가 3 번을 결코 얻지 못할 것이라는 뜻입니까? 숫자가 0, 1, 2 및 3이기 때문에 3에 걸려 넘어지면 3 - 1이되고 결과는 2가되어 3이 절대로 옵션이 될 수 없다는 의미입니다. –

+1

아니요. 'Random.Range'의 최대 값에서 1을 뺀 다음'if '문 결과에 따라 결과에 1을 더합니다. 이것은 제가 제외시키고 자하는 번호를 제거하기 위해 사용하는 기법입니다. 숫자 3을 얻게 될 것입니다. 답안에서'Update' 함수로 테스트 코드로 테스트 해보면 알 수 있습니다. 간단한 문제를 해결하기위한 답을 수정하고 더 많은 의견을 추가했습니다. – Programmer

+0

-1로 무슨 일이 일어나고 있는지 꽤 오래 걸렸습니다. 마지막 질문 (진심으로 희망)은 왜 이것이 첫 번째 실행인지 아닌지를 알아야합니까? –

0

당신이해야 할 것은 RandomColor가 이전 한과 동일한 색상을 반환하는 경우 바로 다시 전화 판단을 추가하는 것입니다와

int index = Random.Range(0, 4); 

, 쉽지?

+0

[삭제됨] (https : // stackoverflow) 중 하나와 같은 고정/잠금 문제가 발생합니다.com/a/47968494/3785314) 답변. 코 루틴에서 호출하고 프레임을 기다리는 것으로 해결할 수 있지만 게임이 느려질 수 있습니다. – Programmer