Skip to content

Commit

Permalink
Create README.md
Browse files Browse the repository at this point in the history
  • Loading branch information
MrNerverDie committed Jul 29, 2015
1 parent 45f35fe commit c944f33
Showing 1 changed file with 67 additions and 0 deletions.
67 changes: 67 additions & 0 deletions README.md
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就通过这种方式实现了颜色渐变和颜色运算的功能。

0 comments on commit c944f33

Please sign in to comment.