css178901235563 2023-10-01 09:26 采纳率: 0%
浏览 14
已结题

我该如何实现鼠标按下GUI按钮时就执行按钮里面的操作的方法

你好,我想实现这样一个功能,我想在鼠标按下GUI按钮时就执行按钮里面的操作**(unity的GUI按钮,只有在鼠标弹起的时候才能执行)**,于是我写了这样一个代码,用来获取FOR循环按钮的rect,然后当react检测到(Event.current.mousePosition) && Input.GetMouseButtonDown(0),执行按钮里的操作,这是我写的代码

img


然后这是运行效果

img

但是当我使用GUILayout.Button时,一切又正常运行了

img

然后这是运行效果

img

但是就像我说的那样,** Gui的按钮只能够在鼠标弹起的时候才能够执行按钮里面的代码,我用了许多种方法,例如GUILayoutUtility.GetLastRect(),但是会有报错,例如这样**

img

所以到底该怎样才能够正确获取gUI layout按钮里的rect,我在网上找了许多问题都没找到答案,现在急需解决方案

  • 写回答

14条回答 默认 最新

  • 忧伤的玩不起 2023-10-01 09:33
    关注
    获得3.75元问题酬金
    
    using UnityEngine;
    using UnityEngine.EventSystems;
     
    public class OnImage : MonoBehaviour,IPointerDownHandler,IPointerUpHandler,IPointerExitHandler,IPointerEnterHandler
    {
        public float Ping;
        private bool IsStart = false;
        private float LastTime = 0;
     
        void Update()
        {
            if (IsStart && Time.time - LastTime > Ping)
            {
                IsStart = false;
                Debug.Log("长按");
            }
        }
        public void OnPointerDown(PointerEventData eventData)
        {
            LongPress(true);
            Debug.Log("按下");
        }
        public void OnPointerUp(PointerEventData eventData)
        {
            if(IsStart)
            {
                LongPress(false);
                Debug.Log("抬起");
            }      
        }
        public void OnPointerExit(PointerEventData eventData)
        {
            Debug.Log("离开");
        }
        public void OnPointerEnter(PointerEventData eventData)
        {
            Debug.Log("进入");
        }
        public void LongPress(bool bStart)
        {
            IsStart = bStart;
            LastTime = Time.time;
        }
    }
    

    试试这个方法

    评论
  • 专家-赤兔[在线] 2023-10-01 09:52
    关注
    获得3.75元问题酬金

    非常抱歉,我之前的回答有误。你是想动态获取创建的按钮的Rect,而不是声明一个Rect变量。抱歉给你带来了困惑。

    实际上,在使用GUILayout创建按钮时,无法直接获取按钮的Rect。GUILayout是根据当前的GUI布局自动调整元素的位置和大小的,并不提供访问单个元素的Rect的方法。

    如果你需要获取每个动态创建按钮的位置和大小信息,可以考虑使用GUILayout.BeginArea和GUILayout.EndArea来创建一个自定义的GUI区域,并在其中绘制按钮。然后,你可以使用GUILayoutUtility.GetLastRect()方法来获取该区域的Rect信息。以下是一个示例代码:

    using UnityEngine;
    
    public class ButtonHandler : MonoBehaviour
    {
        bool[] buttonsClicked;
    
        void OnGUI()
        {
            buttonsClicked = new bool[10]; // 假设你有10个按钮
    
            for (int i = 0; i < buttonsClicked.Length; i++)
            {
                GUILayout.BeginArea(new Rect(100 + i * 120, 100, 100, 50));
                if (GUILayout.Button("Button " + i))
                {
                    buttonsClicked[i] = true;
                }
                GUILayout.EndArea();
    
                // 检测鼠标左键按下事件
                if (Event.current.type == EventType.MouseDown && Event.current.button == 0)
                {
                    if (buttonsClicked[i])
                    {
                        Rect buttonRect = GUILayoutUtility.GetLastRect();
    
                        // 执行按钮操作,例如打印消息
                        Debug.Log("Button " + i + " action executed! Rect: " + buttonRect);
                        buttonsClicked[i] = false;
                    }
                }
            }
        }
    }
    

    在上面的示例中,我们使用GUILayout.BeginArea和GUILayout.EndArea来创建自定义的GUI区域。在该区域中绘制按钮,并使用GUILayoutUtility.GetLastRect()获取按钮的Rect信息。

    希望这次的回答能满足你的需求。非常抱歉之前的回答造成了误解。如果还有其他问题,请随时提问。

    评论
  • 杨得江-君临天下wyj 2023-10-01 10:14
    关注
    
    using UnityEngine;
    public class ButtonHandler : MonoBehaviour
    {
        bool[] buttonsClicked;
        void OnGUI()
        {
            buttonsClicked = new bool[10]; // 假设你有10个按钮
            for (int i = 0; i < buttonsClicked.Length; i++)
            {
                GUILayout.BeginArea(new Rect(100 + i * 120, 100, 100, 50));
                if (GUILayout.Button("Button " + i))
                {
                    buttonsClicked[i] = true;
                }
                GUILayout.EndArea();
                // 检测鼠标左键按下事件
                if (Event.current.type == EventType.MouseDown && Event.current.button == 0)
                {
                    if (buttonsClicked[i])
                    {
                        Rect buttonRect = GUILayoutUtility.GetLastRect();
                        // 执行按钮操作,例如打印消息
                        Debug.Log("Button " + i + " action executed! Rect: " + buttonRect);
                        buttonsClicked[i] = false;
                    }
                }
            }
        }
    }
    
    
    评论
  • 数据大魔王 2023-10-01 10:50
    关注

    使用Event.current.type来判断鼠标事件的类型,从而在鼠标按下时执行按钮里的操作。下面是一个示例代码:

    using UnityEngine;
    
    public class ButtonTest : MonoBehaviour
    {
        private bool buttonClicked = false;
    
        private void OnGUI()
        {
            if (GUI.Button(new Rect(10, 10, 100, 50), "Button"))
            {
                buttonClicked = true;
            }
        }
    
        private void Update()
        {
            if (buttonClicked && Event.current.type == EventType.Repaint)
            {
                // 执行按钮里的操作
                Debug.Log("Button clicked!");
                buttonClicked = false;
            }
        }
    }
    

    在这个示例中,我们通过设置buttonClicked变量来记录按钮是否被点击。在按钮的OnGUI()方法中,当按钮被点击时,我们将buttonClicked设置为true。在Update()方法中,我们检查buttonClicked是否为true,并同时判断当前的事件类型是否为EventType.Repaint,这意味着在鼠标按下按钮时执行按钮里的操作。

    通过这种方法,你可以在鼠标按下GUI按钮时立即执行按钮里的操作,而不是等到鼠标释放。

    评论
  • 心梓知识 2023-10-03 01:18
    关注

    结合GPT给出回答如下请题主参考
    你可以通过在OnGUI()函数中检测鼠标的按下事件来达到在鼠标按下GUI按钮时就执行按钮里面的操作的效果。

    以下是一个简单的示例代码:

    void OnGUI(){
        if (GUI.Button(new Rect(10,10,100,50), "FOR循环按钮")){
            for (int i = 0; i < 10; i++){
                Debug.Log(i);
            }
        }
    }
    

    在这个示例中,当鼠标按下“FOR循环按钮”时,就会执行一个for循环,输出数字0到9。这个功能是通过在OnGUI()函数中使用GUI.Button()函数创建GUI按钮,并在按钮内部使用for循环来实现的。

    你也可以使用其他的GUI事件函数如OnMouseDown()、OnMouseUp()等来实现不同的效果。具体取决于你的需要。

    评论
  • 技术宅program 2023-10-07 10:02
    关注
    评论
  • yy64ll826 2023-10-07 16:04
    关注
    评论
  • 关注

    在Unity中,GUI按钮是在OnGUI函数中处理的,而OnGUI函数在每一帧都会被调用。所以,你可以在OnGUI函数中获取鼠标按下的事件,并执行按钮里的操作。
    下面是一个示例代码,展示了如何在鼠标按下时执行GUI按钮里的操作:

    void OnGUI()
    {
        if (GUI.Button(new Rect(10, 10, 100, 30), "My Button"))
        {
            // 在这里执行按钮里的操作
            Debug.Log("Button Clicked!");
        }
    }
    
    void Update()
    {
        // 检测鼠标按下事件
        if (Input.GetMouseButtonDown(0))
        {
            // 获取鼠标点击的位置
            Vector2 mousePos = Event.current.mousePosition;
    
            // 检查鼠标点击位置是否在按钮的范围内
            if (new Rect(10, 10, 100, 30).Contains(mousePos))
            {
                // 执行按钮里的操作
                Debug.Log("Button Clicked!");
            }
        }
    }
    

    在这个示例代码中在OnGUI函数中创建了一个GUI按钮,并在鼠标按下时执行按钮里的操作。在Update函数中,我们检测鼠标按下事件,并获取鼠标点击的位置,然后检查点击位置是否在按钮的范围内,如果是,则执行按钮里的操作。

    评论
  • bug菌¹ Java领域优质创作者 2023-10-08 11:19
    关注

    该回答引用ChatGPT,希望对题主有所帮助,如有帮助,还望采纳。


    你可以使用Event.current.type来判断是否是鼠标按下事件,然后再执行相应的操作,示例代码如下:

    void OnGUI()
    {
        if (GUILayout.Button("Button"))
        {
            Debug.Log("Button clicked!");
        }
    
        if (Event.current.type == EventType.MouseDown && Event.current.button == 0 && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition))
        {
            Debug.Log("Button pressed!");
        }
    }
    

    这样就可以在鼠标按下时执行操作了,同时也可以正常使用GUILayout.Button的功能。注意要添加一个获取最后一个GUILayout的Rect的条件,以确保鼠标点击的确在按钮内部。

    评论
  • 喵手 2023-10-08 16:40
    关注

    该回答引用ChatGPT,希望对题主有所帮助。
    你可以尝试使用Unity的EventSystem来实现这个功能。在按钮上添加一个EventTrigger组件,并设置事件类型为Pointer Down。然后为该事件添加一个函数调用。这样,当鼠标按下按钮时,该函数就会被调用。具体步骤如下:

    1. 选中你的按钮,在Inspector面板上找到EventTrigger组件,点击Add New Event Type按钮,添加一个Pointer Down事件。

    2. 为该事件添加一个函数调用,点击Add New Function按钮,在弹出的面板上选择需要执行的函数。注意,这个函数必须是Public的,并且不带参数。

    3. 点击Apply保存设置。

    代码示例:

    // 在脚本中定义需要执行的函数
    public void OnButtonDown() {
        // 在这里添加需要执行的代码
    }
    
    // 在Start函数中找到按钮,并添加EventTrigger组件
    void Start() {
        Button button = GetComponent<Button>();
        EventTrigger trigger = button.gameObject.AddComponent<EventTrigger>();
    
        // 创建一个PointerDown事件,并为其添加一个函数调用
        EventTrigger.Entry entry = new EventTrigger.Entry();
        entry.eventID = EventTriggerType.PointerDown;
        entry.callback.AddListener((data) => { OnButtonDown(); });
        trigger.triggers.Add(entry);
    }
    

    这样就可以在鼠标按下按钮时执行你想要的操作了。

    评论
  • Minuw 2023-10-08 17:35
    关注

    参考gpt
    在Unity中,可以使用Event Trigger组件来实现在鼠标按下GUI按钮时执行按钮内部操作的功能。以下是一种可能的实现方法:

    1. 在Unity编辑器中,选择你的GUI按钮对象,并添加一个Event Trigger组件。

    2. 在Event Trigger组件的Inspector窗口中,点击“Add New Event Type”按钮,并选择Pointer Down事件。

    3. 在Event Trigger组件的事件列表中,将Pointer Down事件拖动到你的脚本的一个公共方法上。这个方法将在鼠标按下GUI按钮时被调用。

    4. 在你的脚本中,实现这个公共方法,执行你想要在按钮内部执行的操作。

    例如,你的脚本可以是这样的:

    using UnityEngine;
    using UnityEngine.UI;
    
    public class ButtonController : MonoBehaviour
    {
        public void OnButtonClicked()
        {
            // 在这里执行按钮内部的操作
            Debug.Log("按钮被点击了!");
        }
    }
    

    然后,将这个脚本挂载到你的GUI按钮对象上,并将OnButtonClicked方法拖动到Event Trigger组件的Pointer Down事件上。

    这样,当你按下GUI按钮时,OnButtonClicked方法将被调用,从而执行按钮内部的操作。

    评论
  • 会跑的小鹿 2023-10-08 19:59
    关注

    使用Event.current.type来判断鼠标事件的类型,然后进行处理

    评论
  • GIS工具开发 2023-10-08 21:30
    关注

    把需要的操作封装成一个函数,然后去调用函数

    评论
  • coder_small_bell 2023-10-02 16:13
    关注

    抽出这个函数调用

    评论

报告相同问题?

问题事件

  • 系统已结题 10月9日
  • 创建了问题 10月1日

悬赏问题

  • ¥15 改一下,代码,让代码符合要求
  • ¥15 报错问题,只有两个错误,如图片所示,i多次初始化
  • ¥15 matlab runtime 如何收费
  • ¥20 用C语言绘制cs1.6方框透视 出现了点问题 绘制不上去 矩阵数据 和敌人坐标都是正确的
  • ¥15 Tpad api账户 api口令
  • ¥30 ppt进度条制作,vba语言
  • ¥15 生信simpleaffy包下载
  • ¥15 在二层网络中,掩码存在包含关系即可通信
  • ¥15 端口转发器解析失败不知道电脑设置了啥
  • ¥15 Latex算法流程图行号自定义