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;

    // 玩家和敌人的HUD
	public BattleHUD playerHUD;
	public BattleHUD enemyHUD;

    // 当前战斗状态
	public BattleState state;

    // Start is called before the first frame update
    void Start()
    {
        // 初始化战斗状态为START
		state = 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...";

        // 设置玩家和敌人的HUD
		playerHUD.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);

        // 更新玩家的HP
		playerHUD.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()
	{
        // 玩家恢复HP
		playerUnit.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;
		else
			return 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;
	}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/892276.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机组成原理(笔记7高速缓冲存储器Cache,计算机组成原理的重难点全、直接、组相连)

为什么要设立高速缓冲存储器 &#xff08;Cache&#xff09;&#xff1f; Cache是介于CPU和主存之间的小容量存储器&#xff0c;存取速度比主存快。它能高速地向CPU提供指令和数据&#xff0c;加快程序的执行速度。它是为了解决CPU和主存之间速度不匹配而采用的一项重要技术。…

代理商培训新策略:利用内部知识库提升培训效果

在当今竞争激烈的市场环境中&#xff0c;代理商作为企业与终端消费者之间的桥梁&#xff0c;其专业能力和服务质量直接影响着企业的市场表现和品牌形象。因此&#xff0c;对代理商进行系统而高效的培训&#xff0c;提升其业务技能和服务水平&#xff0c;成为企业不可忽视的重要…

靶场专用免杀工具

工具 SimpleShellcodeInjector 代码 #include <stdio.h> #include <Windows.h> int main(int argc, char* argv[]) {// HWND hWnd GetConsoleWindow();// ShowWindow( hWnd, SW_HIDE );unsigned int char_in_hex;char* shellcode argv[1];unsigned int iteratio…

SpringCloud集成nacos注册中心

SpringCloud集成nacos注册中心 1、Nacos服务端搭建 下载地址:https://github.com/alibaba/Nacos/releases 1)linux环境启停: ①:把我们的Nacos包解压 tar -zxvf nacos-server-1.1.4.tar.gz ②&#xff1a;cd 到我们的解压目录nacos cd nacos ③&#xff1a;进入到bin目录下…

mysql用户管理(user表列信息介绍,本质,管理操作),数据库的权限管理(权限列表,权限操作)

目录 用户管理 介绍 user表 介绍 列信息 Host User *_priv authentication_string 用户管理的本质 操作 创建用户 删除用户 修改用户信息 修改密码 自己修改 root用户修改指定用户的密码 数据库的权限 权限列表 给用户授权 查看权限 回收权限 刷新权限 …

1、HTML笔记

