zoukankan      html  css  js  c++  java
  • 通用窗口类 Inventory Pro 2.1.2 Demo1(中)

    本篇想总结的是Inventory Pro中通用窗口的具体实现,但还是要强调下该插件的重点还是装备系统而不是通用窗口系统,所以这里提到的通用窗口类其实是通用装备窗口类(其实该插件中也有非装备窗口比如NoticeUI等)。

    本篇涉及的功能用加出标出,具体的功能如下:

    1、实现了两个窗口,通过点击键盘I来,打开或者关闭窗口也就是Toggle功能

    2、装备窗口中的物品栏空格数量动态生成可控,可以在属性窗口手动配置

    3、窗口具有拖拽功能

    4、窗口物品具有拖拽,及窗口间拖拽

    5、可以在窗口使用物品的功能,物品有消耗扇形显示功能

    6、通用窗口的类体系结构

    具体的插件使用和功能已经在上篇中说明了这里就不多说了

    1、本篇重点分析 6通用窗口的类体系结构,类组织和类图如下所示:

    4

    类的继承体系结构这里就说了,在第一篇有可以自行查阅

    8

    类的引用关系、核心字段和方法已经在类图中标记的很清楚,用简单的几句话说明下,装备窗口中的每个格子是由一个空格子具有背景的UIItem和InventoryItemBase Model组成的,而整个装备窗口是一个InventoryUI,该类继承了ItemCollectionBase类,也就是说它是具有一组UIItem的装备集合窗口,添加上UIWindow组件、DraggableWindow就具有了普通窗口的拖拽移动和显示关闭的功能了。

    2、装备窗口中的物品栏空格数量动态生成可控,可以在属性窗口手动配置

    如何实现动态装备窗口主要有两个核心技术:一个是UI中的自适应排列,也就是Grid layout Group组件;一个是U3D的prefab实例化技术

    动态初始化Cell数据核心代码如下

     1         protected virtual void FillUI()
     2         {
     3             if (manuallyDefineCollection == false)
     4             {
     5                 items = new InventoryUIItemWrapperBase[initialCollectionSize];
     6 
     7                 // Fill the container on startup, can add / remove later on
     8                 for (uint i = 0; i < initialCollectionSize; i++)
     9                 {
    10                     items[i] = CreateUIItem<InventoryUIItemWrapper>(i, itemButtonPrefab != null ? itemButtonPrefab : InventorySettingsManager.instance.itemButtonPrefab);
    11                 }
    12             }
    13             else
    14             {
    15                 for (uint i = 0; i < items.Length; i++)
    16                 {
    17                     items[i].itemCollection = this;
    18                     items[i].index = i;
    19                 }
    20             }
    21         }
    22 
    23         protected T CreateUIItem<T>(uint i, GameObject prefab) where T : InventoryUIItemWrapperBase
    24         {
    25             T item = GameObject.Instantiate<GameObject>(prefab).GetComponent<T>();
    26             item.transform.SetParent(container);
    27             item.transform.localPosition = new Vector3(item.transform.localPosition.x, item.transform.localPosition.y, 0.0f);
    28             item.itemCollection = this;
    29             item.transform.localScale = Vector3.one;
    30             item.index = i;
    31         
    32             return item;
    33         }

    是不是很简单 initailCollectionSize是InventoryUI基类的一个共有field也就是说这个装备格子的数量,这个可以根据自己设计的装备窗口手动设置,然后根据这个循环调用CreateUIItem<T>泛型方法通过,GameObject.Instantiate动态实例化预设装备格子对象,并设置Parent和位置,在我看来Prefab的 GameObject.Instantiate实际是一种深克隆(如果理解错了欢迎大家拍砖)

  • 相关阅读:
    ActiveReports 报表控件官方中文入门教程 (2)-创建、数据源、浏览以及发布
    SpreadJS 中应用 KnockoutJS 技术
    HTML5 Wijmo:控制 Wijmo Grid 插件的编辑模式
    Studio for WPF:使用 C1TileView 创建图片库
    随心所欲导出你的 UI 界面到 PDF 文件
    Studio for Winforms FlexGrid: 创建分类汇总
    Hibernate中事务中事务相关知识点
    Hibernate-一级缓存
    Hibernate-实体详解
    算法之旅-First之选择排序
  • 原文地址:https://www.cnblogs.com/IlidanStormRage/p/5780372.html
Copyright © 2011-2022 走看看