欢迎光临散文网 会员登陆 & 注册

Inventory背包学习笔记

2023-06-26 18:12 作者:猪鸡不是病句  | 我要投稿

Inventory背包学习

  1. 制作背包基本UI

    1. 基础的panel,container

    2. SlotHolder【包含ItemSlot <- amount】保存为prefab

  2. 创建在地图上的物品ItemOnWorld,装备在身上的物品ItemEquipment

    1. ItemData_SO,用于保存item数据【name,icon,stackable可堆叠,描述等等信息】

      1. ItemType(Useable,Weapon,Armor等等)

      2. name

      3. icon

      4. prefab_EQ

    2. ItemPickUp【碰撞到玩家之后销毁自己,给玩家加入背包】

      1. 调用InventoryData_SO中的AddItem给某个背包添加物品,RefreshUI();

      2. 删除本体

    3. Equipment

      1. ChangetWeapon

      2. EquipWeapon

      3. UnEquipWeapon

      4. 需要的话可以修改attackData

  3. InventoryManger

    1. 需要获取的变量:

      1. InventoryData

      2. Container

      3. UI Panel

      4. ItemToolTip

      5. Canvas(inventoryCanvas , dragCanvas)

      6. DragData【自定义类,包含originalHolder,originalParent】

    2. Fnc

      1. 获取模板数据

      2. 保存、读取数据

      3. 开关背包的bool

      4. Check DragItem is In SlotArea 检查拖拽物品是否在某一个Slot范围内

  4. 创建背包的数据库Inventory Data【每一个背包都对应一个inventoryData】

    1. InventoryItem【这是背包里面的物品类型,储存itemData和amount】

    2. Listitems; 列表中的每一个元素都对应背包中对应序号的物品,交换之后会交换列表中的位置

    3. AddItem(ItemData_SO , Int)

      1. 可堆叠

        1. 在列表中寻找物品,有则堆叠上去

      2. 不可堆叠、没有找到相同物品

        1. 在第一个空位置添加相应物品

  5. InventoryUI 背包显示物品对应图标

    1. ContainerUI 保存该背包下的所有SlotHolder

      1. RefreshUI(),更新每一个itemUI的index ,index有值之后就可以UpdateItem了

    2. SlotHolder

      1. 单元格类型SlotType

      2. 获取自身子类itemUI

      3. UpdateItem,将自身单元格的item更新到itemUI上

        1. switch更换对应类型的数据库

          1. 进行对应的操作,比如说装备武器

        2. itemUI.SetUpItemUI更新UI的显示

    3. ItemUI(包含Image <- text) 具体每个物体UI上,控制image,text显示

      1. SetUpItemUI

        1. 如果当前格子有物品,则更新icon、amount、SetAction(true);

        2. 如果没有物品,SetActive(false);

      2. InventoryData_SO InventoryData ,int index 保存这个地方对应哪一个数据库的哪一个index

  1. 创建其他Panel,按照上面的方式,保存itemUI成为Prefab,设置好SlotType,创建对应的数据库

  2. DragItem 实现拖拽物品(实际上是拖拽的ItemUI),添加到可以拖拽的背包格子(ItemUI)上,命名空间EventSystems

    1. 接口:IBeginDragHandler, IDragHandler ,IEndDragHandler,拖拽开始、拖拽中、拖拽结束

      1. https://docs.unity.cn/cn/current/ScriptReference/EventSystems.IBeginDragHandler.html 接口的代码手册

      2. PointerEventData eventData(position鼠标位置,pointerEnter鼠标进入某个区域(triggerEnter))

    2. OnIBeginDragHandler

      1. 记录原始信息

      2. 设置父级为DragCanvas

    3. OnIDragHandler(自带Update)

      1. 跟随鼠标位置移动

    4. OnIEndDragHandler

      1. 放下物品,交换数据

      2. EventSystem.current.IsPointerOverGameObject() 【具有给定ID的指针是否位于EventSystem对象上】

      3. 在InventoryManager里面创建CheckInInventoryUI(vec3)检测拖拽物品是否在某一个slot范围内

        1. 循环若干个containerUI需要检测每一个该检测的)

        2. RectTransformUtility.RectangleContainsScreenPoint(方形范围 , position)) 判断position是否在方格范围内

      4. 检查鼠标指向的位置是否有SlotHolder组件 ,设置为targetHolder。如果image显示出来了,获取不到SlotHolder,则要去image的父级获取

      5. 交换物品,判断targetHolder是否为空,是否不是原始Holder,需要判断targetHolder的slotType能否进行交换,调用SwapItem()

      6. 交换完毕后更新currentHolder,targetHolder

      7. 修改父级回到原始

      8. 修改RectTransform回到原始设置

        1. offSetMax 锚点右上偏移

        2. offSetMin 锚点左下偏移

    1. [RequireComponent(typeof(ItemUI))] 在拖拽物品上自动添加ItemUI

    2. 添加一个最高层的DragCanvas,在拖拽时加入此Canvas,保证拖拽不会被挡道其他UI后面,在InventoryManager里面保存

    3. InventoryManger中创建一个类DragData

      1. 保存原始的Holder,原始的Parent(RectTransform)

      2. 用来临时储存拖拽信息,使用的时候new一个新值

    4. SwapItem() 【修改数据列表的排列】

      1. targetItem,tempItem【指向当前item,如果交换过去则清空】

      2. 判断是否堆叠,可堆叠则堆叠,否则直接交换

  • Useable Item可使用物品(双击使用)

    1. 创建对应的数据,物品

    2. 在SlotHolder中,利用 IPointerClickHandler 接口实现双击使用物品

      1. 代码手册:https://docs.unity.cn/cn/current/ScriptReference/EventSystems.IPointerClickHandler.html

      2. 判断点击次数为偶数,避免多次点击不为2会失效

      3. UseItem(),判断是否为空,是否可使用,数量是否大于0

    3. 链接到Character组件实现改变属性

  • 开关Panel,InventoryManager里面设置一个bool,一个func,用于判定打开背包时人物不可移动

  • ActionButton

    1. public KeyCode actionKey,进行逐一设置

  • 背包中实现实时投影玩家

    1. 摄像机输出到Render Texture

    2. UI创建Raw Image接收这个Render Texture即可

  • ItemToolTip物品信息显示栏

    1. 创建UI,主要用到Content Size Fitter 和 Layout Group

    2. 脚本ItemToolTip

      1. SetUpToolTip(ItemData_SO itemData),设置图标、名称、描述等,配合UI显示

      2. Update中跟随鼠标的位置,并且根据条件判断应该在鼠标的哪个方向显示,RectTransform.GetWroldCorners获取矩形四个角顶点位置(世界坐标)

        1. 1 2

        2. 0 3

    1. 在SlotHolder中 添加 IPointerEnterHandler ,IPointerExitHandler两个接口

      1. 鼠标进入时如果有物品,则更新ToolTip并且显示

      2. 离开时、SlotHolder(背包)关闭时取消ToolTip的显示

  • Loot Item 掉落物品

    1. LootSpawner脚本

      1. 创建一个序列化的类,包含item以及一个权重(设置掉落概率)

      2. SpwanLoot

        1. 获取一个随机值,从lootItems数组中遍历,寻找符合概率的物品,如果掉落之后break则只掉落一个物品

  • 背包数据的保存与读取

    1. 调用SaveManager,在背包内物品有所更改、或是别的条件下进行保存数据

  • DragPanel面板的拖拽,调整Hierarchy排序方式改变渲染层级

    1. 拖动时,为了避免电脑分辨率和Canvas分辨率不同,所以拖动要除以Canvas的分辨率

      1. rectTransform.anchoredPosition += eventData.delta / canvas.scaleFactor;

    2. IPointerDownHandler

      1. 渲染层级:RectTransform.SetSiblingIndex / Get...

  1. 滚轮选择ActionBar物品【实现时需要对前文的设置进行修改以达到最好的效果,属于两种截然不同的背包方法】

    1. InventoryManager 中 Input.GetAxisRaw("Mouse ScrollWheel")检测滚轮输入 上为正,下为负

    2. 在SlotHolder中添加index来进行索引,添加选择框的image

    3. InventoryManager 中 添加选择currentSelectHolder的函数

      1. 更新前取消选择框iamge,更新后显示选择框image

      2. 选择时装备物品,如果是空栏则卸载物品


Inventory背包学习笔记的评论 (共 条)

分享到微博请遵守国家法律