2014-08-02 3 views
2

Если игрок получает X очков за то, что они что-то делают в моей игре, я хочу, чтобы табло обновлялось, показывая каждое число от 0 до X очень кратко. Я собираюсь использовать аналоговую систему подсчета очков, такую ​​как те старые часы, где вы можете наблюдать за изменениями чисел, за исключением того, что изменение произойдет быстро, потому что одновременно можно добавить сотни точек.Как я могу обновить свой балл за один раз за один раз?

В настоящее время X количество точек обновляются мгновенно, когда очки начисляются:

/****************************** Platform Collision ***************************/ 

void OnCollisionEnter2D(Collision2D coll) 
    { 
     foreach(ContactPoint2D contact in coll.contacts) 
     { 
      newPlayerHeight = transform.position.y; 

      // Don't count the first jump 
      if(newPlayerHeight < 0){ 
       newPlayerHeight = 0; 
      } 

      // If the player jumps down, don't reduce points 
      // Add a tolerance for variable collision positions on same platform 
      if(newPlayerHeight < oldPlayerHeight + -0.05f){ 
       newPlayerHeight = oldPlayerHeight; 
      } 

      // Send the height to the Score class 
      Score.SP.updateScore(newPlayerHeight); 

      oldPlayerHeight = newPlayerHeight; 
     } 
    } 

/******************************* Score class *********************************/ 

public void updateScore (float newScore) 
    { 
     // Display GUI score 
     score = (int)(newScore * 76); 
     guiText.text = "Score" + score; 

    } 

возился с для петли, чтобы попытаться достичь этого, но получил нигде близко.

+3

Просто поддерживать реальный счет и отображаемый счет. И затем в каждом вызове обновления увеличьте отображаемый результат на определенное количество, в зависимости от того, как быстро вы хотите его подсчитать. – Bart

+0

@Bart - Есть ли шанс получить реализацию этого? Я некоторое время работаю над этим, и мои мозговые клетки горячие от эмоций. – LooMeenin

ответ

2

Я только что создал этот код, который решает вашу проблему. В настоящее время я использую его в своей игре.

Основная идея класса ScoreManager заключается в том, чтобы сохранить траекторный счет и обновить его каждый кадр. Он использует Stack, чтобы отслеживать счет, который нужно добавить, таким образом, у нас нет магического числа, увеличивающего счет.

Итак, когда игрок получает новую точку, просто вызовите функцию addScore(), тогда класс ScoreManager будет обрабатывать обновление самостоятельно.

Он будет иметь нить, всегда работающую, которая будет увеличиваться с currentScore до newScore цифра цифрой, таким образом изменение будет наблюдаться пользователями, как вы хотели.

Нить была добавлена, чтобы уменьшить «лаги» вы испытываете в другом вопросе, который вы публикуемая: Why is my game lagging huge when I call a method?

using UnityEngine; 
using System.Collections; 
using System.Collections.Generic; 
using System.Threading; 

public class ScoreManager : MonoBehaviour 
{ 
    public GUIText score; 

    private int currentScore = 0; 
    public int scoreToUpdate = 0; 

    private Stack<int> stack; 

    private Thread t1; 
    private bool isDone = false; 

    void Awake() 
    { 
     stack = new Stack<int>(); 
     t1 = new Thread(updateScore); 
     t1.Start(); 
    } 

    private void updateScore() 
    { 
     while(true) 
     { 
      if(stack.Count > 0) 
      { 
       int newScore = stack.Pop() + currentScore; 

       for(int i = currentScore; i <= newScore; i++) 
       { 
        scoreToUpdate = i; 
        Thread.Sleep(100); // Change this number if it is too slow. 
       } 

       currentScore = scoreToUpdate; 
      } 

      if(isDone) 
       return; 
     } 
    } 

    void Update() 
    { 
     score.text = scoreToUpdate + ""; 
    } 

    public void addScore(int point) 
    { 
     stack.Push(point); 
    } 

    public void OnApplicationQuit() 
    { 
     isDone = true; 
     t1.Abort(); 
    } 
} 

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

+0

Попытка заставить это работать в моей игре, но я испытываю странное поведение. Получение этой ошибки: NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта MikesController.OnCollisionEnter2D (UnityEngine.Collision2D coll) (в Assets/Scripts/MikesController.cs: 88) – LooMeenin

+0

Это строка, на которую ссылается ошибка: ScoreManager .SM.addScore (((int) (newPlayerHeight * 76))); – LooMeenin

+0

Почему вы вызываете 'addScore()' таким странным образом? Что такое 'SM'? Все, что вам нужно, это ссылка на компонент скрипта и просто вызов функции. Или сделайте класс статическим. – FunctionR

1

Быстрое и грязное решение, используя HOTween (который является свободным и открытым исходным кодом). Обратите внимание, что он не будет показывать все числа, как можно больше в пределах transitionTime секунд.

using Holoville.HOTween; 

... 

int displayScore = 0; 

public void updateScore (int newScore) 
{ 

    if (oldScore != newScore) 
    { 
     float transitionTime = .2f; 
     HOTween.To(this, transitionTime, "displayScore", newScore); 
    } 

} 

public void Update() { 
    guiText.text = "" + displayScore 
} 
+0

Я получаю эту ошибку: HOTween: «MohawkMike (ScoreManager) .displayScore» отсутствует, статичен или нет. Твина для этого свойства не будет создана. – LooMeenin

2

Вы пробовали использовать сопрограмму Unity? Это может быть проще реализовать, начиная с coroutine и позволяя обновлять фрейм между каждым увеличением в баллах, будет простым способом добиться успеха.

В сопрограмме разрешен доступ к yield return null, это будет продолжаться до конца текущего кадра для продолжения функции.

... 
StartCoroutine(AddtoScore(ValuetoAdd)); 
... 
... 
public IEnumerator AddtoScore(int value) { 
    for(int i = 0; i < value; i++) { 
     currentScore++; 
     guiText.text = "Score: " + currentScore; 
     yield return null; 
    } 
} 
... 

Однако недостатком этого является то, что если вы забиваете снова, когда он добавляет точки, это может создать некоторые графические проблемы.

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

... 
void Update(){ 
    if(currentScore < scoreToUpdate) { 
     currentScore++; 
     guiText.text = "Score: " + currentScore; 
    } 
} 
... 

Однако оба этих метода требуют, чтобы класс они находятся в унаследован от MonoDevelop:

public class Scoring : MonoBehaviour 
Смежные вопросы