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