1 Canvas 画布
Overlay UI永远在最前面 分辨率改变画布自动改变 canvas不能移动,改变
Camera 画布放在camera前的一个指定距离上,画布会随camera field改变 canvas不能移动改变
WorldSpace 可手动改变画布的大小和位置 UI元素可以呈现在3D物体的前或后
Canvas 在 Camera 和WorldSpace 渲染是依据摄像机的的depth改变,同一摄像机看canvas的Sorting Layer 谁大,同一Sorting Layer看Order in layer
元素在canvas中看上下顺序,下面的显示在前面
2 RectTransform
2 text
Text 支持 html 的tag <color></color> <size></size>
Text 的大小随着字数的增加而变大,挂Content Size Fitter 修改Text 的Pivot来确定向那个方向扩展
3 3D物体和UI穿透
EventSystem.current.IsPointerOverGameObject() 来判断是否点击到UI
给主摄像机加PhysicsRaycaster
4 ugui 点击事件
继承EventTriggerListner类对各种事件进行委托
public delegate void VoidDelegate(GameObject go);
public VoidDelegate onClick;
static public EventTriggerListener Get (GameObject go){
EventTriggerListener listener = go.GetComponent<EventTriggerListener>();
if (listener == null) listener = go.AddComponent<EventTriggerListener>();
return listener;
}
public override void OnPointerClick(PointerEventData eventData){
if(onClick != null) onClick(gameObject);
}
这种情况下使用
EventTriggerListener.Get (btn.gameObject).onClick = OnBtnClicked;
void OnBtnClicked(GameObject go){
btn1.interactable = false;
Debug.Log ("btn 1 is clicked");
}
如果是Button,将interactable设为false,Button还是可以响应点击事件,继承接口也是一样。解决方案:
(1)使用unity自带的AddListener
btn.onClick.AddListener(
delegate(){
this.OnBtnClicked(parmats p);
}
);
void OnBtnClicked(GameObject go){
btn1.interactable = false;
Debug.Log ("btn 1 is clicked");
}
(2)将Button禁用的同时,将EventTriggerListener禁用
(3)给按钮加Canvas Group 将blocks raycasts (接受射线)禁用
5 ugui draw call
一种字体 = 1 drawcall
A字体B字体A字体 = 3 drawcall
A字体A字体B字体 = 2 drawcall
A字体 sprite A体 = 2 drawcall
一个没有Sprite的组件 = 1 drawcall
一个有Sprite的组件 = 1 drawcall
多个sprite 一个packing tag = 1 drawcall
多个sprite 多个packing tag = 多个 drawcall
Resource文件夹下的图片不会自动打成图集
6 Rect Transform
GetComponent<RectTransform>().sizeDelta = new Vector2(100, 100);
7 背景image随text 大小的改变而改变
在image上挂 layout 和 content size fitter
8 层级
SetSiblingIndex(); GetSiblingIndex(); SetAsFirstSibling(); SetAsLastSibling()
9 Alpha
CrossFadeAlpha(float alpha, float duration, bool ignoreTimeScale);
10 ui 与 gfx
特效默认order layer 0
Order > 0 gfx 在最后 order大的在 order小的gfx 前面
11 Multiple Sprite
Sprite[] sprites = Resources.LoadAll<Sprite>(path);