ClayByrne 2022-07-07 09:30 采纳率: 71.4%
浏览 62
已结题

关于unityUI拖拽的问题

问题遇到的现象和发生背景

这里在开发一个editor,老板给我的要求是让整个UI可以实现自由拖拽和缩放。UI上有很多小组件,要求是让它们可以一起被拖拽及缩放。我现在已经实现了缩放功能,其实就是把所有小组件挂在一个大的panel上面。但是关于拖拽,出现了一点问题。我现在使用的是Ondrag方法,但是这个方法只有在点击Panel组件时才能实现拖拽。我的老板希望我在点击背景时也可以随意拖拽缩放。所以现在我想要知道该如何实现这个功能。

问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法

我现在使用的代码:
using UnityEngine;
using UnityEngine.EventSystems;

public class DragUI : MonoBehaviour, IDragHandler, IPointerDownHandler
{

private Vector2 offsetPos;  


public void OnDrag(PointerEventData eventData)
{
    transform.position = eventData.position - offsetPos;
}

public void OnPointerDown(PointerEventData eventData)
{
    offsetPos = eventData.position - (Vector2)transform.position;
}

}

我想要达到的结果
  • 写回答

3条回答 默认 最新

  • 带酒书生 2022-07-07 09:54
    关注

    刚好昨天在帮另一个题主搞UI检测这一块,感觉你的问题跟他其实可以用同一套逻辑和思路,将脚本挂在任意物体上,然后判断射线射中物体是否为背景哪里你可以用名字判断也可以搞个单独的层,将你这个挂了dragUI的物体拖到脚本的public变量上,play

    
    ```c#
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.EventSystems;
    public class Simulation : MonoBehaviour
    {
    
        EventSystem eventSystem;
        PointerEventData pointerEventData;
        List<RaycastResult> uiRaycastResultCache = new List<RaycastResult>();
        public GameObject mDragUI;
        void Start()
        {
            eventSystem = EventSystem.current;
            pointerEventData = new PointerEventData(eventSystem);
        }
    
        // Update is called once per frame
        void Update()
        {
            Drag();
        }
        void Drag()
        {
            pointerEventData.position = Input.mousePosition;
            //射线检测ui
            eventSystem.RaycastAll(pointerEventData, uiRaycastResultCache);
            Debug.Log($"{uiRaycastResultCache.Count}");
            if (uiRaycastResultCache.Count > 0)
            {
                if (uiRaycastResultCache[0].gameObject.name == "BG")
                {
                    eventSystem.SetSelectedGameObject(mDragUI);
                    if (Input.GetMouseButtonDown(0))
                    {
                        ExecuteEvents.Execute(mDragUI, pointerEventData, ExecuteEvents.pointerDownHandler);
    
                    }
                    if (Input.GetMouseButton(0))
                    {
                        ExecuteEvents.Execute(mDragUI, pointerEventData, ExecuteEvents.dragHandler);
                    }
    
                }
            }
        }
    
    }
    
    
    

    ```

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 7月19日
  • 已采纳回答 7月11日
  • 创建了问题 7月7日

悬赏问题

  • ¥15 CARSIM前车变道设置
  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败