C# 协同程序不';我不能每次都完成它的执行

C# 协同程序不';我不能每次都完成它的执行,c#,unity3d,scripting,coroutine,C#,Unity3d,Scripting,Coroutine,我有下面的代码,我正在使用它让用户飞行一段时间,然后让它下来 void Booster() { StartCoroutine (Booster (airTime)); } IEnumerator Booster(float airTime) { isJumping = true; var e = sphere.localEulerAngles; e.x = 0; e.y = 0; sphere.localEulerAngles = e; float startPosY = -0.2

我有下面的代码,我正在使用它让用户飞行一段时间,然后让它下来

void Booster() { StartCoroutine (Booster (airTime)); }

IEnumerator Booster(float airTime) { isJumping = true;

 var e = sphere.localEulerAngles;
 e.x = 0;
 e.y = 0;
 sphere.localEulerAngles = e;
 float startPosY = -0.24f;
 float finalPosY = -0.24f + 2.5f;
 float xStartAngle = 0;
 float xEndAngle = 90f;
 float timer = 0f;
 float timeJump = animTime*2.5f;
 while (timer <= timeJump) 
 {
     timer += Time.deltaTime;
     float yPosTemp = 0;
     float xAngleTemp = 0;
     yPosTemp = Mathf.Lerp(startPosY,finalPosY,timer/timeJump);
     xAngleTemp = Mathf.Lerp(xStartAngle,xEndAngle,timer/timeJump);
     var s = sphere.localPosition;
     s.y = yPosTemp;
     sphere.localPosition = s;
     var a = sphere.localEulerAngles;
     a.x = xAngleTemp;
     sphere.localEulerAngles = a;
     //Debug.Log("Player Angles: " + sphere.localEulerAngles);
     yield return null;
 }
 timer = 0f;
 while (timer <= airTime) 
 {
     timer += Time.deltaTime;

     yield return null;
 }
 timer = 0f;
 var hitColliders = Physics.OverlapSphere(sphere.position, 10);
 int i = 0;
 //Time.timeScale = 1.25f;
 while (hitColliders [i].name == "Track_tiny") 
 {
     i += 1;
 }
 print(hitColliders[i].name);
 hitTile = hitColliders[i].gameObject;
 Debug.Log("Position: " + hitTile.transform.parent.gameObject.transform.localPosition + "Angle: " + hitTile.transform.parent.gameObject.transform.localEulerAngles);
 for(int j = 0; j < gameManager.GameCubes.Count;j++)
 {
     if(hitColliders[i].name == gameManager.GameCubes[j].name)
     {
         spawnChecker = j + 1;
         break;
     }
 }
 float zStartAngle = hitTile.transform.parent.gameObject.transform.localEulerAngles.z;
 float zStartPos = hitTile.transform.parent.gameObject.transform.localPosition.z;
 float zEndPos = transformParent.localPosition.z;
 float zEndAngle = sphere.localEulerAngles.z;
 if((zStartAngle - zEndAngle) > 0)
 {
     if((zStartAngle - zEndAngle) > 180)
     {
         zStartAngle = -(360 - zStartAngle);
     }
     else if((zStartAngle - zEndAngle) <= 180)
     {
         zStartAngle = zStartAngle;
     }
 }
 else if((zStartAngle - zEndAngle) < 0)
 {
     if((zEndAngle - zStartAngle > 180))
     {
         zEndAngle = -(360 - zEndAngle);
     }
     else if((zEndAngle - zStartAngle) <= 180)
     {
         zEndAngle = zEndAngle;
     }
 }
void Booster(){start例程(Booster(airTime));}
IEnumerator增压器(浮动空气时间){isJumping=true;
var e=sphere.localEulerAngles;
e、 x=0;
e、 y=0;
sphere.localEulerAngles=e;
浮动起始温度=-0.24f;
浮动最终值=-0.24f+2.5f;
浮动xStartAngle=0;
浮点数xendagle=90f;
浮动定时器=0f;
浮动时间跳变=animTime*2.5f;
同时(定时器180)
{
zStartAngle=-(360-zStartAngle);
}
否则如果((zStartAngle-zEndAngle)180))
{
zEndAngle=-(360-zEndAngle);
}

否则如果((zEndAngle-zStartAngle)我不建议将这些函数命名为相同的函数。我这样说是因为Unity能够阻止您与StopCoroutine(Booster())的协同进程(我觉得很奇怪)。不过,我不知道Unity在引擎盖下做了什么。另外,在这一行:

while (hitColliders [i].name == "Track_tiny") 

检查[i]是否高于或等于hitColliders.Length

您需要更具体一点。问题出在哪段代码上?请提供一些信息,说明它“不是每次都完成执行的”。这将使您的问题更容易解决。