首页 > 其他分享 >NGUI学习笔记4.0

NGUI学习笔记4.0

时间:2024-03-06 18:22:06浏览次数:33  
标签:4.0 渲染 void 笔记 UI print NGUI 图集

EventListener和EventTrigger

控件自带组件的局限性

其实我们常见的复合控件只提供一些简单的事件监听,如按钮有点击抬起的监听,对长按等其他交互方式的事件监听不大支持。

NGUI的监听函数

给NGUI对象添加Collider,在其挂载的脚本中编写对应的NGUI的函数,在运行时候会通过反射来进行匹配调用函数。

image-20240306104859587

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace NGUILearn
{
    public class NGUIPractice : MonoBehaviour
    {
        void Start()
        {

        }

        void Update()
        {

        }
        //挂载在挂载着Collider的UI组件上 
        //Unity会通过反射找到对应的响应函数
        void OnPress(bool isPressed)
        {
            if (isPressed)
            {
                print("按下组件了");
            }
            else
            {
                print("组件抬起了");
            }
        }
        //经过组件
        void OnHover(bool isHover)
        {
            if (isHover)
            {
                print("经过组件");
            }
            else
            {
                print("离开组件");
            }
        }
        //点击事件
        void OnClick()
        {
            print("点击了");
        }
        //双击
        void OnDoubleClick()
        {
            print("双击了");
        }
        //拖曳
        void OnDrag(Vector2 delta)
        {
            print("拖曳===="+delta);
        }
        //拖曳结束
        void OnDragEnd()
        {
            print("拖曳结束!");
        }
        //拖曳经过的对象
        //注意:这里的对象都是拖曳的目标物体
        //并非再次经过的一些对象【在这里如果你拖拽的是A,那么拖拽开始和离开的时候都是A对象】
        //可以理解为已经拖着的对象一直跟着鼠标走,知道撒手
        void OnDragOver(GameObject obj)
        {
            print("拖拽经过-----"+obj.name);
        }
        //拖曳要离开的对象
        void OnDragOut(GameObject obj)
        {
            print("拖曳离开经过的对象"+obj.name);
        }
    }
}

使用EventListerner对UI组件进行事件处理

上述脚本挂载的对象是单个的UI组件,不方便进行系统的管理,而使用EventListerner可以在UI管控脚本中来对各个子UI对象来设置监听,相应对应的函数。

using System;
using System.Diagnostics.Tracing;
using UnityEngine;

namespace NGUILearn
{
    public class EventListenerPractic:MonoBehaviour
    {
        private UISprite A;
        private UISprite B;
        private UIEventListener _UIlistener;
        private void Awake()
        {
            A = transform.GetChild(0).GetComponent<UISprite>();
            B = transform.GetChild(1).GetComponent<UISprite>();
            //给A对象添加监听机
            _UIlistener=UIEventListener.Get(A.gameObject);
            //监听机要检测的活动
            _UIlistener.onPress += (obj,isPress) =>
            {
                if(isPress)
                    print(obj.name+"被按压了");
            };
            _UIlistener.onClick += (obj) =>
            {
                print(obj.name+"被点击了");
            };
            _UIlistener.onDragStart += BeginDrag;
        }

        private void BeginDrag(GameObject obj,Vector2 delta)
        {
            print(obj.name+"被拖拖曳了");
        }
        
        //供B对象使用EventTrigger来添加的事件监听
        private void PressB()
        {
            print("B被按压了");
        }

    }
}

image-20240306112237410

通过EventTrigger拖拽的方式来给B添加监听:

image-20240306112627643

EventListerner和EventTrigger区别:

  1. EventListener适合脚本代码控制组件的事件监听处理,EventTrigger适合拖拽组件
  2. EventListerner传入的参数更为具体,方便进行控制;而EventTriggr不会传入参数,基本上为无参无返回值的回调函数

DrallCall

