сопрограмма вызывает следующий метод слишком много раз - PullRequest
0 голосов
/ 05 ноября 2018

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
using System;
using Random = UnityEngine.Random;

public class YourHealth : MonoBehaviour
{
    bool yourTurn = true;
    public Button button1;
    public Button button2;
    public Text YH;
    public Text EH;
    private int yourHealth = 100;
    private int enemyHealth = 100;

    // Use this for initialization
    void Start()
    {
        button1.onClick.AddListener(Heal20);
        button2.onClick.AddListener(Damage40);
        YH.text = Convert.ToString(yourHealth);
        EH.text = Convert.ToString(enemyHealth);
    }

    public void Heal20()
    {
        yourHealth += 20;
        yourTurn = false;
    }

    public void Damage40()
    {
        enemyHealth -= 40;
        yourHealth -= 5;
        yourTurn = false;
    }

    public void Update()
    {
        YH.text = Convert.ToString(yourHealth);
        EH.text = Convert.ToString(enemyHealth);

        if (yourTurn == false)
        {
            button1.interactable = false;

            StartCoroutine(Wait(2));
        }
        else
        {
            button1.interactable = true;
        }
    }

    public void EnemyTurn()
    {
        int roll = Random.Range(1 , 7);

        switch (roll)
        {
            case 1:
                yourHealth -= 10;
                break;
            case 2:
                enemyHealth -= 10;
                break;
            case 3:
                yourHealth -= 30;
                break;
            case 4:
                yourHealth += 5;
                break;
            case 5:
                break;
            case 6:
                enemyHealth += 10;
                break;
        }

        yourTurn = true;
    }

    IEnumerator Wait(float time)
    {
        yield return new WaitForSecondsRealtime(time);

        EnemyTurn();
    }
}

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

1 Ответ

0 голосов
/ 06 ноября 2018

Это потому, что вы создаете Wait Coroutine на каждый Update вызов между концом игрока и ходом врага. Вам нужен способ создать его только один раз за конец хода игрока.

Один из способов - добавить флаг, который вы установили при создании Wait Coroutine, а затем сбросить его, когда ход врага завершен:

// If this is true, we are already waiting 
// and don't want more Wait coroutines (yet)
private bool waiting;  

void Start()
{
    button1.onClick.AddListener(Heal20);
    button2.onClick.AddListener(Damage40);
    YH.text = Convert.ToString(yourHealth);
    EH.text = Convert.ToString(enemyHealth);
    waiting = false;
}

// ...

    if (yourTurn == false)
    {
        if (!waiting) 
        {
            // we only want to do this stuff the first frame we start waiting

            button1.interactable = false;
            waiting = true;
            StartCoroutine(Wait(2));
        }
    }
    else
    {
        button1.interactable = true;
    }

// ...

IEnumerator Wait(float time)
{
    yield return new WaitForSecondsRealtime(time);

    EnemyTurn();
    waiting = false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...