【unity实战】如何更加规范的创建各种Rogue

您所在的位置:网站首页 肉鸽游戏的定义 【unity实战】如何更加规范的创建各种Rogue

【unity实战】如何更加规范的创建各种Rogue

2024-06-05 13:10| 来源: 网络整理| 查看: 265

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

前言

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

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

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

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

抽象类的主要好处包括:

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

在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) { // 将玩家的生命值增加 5 player.health += 5; } }

新增玩家脚本,调用BUFF

public class Player : MonoBehaviour { // 表示玩家的生命值 public int health; // 表示玩家的物品BUFF列表 public List items = new List(); 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); // 重新启动协程 CallItemUpdate StartCoroutine(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.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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3