简单来说,DrallCall就是CPU给GPU发送的渲染指令,其过程在CPU这边。CPU把需要渲染的资源(数据、贴图、渲染指令等)准备好之后,会给GPU发送一个指令,告诉GPU可以来读取渲染资源,进行渲染了。而CPU的准备其实是非常费事的事情,过载的drallcall会加重CPU的负载,造成游戏的卡顿,为此要尽可能地减少DrallCall的调用次数。

我们知道,拷贝1K个1Kb的文件速度远远慢于拷贝一个1Mb大小的文件,因为一个文件拷贝悬疑进行中断、寻址,开辟内存等步骤,消耗CPU资源。

如何降低DrallCall?

将一些小图合并处理成一张图,打成图集。

打图集的注意:

  1. 通过NGUI Panel上的DrallCall查看工具查看drallcal

    image-20240306140816397

  2. 注意不同图集之间的层级关系,不要在不同UI层级中交叉使用不同图集的资源,以免阻碍同图集的合并渲染,增加drallcall【就是说,同图集之间不要插入使用其他图集的资源】

    理解:在渲染UI时候,会根据UI组件的层级来判断是否可以合并渲染,例如层级1,2所用的资源在一个图集中则可以合并渲染,如果1,2,3三层层级中国,1,3是一个图集资源,2使用的是另外一个层级的资源,则drallcall数是3.因为中间的其他层级资源阻碍1,3层级的合并渲染。

  3. 注意label之间的层级关系

    label尽管不能被打入图集中进行优化,但是要保证它处在合适的图层中,防止其打断相邻图层相同图集资源的合并渲染的优化。

也可以使用内存换取低drallcall!

对于公用的图片资源,可以给每个图集中都打入一份,防止每次使用时单独加载一个图集。

总之,对于UI制作中的drawcall控制,优先使用图集,label正确处理,Texture尽量不用。

NGUI字体

  1. 降低DrallCall

使用NGUI字体制作器可以将字体生成图片并打入图集中,从而达到优化DarCall的作用。

  1. 自定义美术字体

在自定义图集制作工具中我们可以选用一些图片(美术自定义的字体)来作为某个常规字体的替换,达到自定义字体的效果。

如何制作NGUI字体?

  1. 使用NGUI的字体制作工具来生成
  2. 使用第三方工具BitmapFont生成字体信息和图集,然后在NGUI字体生成器中生成字体。

本质上都是把字体进行图片化,然后合并入图集中。

文字变化较多的文字我们使用unity字体,而变化较少的,显示内容比较少的可以选取一定的数字和字体进行新的NGUI字体制作,降低drallcall。

NGUI缓动

NGUI缓动就是让控件交互式及逆行缩放变化、透明变化、位置变化、角度变化等等行为,可以通过NGUI自带的Tween功能来实现这些缓动效果。

可以使用Tween来制作UI动画,使用PlayTween来控制动画的播放。

image-20240306153322921

image-20240306153420688

image-20240306153436483

模型和粒子显示在UI之前

NGUI中显示3D模型

显示3D模型的方式:

  1. 将UI内容设置在UI层中
  2. 3D摄像机不渲染UI层
  3. 将3D模型拖拽到UI组件下,并设置渲染层级为UI层

或者:

使用Rander Texture来显示3d渲染效果

NGUI中显示粒子系统

设置粒子系统的Order in Layer数值,越大越在前面渲染

image-20240306163457990

其他内容:

绑定KeyBoard

使用NGUI中的KeyBinding 脚本

image-20240306180458994

播放音效

使用NGUI中的脚本 PlaySound

image-20240306180443872

语言本地化

  1. 在Resource下创建一个txt文件 命名为Localization

  2. 配置文件

    image-20240306180211470

  3. 要切换文字显示的label对象下挂载Localize 关联Key

    image-20240306180128482

  4. 给用于切换语言的下拉列表下添加LanguageSelection

    image-20240306180021599

PC端快速切换选中

使用NGUI脚本–KeyNavigation脚本

image-20240306180538898

完结撒花,但是还有两个坑没有填上;
在此立下----使用NGUI--

  1. 制作背包系统面板
  2. 制作遥感控制物体移动

