背包系统搭建总结

本文总结了在Unity中搭建背包系统的步骤。首先创建UIroot和UICanvas进行UI管理,采用单例模式的UIManager控制窗口的打开与关闭。接着详细介绍了物品数据的管理,包括背包UI、格子UI和物品UI的功能实现,以及单例的DataManager类如何存储和管理玩家物品。最后,讨论了格子控制、拖动交换和合并功能的脚本实现。
摘要由CSDN通过智能技术生成

背包系统搭建,实现效果如下:
在这里插入图片描述

1. UI系统的搭建

  1. 首先创立一个UIroot空物体
    在这里插入图片描述

其子物体是UI相关的游戏物体
创建一个UICanvas作为所有窗口的根节点,所有生成的UI窗口的canvas都在其下做统一管理。
2. 设定好UICanvas的由一个专门渲染UI的camera渲染,同时设定好自适应的尺寸。
在这里插入图片描述

  1. 采用单例模式,用一个UIManager类来管理。
    •1.在UImanager定义一个枚举类,规定可能存在的窗口。
    •2.用一个字典类保存每一个打开过的窗口。键就是枚举类的值,值是动态加载生成的窗口克隆。
    •3.实现一个打开窗口的方法:通过之前定义的枚举来作为参数打开相应的窗口。如果之前没打开过,就通过动态加载来生成一个,如果之前打开过,就根据枚举的值在从之前保存的字典里调出来将其激活。
    •4.同样实现一个关闭窗口的方法:就是通过枚举变量,在字典中找出相应的窗口将其隐藏。
    具体UImanager类实现代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UIManager //UI管理类
{
   
    private static UIManager _instance;
    private UIManager() {
    }//私有化构造函数
    public static UIManager Instance
    {
   
        get
        {
   
            if (_instance == null)
            {
   
                _instance = new UIManager();
            }
            return _instance;
        }
    }
    public enum UIType//规定可能存在的窗口
    {
    MainMenu, CharacterView, LoginView, SettingView, PopView };
    Dictionary<UIType, GameObject> allView = new Dictionary<UIType, GameObject>();//通过字典保存每个窗口
    int _maxSortNum = 0;
    public GameObject OpenView(UIType uiType)//通过UIType1打开窗口
    {
   
        string path = "";
        switch (uiType)
        {
   
            case UIType.CharacterView:
                path = "View/CharacterCanvas";
                break;
            case UIType.PopView:
                path = "View/PopUIView";
                break;
        }
        if (allView.ContainsKey(uiType))//如果UI已存在
        {
   
            allView[uiType].SetActive(true);
            allView[uiType].GetComponent<Canvas>().sortingOrder = ++_maxSortNum;
            return allView[uiType];
        }
        else
        {
   
            GameObject UIPrefab = Resources.Load<GameObject>(path);
            GameObject UIPanel = GameObject.Instantiate(UIPrefab);
            //指定父节点
            UIPanel.transform.SetParent(GameObject.Find("MainUICanvas").transform);
            //四角拉伸
            RectTransform popRect = UIPanel.GetComponent<RectTransform>();
            popRect.anchorMin = Vector2.zero;
            popRect.anchorMax = Vector3.one;
            popRect.sizeDelta = Vector2.zero;
            //指定位置大小//要先设置锚点,后调位置
            UIPanel.transform.localPosition = Vector3.zero;
            UIPanel.transform.localScale = Vector3.one;
            UIPanel.GetComponent<Canvas>().sortingOrder = ++_maxSortNum;
            allView.Add(uiType, UIPanel);//存下ui
            return UIPanel;
        }

    }
    public void CloseView(UIType uiType)//关闭UI的方法
    {
   
        if (allView.ContainsKey(uiType)&& allView[uiType].activeSelf)//如果UI已存在且开启状态才能关
        {
   
            allView[uiType].SetActive(false);
            if (allView[uiType].GetComponent<Canvas>().sortingOrder == _maxSortNum)
            {
   
                allView[uiType].GetComponent<Canvas>().sortingOrder = --_maxSortNum;
            }
        }
        
    }

}

5.之后就可以做一个个UI窗口的预制体,在枚举体里加上对应的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值