Unity3DUI实例
图片的拖拽与释放
图标的拖拽
逻辑分析
- 为了表示可以拖拽的图片,首先定义一个静态的图片DragImage
- 实际可以拖拽的图片,定义为另一个Image组件icon
- 当把图片拖拽到目标槽位DropSlot时,改变DropSlot下的DropImage.SourceImage=icon.SourceImage
- 拖拽是为了让图标跟随鼠标移动,需要实现一些响应鼠标拖拽的Unity
原理
拖
- 初始化:生成一个icon临时对象,专门来显示要拖拽的图片UI
- 开始拖:记录鼠标相对于icon的原点(pivot)的偏移
- 拖动中:设置icon的位置为鼠标光标位置
- 松开后:icon归位
放
通过事件参数取得放的GameObject,并进一步取得对应的图片Sprite和Color,设置给目标GameObject。
生成可拖拽的图片,并进行拖拽
public class MyDrag : MonoBehaviour,IBeginDragHandler,IDragHandler,IEndDragHandler
{private GameObject m_icon;private GameObject m_canvas;private Vector3 m_offset;//private void OnEnable(){//在DragImage的位置上创建一个相同的图片,起名iconm_canvas = GameObject.Find("Canvas");m_icon = new GameObject("icon");//在场景根节点下创建一个跟对象,并命名为iconm_icon.transform.SetParent(m_canvas.transform,true);//将icon的节点设置在convas之下//ture:保持icon在场景中的原本位置不变//m_icon.transform.parent=m_canvas.transformm_icon.transform.position = this.transform.position;//让生成的icon的图片与原来的图片重叠var img = m_icon.AddComponent<Image>();//添加一个Image组件img.sprite = this.GetComponent<Image>().sprite;//取DragImage的图片精灵设置给iconvar group = m_icon.AddComponent<CanvasGroup>();group.blocksRaycasts = false;使拖拽是不会点击到icon节点,因为脚本是挂在DragImage上的,因此要拖动是DragImage,而同级的节点,unity会自动选择最下面的节点,所以规定拖拽是很有必要的}public void OnBeginDrag(PointerEventData eventData){Vector3 curpos;RectTransformUtility.ScreenPointToWorldPointInRectangle(m_canvas.transform as RectTransform, eventData.position, eventData.pressEventCamera, out curpos);//取得鼠标光标相对的位置,并转换到canvas坐标系下的位置Vector3 imgpos;RectTransformUtility.ScreenPointToWorldPointInRectangle(m_canvas.transform as RectTransform, this.transform.position, eventData.pressEventCamera, out imgpos);//取得dragImage在屏幕上的位置,并且将其转换到其在canvas坐标系下的位置m_offset = imgpos - curpos;//记录鼠标点击位置相对于图片中心点的位移}public void OnDrag(PointerEventData eventData){Vector3 curpos;RectTransformUtility.ScreenPointToWorldPointInRectangle(m_canvas.transform as RectTransform, eventData.position, eventData.pressEventCamera, out curpos);(m_icon.transform as RectTransform).position = curpos + m_offset;//icon的位置设置成鼠标光标位置+光标相对于图片中心得偏移量}public void OnEndDrag(PointerEventData eventData){(m_icon.transform as RectTransform).position = this.transform.position;//icon的位置归位到dragImage的位置,整个拖拽过程拖拽的是icon}}
unity执行顺序

点击DragImage是为了生成icon,后面拖拽的是icon
注意:LocalPoint——vector2 ; WorldPoint——vector3
将拖拽的图片放在指定位置
public class MyDrop : MonoBehaviour, IDropHandler
{public void OnDrop(PointerEventData eventData){this.GetComponent<Image>().sprite = eventData.pointerDrag.GetComponent<Image>().sprite;this.GetComponent<Image>().color = eventData.pointerDrag.GetComponent<Image>().color;}
}
自适应的消息框
展示

- Panel

垂直布局组件控制整个面板
Cantent Size Fitter组件水平不接收文本的数据,垂直接收来自文本框的数据并随着变化
Padding控制其内边距的大小
- Buttons

在Buttons上添加一个水平布局组件控制两个Button
面板选项框

1、将Panel上挂上Toggle Group组件

2、在Panel下创建三个Toggle

Background表示背景图片,Checkmark表示被选中的状态

Is On :表示是否开启
Group:表示是受Panel(ToggleGroup)控制,在ToggleGroup的控制之下,只会有一个被选中的状态
On Value Changeed(Boolean):事件处理,当选中任意个Toggle,就会启动事件将游戏面板(PanelEquip)启动(SetActive)。
PanelEquip面板:通过表格布局组件创建出的UI面板

关卡选择
结构

Context

Scroll View
将垂直滑动关闭,让其只能水平滑动

同时注意EventSystem这个一定不能少,不然就会让unity无法反应事件(该死,因为没加这东西,浪费了我一个小时的功夫)

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
