一、资源管理及命名规则
通用和各个功能区分,提高图集利用率
二、纹理格式的选择
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
文章评论