版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/leonardo_Davinci/article/details/78197186
文档
目标:做一个可以拖拽的背包 时间(1小时)
1,可以拖拽(UI Drag)
2,背包(格子) 格子(有物品)(没有物品)(tag是格子还是物品)
3,当格子有物品(两个物品交换位置) 没有物品(将物品放到格子里)
预览图:
根据Hierarchy面板创建控件UI Panel--->Scroll View ---->Gird(Empty gameobject)----很多Image等
Grid加了Grid Layout Group(用于UI排版的控件) Scroll Rect(Script)使物体在一定范围内有一定的弹性缓动和用于固定(水平、垂直)的移动(查找详细资料了解)
还有一个Panel后面的Top(Empty GameObject) 用于使物品在拖拽时渲染在最高层,
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class UIBackPack :EventTrigger{
//现在物品的父物体
private Transform nowparent;
//Top的位置
private Transform TopPos;
// Use this for initialization
void Start () {
TopPos = transform.Find("Top");
}
// Update is called once per frame
void Update () {
}
//通过重写的鼠标监听事件(开始拖动)
public override void OnBeginDrag(PointerEventData eventData)
{
nowparent = transform.parent;
//把物品渲染到最高层
transform.parent = TopPos;
}
//拖拽的物体和鼠标一起移动(拖动中)
public override void OnDrag(PointerEventData eventData)
{
//使物体跟着鼠标移动
transform.position = Input.mousePosition;
//并且把物体设置为不是射线的目标,是射线不被遮挡,才能检测物体下方的物体
IsRaycast(false);
}
//将物体拖到格子下 (拖动结束)
public override void OnEndDrag(PointerEventData eventData)
{
// 检测当前射线碰撞到的物体
GameObject go = eventData.pointerCurrentRaycast.gameObject;
IsRaycast(true);
//判断射线是否检测到物体
if(go==null||go.tag!="bag"||go.tag!="goods")
{
//拖到其他地方时,物体返回到开始的父物体的位置和成为子物体
SetPosandParent(transform, nowparent);
return;
}
//如果当前物体是格子(没有物品)
else if(go.tag=="bag")
{
SetPosandParent(transform, go.transform);
}
//如果当前物体是物品
else if(go.tag=="goods")
{
Transform GoParent = go.transform.parent;
SetPosandParent(go.transform,nowparent);
SetPosandParent(transform,GoParent);
}
}
//重构 工具 开启关闭射线
private void IsRaycast(bool flag)
{
//设置物体是否挡住射线
transform.GetComponent<Image>().raycastTarget = flag;
}
//写入我们的父物体以及位置
private void SetPosandParent(Transform trans,Transform parent)
{
trans.parent = parent;
trans.position = parent.position;
}
}