【unity实战】如何更加规范的创建各种Rogue-Lite(肉鸽)风格的物品和BUFF效果(附项目源码)

文章目录

  • 前言
  • 定义基类
  • 实现不同的BUFF效果
    • 一、回血BUFF
      • 1. 简单的回血效果实现
      • 2. BUFF层数控制回血量
    • 二、攻击附带火焰伤害
    • 三、治疗领域
      • 1. 简单的治疗领域实现
      • 2. 添加技能冷却时间
  • 通过拾取物品获取对应的BUFF
  • 参考
  • 源码
  • 完结

前言

当创建各种Rogue-Lite(肉鸽)风格的游戏时,物品和BUFF效果是非常重要的元素之一。为了更加规范地创建这些物品和BUFF效果,可以使用抽象类来定义不同的BUFF。

那么什么是抽象类呢?他的用法?为什么用它?好处是什么呢?

在Unity中,抽象类是一种特殊的类,它不能被实例化,只能被用作其他类的基类。抽象类通常用于定义一些通用的行为和属性,但并不提供具体的实现细节。其目的是让子类来实现这些抽象方法和属性,以便根据具体的需求进行定制化。

使用抽象类的主要原因是为了实现代码的重用和统一性。抽象类可以定义一些通用的方法和属性,从而避免在多个类中重复编写相似的代码。同时,它也可以作为约定,强制子类实现特定的方法和属性,确保了程序的一致性和可扩展性。

抽象类的主要好处包括:

  1. 提供了一种模板化的设计方式,使得代码更易维护和扩展。
  2. 强制了子类必须实现抽象方法和属性,从而减少了程序出错的可能性。
  3. 通过抽象类可以实现多态性,使得代码更加灵活和可复用。

在Unity中,经常会用到抽象类来定义一些通用的行为或者规范,例如定义一个抽象的游戏角色类,其中定义了移动、攻击等方法,然后具体的角色类(如玩家角色、敌对角色等)继承并实现这些方法。这样可以保持代码的一致性和可维护性。

总之,抽象类在Unity中的使用可以帮助我们更好地组织和管理代码,提高代码的复用性和可维护性。

定义基类

物品就是物品BUFF,下面我都会用物品作为注释

新增Item,定义一个名为 Item 的物品BUFF抽象类

[System.Serializable]public abstract class Item
{// 定义BUFF名称public abstract string GiveName();// 定义一个虚方法 Update,其中 player 表示玩家对象,stacks 表示物品的叠加数量(及BUFF层数)public virtual void Update(Player player, int stacks){ }
}

新增ItemList,定义物品BUFF列表参数

[System.Serializable]
public class ItemList
{// 表示物品public Item item;// 表示名称public string name;// 表示叠加数量(及BUFF层数)public int stacks;// 构造函数,用于初始化 ItemList 对象public ItemList(Item newItem, string newName, int newStacks){item = newItem;name = newName;stacks = newStacks;}
}

实现不同的BUFF效果

一、回血BUFF

1. 简单的回血效果实现

定义一个名为 HealingItem 的类,继承自 Item,定义回血BUFF

