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