Как я могу вызвать функцию после запуска другой функции определенное количество раз - PullRequest
0 голосов
/ 31 марта 2020

Функция EnemyDead запускается после смерти врага, а PlayerDead означает, что игрок умер. Затем сценарий отключает мертвый объект и создает новый объект, и я хочу вызвать функцию game over, когда функция EnemyDead или PlayerDead была вызвана три раза. Я просто понятия не имею, как go сделать это. Любая помощь будет отличной, спасибо!

IEnumerator EnemyDead()
{
    enemyUnit.GetComponentInChildren<SpriteRenderer>().enabled = false;

    yield return new WaitForSeconds(.5f);

    randomInt = Random.Range(0, enemyPrefab.Length);
    GameObject enemyGO = Instantiate(enemyPrefab[randomInt], enemySpawn);
    enemyUnit = enemyGO.GetComponent<Unit>();

    enemyHUD.SetHUD(enemyUnit);

    if (playerUnit.speed > enemyUnit.speed)
    {
        state = BattleState.PLAYERTURN;
        PlayerTurn();
    }

    else if (enemyUnit.speed > playerUnit.speed)
    {
        passButtonDamage.interactable = false;
        attackButton.interactable = false;
        healButton.interactable = false;
        passButtonResistance.interactable = false;

        yield return new WaitForSeconds(.5f);

        state = BattleState.ENEMYTURN;
        StartCoroutine(EnemyTurn());
    }
}

IEnumerator PlayerDead()
{
    playerUnit.GetComponentInChildren<SpriteRenderer>().enabled = false;

    yield return new WaitForSeconds(.5f);

    randomInt = Random.Range(0, playerPrefab.Length);
    GameObject playerGO = Instantiate(playerPrefab[randomInt], playerSpawn);
    playerUnit = playerGO.GetComponent<Unit>();

    playerHUD.SetHUD(playerUnit);

    if (playerUnit.speed > enemyUnit.speed)
    {
        state = BattleState.PLAYERTURN;
        PlayerTurn();
    }

    else if (enemyUnit.speed > playerUnit.speed)
    {
        passButtonDamage.interactable = false;
        attackButton.interactable = false;
        healButton.interactable = false;
        passButtonResistance.interactable = false;

        yield return new WaitForSeconds(.5f);

        state = BattleState.ENEMYTURN;
        StartCoroutine(EnemyTurn());
    }
}

Ответы [ 3 ]

0 голосов
/ 31 марта 2020

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

И затем вы можете добавить простой int счетчик, например

public Transform playerSpawn;
public Unit[] playerPrefabs;
public <YourType> playerHUD;
[Space]
public Transform enemySpawn;
public Unit[] enemyPrefabs;
public <YourType> enemyHUD;

private int deathCountPlayer;
private int deathCountEnemy;
private Unit playerUnit;
private Unit enemyUnit;

private IEnumerator UnitDead(ref Unit targetUnit, ref int deathCount, Unit[] prefabs, Transform targetParent, <YourType> targetHUD)
{
    // if you instantiate new units you should actually destroy the old
    // ones not only disable their children!
    Destroy(targetUnit.gameObject);

    if(++deathCount >= 3)
    {
        // GAME OVER
        if(deathCountPlayer > deathCountEnemy)
        {
            // enemy wins
        }
        else
        {
            // player wins
        }

        yield break;
    }

    yield return new WaitForSeconds(0.5f);

    var randomInt = Random.Range(0, prefabs.Length);
    // since we passed in targetUnit using the ref keyword
    // this will replace either the playerUnit or enemyUnit reference 
    // we passed in
    targetUnit = Instantiate(prefabs[randomInt], targetParent);

    targetHUD.SetHUD(targetUnit);

    if (playerUnit.speed > enemyUnit.speed)
    {
        state = BattleState.PLAYERTURN;
        PlayerTurn();
    }
    else if (enemyUnit.speed > playerUnit.speed)
    {
        passButtonDamage.interactable = false;
        attackButton.interactable = false;
        healButton.interactable = false;
        passButtonResistance.interactable = false;

        yield return new WaitForSeconds(0.5f);

        state = BattleState.ENEMYTURN;
        StartCoroutine(EnemyTurn());
    }
}

Так что теперь вы можете запустить сопрограмму либо используя

StartCoroutine(ref playerUnit, ref deathCountPlayer, playerPrefabs, playerSpawn, playerHUD);

или

StartCoroutine(ref enemyUnit, ref deathCountEnemy, enemyPrefabs, enemySpawn, enemyHUD);
0 голосов
/ 31 марта 2020

Вот пример с некоторыми свойствами и событиями. Если у вас есть какие-либо вопросы, просто дайте мне знать !!


public class MyGameHandle
{
    public delegate void OnGameOver();
    public event OnGameOver OnGameIsOver;


    private int _enemyCount = 0;
    private readonly int _enemiesToLoseGame = 3;

    private int _playerDeadsCount = 0;
    private readonly int _playerLifes = 3;

    public int EnemyCountProperty
    {
        get { return _enemyCount; }
        private set
        {
            _enemyCount = value;
            if (_enemyCount >= _enemiesToLoseGame)
            {
                OnGameIsOver?.Invoke();
            }
        }
    }

    public int PlayerDeadsCount
    {
        get { return _playerDeadsCount; }
        private set
        {
            _playerDeadsCount = value;
            if (_playerDeadsCount >= _playerLifes)
            {
                OnGameIsOver?.Invoke();
            }
        }
    }

    IEnumerator EnemyDead()
    {
        EnemyCountProperty++;
        /*
         *
         *
         *
         */
        yield return null;
    }

    IEnumerator PlayerDead()
    {
        PlayerDeadsCount++;
        /*
         *
         *
         *
         */
        yield return null;
    }

    public class SomeWhereInMyProject
    {
        public SomeWhereInMyProject()
        {
            MyGameHandle gameHandle = new MyGameHandle();
            gameHandle.OnGameIsOver += GameOver;
        }

        private void GameOver()
        {
            //Handle Gameover event

            //YOUR CODE HERE

            /*
             *
             *
             */
        }
    }
0 голосов
/ 31 марта 2020

Вы можете определить новую функцию и свойство, которое проверяет ее.

    private int _checkForGameOver { get; set; } = 0;

    public void CountGameOver()
    {
        _checkForGameOver++;

        if (_checkForGameOver == 3)
            GameOver();
    }

И поместить эту функцию в тело EnemyDead и PlayerDead. Когда функция вызывается три раза, будет вызвано GameOver(). Конечно, вы должны справиться с текущими сопрограммами!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...