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

来源:互联网 发布:外设马淘宝 编辑:程序博客网 时间:2024/05/02 00:04

文档

目标:做一个可以拖拽的背包  时间(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 initializationvoid Start () {        TopPos = transform.Find("Top");}// Update is called once per framevoid 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;    }}







原创粉丝点击