Unity进阶--物品,背包,角色管理器

2023-11-16

物品管理器

  • 物品数据 Item.json(json部分)(Resources/Data/Item)

    [{
    "id": 1,
    "name": "新手剑",
    "des": "这是一把宝剑",
    "price": 200,
    "icon": "",
    "attack": 10,
    "hp": 0
    },
    {
    "id": 2,
    "name": "新手药剂",
    "des":"这是新手药剂",
    "price": 100,
    "icon": "",
    "attack" : 0,
    "hp": 10
    }]
    
    
    • 数据类

      public class Item
      {
          public int id;
          public string name;
          public string des;
          public int price;
          public string icon;
          public int attack;
          public int hp;
      }
      
  • 物品管理类

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using LitJson;
    
    public class ItemManager
    {
        private static ItemManager instance;
    
        public static ItemManager Instance{
            get
            {
                if(instance == null) {
                    instance = new ItemManager();
                }
                return instance;
            }
        }
    
        //所有的物品信息
        private Item[] items;
        
        public ItemManager(){
            TextAsset json = Resources.Load<TextAsset>("Data/Item");
            //解析json
            items = LitJson.JsonMapper.ToObject<Item[]>(json.text);
        }
        
        //通过物品id获取物品
        public Item GetItem(int id){
            foreach (Item item in items){
                if(item.id == id) {
                    return item;
                }
            }
            return null;
        }
    }
    
    

背包管理器

  • InventoryManager

    using System.Collections;
    using System.Collections.Generic;
    
        //背包格子
        public class InventoryItem{
            //物品id
            public int ItemId;
            //个数
            public int Count = 1;
        }
    
        public class InventoryManager
       {
        //单例模式
       private static InventoryManager instance;
       public static InventoryManager Instance{
        get{
            if(instance == null){
                instance = new InventoryManager();
                return instance;
            }
            return instance;
        }
       }
    
       //背包集合
       public List<InventoryItem> Inventory = new List<InventoryItem>();
    
       //添加物品
        public void AddItem(int itemId, int count = 1){
            //查看背包中是否已经存在该物品
            foreach (InventoryItem tmpItem in Inventory){
            if (tmpItem.ItemId == itemId){
                //存在,就数量自增
                tmpItem.Count += count;
                return;
            }
            }
            //背包中不存在该物品
            InventoryItem item = new InventoryItem();
            item.ItemId = itemId;
            item.Count = count;
            Inventory.Add(item);
        }
    
        //移除物品
        public void Removeltem(int itemId, int count = 1){
        //遍历背包
        for (int i = 0; i < Inventory.Count; i++){
            InventoryItem item = Inventory[i];
            //如果存在该物品
            if (item.ItemId == itemId && item.Count > 0){
                //删除
                item.Count -= count;
                if (item.Count <= 0){
                Inventory.Remove(item);
                }  
            }
         }
        }
        
        //获取物品
        public InventoryItem GetItem(int itemId){
            foreach (InventoryItem tmpItem in Inventory){
                if (tmpItem.ItemId == itemId){
                    return tmpItem;
                }
            }
            return null;
        }
        //清空背包
        public void RemoveAllItem() {
            Inventory.Clear();
        }
    }
    
    

角色管理器

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//角色基本信息
public class Bai_Character{
    //姓名
    public string Name ="张三";
    //等级
    public int Level = 1;
    //经验
    public int CurrentExp = 0;
    public int Hp = 0;
    //最大血量
    public int MaxHp{
        get{
            return Level * 10;
            }   
    }
    //升到下一级需要的经验
    public int GetNextLevelExp(){
            return Level * 50;
    }
    //装备 -1代表无
    public int WeaponId = -1;
    public int ClothesId = -1;
    public int ShoesId = -1;
    //技能
    public List<int> SkillList = new List<int>();

}

public class CharacterManager 
{
    private static CharacterManager instance;
    public static CharacterManager Instance{
        get{
            if(instance == null){
                instance = new CharacterManager();
                return instance;
            }
            return instance;
        }
    }
    //玩家
    public Bai_Character character = new Bai_Character();
    //金钱
    public int Money = 0;
    //当前角色是否可控
    public bool canControl = true;

