若愚

  • 首页
  • 开发记录
  • 心悟感想
    • 书生意气
    • 随心杂谈
  • 我的简介
    • 吾辈简介
    • 慷概解囊
若愚
独坐残床不思量,一盏昏灯照孤郎
  1. 首页
  2. 开发记录
  3. 正文

UGUI优化注意

2021年3月27日 1882点热度 0人点赞 0条评论

一、资源管理及命名规则

通用和各个功能区分,提高图集利用率

二、纹理格式的选择

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

标签: 暂无
最后更新:2021年3月27日

admin

这个人很懒,什么都没留下

点赞
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

归档

  • 2022 年 9 月
  • 2022 年 2 月
  • 2021 年 12 月
  • 2021 年 10 月
  • 2021 年 7 月
  • 2021 年 6 月
  • 2021 年 3 月
  • 2019 年 11 月
  • 2019 年 4 月
  • 2018 年 6 月
  • 2018 年 4 月
  • 2018 年 3 月
  • 2017 年 6 月
  • 2017 年 2 月
  • 2016 年 3 月

分类

  • 书生意气
  • 小游戏
  • 开发记录
  • 我的游戏
  • 随心杂谈

COPYRIGHT © 2025 若愚. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

豫ICP备19041692号