插件功能

按照Demo1的实现,使用插件来实现一个装备窗口是很easy的,虽然效果还很原始但是也点到为止了,本篇涉及的功能用加粗标出,具体的功能如下:

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

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

3、窗口具有拖拽功能

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

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

具体效果图如下所示:

插件使用

1、具体在UGUI 中的Canvas中创建一个InventoryWindow

2、在InventoryWindow下创建空GameObject并命名Container,赋予Grid LayOut 插件

3、给InventoryWindow添加InventoryUI组件,插件将自动添加WindowUI也就是通用窗口辅助插件

4、添加拖拽功能组件DraggableWindow,这样窗口就有了拖拽功能了

至此简单的点击I键可以打开和关闭的装备窗口做好了

总结

最后总结下实现通用窗口的三个类,分别是WindowHelper文件夹下的,UIWindow,UIWindowPage和DraggableWindow

1、DraggableWindow有就是拖拽窗口的组件,这里还是比较赞的,也是插件编程的简单例子,这里学过UGui的同学都知道要实现拖拽功能实现IBeginDragHandler和IDargHandler接口即可,原理很简单, 源码如下

using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;namespace Devdog.InventorySystem
{[AddComponentMenu("InventorySystem/UI Helpers/DraggableWindow")]public partial class DraggableWindow : MonoBehaviour, IBeginDragHandler, IDragHandler{public float dragSpeed = 1.0f;private Vector2 dragOffset;public void OnBeginDrag(PointerEventData eventData){if (InventorySettingsManager.instance.isUIWorldSpace)dragOffset = transform.position - eventData.worldPosition;            elsedragOffset = new Vector2(transform.position.x, transform.position.y) - eventData.position;}void IDragHandler.OnDrag(PointerEventData eventData){transform.position = new Vector3(eventData.position.x + dragOffset.x * dragSpeed, eventData.position.y + dragOffset.y * dragSpeed, 0.0f);}}
}

2、UIWindow这个类是窗口的公共类,先上类图主要功能点在类图上标注了,这里就不废话了,主要就是控制的窗口的显示关闭,及组合动画效果比较难的是实现了类似组合窗口的功能(这部分有后有机会再仔细分析)

源码就不全上了,上点有亮点的部分如下:

        public virtual void Hide(){if (isVisible == false)return;isVisible = false;if (OnHide != null)OnHide();if (hideAudioClip != null)InventoryUIUtility.AudioPlayOneShot(hideAudioClip);if (hideAnimation != null){animator.enabled = true;animator.Play(hideAnimation.name);if (hideCoroutine != null){StopCoroutine(hideCoroutine);                    }hideCoroutine = _Hide(hideAnimation);StartCoroutine(hideCoroutine);}else{animator.enabled = false;SetChildrenActive(false);}}/// <summary>/// Hides object after animation is completed./// </summary>/// <param name="animation"></param>/// <returns></returns>protected virtual IEnumerator _Hide(AnimationClip animation){yield return new WaitForSeconds(animation.length + 0.1f);// Maybe it got visible in the time we played the animation?if (isVisible == false){SetChildrenActive(false);animator.enabled = false;}}

  以上部分是通过协程实现的具有延时效果的动画关闭窗口的代码,有代表意义。

3、UIWindowPage类,该类是UIWindow的子类,在UIWindow有一个Page的集合用于组合显示UIWindowPage,这块Demo1中没有涉及到该功能这里就不仔细分析了,等后面的例子中出现了再研究,亮点代码如下:

        /// <summary>/// Container that olds the items, if any./// </summary>public RectTransform itemContainer;public UIWindow windowParent { get; set; }public override void Awake(){base.Awake();windowParent = transform.parent.GetComponentInParent<UIWindow>();if (windowParent == null)Debug.LogWarning("No UIWindow found in parents", gameObject);// Register our page with the window parentwindowParent.AddPage(this);}public override void Show(){if(isEnabled == false){Debug.LogWarning("Trying to show a disabled UIWindowPage");return;}base.Show();windowParent.NotifyPageShown(this);}

这里UIWindow和UIWindowPage 本身是继承关系,然又彼此引用,代码可读性有些差了,作者这里通过Page类中Awake和Show来做父类的初始化和调用,也是一种方法,我觉得还行(请高手拍砖)。

总体来说目前的UIWinow和UIWindowPage更像是容器Panel或者Group不像是窗口,等以后的Demo中有复杂的再学习吧。

4、如何通过键盘唤起窗口

这个比较简单用到了U3D的输入输出模块,关键代码如下:

        /// <summary>/// Keys to toggle this window/// </summary>public KeyCode[] keyCombination;public virtual void Update(){if (keyCombination.Length == 0)return;bool allDown = true;foreach (var key in keyCombination){if (Input.GetKeyDown(key) == false){allDown = false;}}if (allDown)Toggle();}

