Unity实战案例全解析 类宝可梦回合制的初级案例 源码分析(加了注释和流程图)
这是一个老教程了,但是对于没有写过回合制的初级程序同学来讲是比较适合的,也可以直接看源码,半小时内可以解决战斗
当然,我也没写过回合制系统所以就到处找,思路明白了就能自己修改了
视频教程 - 油管链接
Turn-Based Combat in Unity (youtube.com)
GitHub - 完整工程案例
wBrackeys/Turn-based-combat: Project files for our tutorial on how to create a turn-based battle system. (github.com)
实现效果

流程图

Start进入PlayerAttack,之后便是几个枚举状态之间的循环了
主要代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;// 定义战斗状态的枚举
public enum BattleState { START, PLAYERTURN, ENEMYTURN, WON, LOST }public class BattleSystem : MonoBehaviour
{// 玩家和敌人的预制体public GameObject playerPrefab;public GameObject enemyPrefab;// 玩家和敌人的战斗位置public Transform playerBattleStation;public Transform enemyBattleStation;// 玩家和敌人的单位Unit playerUnit;Unit enemyUnit;// 对话文本public Text dialogueText;// 玩家和敌人的HUDpublic BattleHUD playerHUD;public BattleHUD enemyHUD;// 当前战斗状态public BattleState state;// Start is called before the first frame updatevoid Start(){// 初始化战斗状态为STARTstate = BattleState.START;// 启动设置战斗的协程StartCoroutine(SetupBattle());}// 设置战斗的协程IEnumerator SetupBattle(){// 实例化玩家和敌人的预制体GameObject playerGO = Instantiate(playerPrefab, playerBattleStation);playerUnit = playerGO.GetComponent<Unit>();GameObject enemyGO = Instantiate(enemyPrefab, enemyBattleStation);enemyUnit = enemyGO.GetComponent<Unit>();// 更新对话文本dialogueText.text = "A wild " + enemyUnit.unitName + " approaches...";// 设置玩家和敌人的HUDplayerHUD.SetHUD(playerUnit);enemyHUD.SetHUD(enemyUnit);// 等待2秒yield return new WaitForSeconds(2f);// 切换到玩家回合state = BattleState.PLAYERTURN;PlayerTurn();}// 玩家攻击的协程IEnumerator PlayerAttack(){// 玩家攻击敌人并检查敌人是否死亡bool isDead = enemyUnit.TakeDamage(playerUnit.damage);// 更新敌人的HP和对话文本enemyHUD.SetHP(enemyUnit.currentHP);dialogueText.text = "The attack is successful!";// 等待2秒yield return new WaitForSeconds(2f);// 如果敌人死亡,结束战斗;否则,切换到敌人回合if(isDead){state = BattleState.WON;EndBattle();} else{state = BattleState.ENEMYTURN;StartCoroutine(EnemyTurn());}}// 敌人回合的协程IEnumerator EnemyTurn(){// 更新对话文本dialogueText.text = enemyUnit.unitName + " attacks!";// 等待1秒yield return new WaitForSeconds(1f);// 敌人攻击玩家并检查玩家是否死亡bool isDead = playerUnit.TakeDamage(enemyUnit.damage);// 更新玩家的HPplayerHUD.SetHP(playerUnit.currentHP);// 等待1秒yield return new WaitForSeconds(1f);// 如果玩家死亡,结束战斗;否则,切换到玩家回合if(isDead){state = BattleState.LOST;EndBattle();} else{state = BattleState.PLAYERTURN;PlayerTurn();}}// 结束战斗的方法void EndBattle(){if(state == BattleState.WON){dialogueText.text = "You won the battle!";} else if (state == BattleState.LOST){dialogueText.text = "You were defeated.";}}// 玩家回合的方法void PlayerTurn(){dialogueText.text = "Choose an action:";}// 玩家治疗的协程IEnumerator PlayerHeal(){// 玩家恢复HPplayerUnit.Heal(5);// 更新玩家的HP和对话文本playerHUD.SetHP(playerUnit.currentHP);dialogueText.text = "You feel renewed strength!";// 等待2秒yield return new WaitForSeconds(2f);// 切换到敌人回合state = BattleState.ENEMYTURN;StartCoroutine(EnemyTurn());}// 攻击按钮的事件处理方法public void OnAttackButton(){if (state != BattleState.PLAYERTURN)return;StartCoroutine(PlayerAttack());}// 治疗按钮的事件处理方法public void OnHealButton(){if (state != BattleState.PLAYERTURN)return;StartCoroutine(PlayerHeal());}
}
次要代码
战斗单位脚本,主要是属性
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Unit : MonoBehaviour
{public string unitName;public int unitLevel;public int damage;public int maxHP;public int currentHP;public bool TakeDamage(int dmg){currentHP -= dmg;if (currentHP <= 0)return true;elsereturn false;}public void Heal(int amount){currentHP += amount;if (currentHP > maxHP)currentHP = maxHP;}}
更新UI代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class BattleHUD : MonoBehaviour
{public Text nameText;public Text levelText;public Slider hpSlider;public void SetHUD(Unit unit){nameText.text = unit.unitName;levelText.text = "Lvl " + unit.unitLevel;hpSlider.maxValue = unit.maxHP;hpSlider.value = unit.currentHP;}public void SetHP(int hp){hpSlider.value = hp;}}
相关文章:
Unity实战案例全解析 类宝可梦回合制的初级案例 源码分析(加了注释和流程图)
这是一个老教程了,但是对于没有写过回合制的初级程序同学来讲是比较适合的,也可以直接看源码,半小时内可以解决战斗 当然,我也没写过回合制系统所以就到处找,思路明白了就能自己修改了 视频教程 - 油管链接 Turn-Bas…...
AI绘图大模型 Stable Diffusion 使用详解
近年来,生成式 AI 技术,特别是 AI 绘图模型的进展令人瞩目。Stable Diffusion 是其中一款开源的大规模图像生成模型,它能够根据文本描述生成高质量的图像,支持从写实风格到卡通、幻想等各种不同的视觉效果。本文将深入介绍如何使用…...
es索引库操作和使用RestHignLevelClient客户端操作es
目录 es索引库操作 mapping映射操作 索引库的CURD操作 1.创建索引库和映射 编辑 2.查询索引库 3.删除索引库 4.修改索引库 5.总结 文档的CURD操作 1.新增文档 2.查询文档 3.删除文档 4.修改文档 全量修改 增量修改 5.总结 RestAPI 使用API例子 需要的数…...
安卓数据共享
在 Android 中,数据共享是指不同应用之间共享数据或同一应用不同组件之间共享数据的机制。SQLite 数据库、内容提供者(Content Provider)、共享偏好(Shared Preferences)和文件存储等方式可以实现数据共享。下面将详细…...
Gin框架操作指南02:JSON渲染
官方文档地址(中文):https://gin-gonic.com/zh-cn/docs/ 注:本教程采用工作区机制,所以一个项目下载了Gin框架,其余项目就无需重复下载,想了解的读者可阅读第一节:Gin操作指南&#…...
【随手记】MySQL单表访问方法
在MySQL查询优化器中,单表访问方法(Access Method)指的是查询时数据库如何从一个表中访问所需的数据。不同的访问方法适用于不同的查询场景,主要包括 const、ref、ref_or_null、range、index 和 all。这些方法从效率上依次递减&am…...
机器学习:情感分析的原理、应用场景及优缺点介绍
一、情感分析算法概述 情感分析是自然语言处理中的一个重要任务,主要用于判断文本中所包含的情感倾向,如正面、负面或中性。 二、基于词典的情感分析算法 原理 词典构建:首先需要构建一个情感词典。这个词典包含了一系列带有情感倾向的词汇…...
基于SSM的医院药品管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
特征融合篇 | YOLOv10 引入动态上采样模块 | 超过了其他上采样器
本改进已集成到YOLOv8-Magic 框架 论文名称:《Learning to Upsample by Learning to Sample》 论文地址:https://arxiv.org/abs/2308.15085 代码地址:https://github.com/tiny-smart/dysample 我们提出了 DySample,一种超轻量级且有效的动态上采样器。尽管最近基于内核的…...
【Linux系列】写入文本到文件
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
【踩坑随笔】Tensorflow-GPU训练踩坑
一个无语的坑,4060单卡训练,8G内存本来就不够,还没开始训练就已经爆内存了,但是居然正常跑完了训练,然后一推理发现结果就是一坨。。。往回翻日志才发现原来中间有异常。 首先解决第一个问题:Could not lo…...
【云岚到家】-day07-4-实战项目-优惠券活动-项目准备
【云岚到家-即刻体检】-day07-4-实战项目-优惠券活动-活动管理 1 模块需求分析1.1 业务流程1.2 界面原型1.3 业务模块 2 模块设计2.1 数据流2.2 表结构设计2.2.1 优惠券活动表设计2.2.2 优惠券表设计2.2.3 优惠券核销表2.2.4 优惠券退回表 2.3 创建数据库2.4 创建工程 1 模块需…...
axios的使用
在 Vue 项目中,封装 Axios 并实现加密、重复请求优化、请求取消、页面切换时取消未完成的请求、以及区分上传和下载操作是非常常见的需求。下面将逐一讲解这些需求的实现方式。 1. Axios 的基本封装 首先,我们可以将 Axios 封装到一个服务层中…...
Ubuntu 使用命令克隆和恢复SD卡
因为平常我需要做很多张开发板的出货卡,测试卡,那么我需要将备份下来文件,方便后续管理,这里时候需要用到Ubuntu上面的命令来克隆镜像和恢复镜像到SD卡上 先查询自己的SD卡是在sdx,以我的为例子,为sdb 备…...
Java 小游戏《超级马里奥》
文章目录 一、效果展示二、代码编写1. 素材准备2. 创建窗口类3. 创建常量类4. 创建动作类5. 创建关卡类6. 创建障碍物类7. 创建马里奥类8. 编写程序入口 一、效果展示 二、代码编写 1. 素材准备 首先创建一个基本的 java 项目,并将本游戏需要用到的图片素材 image…...
go语言defer详解
什么是defer?为什么需要defer?怎样合理使用defer?defer进阶 defer的底层原理是什么?利用defer原理defer命令的拆解defer语句的参数闭包是什么?defer配合recover后记参考资料 什么是defer? defer是Go语言提供的一种用…...
【C语言】循环中断break
在循环使用过程中,可能遇到某些情况需要终止循环。比如按座位查找一位学生,循环查找,找到时可以直接停止。后续的循环将不再执行。 break;只跳出一层循环 例子中的素数判断,查找到根号n停止:一个合数等于两个数的乘积…...
centos ping能通但是wget超时-解决
问题截图: 域名解析地址为IPV6地址,建议您调整IPV4优先级之后,再尝试访问,请参考Linux系统IPv4/IPv6双栈接入优先使用IPv4设置:移动云帮助中心 实操截图:...
SDIO - DWC MSHC 电压切换和频率切换
背景 我们的sdio访问sd card过去一直跑在低频上,HS50M。前段时间给eMMc添加了HS200模式,eMMc的总线模式定义是这样的: 可以看到1.8V的IO 电压可以支持所有模式,我们过去的芯片,由硬件部门放到evb上,其IO …...
EI-CLIP 深度理解 PPT
系列文章目录 文章目录 系列文章目录 在电子商务产品的跨模态检索中,电子商务图像和电子商务语言都有许多独特的特点。如图所示,一个电子商务产品图片通常只包含一个简单的场景,有一个或两个前景物体和一个普通的背景。同时,电子商…...
无机布防火卷帘门价格怎么算?按尺寸定制,按需报价
无机布防火卷帘门作为建筑防火分区的核心设备,价格一直是工程采购的关注重点。很多用户在询价时,会发现不同厂家的报价差异较大,这是因为无机布防火卷帘门的价格并非按统一单价计算,而是完全根据项目的实际需求定制化核算。 &…...
基于2D工程图几何特征与梯度提升模型的制造成本智能预测
1. 项目概述:从图纸到报价的智能革命在制造业,尤其是像汽车零部件这样的离散制造领域,报价速度直接决定了订单的生死。传统上,拿到一张新的2D工程图(DWG格式),成本工程师需要花上几天甚至几周时…...
【DeepSeek-R1代码相似度引擎解密】:3层语义比对机制、Token归一化偏差修正与Jaccard阈值黄金分割点
更多请点击: https://kaifayun.com 第一章:DeepSeek代码重复检测 DeepSeek-R1 模型在训练过程中引入了严格的代码去重机制,其核心目标是消除训练语料中语义等价或高度相似的代码片段,从而提升模型对真实编程模式的学习能力与泛化…...
物理引导的机器学习工作流:气候建模的融合创新与实践
1. 项目概述:当气候建模遇见机器学习如果你像我一样,在气候模拟这个领域摸爬滚打超过十年,就会深刻体会到一种“甜蜜的负担”:我们构建的地球系统模型(ESM)越来越精细,物理过程越来越复杂&#…...
终极艾尔登法环帧率解锁指南:轻松突破60FPS限制
终极艾尔登法环帧率解锁指南:轻松突破60FPS限制 【免费下载链接】EldenRingFpsUnlockAndMore A small utility to remove frame rate limit, change FOV, add widescreen support and more for Elden Ring 项目地址: https://gitcode.com/gh_mirrors/el/EldenRing…...
口碑最好的AI论文写作工具推荐(从文献整理到论文成稿全流程)适合全体毕业生
还在为选题方向纠结、文献资料翻找耗时、开题报告无从下手、论文框架反复修改、查重率居高不下、降重过程痛苦不堪,甚至答辩PPT还要临时抱佛脚?作为学术新手、应届生或本科硕士毕业生,面对论文写作的重重关卡,流程复杂、操作门槛高…...
高精度光照检测
光线检测仪,kotlin开发,调用手机感光模块检测室内外光照强度,用途多多,我主要用途孩子写作业检测光照保护视力。 食用方法∶打开即测,速度快,无广告,手机平视即可,无须直视光线。 买…...
独立开发者如何利用Taotoken Token Plan,以更低成本启动AI项目
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者如何利用Taotoken Token Plan,以更低成本启动AI项目 对于独立开发者或小型团队而言,启动一个集成…...
告别DLL缺失烦恼!Visual C++运行库合集一键搞定Windows应用依赖问题
告别DLL缺失烦恼!Visual C运行库合集一键搞定Windows应用依赖问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经在打开某个软件或游戏时…...
想深耕网络安全行业,这些必备条件缺一不可
网络空间的攻防对抗日益激烈,网络安全已成为企业生存和国家安全的命脉,它负责构筑数字世界的坚固防线,保护核心资产与用户隐私免受侵害。 想要成为一名优秀的网络安全专家,除了敏锐的安全意识和高度的责任感,更需要锤…...
