2016-04-07 2 views
-3

У меня есть два метода, почти одинаковые в теле, но разные в обратном типе. Один из них - IEnumerator, а другой - недействительный. Есть ли какой-либо умный способ написания кода, чтобы мне пришлось писать меньше строк кода.Те же методы с разными типами возврата

IEnumerator CreatePath(int val) 
{ 
     if (val < worlds.Length - 1) { 
       int totalChild = CountChildren (Path [val].transform); 
       MeshRenderer[] child = Path [val].transform.GetComponentsInChildren<MeshRenderer>(); 

       for (int i = 0; i < totalChild; i++) { 
         yield return new WaitForSeconds (0.2f); 

         child [i].enabled = true; 
       } 
     } 

} 

И

void CreatePath_(int val) 
{ 
     if (val < worlds.Length - 1) { 
       int totalChild = CountChildren (Path [val].transform); 
       MeshRenderer[] child = Path [val].transform.GetComponentsInChildren<MeshRenderer>(); 

       for (int i = 0; i < totalChild; i++) { 
         child [i].enabled = true; 
       } 
     } 
} 

И весь сценарий

public GameObject[] worlds,Path; 
public int ClearedWorldValue = -1; 
private int posArray; 

void Start() 
{ 
    SetMapState(); 
} 

void SetMapState() 
{ 
     for (int i = 0; i < 3; i++) { 
       ChangeColor (i,0); 

     } 

} 

void ChangeColor(int val,float pause){ 
     if (val!=-1) { 
      worlds [val].transform.GetChild (0).GetComponent<SpriteRenderer>().enabled = false; 
      worlds [val].transform.GetChild (1).GetComponent<SpriteRenderer>().enabled = true; 
       StartCoroutine (CreatePath (val, pause)); 
       ChangeColortoRed (val); 
     } 

} 

void ChangeColortoRed(int val) 
{ 
     if (val < worlds.Length-1) { 
       worlds [val + 1].transform.GetChild (0).GetComponent<SpriteRenderer>().enabled = true; 
     } 
} 

IEnumerator CreatePath(int val,float pause) 
{ 
     if (val < worlds.Length - 1) { 
       int totalChild = CountChildren (Path [val].transform); 
       MeshRenderer[] child = Path [val].transform.GetComponentsInChildren<MeshRenderer>(); 

       for (int i = 0; i < totalChild; i++) { 
         yield return new WaitForSeconds (pause); 

         child [i].enabled = true; 
       } 
     } 

} 



int CountChildren(Transform a) 
{ 
     int childCount = 0; 
     foreach (Transform b in a) 
     { 
      childCount ++; 
      childCount += CountChildren (b); 
     } 
     return childCount; 
} 

void Update() 
{ 
    ChangeColor (ClearedWorldValue,0.2f); 
} 
+3

В чем разница между этими двумя методами рядом с типом возврата? – Valentin

+0

как void возвращает тип? – Haris

+0

Попробуйте отправить немного более подробную информацию и соответствующую часть вашего кода, если это возможно. – Angelo

ответ

1

вы можете сделать его родовое или вернуть объект. Лучше всего извлечь повторяющуюся часть в отдельный метод.

+0

Это мои два метода –

0

Методы имеют совсем другое поведение, потому что IEnumerator внутри имеет WaitForSeconds, поэтому вы можете добавить новый параметр pause к методу со значением по умолчанию, который будет равен длительности паузы.

IEnumerator CreatePath(int val, float pause = 0) 
{ 
     if (val < worlds.Length - 1) { 
       int totalChild = CountChildren (Path [val].transform); 
       MeshRenderer[] child = Path [val].transform.GetComponentsInChildren<MeshRenderer>(); 

       for (int i = 0; i < totalChild; i++) { 
         yield return new WaitForSeconds (pause); 

         child [i].enabled = true; 
       } 
     } 

} 

Затем вы можете использовать CreatePath (1) метод без паузы (или с паузой по умолчанию) или CreatePath(1, 100) с заданной длительности паузы.

Но я предлагаю разбить его на три метода, один базовый метод и два, которые вызовут базовый метод с разными параметрами, поэтому ваше имя метода будет представлять поведение метода.

IEnumerator CreatePathWithPause(int val, float pause) 
{ 
     if (val < worlds.Length - 1) { 
       int totalChild = CountChildren (Path [val].transform); 
       MeshRenderer[] child = Path [val].transform.GetComponentsInChildren<MeshRenderer>(); 

       for (int i = 0; i < totalChild; i++) { 
         yield return new WaitForSeconds (pause); 

         child [i].enabled = true; 
       } 
     } 

} 

IEnumerator CreatePath(int val) 
{ 
    return CreatePathWithPause(val, 0) 
} 

IEnumerator CreatePathWithDefaultPause(int val) 
{ 
    return CreatePathWithPause(val, 0.2f) 
} 
+0

Его все еще занимает некоторое время, чтобы создать путь, когда я использую Co-Routine, даже если я поставлю нуль в ожидаемое время –

+0

Какой метод вы используете? – Valentin

Смежные вопросы