深圳Unity3D培训
达内深圳龙华中心

185-8926-6248

热门课程

【Unity3D技巧】一个简单的Unity-UI框架的实现

  • 时间:2017-08-15 10:55
  • 发布:深圳Unity3D培训
  • 来源:达内新闻

【Unity3D技巧】一个简单的Unity-UI框架的实现


View,Context和UI的定义

UI是游戏中首要界面和它的子节点上的物体的总称,如配备列表界面中的配备列表和每个配备通常会被制作成两个Prefab,这两个Prefab被我们称作两个UI,这两个UI会对应两个UIType,在UIType里边会存储有这个UI大局唯一的姓名和途径,如下:

public class UIType { public string Path { get; private set; } public string Name { get; private set; } public UIType(string path) {
        Path = path;
        Name = path.Substring(path.LastIndexOf('/') + 1);
    } public override string ToString() { return string.Format("path : {0} name : {1}", Path, Name);
    }
}

View代指游戏中的首要界面,例如:主界面,配备界面,配备概况界面等等。在View中包含了界面中处理数据的逻辑。

Context代指游戏中每个View的上下文,存储了这个界面的各种数据状况,每个特定的View会持有特定的Context,游戏中会经过栈的办法办理Context。

在本结构中,会把Context和View定义在同一个cs文件中,如下:

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的创建和毁掉

一切界面上挂上的Mono脚本和关联的Prefab一致以XXXView命名。

一切View的途径一致放在UIType中进行办理,每逢新创建一个View的时分,都需求在UIType中新增加一个成员变量指明View的途径。

public static readonly UIType MainMenu = new UIType("View/MainMenuView"); public static readonly UIType OptionMenu = new UIType("View/OptionMenuView"); public static readonly UIType NextMenu = new UIType("View/NextMenuView"); public static readonly UIType HighScore = new UIType("View/HighScoreView");

在游戏中单独呈现的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的动画

如果在界面上运用3D的旋转动画,就很难运用DoTween或许iTween在代码里边进行动画操控,而且为了坚持战斗模块和UI模块规划的一致性。因而主张运用Animator对View的各种动画进行操控,而View的动画一般又和View的跳转逻辑联系严密,所以主张将两者进行绑定,一个View的动画状况机如下图:

一个界面在没有显现的时分会处于Empty状况,当接收到OnEnter的Trigger的时分,会播映OnEnter动画,其他的状况如图所示,能够参阅上图以及项目中的状况机。不同的界面能够运用相同的状况机,只是在某些状况上绑定的动画会有所不同。

这样做的另一个优点是,我们能够运用动画时间的办法在动画过程中做一些回调,这样的在界面上对回调机遇进行修改,相比运用协程或许Dotween的OnFinished函数,有更好的可修改性。
本地化

本地化是经过单例Localization和组件LocalizedText两个来协同完成的,不同言语的文字会存储在Resources/Localization中的不同JSON文件中,在单例Localization中装备后言语之后,即可读入相应的JSON文件。

每个LocalizedText所在的GameObject上都需求与Text绑定,LocalizedText会根据自己的textID对Text中的text进行本地化
分辨率适配

UGUI中的分辨率适配是经过CanvasScaler来完成的

在这里,我主张运用Scale With Width Or Height这种Scale形式,一起,由于大多数游戏是横屏游戏,经过运用高度固定,宽度随之改变的形式。这样我们就能够以一个固定的高度进行UI规划,只需求考虑UI在水平尺度上的延伸就能够了。
提高滑动列表的功用

在UGUI中Scroller和Grid都是很好用的组件,可是由于它们在完成过程中考虑了太多对齐,排序的问题,这就导致它们在处理无限列表问题的时分遇到了极大的功用瓶颈,相关材料参阅:Performance issues on android with Scrollrect。在本结构中完成的自定义组件GridScroller能够在确保可修改性的一起,提高了滑动列表的功用。

GridScroller的原理是:在滑动到某个item上的时分,会把之前的item进行收回,而且把它放到下一个方位进行再利用。在运用GridScroller的时分,你相同要运用ScrollRect和GridLayout,GridScroller会从这两个组件中读取相应的特点而且运用到UI逻辑中。

GridScroller对外界代码供给了一个Init的接口,经过这个接口,外界模块能够向GridScroller传入一个onChange回调函数,这样在GridScroller在改写的时分,就会动态改写相应的itemPrefab,完成用届时再加载的特性。

[RequireComponent(typeof(ScrollRect))] public class GridScroller : MonoBehaviour { // public UI elements // [SerializeField] private Transform _itemPrefab;
    [SerializeField] private GridLayoutGroup _grid; // public fields // [SerializeField] private Movement _moveType = Movement.Horizontal; public delegate void OnChange(Transform trans, int index); public void Init(OnChange onChange, int itemCount, Vector2? normalizedPosition = null) {
        Clear();
        InitScroller();
        InitGrid();
        InitChildren(onChange, itemCount);
        InitTransform(normalizedPosition);
    }

对UI进行润饰

由于UGUI的Image,Text等特点一般是不会设置Material的,我们能够经过写脚本承继BaseVertexEffect来对UI的Vertex进行润饰,项目中的Gradient Color和Blend Color就经过这种办法完成了色彩渐变和色彩运算的功用。经过重载ModifyVertices这个办法,你能够不实用Shader直接在脚本里对UI的渲染办法进行润饰。

想知道更多关于IT行业的信息吗?想远远不如行动,行动起来,一起加入达内,一起进入IT行业,跟着达内的脚步,一起走进如今的互联网信息时代,带给你不一样的色彩生活——【深圳Unity3D培训

深圳达内

上一篇:Unity3D占用内存太大怎么解决呢
下一篇:Unity3D中常用的数据结构总结与分析

马上预约三天免费体验课

姓名:

电话:

移动应用中的AR开发,5款最受欢迎工具推荐!

【深圳Unity3D培训】unity中不可不知的13个小技巧

【深圳Unity3D培训】unity 射线过滤

【深圳Unity3D培训】Unity是如何跨平台的?

选择城市和中心
贵州省

广西省

海南省