-
Notifications
You must be signed in to change notification settings - Fork 242
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
45f35fe
commit c944f33
Showing
1 changed file
with
67 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
#Unity-UI-Framework的设计与实现 | ||
|
||
[TOC] | ||
|
||
在设计UI的基础架构的时候,最重要的是要保证其有足够的易编辑性,其次则是有着足够的性能。一下的各个模块的设计中也会着重在这两方面进行努力。 | ||
|
||
###View的创建和销毁 | ||
|
||
所有界面上挂上的Mono脚本和关联的Prefab统一以`XXXView`命名。 | ||
|
||
所有View的路径统一放在UIType中进行管理,每当新创建一个View的时候,都需要在UIType中新添加一个成员变量指明View的路径。 | ||
|
||
在游戏中只会出现一个的View会通过UIManager中的GetSingleUI和DestroySingleUI来进行创建和销毁。 | ||
|
||
###View的跳转 | ||
|
||
每个View都相应拥有相应的Context来保存该界面的状态,View的跳转通过ContextManger管理,ContextManager中以栈的形式储存了已经经过的界面的Context。这样在返回的时候就可以得到需要的状态参数。 | ||
|
||
当需要进入下一个View的时候,调用`ContextManger.Instance.Push(nextContext)`即可,nextContext即为下一个View需要的上下文参数, 这是会调用当前View的OnPause函数,对当前View的上下文进行存储,并调用下一个View的OnEnter函数,对下一个Viwe的上下文进行初始化 | ||
|
||
当需要返回上一个界面的时候,调用`ContextManger.Instance.Push.Pop()`即可。这是会调用当前界面的OnExit函数,接着调用下一个界面的OnResume函数。 | ||
|
||
一个普通的View脚本如下,包含了相应的Context和View的实现: | ||
``` | ||
public class OptionMenuContext :BaseContext | ||
{ | ||
public OptionMenuContext() : base(UIType.OptionMenu){} | ||
} | ||
public class OptionMenuView : AnimateView | ||
{ | ||
public override void OnEnter(BaseContext context) | ||
public override void OnExit(BaseContext context) | ||
public override void OnPause(BaseContext context) | ||
public override void OnResume(BaseContext context) | ||
} | ||
``` | ||
|
||
###View的动画 | ||
|
||
如果在界面上使用3D的旋转动画,就很难使用DoTween或者iTween在代码里面进行动画控制,而且为了保持游戏内和游戏外设计的一致性。因此建议使用Animator对View的各种动画进行控制,而View的动画一般又和View的跳转联系紧密,所以建议将两者进行绑定,一个一般的动画状态机如下图: | ||
|
||
![ViewAnimator](./ViewAnimator.png) | ||
|
||
一个界面在没有显示的时候会处于Empty状态,当接收到OnEnter的Trigger的时候,会播放OnEnter动画,其他的状态如图所示,可以参考上图以及项目中的状态机。不同的界面可以使用相同的状态机,只是在某些状态上绑定的动画会有所不同。 | ||
|
||
###本地化 | ||
|
||
本地化是通过单例Localization和组件LocalizedText两个来协同实现的,不同语言的文字会存储在`Resources/Localization`中的不同JSON文件中,在单例Localization中配置后语言之后,即可读入相应的JSON文件。 | ||
|
||
每个LocalizedText所在的GameObject上都需要与Text绑定,LocalizedText会根据自己的textID对Text中的text进行本地化 | ||
|
||
###分辨率适配 | ||
|
||
UGUI中的分辨率适配是通过CanvasScaler来实现的,如下图: | ||
![CanvasScaler](./Unnamed QQ Screenshot20150728200015.png) | ||
|
||
在这里,我建议使用Scale With Width Or Height这种Scale模式,同时,由于我们是横屏游戏,我建议使用高度固定,宽度随之变化的模式,即为如图所示的设置方式。 | ||
|
||
###自定义组件 | ||
|
||
自定义组件GridScroller可以在保证可编辑性的同时,提升了滑动列表的性能,可以参考GridScroller的相应源代码。 | ||
|
||
由于UGUI的Image,Text等属性一般是不会设置Material的,我们可以通过写脚本继承BaseVertexEffect来对UI的Vertex进行修饰,项目中的Gradient Color和Blend Color就通过这种方式实现了颜色渐变和颜色运算的功能。 |