转载于:https://www.cnblogs.com/IlidanStormRage/p/5779460.html

通用窗口类 Inventory Pro 2.1.2 Demo1(上)相关推荐

  1. 通用窗口类 Inventory Pro 2.1.2 Demo1(下)

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

  2. 通用窗口类 Inventory Pro 2.1.2 Demo1(中)

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

  3. Unity3d UGUI 通用Confirm确认对话框实现(Inventory Pro学习总结)

    背景 曾几何时,在Winform中,使用MessageBox对话框是如此happy,后来还有人封装了可以选择各种图标和带隐藏详情的MessageBox,现在Unity3d UGui就没有了这样的好事情 ...

  4. 【Unity3D插件】Inventory Pro插件分享《游戏背包系统》

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 发现就喜欢研究这些插件,为什么呢,因为方便快捷啊.基本不用研究源代 ...

  5. 第七章:无模式对话框 和 Windows通用对话框类

    第七章:无模式对话框 和 Windows通用对话框类 1,[无模式对话框]在它处于激活状态下还允许用户在(同一个应用程序中)其它地方工作. [通用对话框]则是C++和一组Windows的实用对话框之间 ...

  6. 注册窗口类 registerclass

    window把窗口以不同的类别进行设计,通过不同的类别来管理不同的资源,体现模块化管理的思想.以mfc为例Button类别有ccheckbox,cbutton,radiobutton等 ,Static ...

  7. Unity3D 装备系统学习Inventory Pro 2.1.2 基础篇

    前言 前一篇 Unity3D 装备系统学习Inventory Pro 2.1.2 总结 基本泛泛的对于Inventory Pro 这个插件进行了讲解,主要是想提炼下通用装备系统结构和类体系.前两天又读 ...

  8. php分页类示例下载,PHP 通用分页类的简单示例

    这篇文章主要为大家详细介绍了PHP 通用分页类的简单示例,具有一定的参考价值,可以用来参考一下.对PHP通用分页类感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 写了个php的通用分页类 ...

  9. win32开发(窗口类和窗口)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 之前虽然也编写win32代码,比如使用visual studio自动生成的win32框架.但是对 ...

  10. 窗口句柄、窗口类对象的关系

    HWND hwnd://窗口句柄 CWnd wnd://窗口类对象 窗口类对象中有一个成员是窗口句柄. 窗口句柄,提供了窗口的一个标识,类似于指针的概念,每一个窗口都对应了一个窗口句柄作为其标识,通过 ...

最新文章

  1. ELNET服务被我删了,如何安装?
  2. java 图片合成pdf_java将多张图片合并转为PDF
  3. Netty中集成Protobuf实现Java对象数据传递
  4. JavaScript实现hamiltonianCycle哈密尔顿图算法(附完整源码)
  5. oracle中的greatest,ORACLE 内置函数之 GREATEST 和 LEAST(转)
  6. 一句简单的SQL查询语句的背后...
  7. 计算机的外部设备 硬盘,外部设备采用SMB协议想共享电脑硬盘下的文件
  8. HTML5 API详解(6):getUserMedia实现拍照功能
  9. office文档 在线预览 (doc、ppt、xls)
  10. NetBeans 6.9 正式版发布!
  11. DELL电脑系统恢复出常值
  12. NutUI 2.1.0 发布,移动端轻量级 Vue 组件库
  13. MySQL的启动和停止
  14. Unity网络教程翻译(三)多人游戏大厅
  15. 【光波电子学】MATLAB仿真厄米特-高阶高斯光束以及绘制其光强分布图
  16. 丁昊 北大计算机,北大清华17人!2018自主招生等类型入选名单公示,苏州333人!...
  17. iptables查看、添加、删除规则
  18. MacBookPro 装win7
  19. Genesis公链加速区块链行业发展
  20. 点击复制按钮复制input中的内容

热门文章

  1. ​​​​​​​​CloudMounter:挂载云存储作为在 Mac 的本地磁盘
  2. AirPods耳机mac端管理工具:AirBuddy
  3. 如何阻止事件冒泡和默认事件
  4. thrift编写服务端 客户端
  5. 使用 Hapi 开发 RESTful APIs
  6. MySQL 8支持文档存储,并带来性能和安全方面的改进
  7. powerdesigner 连接数据库
  8. win7下用UtralISO制作U盘系统盘--UltraISO打开Ubuntu只有EFI文件夹
  9. 关于ADO之AddNew,UPdate与Identity列
  10. python2和python3的编码区别