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

关于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 01: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);
                    }
    
                }
            }
        }
    
    }
    
    
    

    ```

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    ClayByrne 2022-07-07 02:10

    我试了一下,没有办法运行,可能是我的表述有问题,我们老板要求的是在完全没有其它组件的空白部位也可以进行拖拽

    回复
    带酒书生 回复 ClayByrne 2022-07-07 02:31

    可以点击拖动UI,也可以点击背景拖动UI,不是这个意思吗?

    img

    回复
    ClayByrne 回复 带酒书生 2022-07-08 00:59

    确实是这个效果,但是我这边挂载了脚本之后拖拽没有反应啊

    回复
    展开全部4条评论
查看更多回答(2条)
编辑
预览

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 centos7.6进不去系统,卡在数字7界面
  • ¥15 Tensorflow采用interpreter.allocate_tensors()分配内存出现ValueError: vector too long报错
  • ¥15 使用CGenFF在线生成血红素辅基拓扑结构遇到问题
  • ¥15 在fragment使用okhttp同步上传文件,能不能在fragment销毁后还可以继续上传文件?
  • ¥20 matlab代码实现可达矩阵形成骨骼矩阵
  • ¥15 关于地板的木纹和图库中的匹配的
  • ¥30 机器学习预测疾病模型流程疑问
  • ¥50 2048Python实现
  • ¥15 使用ads进行低噪放仿真没有结果且不报错
  • ¥15 关于#python#的问题:有偿求一个千寻框架找书机器人插件
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部