unityUGUI拖拽物品的实现方法

/*
该脚本绑在要拖拽的物体上
*/
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;//要想用拖拽事件必须导入EventSystems
using UnityEngine.UI;
public class Drag2 : MonoBehaviour ,IBeginDragHandler, IDragHandler,IEndDragHandler{//实现开始拖拽,拖拽中和结束拖拽3个事件接口
    public Canvas canv;//场景中的canvas
    private GameObject dragObj;//拖拽生成的物品
    private RectTransform dragObjRect;//生成物品的方向等信息
    void Start()
    {
        dragObjRect = canv.transform as RectTransform;

    }
    public void OnBeginDrag(PointerEventData eventData)//开始拖拽
    {
        dragObj = new GameObject("icon");
        dragObj.transform.SetParent(canv.transform, false);//让这个物体在canvas上,此时物品在屏幕中心
        dragObj.transform.SetAsLastSibling();//将生成的物体设为canvas的最后一个子物体,一般来说最后一个子物体是可操作的
        Image img = dragObj.AddComponent<Image>();//给生成的拖拽物体添加一个Image组件并获得Image组件的控制权
        img.raycastTarget = false;//让该物体不接受鼠标的照射,目的是底下的物品也能操作
        img.sprite = GetComponent<Image>().sprite;//让生成物体的图片为按钮的图片
        dragObj.GetComponent<RectTransform>().sizeDelta =
            new Vector2(Screen.height * 0.1f, Screen.height * 0.1f);//设置新生成物品的尺寸
        ObjFollowMouse(eventData);//让生成的物体跟随鼠标
    }
    public void OnDrag(PointerEventData eventData)//拖拽中
    {
        ObjFollowMouse(eventData);//让生成的物体跟随鼠标
    }
    public void OnEndDrag(PointerEventData eventData)
    {
       if (dragObj != null)
        {
            Destroy(dragObj);//拖拽结束后销毁生成的物体
        }
    }//拖拽结束
    private void ObjFollowMouse(PointerEventData eventData)
    {
        if (dragObj != null)//检测生成的物体是否为空,保险起见
        {
            RectTransform rc = dragObj.GetComponent<RectTransform>();//得到生成物品的控制权
            Vector3 globalMousePos;
            if (RectTransformUtility.ScreenPointToWorldPointInRectangle
                (dragObjRect, eventData.position, eventData.pressEventCamera, out globalMousePos))
            {
                rc.position = globalMousePos;
                rc.rotation = dragObjRect.rotation;
            }
        }
    }
}


/*
该脚本绑在拖拽结束后,要落入的物体
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System;
public class Drop : MonoBehaviour, IDropHandler{
 
 public void OnDrop(PointerEventData eventData)
     {
         if (eventData.pointerDrag!= null)
         {
             Image img = eventData.pointerDrag.GetComponent<Image>();
             if (img != null)
             {
                 GetComponent<Image>().sprite = img.sprite;
                 GetComponent<Image>().color = new Color(1, 1, 1, 1);//我刚开始把图片设为了透明
             }
         }
     }
}

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的示例代码,实现了自动轮播和手动滑动切换图片的功能: ```csharp using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; public class ImageSlider : MonoBehaviour, IDragHandler, IEndDragHandler { public float autoPlayDelay = 3f; // 自动播放延迟时间 public float changeSpeed = 10f; // 切换速度 public bool autoPlay = true; // 是否自动播放 private ScrollRect scrollRect; private RectTransform content; private int currentIndex = 0; private float timer = 0f; void Start() { scrollRect = GetComponentInChildren<ScrollRect>(); content = scrollRect.content; currentIndex = 0; } void Update() { if (autoPlay) { timer += Time.deltaTime; if (timer > autoPlayDelay) { timer = 0f; currentIndex++; if (currentIndex >= content.childCount) { currentIndex = 0; } } } // 通过插值移动content的位置 Vector2 targetPos = new Vector2(currentIndex * scrollRect.viewport.rect.width, content.anchoredPosition.y); content.anchoredPosition = Vector2.Lerp(content.anchoredPosition, targetPos, Time.deltaTime * changeSpeed); } // 当用户结束拖拽时,计算当前应该显示哪张图片 public void OnEndDrag(PointerEventData eventData) { float posX = content.anchoredPosition.x; int index = Mathf.RoundToInt(posX / scrollRect.viewport.rect.width); currentIndex = index; } // 当用户拖拽时停止自动播放 public void OnDrag(PointerEventData eventData) { autoPlay = false; timer = 0f; } } ``` 这段代码中,我们实现了自动播放和手动滑动切换功能。autoPlayDelay表示自动播放的延迟时间,changeSpeed表示切换速度。在Update函数中,我们通过插值移动content的位置,从而实现图片的切换。在OnEndDrag函数中,我们计算当前应该显示哪张图片,然后将currentIndex设置为对应的索引。在OnDrag函数中,我们停止自动播放。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值