UGUI

本文深入探讨Unity中UI系统的画布渲染模式,包括其如何适应屏幕大小和分辨率,以及锚点、轴心点的作用。此外,还介绍了Unity动画事件的绑定方法,包括Inspector面板绑定、AddListener()绑定和实现接口绑定。最后,详细解析了UI拖拽的实现过程及iTween动画库的使用。
摘要由CSDN通过智能技术生成

画布canvas大小不能随意调整由game屏幕大小和分辨率决定.
画布渲染模式

在这里插入图片描述

在此模式下,“画布”会缩放以适合屏幕,然后直接渲染而不参考场景或相机(即使场景中根本没有相机,也会渲染UI)。如果更改了屏幕的大小或分辨率,则UI将自动重新缩放以适合。UI将绘制在任何其他图形上,因为UI独立渲染。

在这里插入图片描述
在此模式下,Canvas被渲染为给定摄像机前面一定距离的平面对象上绘制的。必须单独给定相机,如果未给相机则为Overlay模式
UI的屏幕尺寸不随距离而变化,因为它总是重新缩放以完全适合相机平截头体。如果更改了屏幕的大小或分辨率或相机平截头体,则UI将自动重新缩放以适合。接近相机的会遮挡后面的物体,3D物体和UI一起渲染.
一般单独用一个Camera用来渲染UI,然后设置Culling Mask和clear flag为Depth only时两个相机同时渲染

在这里插入图片描述
此模式将UI呈现为场景中的平面对象。然而,与屏幕空间 - 摄像机模式不同,飞机无需面向摄像机,无论您喜欢什么,都可以进行定向。Canvas的大小可以使用其Rect Transform设置,但其屏幕大小将取决于摄像机的视角和距离。其他场景对象可以在Canvas后面,之后或之前传递。

锚点与轴心点
锚点:与canvas距离保持不变
1.不分开做位置自适应
2.分开做大小自适应
轴心点:与锚点距离保持不变
UI元素的中心点
rectTransform:物体轴心点到锚点的距离

        //UI 世界坐标(从世界原点 指向 UI 轴心点Pivot向量)
        Vector3 worldPos = transform.position;

        //当前UI轴心点 相对于 父级(UI)轴心点 向量 
        //从父级轴心点 指向 当前UI轴心点 向量
        localPos = transform.localPosition;

        //RectTransform rtf = transform as RectTransform;
        RectTransform rtf = GetComponent<RectTransform>();
        //当前UI 锚点 指向 轴心点的向量
        Vector3 anchoredPos = rtf.anchoredPosition3D;

        //获取3D模型大小
        //Vector3 size = GetComponent<MeshRenderer>().bounds.size;
        //获取UI宽高
        float width = rtf.rect.width;
        float height = rtf.rect.height;

        设置UI宽度
        //rtf.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, 100);
        设置UI高度
        //rtf.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, 100);

        //rtf.sizeDelta = new Vector2(100, 100);
        //当前物体大小 -  锚点大小
        //如果锚点不分开,结果是物体大小
        size = rtf.sizeDelta;

动画事件:当满足某种条件自动调用方法的过程.
1.通过在inspector面板中绑定

    public void Fun1()
    {
        Debug.Log("Fun1");
    }
    public void Fun2(string str)
    {
        Debug.Log("Fun2:" + str);
    }

2.通过:AddListener();绑定

        //注册事件:将某个方法与某个事件做关联。
        //1.获取相关组件引用
        Button btn = transform.Find("Button").GetComponent<Button>();
        //2.绑定
        //public delegate void UnityAction(); 
        //方法形参:委托类型
        //方法实参:传递方法(无返回值,无参数)
        btn.onClick.AddListener(Fun1);

        var input = transform.Find("InputField").GetComponent<InputField>();
        //public delegate void UnityAction<T0>(T0 arg0);
        //传递无返回值,1个参数的方法
        input.onValueChanged.AddListener(Fun2);

    //光标单击当前UI时执行
    public void OnPointerClick(PointerEventData eventData)
    {
        //eventData 事件参数类:包含了引发事件时的信息
        //判断单击次数
        if (eventData.clickCount == 2)
        {
            Debug.Log("OnPointerClick");
        }
    }
    
    //光标拖拽当前UI时执行
    public void OnDrag(PointerEventData eventData)
    {
        //当canvas渲染模式为overlay时,世界坐标原点与屏幕坐标原点重合,
        //所以可以将屏幕坐标视为世界坐标

        //获取当前光标位置(屏幕)
        //transform.position = eventData.position;

        //通用拖拽代码 
        Vector3 worldPos;
        RectTransform parentRTF = transform.parent  as RectTransform;
        //将屏幕坐标  -->  世界坐标
        RectTransformUtility.ScreenPointToWorldPointInRectangle(parentRTF, eventData.position, eventData.pressEventCamera, out worldPos);
        transform.position = worldPos; 
        }