    //增加/减少金钱
    public void ChangeMoney(int money){
        Money += money;
        if (Money < 0) Money = 0;
    }
    //增加经验
    public void AddExp(int exp){
        character.CurrentExp += exp;
        //判断经验是否升级
        if (character.CurrentExp >= character.GetNextLevelExp()){
            //升级
            character.Level++;
            character.CurrentExp = 0;
        }
    }
    //改变血量
    public void ChangeHp(int hp){
        character.Hp += hp;
        //限制character.Hp的范围[0, character.MaxHp]
        character.Hp = Mathf.Clamp(character.Hp, 0, character.MaxHp);
    }

#region 任务技能
    //添加技能
    public bool AddSkill(int skillld){
        if(character.SkillList.Contains(skillld)){
            return false;
        }
        character.SkillList.Add(skillld);
        return true;
    }

    //是否拥有此技能
    public bool HasSkill(int skillld){
        return character.SkillList.Contains(skillld);
    }

    //移除技能
    public void RemoveSkill(int skillld){
        if (character.SkillList.Contains(skillld)){
            character.SkillList.Remove(skillld);
        }
    }
    //所有技能
    public int[] GetSkills(){
        return character.SkillList.ToArray();
    }

#endregion

#region 人物装备
    //装备武器
    public void AddWeapon(int id){
        //如果背包有这个武器,允许装备
        InventoryItem item = InventoryManager.Instance.GetItem(id);
        if (item!= null)
        {
            InventoryManager.Instance.Removeltem(id,1);
        }
        //如果当前有武器,武器卸载下来放入背包
        if (character.WeaponId > -1){
            InventoryManager.Instance.AddItem(character.WeaponId, 1);
        }
        character.WeaponId = id;
    }
    
    //获取当前武器
    public int GetWeapon(){
        return character.WeaponId;
    }

    //移除当前武器
    public void RemoveWeapon(){
        //如果当前有武器,武器卸载下来放入背包if (character.Weaponld > -1)
        InventoryManager.Instance.AddItem(character.WeaponId,1);
    }
#endregion
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity进阶--物品,背包,角色管理器 的相关文章

随机推荐

  • 响应式人力资源招聘企业网站源码

    介绍 响应式人力资源招聘企业网站源码 网盘下载地址 http kekewangLuo cc 6lqETgRAZ6a0 图片
  • mysql 表分区 插入数据,分区表导入数据库

    如果是10g及以上版本 可以使用参数REMAP TABLESPACE 来映射表空间 1 在ascii数据库中建立3个tablespaces tbs1 tbs2 tbs3 SQL gt create tablespace tbs1 dataf
  • 百分位数

    来源
  • dedecmscan漏洞扫描

    介绍 推荐一款 大佬编写 实用工具 只做推荐 请勿违法 如有侵权 请联系我删除 dedescan是一款可以扫描所有已公开的dedecms漏洞的扫描器 github地址 https github com lengjibo dedecmscan
  • C++中智能指针的设计和使用

    转载请标明出处 原文地址 http blog csdn net hackbuteer1 article details 7561235 智能指针 smart pointer 是存储指向动态分配 堆 对象指针的类 用于生存期控制 能够确保自动
  • libtorch 1.12.1 cuda11.3 torch1.12.1 visual stdio2019环境搭建

    conda 的环境 name torch1 12 1 channels https mirrors tuna tsinghua edu cn anaconda cloud pytorch https mirrors tuna tsinghu
  • 如何关闭rabbitmq

    rabbitmqctl stop 方式2 先用ps ef grep rabbitmq 查询出进程号 然后用kill 9 进程号 杀死进程 RabbitMQ常用命令 说明 命令 启用Web控制台 rabbitmq plugins enable
  • 路由器ipv6怎么设置才能上网_设置路由器时,如何正确选择上网方式?