public class HealingItem : Item
{public override string GiveName(){return "回血BUFF";}public override void Update(Player player, int stacks){// 将玩家的生命值增加 5player.health += 5;}
}

新增玩家脚本,调用BUFF

public class Player : MonoBehaviour
{// 表示玩家的生命值public int health;// 表示玩家的物品BUFF列表public List<ItemList> items = new List<ItemList>();void Start(){HealingItem item = new HealingItem();// 将回血BUFF对象添加到物品列表中items.Add(new ItemList(item, item.GiveName(), 1));StartCoroutine(CallItemUpdate());}IEnumerator CallItemUpdate(){// 遍历物品列表中的每个物品foreach (ItemList i in items){// 调用物品的 Update 方法i.item.Update(this, i.stacks);}//暂停1秒继续执行yield return new WaitForSeconds(1);// 重新启动协程 CallItemUpdateStartCoroutine(CallItemUpdate());}
}

运行效果,角色每秒回5点血
在这里插入图片描述

2. BUFF层数控制回血量

修改HealingItem

public override void Update(Player player, int stacks)
{// 将玩家的生命值增加player.health += 3 + (2 * stacks);
}

效果,两层每秒加7血
在这里插入图片描述
在这里插入图片描述

二、攻击附带火焰伤害

新增敌人脚本,定义敌人生命值

public class Enemy : MonoBehaviour {public int health;
}

修改Item,定义攻击事件

public virtual void OnHit(Player player, Enemy enemy, int stacks){ }

新增FireDamageItem,实现火焰攻击效果

public class FireDamageItem : Item
{public override string GiveName(){return "火焰攻击";}public override void OnHit(Player player, Enemy enemy, int stacks){enemy.health -= 10 * stacks;}    
}

修改Player,默认加2层火焰攻击效果

// 表示玩家的攻击力 
public int attackDamage;void Start()
{FireDamageItem item = new FireDamageItem();items.Add(new ItemList(item, item.GiveName(), 2));
}public void CallItemOnHit(Enemy enemy)
{foreach (ItemList i in items){i.item.OnHit(this, enemy, i.stacks);}
}

新增PlayerHitbox,定义攻击判定,攻击附加额外火焰攻击BUFF伤害

public class PlayerHitbox : MonoBehaviour
{public Player player;//触发器检测private void OnTriggerEnter(Collider other){// 判断进入碰撞体的对象是否为敌人if (other.tag == "Enemy"){Enemy enemy = other.GetComponent<Enemy>();// 减少敌人的生命值,减少的值为玩家的攻击力enemy.health -= player.attackDamage;// 调用玩家的 CallItemOnHit 方法,附加额外伤害player.CallItemOnHit(enemy);}}
}

效果,攻击附带额外伤害
在这里插入图片描述

三、治疗领域

实现治疗领域效果一般需要加载一些特性,而我们定义的BUFF是没办法挂载特效物品的,这时候就需要使用Resources加载指定的特效了

在这里插入图片描述

1. 简单的治疗领域实现

绘制预制体
在这里插入图片描述

修改Item,定义跳跃方法

public virtual void OnJump(Player player, int stacks) { }

新增HealingArea,实现跳跃方法生成治疗领域

public class HealingArea : Item
{//特效GameObject effect;public override string GiveName(){return "治疗领域";}public override void OnJump(Player player, int stacks){if (effect == null) effect= (GameObject)Resources.Load("Item Effects/Healing Area", typeof(GameObject));GameObject healingArea = GameObject.Instantiate(effect, player.transform.position, Quaternion.Euler(Vector3.zero));}
}

修改Player,实现每次按Space,执行治疗领域OnJump方法

private void Update()
{if (Input.GetKeyDown(KeyCode.Space)){CallItemOnJump();}
}public void CallItemOnJump()
{foreach (ItemList i in items){i.item.OnJump(this, i.stacks);}
}

效果,每次跳跃生成一个治疗光环
在这里插入图片描述

2. 添加技能冷却时间

修改HealingArea

public class HealingArea : Item
{GameObject effect;float internalCoolDown;//技能冷却时间public override string GiveName(){return "Healing Area";}public override void Update(Player player, int stacks){internalCoolDown -= 1;}public override void OnJump(Player player, int stacks){if (internalCoolDown <= 0){if (effect == null) effect = (GameObject)Resources.Load("Item Effects/Healing Area", typeof(GameObject));GameObject healingArea = GameObject.Instantiate(effect, player.transform.position, Quaternion.Euler(Vector3.zero));internalCoolDown = 10;//技能冷却时间默认定义10秒}}
}

效果,每10秒才能释放一次治疗光环
在这里插入图片描述

通过拾取物品获取对应的BUFF

新增ItemPickup ,物品拾取类

public class ItemPickup : MonoBehaviour
{// 掉落的物品对象public Item item;// 物品类型public Items itemDrop;void Start(){// 调用 AssignItem 方法,传入掉落的物品类型,并将返回值赋值给 itemitem = AssignItem(itemDrop);}// 触发器检测private void OnTriggerEnter(Collider other){// 判断进入碰撞体的对象是否为玩家if (other.tag == "Player"){// 获取玩家对象Player player = other.GetComponent<Player>();// 调用 AddItem 方法,传入玩家对象AddItem(player);// 销毁 Pickup 对象Destroy(this.gameObject);}}public Item AssignItem(Items itemToAssign){// 根据不同的物品类型返回不同的物品对象switch (itemToAssign){case Items.HealingItem:return new HealingItem();case Items.FireDamageItem:return new FireDamageItem();case Items.HealingAreaItem:return new HealingArea();default:return new HealingItem();}}public void AddItem(Player player){// 遍历玩家物品列表中的每个物品foreach (ItemList i in player.items){// 如果该物品已经存在于列表中,则将该物品的叠加数量加 1,并直接返回if (i.name == item.GiveName()){i.stacks += 1;return;}}// 将新的物品添加到玩家物品列表中player.items.Add(new ItemList(item, item.GiveName(), 1));}
}// 定义一个公共枚举类型 Items,表示所有可用的物品类型
public enum Items
{HealingItem,FireDamageItem,HealingAreaItem
}

修改Player,删除前面旧的BUFF添加

// HealingItem item = new HealingItem();
// items.Add(new ItemList(item, item.GiveName(), 1));// FireDamageItem item = new FireDamageItem();
// items.Add(new ItemList(item, item.GiveName(), 2));

新增各种BUFF物品,配置预制体
在这里插入图片描述效果,拾取物品即可获取对应的BUFF效果
在这里插入图片描述
ps:后续要加入其他BUFF,直接就可以修改ItemPickup很方便的进行添加定义即可

参考

【视频】https://www.youtube.com/watch?v=iU6mKyQjOYI

源码

https://gitcode.net/unity1/unity-roguelitebuff
在这里插入图片描述

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,于是最近才开始自习unity。如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我可能也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux基础项目开发1:量产工具——显示系统(二)

前言&#xff1a; 前面我们已经对这个项目的基本框架有了一个初步的了解与认识&#xff0c;要实现显示管理器与输入管理器&#xff0c;有输入有输出基本就实现这个项目的大部分功能了&#xff0c;首先我们先来做显示系统&#xff0c;对于上层系统为了让程序更好扩展&#xff0c…

策略模式实践

目录 前言 五个部分 名词解释 代码 controller层 HelloService接口 实现类 自定义注解 上下文 策略工厂 Java SPI配置 验证 前言 五个部分 接口、实现类、自定义注解、上下文、策略工厂 名词解释 自定义注解(方便后期增加实现类后灵活控制策略) 上下文(初始化…

【RESTful API】RESTful接口设计练习

参考: BV1Ps4y1J7Ve ---------------------------------------------------------------------------------------------------------- 一、RESTful框架 常见的有SpringMVC,jersey,play 二、API测试工具 Postman,Insomnia 三、RESTful接口设计练习 3.1 项目准备 构…

【项目实战】SpringBoot连接openGauss

一&#xff1a;Docker安装openGauss 1.下载openGauss 安装好Docker好以后&#xff0c;执行如下命令下载openGauss3.0镜像。docker pull enmotech/opengauss:3.0.0 2.运行openGauss 执行如下命令docker run -itd --name opengauss \ --restartalways \ --privilegedtrue \ …

eNSP防火墙USG6000V使用Web界面登入教程

文章目录 登入流程1、下载USG6000V的镜像包2、导入USG6000V的镜像包3、配置防火墙web页面4、修改本机vmnet1网卡的ipv4地址5、在eNSP上添加云6、配置防火墙管理地址&#xff0c;开启http服务7、关闭电脑防火墙8、访问web页面 登入流程 1、下载USG6000V的镜像包 链接&#xff…

MySQL表连接

文章目录 MySQL内外连接1.内连接2.外连接&#xff08;1&#xff09;左外连接&#xff08;2)右外连接 3.简单案例 MySQL内外连接 1.内连接 内连接的SQL如下&#xff1a; SELECT ... FROM t1 INNER JOIN t2 ON 连接条件 [INNER JOIN t3 ON 连接条件] ... AND 其他条件;说明一下…

pytest-pytest-html测试报告这样做,学完能涨薪3k

在 pytest 中提供了生成html格式测试报告的插件 pytest-html 安装 安装命令如下&#xff1a; pip install pytest-html使用 我们已经知道执行用例的两种方式&#xff0c;pytest.main()执行和命令行执行&#xff0c;而要使用pytest-html生成报告&#xff0c;只需要在执行时加…

分布式运用之ELK企业级日志分析系统

1.1 ELK的概念与组件 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 ElasticSearch&#xff1a; 是基于Lucene&#xff08;一个全文检索引…

2023-简单点-机器学习中常用的特殊函数,激活函数[sigmoid tanh ]

机器学习中的特殊函数 Sigmoidsoftplus函数tanhReLu(x)Leaky-ReluELUSiLu/ SwishMish伽玛函数beta函数Ref Sigmoid 值域: 【0,1】 定义域&#xff1a;【负无穷,正无穷】 特殊点记忆&#xff1a; 经过 [0 , 0.5] 关键点[0,0.5]处的导数是 0.025 相关导数&#xff1a; softplu…

『VUE3 の 要点摘录』

✅v-model 用法 v-model 原生方法&#xff1a; v-model computed &#xff1a; 更改名字&#xff1a; 多个 v-model 绑定 处理 v-model 修饰符 ✅TS项目报错 1、TypeScript 错误 “Module ‘…index’ has no default export” // tsconfig.json {...."compilerOpt…

大金仓数据库:kingbase学习

kingbase学习 1.简介2. 安装3. 基础使用3.1 客户端连接3.2 表数据测试3.2.1 建表创建字段备注 3.2.2 数据写入测试3.2.2 json测试3.2.2.1 json查询测试3.2.2.2 json修改测试3.2.2.3 json数据迁移测试 4.springboot实战4.1 maven依赖4.2 连接配置4.3 mybatis-plus测试4.4 liquib…

【AI认证笔记】NO.2人工智能的发展

目录 一、人工智能的发展里程碑 二、当前人工智能的发展特点 1.人工智能进入高速发展阶段 2.人工智能元年 三、人工智能高速发展的三大引擎 1.算法突破 2.算力飞跃 3.数据井喷 四、AI的机遇 五、AI人才的缺口 六、行业AI 人工智能算法&#xff0c;万物互联&#xff…

qInstallMessageHandler的学习

背景&#xff1a;需要做一个日志系统。 把信息重定向到txt文件中。 参考&#xff1a; QT 调试信息如何输出到文件&#xff08;qDebug/qWarning/qCritical/qFatal&#xff09;-CSDN博客 Qt 之 qInstallMessageHandler&#xff08;重定向至文件&#xff09;-CSDN博客 demo…

Python小技巧:探索函数调用为何加速代码执行

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python 作为一种解释型语言&#xff0c;其执行速度相对于编译型语言可能会较慢。然而&#xff0c;在Python中&#xff0c;通常观察到代码在函数中运行得更快的现象。这个现象主要是由于函数调用的内部优化和解释…

神器!使用 patchworklib 库进行多图排版真棒啊

如果想把多个图合并放在一个图里&#xff0c;如图&#xff0c;该如何实现 好在R语言 和 Python 都有对应的解决方案&#xff0c; 分别是patchwork包和patchworklib库。 推介1 我们打造了《100个超强算法模型》&#xff0c;特点&#xff1a;从0到1轻松学习&#xff0c;原理、…

整车测试中的UDS诊断

UDS&#xff08;Unified Diagnostic Services&#xff0c;统一的诊断服务&#xff09;诊断协议是在汽车电子ECU环境下的一种诊断通信协议。这种通信协议被用在几乎所有由OEM一级供应商所制造的新ECU上面。这些ECU控制车辆的各种功能&#xff0c;包括电控燃油喷射系统&#xff0…

Week-T11-优化器对比试验

文章目录 一、准备环境二、准备数据三、搭建训练网络三、训练模型&#xff08;1&#xff09;VSCode训练情况&#xff1a;&#xff08;2&#xff09;jupyter notebook训练情况&#xff1a; 四、模型评估 & 模型预测1、绘制Accuracy-Loss图2、显示model2的预测效果 五、总结1…

C++类与对象(7)—友元、内部类、匿名对象、拷贝对象时编译器优化

目录 一、友元 1、定义 2、友元函数 3、友元类 二、内部类 1、定义 2、特性&#xff1a; 三、匿名对象 四、拷贝对象时的一些编译器优化 1、传值&传引用返回优化对比 2、匿名对象作为函数返回对象 3、接收返回值方式对比 总结&#xff1a; 一、友元 1、定义…

RPC之grpc重试策略

1、grpc重试策略 RPC 调用失败可以分为三种情况&#xff1a; 1、RPC 请求还没有离开客户端&#xff1b; 2、RPC 请求到达服务器&#xff0c;但是服务器的应用逻辑还没有处理该请求&#xff1b; 3、服务器应用逻辑开始处理请求&#xff0c;并且处理失败&#xff1b; 最后一种…

2020年3月2日 Go生态洞察:Go协议缓冲区的新API发布

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…