Unity 做一个2000个的背包如何让系统不蹦

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity 做一个2000个的背包如何让系统不蹦相关的知识,希望对你有一定的参考价值。

参考技术A 动态加载,分批显示。界面看到的背包能显示出来,看不到的隐藏掉。

Unity 游戏黑暗之光笔记第五章 背包系统的实现

Unity 网络游戏黑暗之光笔记

第五章 背包系统的实现

1.开发功能按钮

 

 注意Anchors的位置,可以让图标在窗口变化时保持相对位置不会变化

 

 

2.功能按钮的事件的监听

  • 给FunctionBar添加脚本分别给按钮添加点击方法监听事件
 public void OnStatusButtonClick() {
    }
public void OnBagButtonClick() {
    }
public void OnEquipButtonClick() {
    }
public void OnSkillButtonClick() {
    }
public void OnSettingButtonClick() {
    }

3.创建物品信息的管理系统

  • 使用Text文件存储信息
    • 添加icon给Atals图集
  • 创建用来管理管理信息的TXT 文档 OjbectsInfoList
//对应的信息名称
//ID,游戏名称,icon名称,类型,hp,mp,出售价,购买价
1001,小瓶血药,icon-potion1,Drug,50,0,50,60
1002,大瓶血药,icon-potion2,Drug,100,0,70,100
1003,蓝药,icon-potion3,Drug,0,100,60,80

创建ObjectInfo脚本管理信息

//使用单例模式
    void Awake() {
        _instance = this;
        ReadInfo();
    }
   
//定义各个物品的功能 
public enum ObjectType {
    Drug,
    Equip,
    Mat
}
//表示物品的一条信息
public class ObjectInfo {
    public int id;    //id 
    public string name;//名称
    public string icon_name;//这个名称是存储在图集中的名称 icon名称
    public ObjectType type;//类型(药品drug)
    public int hp; //加血量值
    public int mp;//加魔法值
    public int price_sell;//出售价
    public int price_buy;//购买
}
  • 在程序中读取文本,将物品信息读取到内存

使用TextAcess类

获取文本文件

public TextAsset objectsInfoListText;

要把获取的字符存到字典要引用新的命名空间

using System.Collections.Generic;
 public static ObjectsInfo _instance;

    private Dictionary<int, ObjectInfo> objectInfoDict = new Dictionary<int, ObjectInfo>();

    public TextAsset objectsInfoListText;

    //使用单例模式
    void Awake() {
        _instance = this;
        ReadInfo();
    }

    //得到信息的方法,从字典里取用
    public ObjectInfo GetObjectInfoById(int id) {
        ObjectInfo info=null;

        objectInfoDict.TryGetValue(id, out info);
        return info;
    }

    void ReadInfo() {
        //取到文本文件中所有的字符
        string text = objectsInfoListText.text;
        //按照行去数据,需要拆分数据到数组
        string[] strArray = text.Split(\'\\n\');
        foreach (string str in strArray) {
            string[] proArray = str.Split(\',\');

            //实例化info存储信息
            ObjectInfo info = new ObjectInfo();
            
            //ID转换成字符类型
            int id = int.Parse(proArray[0]);
            string name = proArray[1];
            string icon_name = proArray[2];
            string str_type = proArray[3];
            //获取类型,根据获得的字符串来赋值类型
            ObjectType type = ObjectType.Drug;
            switch (str_type) {
                case "Drug":
                    type = ObjectType.Drug;
                    break;
                case "Equip":
                    type = ObjectType.Equip;
                    break;
                case "Mat":
                    type = ObjectType.Mat;
                    break;
            }
            info.id =  ; info.name = name; info.icon_name = icon_name;
            info.type = type;
            if (type == ObjectType.Drug) {
                int hp = int.Parse(proArray[4]);
                int mp = int.Parse(proArray[5]);
                int price_sell = int.Parse(proArray[6]);
                int price_buy = int.Parse(proArray[7]);
                info.hp = hp; info.mp = mp;
                info.price_buy = price_buy; info.price_sell = price_sell;
            }

            objectInfoDict.Add(id, info);//添加到字典中,id为key,可以很方便的根据id查找到这个物品信息
        }
    }
    
4. 设计背包界面

 

 

 

 

  • 为了在鼠标移动到面板点击时角色不移动,添加box collider组件

5.创建脚本管理背包物品

  • 创建Inventory脚本设置设置单例模式方便调用
    //设置单例模式
    public static Inventory _instance;
    private TweenPosition tween;
    //获取背包格子的数组
    public List<InventoryItemGrid> itemGrids = new List<InventoryItemGrid>();
    //金币的数量
    private int coinCount = 1000;
    //管理金币的显示
    public UILabel coinNumberLable;
    private void Awake()
    {
        _instance = this;
        tween = this.GetComponent<TweenPosition>();
    }
    //播放动画的方法
    public void Show()
    {
        tween.PlayForward();
    }
    public void Hide()
    {
        tween.PlayReverse();
    }
  • 单个网格中存放信息,若要创建InventoryItemGrid脚本进行信息的存储,要给网格添加box Collider组件

  • 创建Tag区分网格中是否存在物品,给不同的网格制定Tag

 

 

 //存储物品信息
    public  int id=0;
    //存储物品信息
    private ObjectInfo info = null;
    //物品个数
    public int num = 0;

    public UILabel numLabel;

    // Use this for initialization
    void Start () {
        numLabel = this.GetComponentInChildren<UILabel>();
    }

    //控制网格的显示方法,默认num里为1,根据idmunber显示
    public void SetId(int id, int num = 1) {
        this.id = id;
        info = ObjectsInfo._instance.GetObjectInfoById(id);
        //获取子物体
        InventoryItem item = this.GetComponentInChildren<InventoryItem>();
        item.SetIconName(info.icon_name);
        //更新显示
        numLabel.enabled = true;
        this.num = num;
        numLabel.text = num.ToString();
    }

    public void PlusNumber(int num = 1) {
        this.num += num;
        numLabel.text = this.num.ToString();
    }

    //清空 格子存的物品信息
    public void ClearInfo() {
        id = 0;
        info = null;
        num = 0; 
        numLabel.enabled = false;
    }
  • InventoryItem脚本
private UISprite sprite;
    private void Awake()
    {
        base.Awake();
        sprite = this.GetComponent<UISprite>();
    }

    //判断鼠标是否 在网格中
    protected override void OnDragDropRelease(GameObject surface)
    {
        base.OnDragDropRelease(surface);
        if(surface!=null)
        {
         
        }
    }

    public void SetId(int id)
    {
        ObjectInfo info = ObjectsInfo._instance.GetObjectInfoById(id);
        sprite.spriteName = info.icon_name;
    }
    //设置名字
    public void SetIconName(string icon_name)
    {
        sprite.spriteName = icon_name;
    }

 

以上是关于Unity 做一个2000个的背包如何让系统不蹦的主要内容,如果未能解决你的问题,请参考以下文章

怎么让vs在执行时不蹦窗口而是在终端执行

unity3d 背包怎么做

unity3背包如何进行装备物品的排序百度提问

Unity 游戏黑暗之光笔记第五章 背包系统的实现

Unity游戏开发:背包系统的实现

unity3d背包怎么扩容