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