30. 回合转换
1.02. 创建房间的 Prefab2.03. 设计地图配置表3.04. 生成地图上的房间4.07. 泛型事件框架5.08. 场景加载6.09. 保存地图场景7.10. 房间进出逻辑8.11. 制作卡牌 Prefab9.12. 创建卡牌数据类10.13. 对象池11.14. 制作卡牌库实现抽卡12.15. 创建卡牌布局13.16. 抽卡动画14.17. 实现卡牌扇形布局15.18. 实现鼠标事件16.19. 卡牌拖拽17.20. 攻击牌的拖拽指针18.21. 实现洗牌逻辑19.22. 导入Spine人物素材20.23. 人物基类代码21.24. 执行卡牌效果22.25. 制作血条的 UI Document23.26. 绑定血条数据24.27. 创建USS血条样式25.28. 制作 Gameplay Panel26.29. 绑定 Gameplay Panel 数据
27.30. 回合转换
28.31. 出牌能量判断29.32. 防御牌及 UI30.33. 回血的苹果牌及特效31.34. 增加力量牌及 UI32.35. 更多卡牌33.36. 人物动画34.37. 敌人意图 AI 逻辑35.38. 敌人的动画执行逻辑36.39. 对战胜负逻辑37.40. 制作胜利和抽卡面板38.41. 抽卡面板的实际逻辑39.42. GameOver 及 Menu 面板40.43. 实现休息房间的逻辑41.44. Boss 制作和整体流程42.45. 淡入淡出及打包游戏本节目标
当我点击右下角回合切换按钮的时候,会从我的回合切换到敌人回合,然后敌人回合经过几秒后回到我的回合
代码实现
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
,最后回到玩家回合
界面数据
项目相关代码
合集:
王国之梦
分类:
unity / 王国之梦
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?