前言
之前写过一些关于DoozyUI的开发介绍,比较基础。后面用DoozyUI开发了一段时间,现在已经有了更深入的一些了解。这篇主要讲一下UI Elemenet这个脚本的使用。
正文
1、关于UI Element:
如下图所示,Doozy UI的UI Element主要有以下内容。
UI Element顾名思义,就是一个UI的最小元素。是作为打开、关闭的单位。通俗来讲,就是我们说的一个面板。
2、面板属性
hide @START :勾上后便在脚本Start时进行隐藏(移出屏幕外,并非Setactive false);
animate @START : 如果没有在开始时不隐藏,勾选这个则会播放进入动画;
disable when hidden :在隐藏时是否设置active 为 false ;
don't disable Canvas when hidden : 在隐藏时,不关闭Canvas。(不知道有啥用,一般都会让他关闭吧)
disable the Graphic Raycaster : 不启用 Graphic Raycaster组件,也就是取消点击事件。特殊面板可以选用。
auto hide : 自动隐藏,勾选后会让你填一个时间(秒)。在此时间后自动Hide;
custom start position : 设定开始位置。这个很重要!在Unity 2018 + ,由于新改了Prefab的框架,编辑Prefab是在一个单独的Scene中进行的。在使用代码实例化UI Element,打开Prefab时,极容易发生面打开后的初始位置并不是0点,因此会造成动画的各种错位(发生这种情况的根本原因我还没有定位到)!此时就要用这个属性来修改初始位置,将其调整至正确地情况。
execute layout fix : 执行缩放适应?表示从来没用过。
auto selected button after show : 在展示时自动选个物体。注意,这个并不会触发点击事件。
3、动画
这里先看一个通常的动画设置:
一般来讲,用DoozyUI做UI动画的时候,可以先从模板中选一个接近的。通过Preset Category 和 Preset Name来选择,不过这个貌似无法在编辑模式下进行预览,只有运行的时候看。
当你选择了其中一个之后,点击Load Preset就会导入一个预设。(你也可以通过New Preset 和 Delete Preset来维护你的动画预设仓库)
然后这下面的Move 、Rotate、Scale、Fade分别代表移动、选择、缩放、渐变。里面的一些参数可以根据自己的需求进行调整。
最下面可以选择声音,这个就可以在编辑器下预览了。声音仓库在Doozy UI 的 Control Panel里(Alt + D)的UI Sounds子才菜单下:
4、关于层级
从目前看来,DoozyUI并没有有效的层级管理,尤其是在用代码进行控制的时候。
我们一般都调整Canvas的属性,但是DoozyUI并没有自动修改这个Order In Layer 的方法,似乎还要自己写代码来维护。一般在预制上就要调整好层级,或者写好代码来辅助修改。否则很容易出现某个面板打开了,但是被其他面板挡住了。
后记
我感觉Doozy UI是设计给那些不会写代码的的人使用的插件,可视化操作近乎完美,但是设计到和代码进行联动的部分就充满了尴尬……
不过好在开源还能救一下。
故障排除:
1、关于面板声音,点击后报错,不播放声音的问题。
我的问题是出在QUtils.CS 的38行的问题,提示的是他Method获取报空。看了一下,他应该是旧的获取Method的方法失败了导致的,我把这一段代码修改一下就可以用了:
/// <summary>
/// Plays an audioClip in the editor. This is useful for previewing a sound in the inspector.
/// </summary>
/// <param name="clip">The AudioClip you want to play</param>
public static void PlayAudioClip(AudioClip clip)
{
if (clip == null) { return; }
Assembly unityEditorAssembly = typeof(AudioImporter).Assembly;
Type audioUtilClass = unityEditorAssembly.GetType("UnityEditor.AudioUtil");
MethodInfo method = audioUtilClass.GetMethod("PlayClip", BindingFlags.Public | BindingFlags.Static);
//MethodInfo method = audioUtilClass.GetMethod("PlayClip", BindingFlags.Static | BindingFlags.Public, null, new System.Type[] { typeof(AudioClip) }, null);
method.Invoke(null, new object[] { clip, 0, false });
}
原方法我我注释了。
同理,按照这个方式反射获取的方法应该都不太行,遇到了都得改一改。