博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通用窗口类 Inventory Pro 2.1.2 Demo1(上)
阅读量:4693 次
发布时间:2019-06-09

本文共 4715 字,大约阅读时间需要 15 分钟。

插件功能

按照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;                        else                dragOffset = 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);            }        }        ///         /// Hides object after animation is completed.        ///         ///         /// 
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中没有涉及到该功能这里就不仔细分析了,等后面的例子中出现了再研究,亮点代码如下:

///         /// Container that olds the items, if any.        ///         public RectTransform itemContainer;        public UIWindow windowParent { get; set; }        public override void Awake()        {            base.Awake();            windowParent = transform.parent.GetComponentInParent
(); if (windowParent == null) Debug.LogWarning("No UIWindow found in parents", gameObject); // Register our page with the window parent windowParent.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的输入输出模块,关键代码如下:

///         /// Keys to toggle this window        ///         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

你可能感兴趣的文章
配置NRPE的通讯
查看>>
shp系列(一)——利用C++进行shp文件的读(打开)与写(创建)开言
查看>>
匹配两个空格之间的字符。。。
查看>>
CSS 文字溢出 变成省略号 ...
查看>>
Spring事务
查看>>
java编程基础(三)流程控制语句
查看>>
让数据库跑的更快的7个MySQL优化建议
查看>>
jquery 取id模糊查询
查看>>
解决在vue中,自用mask模态框出来后,下层的元素依旧可以滑动的问题
查看>>
修改node节点名称
查看>>
PAT(B) 1014 福尔摩斯的约会(Java)
查看>>
PAT甲级题解-1123. Is It a Complete AVL Tree (30)-AVL树+满二叉树
查看>>
项目开发总结报告(GB8567——88)
查看>>
SSH加固
查看>>
端口扫描base
查看>>
iOS IM开发的一些开源、框架和教程等资料
查看>>
FansUnion:共同写博客计划终究还是“流产”了
查看>>
python 二维字典
查看>>
pip 警告!The default format will switch to columns in the future
查看>>
Arrays类学习笔记
查看>>