2016-07-31 1 views
0

Извините, вопрос может быть немного странным, но я не знаю, как это просить.Как изменить значение переменной в соответствии с отключенным шаблоном в единстве 3d?

Я развиваю бесконечную игру бегунов и скачал этот замечательный asset package из магазина. Он будет изгибать дорогу или плитки влево или вправо в соответствии с желаемой величиной.

У меня есть набор чисел, на мой взгляд, -10, 0 и 10,

10 изгибается плитки влево. (в зависимости от актива, (+) остается.)

0 ничего не будет делать, это будут прямые плитки.

-10 согнет плитки правой

Сейчас я разработал его постепенно увеличивать кривую влево и останавливается на 10.

Это код.

float curve = 0; 
float curTarget = 10; 

void Update() 
    { 
if (curve <= curTarget) 
     { 
      curve = curve + (Time.deltaTime * .5f); 
     } 
     else if (curve == curTarget) 
     { 
      HB.ApplyCurvature(curve); //method called from the package. 
     } 
     HB.ApplyCurvature(curve); //method called from the package 
} 

Так что мой вопрос в том, как увеличить и уменьшить эти значения между собой (-10, 0, 10). В принципе, я хочу, чтобы шаблон был;

снижение постепенно от 0 до -10 waitForSeconds (5)

постепенно увеличиваются от -10 до 0 waitForSeconds (5)

постепенно увеличиваются от 0 до 10 waitForSeconds (5)

Наконец то уменьшите с 10 до 0 waitForSeconds (5), а затем сверху сверху.

Как достичь такого сценария, я попытался использовать переключатель, но это не сработало. Это то же самое, что и серфингисты метро. Это красиво проходит с этой моделью. Я немного новичок в единстве. Помощь будет принята с благодарностью.

ответ

1

Как новый прогеймер Unity, важно понимать, как использовать coroutine и функцию lerp. Это один из примеров, где это необходимо. Как перемещать объект с течением времени ... Это задавали много раз, поэтому их поиск в Googling должен дать отличный результат и начать работу. Вы должны это знать, чтобы это сделать.

bool keepRunning = false; 
IEnumerator pattern() 
{ 
    while (keepRunning) 
    { 
     float mainPatternValue = 0; 

     //decrease gradually from 0 to -10 waitForSeconds(5) 
     const float patternDuration = 5f; 
     float counter = 0; 
     while (counter < patternDuration) 
     { 
      if (!keepRunning) 
       yield break; 

      counter += Time.deltaTime; 
      mainPatternValue = Mathf.Lerp(0, -10, counter/patternDuration); 
      Debug.Log("<color=red>Decr from 0 to -10: " + mainPatternValue + "</color>"); 
      yield return null; 
     } 

     Debug.Log("<color=yellow>DONE</color>"); 

     //Increase gradually from -10 to 0 waitForSeconds(5) 
     counter = 0; 
     mainPatternValue = -10; 
     while (counter < patternDuration) 
     { 
      if (!keepRunning) 
       yield break; 

      counter += Time.deltaTime; 
      mainPatternValue = Mathf.Lerp(-10, 0, counter/patternDuration); 
      Debug.Log("<color=green>Incr from -10 to 0: " + mainPatternValue + "</color>"); 
      yield return null; 
     } 

     Debug.Log("<color=yellow>DONE</color>"); 

     //Increase gradually from 0 to 10 waitForSeconds(5) 
     counter = 0; 
     mainPatternValue = 0; 
     while (counter < patternDuration) 
     { 
      if (!keepRunning) 
       yield break; 

      counter += Time.deltaTime; 
      mainPatternValue = Mathf.Lerp(0, 10, counter/patternDuration); 
      Debug.Log("<color=red>Incr from 0 to 10: " + mainPatternValue + "</color>"); 
      yield return null; 
     } 

     Debug.Log("<color=yellow>DONE</color>"); 

     //Finally then decrease from 10 to 0 waitForSeconds(5) and then from top again 
     counter = 0; 
     mainPatternValue = 10; 
     while (counter < patternDuration) 
     { 
      if (!keepRunning) 
       yield break; 

      counter += Time.deltaTime; 
      mainPatternValue = Mathf.Lerp(10, 0, counter/patternDuration); 
      Debug.Log("<color=green>Decr from 10 to 0: " + mainPatternValue + "</color>"); 
      yield return null; 
     } 

     Debug.Log("<color=yellow>Finally DONE</color>"); 
     Debug.Log("<color=yellow>Starting Over Again!</color>"); 
     yield return null; 
    } 
} 

void start() 
{ 
    if (keepRunning) 
     return; 

    keepRunning = true; 
    StartCoroutine(pattern()); 
} 

void stop() 
{ 
    keepRunning = false; 
} 

Для запуска coroutine вызова start(). Чтобы остановить его, вызовите stop().

+2

Ответ работал как шарм. Большое спасибо за помощь. Также оба ответа мне очень помогают, и я узнал о новых вещах. Спасибо. Поскольку я не могу принять оба вопроса, я проголосовал за них обоих и принял ответ, который использовал. : D –

1

Я на мобильном телефоне, так что я не могу проверить это, но надеюсь, что это помогает ...

Используйте эту функцию, чтобы вернуть значение увеличения/уменьшения тока кривизны на основе разности между целевой кривой и текущей кривой.

В настоящее время в качестве приращения используется только Time.deltaTime. Я добавил в прокомментированную кривую скорость применить линию, просто удалить/* и */и дать curveSpeed ​​значение, чтобы использовать его.

float Bend(float current, float target) { 
    //Don't bend if current curve is equal to target curve 
    if (current == target) 
     return 0; 
    //Find the sign of the difference between current and target 
    float sgn = (target - current)/Math.Abs(target - current); 
    //Apply the sign to the incremental value 
    float val = /*curveSpeed * */Time.deltaTime * sgn; 
    //If the absolute value of the increment/decrement + the current value is greater than 
    //the absolute value of the target, only return the difference (prevents over curving) 
    if (Mathf.Abs(current + val) > Mathf.Abs(target)) { 
     return target-current; 
    } 
    //Return the incremental/decremental value 
    return val; 
} 

Так пример реализации этого в шаблоне в обновлении:

enum Pattern { a, b, c, d } 
Pattern pattern; 

float curve = 0; 
float curveSpeed = 2; 

void Update() { 
    switch (pattern) { 
     case Pattern.a: 
      HB.ApplyCurvature(Bend(curve, -10)); 
      if (Bend(curve, -10) == 0) pattern = Pattern.b; 
      break; 

     case Pattern.b: 
      HB.ApplyCurvature(Bend(curve, 0)); 
      if (Bend(curve, 0) == 0) pattern = Pattern.c; 
      break; 

     case Pattern.c: 
      HB.ApplyCurvature(Bend(curve, 10)); 
      if (Bend(curve, 10) == 0) pattern = Pattern.d; 
      break; 

     case Pattern.d: 
      HB.ApplyCurvature(Bend(curve, 0)); 
      if (Bend(curve, 0) == 0) pattern = Pattern.a; 
      break; 

    } 
} 

Единственное, что отсутствует задержка вы упомянули.

+0

yes Я могу добавить задержку, используя 'yield return new WaitforSeconds (5)'. Надеюсь, это поможет всем. –