欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2022-04-01 10:29:28
与OnGUI相比:全新的布局系统:Rect Transform Layout Group强大的事件机制:鼠标指针类 拖拽类 点选类 输入类最佳的执行性能:减少了GPU的负担与NGUI相比:自适应系统更完善更方便的深度处理淡化Atlas(图集),直接使用Sprite PackerUGUI没有Tween组件(ITween/DoTween)基础控件:canvas画布:绘制UI元素载体 元素必须在canvas内 UI元素绘制顺序依赖于层次顺序(后面覆盖前面的)画布之间...

与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

 

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

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];
    }
}

 

本文地址:https://blog.csdn.net/louxiasang/article/details/107880006

相关标签: unity