unity3d制作背包系统(3)--UI部分

本文详细介绍了如何在Unity3D中制作背包系统的UI部分,包括定义格子、管理格子的UI以及整个UI的管理。内容涵盖格子结构、鼠标持有的物品逻辑、格子与UI交互的事件处理,以及背包管理系统的设计。
摘要由CSDN通过智能技术生成

unity3d制作背包系统(3)–UI部分

UI这块比较大,花了挺长时间从项目中抠代码,也发现了原来项目中有这么多垃圾代码。这部分既要写代码,又要在unity3d中调整UI。

注:这篇文章下面的所有“格子”都代表UI显示上的格子,“物品”仍代表我们第一章定义的物品(itemunit)

0.总览

本文分为三个部分,第一部分主题为定义格子,第二部分为管理格子,第三部分为总的UI管理
UI布局
红框内为背包系统UI在unity中的结构,黄框为背包UI的背景(与当前主题无关)
在这里插入图片描述
在这里插入图片描述
给packgrid添加Grid Layout Group来将格子排列整齐
packgrid
slot
每个格子由以下三部分组成
slotheriachy
slot是格子的背景兼按钮,rawimage负责显示物品的贴图,text显示物品数量
灵魂绘图

1.定义格子与“手”

为了将UI的格子与存储部分中的物品槽一一对应,我们像定义物品一样定义UI格子。同时我们将描述“左键单击拿取格子中物品到鼠标”这样的逻辑放在格子上,这样可以使管理格子的UI无需处理复杂的逻辑。

“手”

鼠标拿取时,物品的图片会跟随鼠标,这就要求得有一个稍微特别的“格子”跟着鼠标移动,因此我们定义这个特别的“格子”叫mousehand
在这里插入图片描述
可以看到mousehand和格子slot的结构基本一样,下面所有的“鼠标持有”就代表了这个mousehand的内容物品itemunit
跟随鼠标移动

RectTransform rect;
void Update()
    {
   
        rect.position=Input.mousePosition; //跟随鼠标,当canvas的rendermode不是overlay的时候不可用
    }

“手”所承载的物品及获取、设置方法

public itemunit holding=new itemunit();
bool taking = false;
public itemunit getholding()
    {
   
        return holding;
    }
public void setholding(itemunit item)
    {
   
        if (!item.isempty())
        {
   
            if (holding.id != item.id)//因itemunit类是引用所以要拿个新的itemunit
                holding =  idtoitemunit.idtoitem(item.id, item.subid);
            holding.copyinfo(item);
        }
        else
        {
   
            holding = new itemunit();
        }
        handler.setpicture(holding);//需要一个静态的ID,texture对应表
        if (!holding.isempty()) taking = true;
        else taking = false;
    }

初始化方法

numtexthandler handler;
void Start () 
    {
   
        rect = GetComponent<RectTransform>();     
            handler = GetComponentInChildren<numtexthandler>();
            handler.setpicture(holding);//需要一个静态的ID,texture对应表     
    }

刷新显示方法

public void flush()//
    {
   
        handler.setpicture(holding);//将显示的图片设置为承载的物品对应的图片        
    }

对承载物品进行加减数量方法

public int addnum(int num)
    {
   
        int temp= holding.addnum(num);
        flush();
        return temp;
    }
public int subnum(int num)
    {
   
        int temp = holding.subnum(num);
        flush();
        return temp;
    }

直接设置承载物品数量的方法

public void setnumber(int numb)
    {
   
        holding.num=numb;
        flush();
    }
格子

实现格子功能的类被称为slotbutton

1.下面代码中的idtoitemunit.idtoitem功能是根据给定的物品id获取对应物品的itemunit实例.
2.uicontroller代表管理格子的UI
3candrain代表该格子内的物品能否被拿完,是被创造模式物品栏使用的功能,本来应该另外做一个类继承slotbutton来实现这个功能,这是一个失败的地方
4.takeonly是该格子内的物品是否只允许从中拿取而不能放下(参见我的世界工作台UI的产出格及火炉UI的产出格),属于延伸功能,对讲解背包系统无用,同样应该用继承实现,现在此功能与原本格子的逻辑耦合在一起,难以分开。
5.格子代码中的tex,其setholding方法的功能是将给入的itemunit显示成图片及数量,可以理解为刷新UI显示。

①首先实现格子的一些显而易见的功能:
设置内容物品:

public itemunit holding;
public void setholding(itemunit ite)//设置存储物品,不会触发UI变化事件
    {
   
        if (candrain)//如果可拿完
        {
   
            if (ite == null)
            {
   
                holding = new itemunit();
            }
            else
            {
   
                if (!ite.isempty())
                {
   
                    if (holding.id != ite.id)//因itemunit类是引用所以要拿个新的itemunit
                        holding = idtoitemunit.idtoitem(ite.id, ite.subid);
                    holding.copyinfo(ite);
                }
                else holding = new itemunit();
            }
        }
        tex
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值