具有不同返回类型的相同方法

时间:2016-04-07 11:02:25

标签: c# unity5

我有两种方法在体内几乎相同但返回类型不同。一个是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);
}

2 个答案:

答案 0 :(得分:1)

你可以使它成为通用或返回对象。 最好的方法是用单独的方法提取重复部分。

答案 1 :(得分: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)
}