文章目录 计算机基础知识一、HTML基础Web标准(面试重点&#xff09;为什么需要Web标准Web标准的构成 HTML标签DOCTYPE和 lang 以及charset字符集的使用标题标签段落标签和换行标签文本格式化标签div和span标签图像标签和路径超链接标签注释标签特殊字符表格标签列表标签表单标签…

飞牛NAS未识别到网卡

最新都说国产免费的飞牛NAS非常好用&#xff0c;再也不用搞黑群辉了。 以前也没有搞过NAS&#xff0c;刚好借着这个机会学习一下NAS产品。 在虚拟机上安装&#xff0c;安装还挺顺利&#xff0c;就打算在买来的 也试试&#xff0c;结果系统都安装成功了&#xff0c;但是提示“…

离散数学-逻辑与证明基础1.4(谓词和量词)

谓词 1.4.2 谓词 涉及变量的语句&#xff0c;例如&#xff1a; “ x > 3 x > 3 x>3”&#xff0c;“ x y 3 x y 3 xy3”&#xff0c;“ x y z x y z xyz” 以及 \quad “Computer x x x is under attack by an intruder” \quad “Computer x x x is f…

RISC-V笔记——基础

1. 前言 RISC-V旨在支持广泛的定制和专业化。RISC-V的ISA是由一个基本整型ISA和其它对基本ISA的可选扩展组成。每个整型ISA可以使用一个或多个可选的ISA扩展进行扩展。 基本整型ISA精选了最小的一组指令&#xff0c;这些指令足以为编译器、汇编器、链接器和操作系统提供足够的…

常见八大排序算法

今天我们带来数据结构中常见的8大排序算法。 排序算法平均时间复杂度最好情况最坏情况空间复杂度稳定性冒泡排序O(n方)O(n方)O(n方)O(1)稳定插入排序O(n方)O(n方)O(n方)O(1)稳定选择排序O(n方)O(n方)O(n方)O(1)不稳定希尔排序O(n1.3方到1,5方)O(n)O(n方)O(1)不稳定堆排序O(n lo…

Opencv形态学的膨胀操作、开运算与闭运算、梯度运算、礼帽与黑帽操作

文章目录 一、膨胀操作二、开运算与闭运算三、梯度运算四、礼帽与黑帽操作 一、膨胀操作 膨胀操作也就是根据图片将边缘的一些细节给丰富&#xff0c;处理的程度取决于卷积核的大小还有膨胀次数。也就是腐蚀操作的相反操作&#xff08;腐蚀操作参考我的上一篇文章 点击跳转&am…

音视频编辑码部分常识

音视频编辑码常识 基本概念 实时音视频通讯 音视频处理 网络传输。包括采集、编码、网络传输、解码、播放等环节 视频播放器播放一个互联网上的视频文件&#xff0c;需要经过以下几个步骤&#xff1a;解协议&#xff0c;解封装&#xff0c;解码视音频&#xff0c;视音频同…

C++初阶(二)--C++入门(引用篇)

目录 一、引用的基本概念与特性 1.定义与声明 2.特性 二、引用的进阶用法 1.函数参数传递&#xff1a; 2.引用作为函数返回值&#xff08;重点&#xff09; 引用作为返回值的优点 引用作为返回值的注意事项 代码示例 注意事项的进一步说明 三、传值和传引用效率比较 …

华三服务器R4900 G5在图形界面使用PMC阵列卡(P460-B4)创建RAID,并安装系统(中文教程)

环境以用户需求安装Centos7.9&#xff0c;服务器使用9块900G硬盘&#xff0c;创建RAID1和RAID6&#xff0c;留一块作为热备盘。 使用笔记本通过HDM管理口&#xff08;&#xff09;登录 使用VGA&#xff08;&#xff09;线连接显示器和使用usb线连接键盘鼠标&#xff0c;进行窗…

10月报名 | 海克斯康Adams二次开发培训

您好&#xff01;感谢您长期以来对优飞迪科技与海克斯康的关注与支持。我们诚邀您参加10月31日-11月1日的海克斯康Adams二次开发培训&#xff0c;本次培训将通过讲解和实操结合的方式&#xff0c;帮助用户了解Adams二次开发技术&#xff0c;学习Adams命令语言&#xff0c;掌握如…

[自然语言处理]RNN

1 传统RNN模型与LSTM import torch import torch.nn as nntorch.manual_seed(6)# todo:基础RNN模型 def dem01():参数1&#xff1a;input_size 每个词的词向量维度&#xff08;输入层神经元的个数&#xff09;参数2&#xff1a;hidden_size 隐藏层神经元的个数参数3&#xff1a…

基于Python的博客系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

智能化企业新人培训:AI助理如何加速新员融入与成长

在当今这个快速变化的时代&#xff0c;企业新人的培训不再仅仅局限于传统的教室环境&#xff0c;而是越来越多地融入了先进的技术&#xff0c;特别是人工智能&#xff08;AI&#xff09;。AI助理&#xff0c;作为这一变革的先锋&#xff0c;正在以独特的方式重塑企业新人培训的…

废水处理(一)——MDPI特刊推荐

特刊征稿 01 期刊名称&#xff1a; Removing Challenging Pollutants from Wastewater: Effective Approaches 截止时间&#xff1a; 摘要提交截止日期&#xff1a;2024年11月30日 投稿截止日期&#xff1a;2025年5月31日 目标及范围&#xff1a; 该主题是分享去除有毒物…

TQRFSOC开发板47DR 100G光口ping测试

本例程实现TQRFSOC开发板使用100G光口与100G网卡进行ping测试。TQRFSOC开发板有两个100G光口&#xff0c;都将进行测试&#xff0c;所使用的100G网卡同样是我们生产的&#xff0c;有需要的可以配套进行购买。本例程提供两个启动文件&#xff0c;分别对应两个光口&#xff0c;通…