Unity 拖拽示例


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class MoveSiblingItem :MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerEnterHandler
{
    /// <summary>
    /// 起始父节点
    /// </summary>
    private Transform originalSlot;
    /// <summary>
    /// 总列表
    /// </summary>
    private GameObject itemRoot;
    /// <summary>
    /// 自身
    /// </summary>
    private GameObject itemSelf;
    /// <summary>
    /// 画布
    /// </summary>
    private CanvasGroup itemCanvasGroup;
    private bool isDragging = false;    
    public string objectTag = null;
    private int frontIndex = 0;
    public int itemlevel;//等级

    private void Start()
    {
        itemCanvasGroup = this.GetComponent<CanvasGroup>();
        itemSelf = this.transform.gameObject;
        itemRoot = GameObject.Find("Content");
    }
    public void OnBeginDrag(PointerEventData eventData)
    {
        originalSlot = this.GetComponent<Transform>().parent;
        isDragging = true;
        itemCanvasGroup.blocksRaycasts = true;
        itemSelf.transform.SetParent(itemRoot.transform, false);
        frontIndex = itemSelf.transform.GetSiblingIndex();
        itemSelf.transform.SetAsLastSibling();
        itemCanvasGroup.alpha = 0.5f;
        RefreshContentSizeFitter(); }
public void OnDrag(PointerEventData eventData) { itemCanvasGroup.blocksRaycasts = false; DragPos(eventData); } public void OnEndDrag(PointerEventData eventData) { OnPointerEnter(eventData); itemCanvasGroup.blocksRaycasts = true; itemCanvasGroup.alpha = 1; isDragging = false; } public void OnPointerEnter(PointerEventData eventData) { if (eventData.pointerCurrentRaycast.depth == 0 && isDragging == true) { SetLastPos(); return; } objectTag = eventData.pointerCurrentRaycast.gameObject.tag; if (objectTag != null && isDragging == true) { Debug.Log("放置位置:" + eventData.pointerCurrentRaycast.gameObject.name); MoveSiblingItem hitItem = eventData.pointerCurrentRaycast.gameObject.GetComponent<MoveSiblingItem>(); if (hitItem != null) { if (itemlevel <= hitItem.itemlevel) { Transform aimParent = eventData.pointerCurrentRaycast.gameObject.transform.parent; while (true) { MoveSiblingItem aimParentSiblingItem = aimParent.GetComponent<MoveSiblingItem>(); if (aimParentSiblingItem == null) { break; } else { if (itemlevel > aimParentSiblingItem.itemlevel) { break; } else { hitItem = aimParentSiblingItem; aimParent = aimParent.parent; } } } itemSelf.transform.SetParent(aimParent); itemSelf.transform.SetSiblingIndex(hitItem.transform.GetSiblingIndex()); } else { itemSelf.transform.SetParent(eventData.pointerCurrentRaycast.gameObject.transform); } RefreshContentSizeFitter(); } else { SetOriginalPos(itemSelf); } } } public void RefreshContentSizeFitter() { ContentSizeFitter[] csfs = itemRoot.GetComponentsInChildren<ContentSizeFitter>(); foreach (var item in csfs) { LayoutRebuilder.ForceRebuildLayoutImmediate(item.GetComponent<RectTransform>()); } } public void SetLastPos() { itemSelf.transform.SetParent(itemRoot.transform); RefreshContentSizeFitter(); } public void SetOriginalPos(GameObject gameobject) { gameobject.transform.SetParent(originalSlot.transform); if (itemSelf.transform.GetSiblingIndex()== frontIndex) { itemSelf.transform.SetSiblingIndex(0); itemSelf.transform.SetSiblingIndex(frontIndex); } else { itemSelf.transform.SetSiblingIndex(frontIndex); } RefreshContentSizeFitter(); } //获取鼠标当前位置,并赋给item private void DragPos(PointerEventData eventData) { RectTransform RectItem = itemSelf.GetComponent<RectTransform>(); Vector3 globalMousePos; if (RectTransformUtility.ScreenPointToWorldPointInRectangle(itemSelf.transform as RectTransform, eventData.position, eventData.pressEventCamera, out globalMousePos)) { RectItem.position = globalMousePos; } } }

 

 这样就可以拖拽了!

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM