2017-01-26 14 views
1

в моем проекте im пытается подсчитать разные объекты и имитировать небольшую анимацию, например, у меня есть звезды в моей игре, и я хочу подсчитать количество звезд в финале игры от 0 корыта число звезд, пользователь получил, так что я сделал это:Подсчет объектов с Coroutine

public void youWin() 
    { 
     audio.Stop(); 
     StartCoroutine (activatePanel()); 
    } 

    IEnumerator activatePanel() 
    { 
     yield return new WaitForSeconds (3f); 
     pausePanel2.SetActive (true); 
     for (int i = 0; i <= stars; i++) { 
      yield return new WaitForSeconds (0.2f); 
      starText2.text = i + ""; 
     } 
    } 

мой код работает хорошо для 0.3f на ожидание для петли на несколько секунд, но это слишком медленно, я хочу его 0.2f, но что-то странно бывает, иногда это похоже на ошибку, и первое число, похоже, возвращается, оно не считается правильным, кто-то знает, что происходит?

+1

Когда вы говорите, что «это не считается правильным», вы означает, что текст неверен или просто вы считаете, что время отключено? – Serlite

+0

Хмм не имею идеи, но я даю вам пример, это происходит примерно так. {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 , 18,19,20,11,21} в конце этого подсчета он идет очень быстро до 11, а затем до 21, он делает каждый раз –

+1

Возможно, вы вызываете youWin() несколько раз, прежде чем он закончит. – Infodayne

ответ

1

Очень вероятно, что функция activatePanel вызывается из другого места, пока она уже запущена, или скрипт, содержащий этот код, прикреплен к нескольким GameObjects, а activatePanel снова, будучи вызванным другой функцией. Вы можете использовать флаг, чтобы это не происходило.

Если функция coroutine уже запущена, используйте yield break;, чтобы вырваться из нее.

bool isRunning = false; 
IEnumerator activatePanel() 
{ 
    //Exit if already running 
    if (isRunning) 
    { 
     yield break; 
    } 

    //Not running, now set isRunning to true then run 
    isRunning = true; 

    yield return new WaitForSeconds(3f); 
    pausePanel2.SetActive(true); 

    WaitForSeconds waitTime = new WaitForSeconds(0.2f); 
    for (int i = 0; i <= stars; i++) 
    { 
     yield return waitTime; 
     starText2.text = i.ToString(); 
    } 

    //Done running, set isRunning to false 
    isRunning = false; 
} 
+0

i ahve, который активируетPanel, ассоциируется только с одним игровым объектом, я не думаю, что это проблема, я уже подтверждаю это, если ожидание секунд немного больше, оно хорошо подсчитывается. –

+0

Это кажется единственной возможной проблемой. Пожалуйста, используйте 'Debug.Log' в цикле' for', в будущем. Это действительно поможет вам найти такую ​​ошибку в будущем. – Programmer

+1

да, смотрите ниже, вы правы, большое спасибо: D –

0

Ну я решил его все вы, ребята, помочь, на самом деле вы все, где право, я священник научил я был вызов функции youWin только один раз, но я забыл это единство и я назвал youWin внутри trigerEnter функция, что означает, что объект держать ввести функцию Тригера и называется функция youWin, спасибо всего вот что я имею в виду с этим

решенных его с BOOL вошло

public class Victory : MonoBehaviour { 

Manager gameManager; 
// Use this for initialization 
public AudioClip clip; 
private AudioSource audio; 
public Animator girl; 
private bool entered; 


void OnTriggerEnter(Collider c) 
{ 
    if (c.gameObject.tag == "Player" && !entered) { 
     gameManager.win = true; 
     audio.clip = clip; 
     audio.Play(); 
     gameManager.Ball.GetComponent<MoveBall>().enabled = true; 
     girl.SetBool ("win",true); 
     entered = true; 
     gameManager.youWin(); 
    } 
} 

void Start() { 
    gameManager = GameObject.Find ("GameController").GetComponent<Manager>(); 
    audio = GetComponent<AudioSource>(); 
    entered = false; 

} 

// Update is called once per frame 
void Update() { 

} 
}