[英]Same methods with different return types
我有两种方法在正文中几乎相同,但返回类型不同。 一个是 IEnumerator ,另一个是 void 。 有没有什么聪明的编写代码的方法,这样我就必须编写更少的代码行。
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);
}
您可以将其设为通用或返回对象。 最好是用单独的方法提取重复部分。
方法有完全不同的行为,因为IEnumerator
one 里面有WaitForSeconds
,所以你可以给方法添加一个新的参数pause
,默认值等于 pauseduration。
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, 100)
CreatePath (1)
方法。
但我建议将其拆分为三个方法,一个基本方法和两个调用基本方法的方法,使用不同的参数,因此您的方法名称将代表方法的行为。
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)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.