2015-01-17 2 views
1

Я запускаю сопрограмму, в которой манипулируют игровые материалы GameObject's children.saders. Я просто не могу понять, как заставить меня ждать, пока все материалы не достигнут желаемого уровня смешивания, прежде чем переходить к следующему шагу. Все работает отлично, мне просто нужно, чтобы сопрограмма не продолжалась до строки 28 до тех пор, пока все материалы не будут изменены. Есть предположения?Нужна помощь Уступка Coroutine

public GameObject changeInto; 

private bool coroutineStarted = false; 
private Renderer[] renderersArray; 
private List<Material> materialsList = new List<Material>(); 
private GameObject newForm; 

void Start(){ 
    renderersArray = this.gameObject.GetComponentsInChildren<Renderer>(); 
} 
void Update(){ 
    if(!coroutineStarted){ 
     coroutineStarted = true; 
     StartCoroutine(Change()); 
    } 
} 

private IEnumerator Change(){ 
    foreach(Renderer renderer in renderersArray){ 
     for(int i = 0; i < renderer.materials.Length; i++){ 
      if(renderer.materials[i].shader.name == "Toon/Basic Blender"){ 
       materialsList.Add(renderer.materials[i]); 
      } 
     } 
    } 
    foreach(Material material in materialsList){ 
     StartCoroutine(ChangeToWhite(material)); 
    } 
    animation.Play("Evolution"); 
    newForm = Instantiate(changeInto, this.transform.position, this.transform.rotation) as GameObject; 
    yield return null; 
} 

private IEnumerator ChangeToWhite(Material mat){ 
    float counter = mat.GetFloat("_Blend"); 
    while(counter != 1f){ 
     float increase = mat.GetFloat("_Blend") + 0.01f; 
     mat.SetFloat("_Blend", increase); 
     counter += increase; 
     yield return null; 
    } 
} 

ответ

1

эта часть:

foreach(Material material in materialsList){ 
     StartCoroutine(ChangeToWhite(material)); 
    } 

должна содержать время ожидания изменения к белой рутине. В вашем случае это будет переменным, потому что вы не используете Time.deltaTime, которое НАСТОЯТЕЛЬНО поощряется.

EDIT: вот код, который вы можете использовать

foreach(Material material in materialsList){ 
     StartCoroutine(ChangeToWhite(material)); 
     yield return new WaitForSeconds(1); 
    } 

    private IEnumerator ChangeToWhite(Material mat){ 
    float counter = mat.GetFloat("_Blend"); 
    while(counter != 1f){ //the 1 here is the time to wait 
     float increase = mat.GetFloat("_Blend") + Time.deltaTime; 
     mat.SetFloat("_Blend", increase); 
     counter += increase; 
     yield return null; 
    } 
} 
+0

Так вы предполагаете, что в части ... 'в то время как (! Счетчик = 1f)' ... добавить некоторый фактор времени.deltaTime? –

+0

Думаю, я должен был сказать это в OP, но я знаю, где должен быть урожай, я просто не уверен, какими должны быть критерии. Например ... в то время как x истинно, возвращает доход null ... и т. Д. ... –

+0

Я обновил ответ с точным кодом, который вам нужен. –