标签:4.0,渲染,void,笔记,UI,print,NGUI,图集
From: https://www.cnblogs.com/TonyCode/p/18057269

相关文章

  • Mybatis学习笔记
    Mybatis代码Mybatis入门https://mybatis.net.cn/getting-started.html写一个Mybatis项目1、新建一个Maven项目2、导入依赖集<!--导入依赖--><dependencies><!--mysql驱动--><dependency><groupId>mysql</groupId>......
  • pandas笔记(二)-- 从不订购的顾客 (数据表连接,主键与外键)
    题目描述找出所有从不点任何东西的顾客,以任意顺序返回结果测试用例输入Customerstable:idname1Joe2Henry3Sam4MaxOrderstable:idcustomerId1321输出CustomersHenryMax解析数据表连接的问题核心在于连接......
  • 数位DP 学习笔记
    什么是数位DP数位dp是与数字相关的一类计数问题。这这类问题中,一般给定一些限制条件,求满足第\(K\)小的数是多少,或者求区间\([L,R]\)内有多少个满足条件的数。本文主要讲述如何解决求区间\([L,R]\)内有多少个满足条件的数这一类问题。为什么要用数位dp对于上述问题,如果......
  • SimGRACE论文阅读笔记
    Abstract​ 图对比学习(GCL)已经成为图表示学习的一种主导技术,它最大限度地提高了共享相同语义的成对图增强之间的互信息。不幸的是,由于图数据的多样性,在扩充过程中很难很好地保存语义。目前,GCL的数据扩充大致可分为三种不令人满意的方式。第一,可以通过试错法手动选择每个数据集的......
  • pandas笔记(一)-- 大的国家(逻辑索引、切片)
    题目描述如果一个国家满足下述两个条件之一,则认为该国是大国:面积至少为300万平方公里人口至少为2500万编写解决方案找出大国的国家名称、人口和面积按任意顺序返回结果表,如下例所示测试用例输入:namecontinentareapopulationgdpAfghanistanAsia65223......
  • Java学习笔记——第七天
    面向对象编程(ObjectOrientedProgramming,OOP)基础面向过程编程开发一个一个的方法,有数据要处理了,我们就调方法来处理。此时程序类似于流水线,按照代码自上而下依次运行。面向对象编程开发一个一个的对象来处理数据,把数据交给对象,再调用对象的方法来完成对数据的处理。程序在对......
  • Rust笔记(上)
    Rust笔记(上)目录Rust笔记(上)关于为什么最终还是选择了Rust作为主力语言基本数据类型所有权与移动所有权移动注意Rc与Arc:共享所有权引用共享引用可变引用生命周期省略生命周期表达式块与分号声明if与matchiflet循环break错误处理panicResult自定义错误类型结构体泛型结构体结构体自......
  • 复试计网笔记
    第1章1.1计算机网络概述从组成部分上划分计算机网络主要由硬件、软件、协议三大部分组成,协议是核心。从工作方式上划分计算机网络可分为边缘部分和核心部分。边缘部分由用户主机组成,用来进行通信和资源共享。核心部分由大量网络和连接网络的路由器组成,为边缘部分提供连通......
  • 读算法的陷阱:超级平台、算法垄断与场景欺骗笔记01_比价
    1.      科技正在改善我们的生活1.1.        从表象看,网络世界为我们带来了诸多便利1.1.1.          比价网站的创建、各式各样的电商促销、数不尽的手机应用程序的确降低了商品的售价,提升了产品的品质,丰富了消费者的选择1.2.        ......
  • NGUI学习笔记3.5
    ScrollView练习使用场景搭建:直接在NGUI中新建ScrollView组件(与Button等其它依赖基本组件存在的组件不同,此组件是单独存在的组件)新建sprite作为其子组件,注意!子组件上需要挂在Collider和DragScrollView脚本,才可以实现鼠标拖拽查看功能ScrollView组件的参数意义:添加Scroll......