本节最终效果
前言
本节紧跟着上一篇,主要实现能力升级系统。
能力升级系统
新增ItemData
[CreateAssetMenu(fileName = "Item", menuName = "Scriptable Object/ItemData")] public class ItemData : ScriptableObject { public enum ItemType { Melee, Range, Glove, Shoe, Heal } // 物品类型枚举 [Header("#Main Info")] public ItemType itemType; // 物品类型 public int itemId; // 物品ID public string itemName; // 物品名称 public string itemDesc; // 物品描述 public Sprite itemIcon; // 物品图标 [Header("#Level Data")] public float baseDamage; // 基础伤害 public int baseCount; // 基础数量 public float[] damages; // 不同等级的伤害数组 public int[] counts; // 不同等级的数量数组 [Header("#Weapon")] public GameObject projectile; // 投射物对象 }
配置各种物品
绘制升级按钮
绘制UI按钮,只是用于测试
新增Item,该类的作用是管理物品的显示和交互,以便在游戏中方便地使用和管理各种物品。
public class Item : MonoBehaviour { // 物品数据,由其他地方赋值 public ItemData data; // 物品等级 public int level; // 引用武器组件 public Weapon weapon; // 物品图标 Image icon; // 物品等级文本 Text textLevel; void Awake() { // 获取子物体中的Image组件,并将其赋值给icon变量 icon = GetComponentsInChildren<Image>()[1]; // 设置icon的sprite为物品的图标 icon.sprite = data.itemIcon; // 获取子物体中的Text组件,并将其赋值给texts数组 Text[] texts = GetComponentsInChildren<Text>(); // 将texts数组中的第一个元素赋值给textLevel变量 textLevel = texts[0]; } // LateUpdate方法,在Update之后调用 // 通常在此方法中更新UI void LateUpdate() { // 更新物品等级文本的内容 textLevel.text = "Lv." + (level + 1); } }
挂载脚本,配置参数
效果
修改Item,定义点击事件
// 当点击物品时调用的方法 public void OnClick() { // 根据物品类型进行不同的处理 switch (data.itemType) { // 如果是近战武器或远程武器 case ItemData.ItemType.Melee: case ItemData.ItemType.Range: // 这里可以添加处理近战武器和远程武器的逻辑 break; // 如果是手套 case ItemData.ItemType.Glove: // 这里可以添加处理手套的逻辑 break; // 如果是鞋子 case ItemData.ItemType.Shoe: // 这里可以添加处理鞋子的逻辑 break; // 如果是治疗物品 case ItemData.ItemType.Heal: // 这里可以添加处理治疗物品的逻辑 break; } // 物品等级加1 level++; // 如果等级等于物品伤害数组的长度 if (level == data.damages.Length) { // 获取Button组件,并将其交互状态设置为false,即不可交互 GetComponent<Button>().interactable = false; } }
效果
武器升级
修改Weapon
void Awake() { player = GameManager.instance.player; // Init(); // 初始化武器属性 } void Update() { switch (id) { //。。。 if (timer > speed && count > 0) { timer = 0f; Fire(); } break; } } /// <summary> /// 初始化武器/子弹属性 /// </summary> public void Init(ItemData data) { name = "Weapon " + data.itemId; // 设置物品名称 transform.parent = player.transform; // 设置物品的父级为玩家对象 transform.localPosition = Vector3.zero; // 设置物品在父级坐标系下的本地位置为(0, 0, 0) id = data.itemId; // 设置物品ID damage = data.baseDamage; // 设置物品基础伤害 count = data.baseCount; // 设置物品基础数量 for (int index = 0; index < GameManager.instance.pool.prefabs.Length; index++) { if (data.projectile == GameManager.instance.pool.prefabs[index]) { prefabId = index; // 设置投射物的预制体ID break; } } //。。。 }
修改Item
// 如果是近战武器或远程武器 case ItemData.ItemType.Melee: case ItemData.ItemType.Range: // 这里可以添加处理近战武器和远程武器的逻辑 if(level == 0){ //开始给玩家一个武器 GameObject newWeapon = new GameObject(); weapon = newWeapon.AddComponent<Weapon>(); weapon.Init(data); }else{ float nextDamage = data.baseDamage; int nextCount = 0; nextDamage += data.baseDamage * data.damages[level]; nextCount += data.counts[level]; weapon.LevelUp(nextDamage, nextCount); } break;
效果
道具升级
新增Gear,用于处理道具的属性和应用。
public class Gear : MonoBehaviour { public ItemData.ItemType type; // 物品类型 public float rate; // 比率 public void Init(ItemData data) { // 基本设置 name = "Gear " + data.itemId; // 设置物品名称 transform.parent = GameManager.instance.player.transform; // 将物品的父物体设置为玩家对象 transform.localPosition = Vector3.zero; // 将物品的本地坐标设置为零向量 // 属性设置 type = data.itemType; // 设置物品类型 rate = data.damages[0]; // 选择第一个等级的伤害作为初始值 ApplyGear(); // 应用物品属性 } public void LevelUp(float rate) { this.rate = rate; // 更新比率 ApplyGear(); // 应用物品属性 } void ApplyGear() { switch (type) { case ItemData.ItemType.Glove: RateUp(); // 手套类型的物品增加攻击速率 break; case ItemData.ItemType.Shoe: SpeedUp(); // 鞋子类型的物品增加玩家速度 break; } } void RateUp() { Weapon[] weapons = transform.parent.GetComponentsInChildren<Weapon>(); // 获取所有子物体中的武器组件 foreach (Weapon weapon in weapons) { switch (weapon.id) { case 0: weapon.speed = 150 * (1.0f + rate); // 增加150%速度 break; default: weapon.speed = 0.5f * (1.0f + rate); // 增加50%速度 break; } } } void SpeedUp() { float speed = 3.0f; // 默认玩家速度 GameManager.instance.player.speed = speed * (1.0f + rate); // 根据rate调整玩家速度 } }
修改Item
public Gear gear; // 如果是手套/鞋子 case ItemData.ItemType.Glove: case ItemData.ItemType.Shoe: // 这里可以添加处理手套/鞋子的逻辑 if (level == 0) { GameObject newGear = new GameObject(); gear = newGear.AddComponent<Gear>(); gear.Init(data); } else { float nextRate = data.damages[level]; gear.LevelUp(nextRate); } break;
运行效果,点击手套和鞋子buff在人物会生成对应属性,且人物增加攻速和移速效果
治疗物品效果
修改Item
// 如果是治疗物品 case ItemData.ItemType.Heal: // 这里可以添加处理治疗物品的逻辑 GameManager.instance.health = GameManager.instance.maxHealth; break;