2016-04-08 3 views
0

Я работал на движении объекта вдоль пути, который я был Geting от NavMesh Unity3d Я использую сопрограмму, в котором я контролирую его в то время цикла, как я могу показатьСопрограммы и в то время как петли

public void DrawPath(NavMeshPath pathParameter, GameObject go) 
{ 

    Debug.Log("path Parameter" + pathParameter.corners.Length); 
    if (agent == null || agent.path == null) 
    { 
     Debug.Log("Returning"); 
     return; 
    } 

    line.material = matToApplyOnLineRenderer; 
    line.SetWidth(1f, 1f); 

    line.SetVertexCount(pathParameter.corners.Length); 

    allPoints = new Vector3[pathParameter.corners.Length]; 

    for (int i = 0; i < pathParameter.corners.Length; i++) 
    { 
     allPoints[i] = pathParameter.corners[i]; 
     line.SetPosition(i, pathParameter.corners[i]); 

    } 

    StartCoroutine(AnimateArrow(pathParameter)); 

    //StartCoroutine(AnimateArrowHigh(pathParameter)); 
} 


#endregion 


#region AnimateArrows 


void RunAgain() 
{ 
    StartCoroutine(AnimateArrow(Navpath)); 
} 

IEnumerator AnimateArrow(NavMeshPath path) 
{ 
    Vector3 start; 
    Vector3 end; 

    while (true) 
    { 


     if (index > 0) 
     { 
      if (index != path.corners.Length - 1) 
      { 
       start = allPoints[index]; 

       index += 1; 
       end = allPoints[index]; 

       StopCoroutine("MoveObject"); 
       StartCoroutine(MoveObject(arrow.transform, start, end, 3.0f)); 
       yield return null; 

      } 
      else 
      { 
       index = 0; 
       RunAgain(); 
      } 
     } 
     else if (index == 0) 
     { 
      start = allPoints[index]; 
      arrow.transform.position = allPoints[index]; 

      index += 1; 
      end = allPoints[index]; 


      StopCoroutine("MoveObject"); 
      StartCoroutine(MoveObject(arrow.transform, start, end, 3.0f)); 

      yield return null; 
     } 
    } 


} 

IEnumerator MoveObject(Transform arrow, Vector3 startPos, Vector3 endPos, float time) 
{ 
    float i = 0.0f; 
    float rate = 1.0f/time; 
    journeyLength = Vector3.Distance(startPos, endPos); 
      float distCovered = (Time.time - startTime) * speed; 
      float fracJourney = distCovered/journeyLength; 


    while (i < 1.0f) 
    { 


     // Debug.Log("fracJourney In While" + fracJourney); 
     arrow.position = Vector3.LerpUnclamped(startPos, endPos, fracJourney); 

     yield return endPos; 
    } 
    Debug.LogError("Outside While"); 
} 

Но проблема в том, что мне нужно перемещать объект с постоянной скоростью, но мой объект набирает скорость в каждом цикле, поскольку мне нужно сделать движение в цикле, чтобы он двигался, пока пользователь не хочет его закончить с помощью ввода guys plz help i dont понять, что я делаю неправильно в Coroutines, что скорость моих объектов растет, я смотрю, чтобы он оставался постоянным, но каким-то образом он не работал таким образом спасибо

ответ

0

Возможно, вы могли бы умножить скорость, скажем, на 0.95f. Это ускорит его, а затем останется на постоянной скорости, а затем, когда вы захотите его остановить, он будет постепенно замедляться. Увеличение 0.95f приведет к ускорению/замедлению скорости.

1

while (i < 1.0f) будет работать вечно, потому что i является 0.0f и 0.0f всегда < 1.0f и там нет места внутри время цикла, где вы increement i так, что он будет> = 1.0f. Вам нужен способ выхода из цикла while. Он должен был выглядеть как-то внизу:

while (i < 1.0f){ 
i++ or i= Time.detaTime..... so that this loop will exist at some point. 
} 

Также ваша движущаяся функция плохая. Ниже функция должна делать то, что вы пытаетесь сделать:

bool isMoving = false; 
IEnumerator MoveObject(Transform arrow, Vector3 startPos, Vector3 endPos, float time = 3) 
{ 
    //Make sure there is only one instance of this function running 
    if (isMoving) 
    { 
     yield break; ///exit if this is still running 
    } 
    isMoving = true; 

    float counter = 0; 
    while (counter < time) 
    { 
     counter += Time.deltaTime; 
     arrow.position = Vector3.Lerp(startPos, endPos, counter/time); 
     yield return null; 
    } 

    isMoving = false; 
} 

Кроме того, в вашем AnimateArrow(NavMeshPath path) функции, заменить эти три строки кода:

StopCoroutine("MoveObject"); 
StartCoroutine(MoveObject(arrow.transform, start, end, 3.0f)); 
yield return null; 

с

yield return StartCoroutine(MoveObject(arrow.transform, start, end, 3.0f)); 

Выполнение этого будет ждать функции MoveObject, чтобы закончить до возвращения и снова запускается в цикле while. Вы должны заменить их внутри if (index != path.corners.Length - 1) и else if (index == 0)

+0

Спасибо за быстрый ответ, но его не решаю я сделал то, что вам предположим, но он делает то же самое, набирает скорость, поскольку его петли с конца пути –

+0

Является ли жесткое тело прикрепленным к этому объекту игры? – Programmer

+0

Нет их нет Жесткое тело или даже коллайдер. Я искал google весь день, но не нашел решение, я думаю, что это не правильный подход. –

1

В качестве альтернативы можно использовать класс AnimationCurve Unity, чтобы отобразить все виды супер гладких типов анимации легко:

enter image description here

Вы можете определить кривые инспектор, или в коде

public AnimationCurve Linear 
{ 
    get 
    { 
     return new AnimationCurve(new Keyframe(0, 0, 1, 1), new Keyframe(1, 1, 1, 1)); 
    } 
} 

И вы можете определить Useage в сопрограммы как таковой:

Vector2.Lerp (startPos, targetPos, aCurve.Evaluate(percentCompleted)); 

Где «percentCompleted» - ваш таймер/TotalTimeToComplete.

Полный пример lerping можно видеть из этой функции:

IEnumerator CoTween(RectTransform aRect, float aTime, Vector2 aDistance, AnimationCurve aCurve, System.Action aCallback = null) 
{ 
    float startTime = Time.time; 
    Vector2 startPos = aRect.anchoredPosition; 
    Vector2 targetPos = aRect.anchoredPosition + aDistance; 
    float percentCompleted = 0; 
    while(Vector2.Distance(aRect.anchoredPosition,targetPos) > .5f && percentCompleted < 1){ 
     percentCompleted = (Time.time - startTime)/aTime; 
     aRect.anchoredPosition = Vector2.Lerp (startPos, targetPos, aCurve.Evaluate(percentCompleted)); 
     yield return new WaitForEndOfFrame(); 
     if (aRect == null) 
     { 
      DeregisterObject(aRect); 
      yield break; 
     } 
    } 
    DeregisterObject(aRect); 
    mCallbacks.Add(aCallback); 
    yield break; 
} 

Заканчивать этот твин библиотека больше примеров коды: https://github.com/James9074/Unity-Juice-UI/blob/master/Juice.cs