unity学习笔记(4)用户图形界面UGUI
与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];
}
}
本文地址:https://blog.csdn.net/louxiasang/article/details/107880006
上一篇: 数据结构算法(n个点m条边连接删除问题)
下一篇: 贡献一个CSS心形加载的动画源码