一、资源管理及命名规则
通用和各个功能区分,提高图集利用率
二、纹理格式的选择
Android
ETC1不带透明通道,ECT2带透明通道
Unity RGBA Crunched ETC2会比ETC2加载更快,而且包体会更小
通道分离,Unity还能将图片设置成alpha8格式
IOS
不带透明推荐PVRTC(也可透明)ASTC5x5,透明ASTC4x4
ASTC大小计算
像素大小 = 16-bytes / 分块宽高 * 8-bit
压缩率 = 原始像素大小(32-bit) / 像素块大小
图像大小 = 原始图片大小 / 压缩率
注:一张1024*1024图片原始为4M(RGBA32)32位
选择要求
ETC1、ETC2以及ASTC 4X4要求尺寸大小被4整除
PVRTC要求正方形2的幂
ETC2只支持OpenGL ES 3.0以上的Android(约2013年以后)
ASTC只支持苹果A8以后的设备(iphone6以后)
三、UI事件注意
取消掉UI中用不到的raycastTarget
取消没有事件响应的Canvas可以不用GraphicRaycaster
可以利用脚本查看是否有事件DebugUILine
#if UNITY_EDITOR using UnityEngine; using UnityEngine.UI; public class DebugUILine : MonoBehaviour { static Vector3[] fourCorners = new Vector3[4]; void OnDrawGizmos() { foreach (MaskableGraphic g in GameObject.FindObjectsOfType<MaskableGraphic>()) { if (g.raycastTarget) { RectTransform rectTransform = g.transform as RectTransform; rectTransform.GetWorldCorners(fourCorners); Gizmos.color = Color.blue; for (int i = 0; i < 4; i++) Gizmos.DrawLine(fourCorners[i], fourCorners[(i + 1) % 4]); } } } } #endif
可以给任意利用脚本给任意物体增加事件UIEventTriggerBox
using UnityEngine; using UnityEngine.EventSystems; public class UIEventTriggerBox : EventTrigger { public System.Action onClick; public System.Action onDown; public System.Action onEnter; public System.Action onExit; public System.Action onUp; public System.Action onSelect; public System.Action onUpdateSelect; static public UIEventTriggerBox Get(GameObject go) { UIEventTriggerBox listener = go.GetComponent<UIEventTriggerBox>(); if (listener == null) listener = go.AddComponent<UIEventTriggerBox>(); return listener; } public override void OnPointerClick(PointerEventData eventData) { if (onClick != null) onClick(); } public override void OnPointerDown(PointerEventData eventData) { if (onDown != null) onDown(); } public override void OnPointerEnter(PointerEventData eventData) { if (onEnter != null) onEnter(); } public override void OnPointerExit(PointerEventData eventData) { if (onExit != null) onExit(); } public override void OnPointerUp(PointerEventData eventData) { if (onUp != null) onUp(); } public override void OnSelect(BaseEventData eventData) { if (onSelect != null) onSelect(); } public override void OnUpdateSelected(BaseEventData eventData) { if (onUpdateSelect != null) onUpdateSelect(); } }
四、控件扩展和优化
ScrollRect无限列表优化
Mask和RectMask2D选择,Mask用Image做裁切区域,RectMask2D用大小作为区域,多个RectMask2D之间不能合批
尽量少使用Layout组件
继承BaseMeshEffect重写ModifyMesh可以修改顶点数据,可以实现flip(反转),mirror(镜像)等效果
尽量不适用Text描边等效果
五、优化技巧
减少gameobject控制显示隐藏,可以利用Canvas的alpha控制显示隐藏
持续性的UI动效可以脱离UI通过粒子实现
动态UI和静态UI用新的Canvas区分开,避免不必要的重绘
多个联系不大的UI,如Tab切换UI的可以做多个UI,避免过多的加载,如角色管理UI
一次性加载过多图片的UI,可以进行分帧加载处理,如图鉴,立绘等加载
如果UI加载过慢,可以使用Profiler监测,查看代码效率
可以给UI统一的的Update机制增加一个SecondUpdate,用来处理倒计时等不需要每帧刷新的逻辑
如果上层是全屏UI,下层消耗大的UI可以关闭Canvas和GraphicRaycaster,如主UI或战斗UI
多个Image的显示隐藏,尽量不使用显示隐藏,而是替换Image的Sprite
血条如果可以可以使用SpriteRenderer或者3DText
文章评论