3.实现接口

//使用UnityEngine.EventSystems命名空间
using UnityEngine.EventSystems;
//实现接口IPointerClickHandler,    IDragHandler
public class EventDemo : MonoBehaviour, IPointerClickHandler,IDragHandler
    //光标单击当前UI时执行
    public void OnPointerClick(PointerEventData eventData)
    {
        //eventData 事件参数类:包含了引发事件时的信息
        //判断单击次数
        if (eventData.clickCount == 2)
        {
            Debug.Log("OnPointerClick");
        }
    }
    
    //光标拖拽当前UI时执行
    public void OnDrag(PointerEventData eventData)
    {
        //当canvas渲染模式为overlay时,世界坐标原点与屏幕坐标原点重合,
        //所以可以将屏幕坐标视为世界坐标
        //获取当前光标位置(屏幕) 简单拖拽
        //transform.position = eventData.position;

        //通用拖拽代码 
        Vector3 worldPos;
        RectTransform parentRTF = transform.parent  as RectTransform;
        //将屏幕坐标  -->  世界坐标
        RectTransformUtility.ScreenPointToWorldPointInRectangle(parentRTF, eventData.position, eventData.pressEventCamera, out worldPos);
        transform.position = worldPos; 
    }


/UI拖拽///
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;

/// <summary>
/// UI拖拽
/// </summary>
public class UIDrag : MonoBehaviour,IPointerDownHandler,IDragHandler
{
    private RectTransform parentRTF;
    private void Start()
    {
        parentRTF = transform.parent as RectTransform;
    }

    private Vector3 downOffset;
    //光标按下时执行
    public void OnPointerDown(PointerEventData eventData)
    {  
        //记录偏移位置
        //屏幕坐标 eventData.position  -->  世界坐标 downWorldPos
        Vector3 downWorldPos;
        RectTransformUtility.ScreenPointToWorldPointInRectangle(parentRTF, eventData.position, eventData.pressEventCamera, out downWorldPos);

        downOffset = transform.position - downWorldPos;
    }

    public void OnDrag(PointerEventData eventData)
    {
        Vector3 currentWorldPos;
        RectTransformUtility.ScreenPointToWorldPointInRectangle(parentRTF, eventData.position, eventData.pressEventCamera, out currentWorldPos);
        //拖拽时,在当前光标位置基础上 +  按下时记录的偏移量
        transform.position = currentWorldPos + downOffset;
    }
}

iTween动画库

public class ItweenDemo : MonoBehaviour
{
    public iTween.EaseType type;
    public GameObject targetTF;
    public void ItweenMovement()
    {   //(目标点,自身坐标,时间)
        //iTween.MoveTo(targetTF, transform.position, 1);

        //缓动插件  iTween , DoTween
        iTween.MoveTo(targetTF, iTween.Hash(
            "position", transform.position,
            "time", 1,
            "easetype", type,
            "oncomplete", "Fun1",
            "oncompletetarget",gameObject
       ));
    }

    //动画事件
    private void Fun1()
    {
        print("到了");
    }
}

读取图集中精灵/精灵数组

    private static Dictionary<int,Sprite> spriteDIC;
    //静态构造函数,类被加载时执行1次
    static ResourceManager()
    {
        //键值对集合  /  字典集合
        spriteDIC = new Dictionary<int, Sprite>();
        //LoadAll读取精灵数组,Load读取单个精灵
        Sprite[] spriteArray = Resources.LoadAll<Sprite>("2048Atlas");
        //将数组元素存储到字典集合中
        foreach (var item in spriteArray)
        {
            int intName = int.Parse(item.name);
            spriteDIC.Add(intName, item);
        }
    }
    public static Sprite GetImage(int number)
    {
        return spriteDIC[number];
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值