2016-08-30 3 views
-2

Я создал скрипт C#, который устанавливает цвет для моих объектов (в данном случае плитки). Проблема заключается в том, что он устанавливает цвет для нескольких объектов, а не только для одного объекта. у кого-нибудь есть решение? Люди, которые знают javascript, также могут ответить.Сценарий устанавливает цвет для нескольких объектов из пустого GameObject вместо цвета для child/children и isnt random

EDIT: Я немного обновил свой код. Я хочу сделать вещи более ясными. У меня есть 16 объектов (плитка), которые являются дочерьми одного пустого игрового объекта (плитки). Каждые 1,5 с (например) Я хочу, чтобы только одна плитка меняла цвет, случайным образом.

EDIT Я обновил свой вопрос и разместил решение/скрипт в ответе ниже.

private float timer = 0.0f; 

Color red = Color.red; 
Color blue = Color.blue; 
Color green = Color.green; 
Color white = Color.white; 

public Transform tiles; 

void Update() 
{  
    timer += Time.deltaTime; 

    if (timer >= 1.5f)//change the float value here to change how long it takes to switch. 
    { 

     Transform tile = tiles.GetChild (Random.Range (0, 16)); 

     int rand = Random.Range (1, 4); 


      if (rand == 1) { 
       tile.GetComponent<Renderer>().material.color = red; 
      } else if (rand == 2) { 
       tile.GetComponent<Renderer>().material.color = blue; 
      } else { 
       tile.GetComponent<Renderer>().material.color = green; 
      } 
     timer = 0; 
    } 
} 

after the first 1.5 sec all these tiles are colored

+0

А на случай, если вы не знаете, как это сделать, самый простой способ начать делать это в Unity - перенести свой код на вызовы Debug.Log() и выяснить, не является ли ваш код Я не знаю, как вы думаете. – Serlite

+0

Я знаю, как отлаживать, но я не знаю, что я должен войти в свою консоль. Я пробовал 'Debug.Log (tile)' и 'Debug.Log (плитки)', которые дают мне оба вывода «Object». – ApoLLoSkiLLz

ответ

0

Пожалуйста, прочтите Unity Scripting API for Random.Range.

В частности, часть для «целого», который гласит: Обратите внимание, что max является эксклюзивным, поэтому использование Random.Range(0, 10) будет возвращаемых значений от 0 до 9.

Обновить код быть

int rand = Random.Range(1, 4); 

На другой ноте, Unity Scripting API for the Color Constructor указывает, что цвета создаются с помощью Floats, что зажать значения между 0.0f и 1.0f. Таким образом, вы можете переписать ваши объявления:

Color red = new Color(1.0f, 0.0f, 0.0f, 1.0f); 
Color green = new Color(0.0f, 1.0f, 0.0f, 1.0f); 
Color blue = new Color(0.0f, 0.0f, 1.0f, 1.0f); 
Color white = new Color(1.0f, 1.0f, 1.0f, 1.0f); 

Или используйте existing static variables:

Color red = Color.red; 
Color green = Color.green; 
Color blue = Color.blue; 
Color white = Color.white; 
+0

Правильно, а версия «float» Random.Range, max включена, но не так для версии 'int'. Я думаю, что такие вещи, как «Array.Length», могут использоваться в максимальном месте, которое производит размер один больше, чем последний индекс массива. – Okomikeruko

+0

Спасибо за полезную информацию. Реальный вопрос по-прежнему остается. Как я могу дать цвет одной плитке – ApoLLoSkiLLz

+0

Вам нужен только один случайный объект из 16, который нужно менять каждые 1,5 секунды снова и снова? – Okomikeruko

-1

Хорошо, так, наконец, у меня есть решение. Я собираюсь опубликовать его здесь, если кому-то в будущем это понадобится.

Таким образом, сценарий дает случайную черепицу цвет (красный, зеленый или синий) каждые 1,5 секунды. Каждая плитка - это ребенок из моего EmptyGameObject, называемый плиткой. Он выбран случайным образом. Плитка получает тег тоже, потому что это часть моей игры.

//PUBLIC VARIABLES 
public Transform tiles; 

//PRIVATE VARIABLES 
private Transform tile; 
private float timer = 0.0f; 

//COLORS 
Color red = Color.red; 
Color blue = Color.blue; 
Color green = Color.green; 

void Start(){  
    tile = tiles.GetChild (Random.Range (0, 16)); 
    } 

void Update() 
{  
    GOsWithTag = GameObject.FindGameObjectsWithTag ("Colored Tile"); 
    timer += Time.deltaTime; 

    if (timer >= 1.5f)//change the float value here to change how long it takes to switch. 
    { 
     SetRandom(); 
     int rand = Random.Range (1, 4); 


     if (rand == 1) { 
      tile.GetComponent<Renderer>().material.color = red; 
      this.tile.gameObject.tag = "Colored Tile"; 
     } else if (rand == 2) { 
      tile.GetComponent<Renderer>().material.color = blue; 
      this.tile.gameObject.tag = "Colored Tile";    
     } else { 
      tile.GetComponent<Renderer>().material.color = green; 
      this.tile.gameObject.tag = "Colored Tile"; 
     } 

     timer = 0; 
    }// CLOSING FIRST IF STATEMENT 

    GameOver(); 

} //CLOSING Update() 

void SetRandom(){ 
    for (float r = 0.0f; r < 9999; r += 1.5f * Time.deltaTime){ 
     int nRand = Random.Range(0, 16); 
     tile = tiles.GetChild (nRand); 
    }   
} 
Смежные вопросы