30. 回合转换

本节目标

当我点击右下角回合切换按钮的时候,会从我的回合切换到敌人回合,然后敌人回合经过几秒后回到我的回合

代码实现

TurnBaseManager 广播 playerTurnBegin 事件

首先我们需要一个TurnBaseManager类,用于管理当前是哪个回合

using UnityEngine;

public class TurnBaseManager : MonoBehaviour
{
    private bool isPlayerTurn = false;
    private bool isEnemyTurn = false;
    public bool battleEnd = true;

    private float timeCounter;
    public float enemyTurnDuration;
    public float playerTurnDuration;

    [Header("事件广播")]
    public ObjectEventSO playerTurnBegin;
    public ObjectEventSO enemyTurnBegin;
    public ObjectEventSO enemyTurnEnd;

    private void Update() 
    {
        if (battleEnd)    
        {
            return;
        }

        if (isEnemyTurn)
        {
            timeCounter += Time.deltaTime;
            if (timeCounter >= enemyTurnDuration)
            {
                timeCounter = 0;
                // 敌人回合结束
                EnemyTurnEnd();
                // 玩家回合开始
                isPlayerTurn = true;
            }
        }

        if (isPlayerTurn)
        {
            timeCounter += Time.deltaTime;
            if (timeCounter >= playerTurnDuration)
            {
                timeCounter = 0f;
                // 玩家回合开始
                PlayerTurnBegin();
                isPlayerTurn = false;
            }
        }
    }

    [ContextMenu("Game Start")]
    public void GameStart()
    {
        isPlayerTurn = true;
        isEnemyTurn = false;
        battleEnd = false;
        timeCounter = 0;
    }

    public void PlayerTurnBegin()
    {
        playerTurnBegin.RaiseEvent(null, this);
    }

    public void EnemyTurnBegin()
    {
        isEnemyTurn = true;
        enemyTurnBegin.RaiseEvent(null, this);
    }

    public void EnemyTurnEnd()
    {
        isEnemyTurn = false;
        enemyTurnEnd.RaiseEvent(null, this);
    }
}

这段代码的运行逻辑如下,最一开始,我们执行GameStart,然后isPlayerTurn=ture,然后在Update中就会调用PlayerTurnBegin(),然后广播playerTurnBegin事件

CardDeck 监听 playerTurnBegin 事件

当 CardDeck 收到 PlayerTurnBegin 事件之后,会调用CardDeck.NewTurnDrawCards方法

GameplayPanel 广播 PlayerTurnEnd 事件

当玩家打完牌之后,就会点击右下角的回合结束按钮。回合结束按钮绑定了OnEndTurnButtonClicked方法,会广播playerTurnEndEvent事件

CardDeck 监听 PlayerTurnEnd 事件

OnPlayerTurnEnd方法中,首先将手牌里面的牌都添加到弃牌堆中,然后丢弃这些牌,同时发送事件更新弃牌堆数量

TurnBaseManager 监听 PlayerTurnEnd 事件

当 TurnBaseManager 收到PlayerTurnEnd事件之后,就会调用方法TurnBaseManager.EnemyTurnBegin,然后就会广播enemyTurnBegin事件

好像暂时没有地方接收enemyTurnBegin事件

EnemyTurnBegin方法中,isEnemyTurn=true,然后在Update里面就会等待一段实现,然后执行EnemyTurnEnd(这里会广播enemyTurnEnd事件),然后让isPlayerTurn=true,最后回到玩家回合

界面数据

项目相关代码

代码仓库:https://gitee.com/nbda1121440/DreamOfTheKingdom.git

标签:20240306_1948

posted @ 2024-03-06 20:47  hellozjf  阅读(20)  评论(0编辑  收藏  举报