Unity3d 简单的背包系统(物品交换)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
    }
}







猜你喜欢

转载自blog.csdn.net/leonardo_Davinci/article/details/78197186