用户登录
用户注册

分享至

unity学习笔记(4)用户图形界面UGUI

  • 作者: 许昌S减肥终点站
  • 来源: 51数据库
  • 2021-07-28

与OnGUI相比:

全新的布局系统:Rect Transform Layout Group

强大的事件机制:鼠标指针类 拖拽类 点选类 输入类

最佳的执行性能:减少了GPU的负担

与NGUI相比:

自适应系统更完善

更方便的深度处理

淡化Atlas(图集),直接使用Sprite Packer

UGUI没有Tween组件(ITween/DoTween)


基础控件:

canvas画布:

绘制UI元素载体 元素必须在canvas内 UI元素绘制顺序依赖于层次顺序(后面覆盖前面的)

画布之间的覆盖由排序次序决定

画布大小是屏幕的大小

渲染模式:

屏幕空间(2D):覆盖(UI元素可以覆盖3D物体 UI独立渲染 性能更好 屏幕坐标和世界坐标重合) 摄像机(要提供一个UI摄像机 3D物体可以覆盖UI元素 平面距离 画布信息受摄像机影响 )

摄像机模式下UI和3D的完全区分情况:UI摄像机深度值>主摄像机 --清除标志设置为仅深度--UI摄像机遮罩层只看UI--主摄像机主遮罩层不看UI--将UI摄像机的位置设到很远

?

世界空间(3D):画布缩小为为0.01 文字会随摄像机移动何物体一起移动

?

?

Rect Transform:

轴心可设置

锚点:如果图片永远在右下角 锚点设置为右下角 锚点分开:大小自适应? 锚点上面的正方形是锚点预设

?

建议选择:矩形工具(左键移动UI 右键移动场景 可以直接变形操作) 2D

?

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

public class RectTransformDemo : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        RectTransform rtf = GetComponent<RectTransform>();
        //RectTransform rtf = this.transform as RectTransform;
        //自身轴心点相对于锚点的位置
        //rtf.anchoredPosition3D
        //获取、设置 锚点
        //rtf.anchorMin
        //如何获取UI宽度(只读)、高度
        //rtf.rect.width
        //rtf.rect.height
        //设置UI宽度
        //rtf.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 250);
        //设置UI高度
        //rtf.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 250);

        //当锚点不分开时,数值可以理解为UI宽高
        //物体大小-锚点间距
        //Size=rtf.sizeDelta;不建议

        // RectTransformUtility 

    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

Image 图片

image type 贴图类型 填充?

图片贴图:图片类型修改为sprite,拖入图片

text 文字

文本框中可使用富文本标记语言 123<color=red>234</color>999 得先勾上富文本

最佳适应

Button 按钮

事件:on click()中拽入含有脚本的canvas,选择需要的脚本的方法,则点击执行此方法 可传参

事件的代码绑定

Button btn =this.transform.Find("Button").GetComponent<Button>();
btn.Onclick.AddListener(Fun1);

Input 输入框

事件:值改变时,结束编辑时 动态字符串/静态字符串

事件的代码绑定

    Button input = this.transform.Find("InputField").GetComponent<InputField>();
    input.OnEndEdit.AddListener(Fun1);

EventSystem(管理事件):可以设置为VR

光标类?

拖拽类

点选类:

输入类 :滑动滚轮 移动wsad 回车 取消esc

?

?


?

使用代码生成UI:

?

 private void GreatSpritr(int r,int c)
    {
        GameObject go = new GameObject(r.ToString()+c.ToString());
        go.AddComponent<Image>();
        go.transform.SetParent(this.transform,false);
    }

优化原理:

在界面中默认一张图片一个Draw Calls

同一图片多次显示仍然为一个Draw Calls

精灵打包:

选中图片--设置打包标签--精灵打包设置

windows--sprite packer --查看精灵图片

图集:

在Inspector--精灵模式设置多个--对话框中做切割--左上角自动切割

代码设置图片

使用代码生成UI修改//NumberSprite.cs//ResourceManager.cs //

    private void GreatSpritr(int r,int c)
    {
        GameObject go = new GameObject(r.ToString()+c.ToString());
        go.AddComponent<Image>();
        NumberSprite action = go.AddComponent<NumberSprite>();
        go.transform.SetParent(this.transform,false);

    }
 public void setlmage(int number)
    {
        //img = GetComponent<Image>();
        //读取单个精灵
        //Sprite sprite = Resources.Load<Sprite>(""); 
        //img.sprite = sprite;
        //读取图集
        //Sprite[] spriteArray = Resources.LoadAll<Sprite>("");//图片要在resources文件夹里
        img.sprite = ResourceManager.LoadSprite(number);//写了resourcemanager后//
    }    
/*
public class ResourceManager
{
    private static Sprite[] spriteArray;
    static ResourcesManager()
    {
        spriteArray = Resources.LoadAll<Sprite>("");//图片要在resources文件夹里面
    }
    public static Sprite LoadSprite(int number)
    {
        foreach (var item in spriteArray)
        {
            if (item.name == number.ToString())
            {
                return item;
            }
        }
        return null;
    }
}
*/
public class ResourceManager
{
    private static Dictionary<int,Sprite> spriteDic;

    static ResourcesManager()
    {
        spriteDic = new Dictionary<int, Sprite>();
        var spriteArray = Resources.LoadAll<Sprite>("");//图片要在resources文件夹里面
        foreach (var item in spriteArray)
        {
            int intSpriteName = item.name;
            spriteDic.Add(intSpriteName, item);
        }
    }
    public static Sprite LoadSprite(int number)
    {
        return spriteDic[number];
    }
}

?

软件
前端设计
程序设计
Java相关