【用unity实现100个游戏之17】从零开始制作一个类幸存者肉鸽(Roguelike)游戏5(附项目源码)(上)

简介: 【用unity实现100个游戏之17】从零开始制作一个类幸存者肉鸽(Roguelike)游戏5(附项目源码)

本节最终效果

前言

本节紧跟着上一篇,主要实现能力升级系统。

能力升级系统

新增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;


目录
相关文章
|
4天前
|
存储 JSON 关系型数据库
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
12 2
|
4天前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(上)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)
10 2
|
4天前
|
存储 JSON 图形学
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
6 0
|
4天前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
8 0
|
4天前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版3(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版3(附带项目源码)
14 2
|
4天前
|
图形学
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)
14 0
|
4天前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版2(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版2(附带项目源码)
8 1
|
4天前
|
存储 JSON 关系型数据库
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
9 0
|
4天前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版12(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版12(附带项目源码)
9 0
|
4天前
|
存储 图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版11(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版11(附带项目源码)
10 0