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

关于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 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同