    设置路由器时 常见有自动获得IP地址 宽带拨号上网 固定IP地址三种上网方式 选择任意一个 均可进入下一步 但上网方式选择错误 即使设置步骤完成 也不能上网 那么设置路由器时 如何正确选择上网方式呢 取决于当前宽带线路的上网方式 本文以Wi
  • NoSQL -- 1.NoSQL与TRDB的区别

    TRDB TRDB Traditional Relational Database 即 传统关系型数据库 关系型数据库 是指采用了关系模型来组织数据的数据库 其以行和列的形式存储数据 以便于用户理解 关系型数据库这一系列的行和列被称为表 一
  • 将一个对象的属性值赋值给另一个对象

    java 对象属性复制 将一个对象的属性值赋值给另一个对象 属性名需要相同 import org springframework beans BeanUtils BeanUtils copyProperties 源对象 目标对象
  • 一位老学长的真实互联网校招求职心路历程~

    自我介绍 听说很多家公司2019年的春招已经陆续开始了 作为一个备战过2018年春招和秋招的求职狗 想来聊一下自己的校招求职经历 我本科是哈尔滨的一所211大学 万年老二 学的是电子信息工程 由于当年高考发挥失常 自己又不想复读 所以从入学
  • Java+GeoTools(开源的Java GIS工具包)快速入门-实现读取shp文件并显示

    场景 GeoTools GeoTools 是一个开源的 Java GIS 工具包 可利用它来开发符合标准的地理信息系统 GeoTools 提供了 OGC Open Geospatial Consortium 规范的一个实现来作为他们的开发
  • SLAM--三角测量SVD分解法、最小二乘法及R t矩阵的判断

    目录 一 三角测量 方法一 SVD分解法的推导 方法二 最小二乘法求解 二 ORB SLAM2 三角测量源码 三 利用Eigen源码实现三角测量 方法一 SVD分解法 方法二 最小二乘法求解 速度最快 方法三 利用OpenCV自带函数 四
  • go语言面试题:令牌桶算法原理

    令牌桶算法是一种常见的限流算法 它基于一个简单的思想 系统中的请求像一个桶 在请求发送之前都需要从桶中获取一个令牌 如果桶里没有可用的令牌 则该请求会被暂时禁止 具体来说 令牌桶算法会在桶内放入固定数量的令牌 这些令牌以固定的速率自动回复
  • 二阶系统响应指标图_一阶和二阶系统的动态特性参数

    检测系统的时域动态性能指标一般都是用阶跃输入时检测系统的输出响应 即过渡过程曲线上的特性参数来表示 1 一阶系统的时域动态特性参数 一阶测量系统时域动态特性参数主要是时间常数及与之相关的输出响应时间 1 时间常数 时间常数是一阶系统的最重要
  • 三十一.刷题.20

    统计给定的n个数中 负数 零和正数的个数 include
  • LeetCode 1309. 解码字母到整数映射

    给你一个字符串 s 它由数字 0 9 和 组成 我们希望按下述规则将 s 映射为一些小写英文字符 字符 a i 分别用 1 9 表示 字符 j z 分别用 10 26 表示 返回映射之后形成的新字符串 题目数据保证映射始终唯一 示例 1 输
  • 练习题:猜年龄游戏升级版

    猜年龄游戏升级版 需求 1 允许用户最多尝试3次 2 每尝试3次后 如果还没猜对 就问用户是否还想继续玩 如果回答Y或y 就继续让其猜3次 以此往复 如果回答N或n 就退出程序 3 如何猜对了 就直接退出 import random n r
  • mysql基础--存储过程

    文章目录 MySQL存储过程 1 创建存储过程 2 调用存储过程 3 变量定义 3 1 局部变量 3 2 用户变量 3 3 系统变量 3 3 1 系统变量 全局变量 3 3 2 系统变量 会话变量 4 存储过程传参 4 1 in 4 2 o
  • Unity进阶--物品,背包,角色管理器

    文章目录 物品管理器 背包管理器 角色管理器 物品管理器 物品数据 Item json json部分 Resources Data Item id 1 name 新手剑 des 这是一把宝剑 price 200 icon attack 10