首页 > 其他分享 >Unity实现鼠标框选功能

Unity实现鼠标框选功能

时间:2024-11-18 11:22:19浏览次数:1  
标签:鼠标 Image rectTransform Unity endPos new 框选 startPos Vector2

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

public class DrawRect : MonoBehaviour
{
    public static DrawRect Instance;

    public DrawRect()
    {
        Instance = this;
    }


    public Image m_Image;

    Vector3 startPos;
    Vector3 endPos;


    public static event Action<Vector2, Vector2,Vector2> OnRectDrawEvent;

    /// <summary>
    /// 返回为true / false
    /// </summary>
    public static event Func<bool> OnRectDrawCompletedEvent;
    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            startPos = Input.mousePosition;
            m_Image.transform.position = startPos;
        }
        else if (Input.GetMouseButton(0))
        {
            endPos = Input.mousePosition;

            if (endPos.x>startPos.x&&endPos.y>startPos.y)
            {
                m_Image.rectTransform.pivot = new Vector2(0,0);
                m_Image.rectTransform.sizeDelta = endPos - startPos;
                OnRectDrawEvent?.Invoke(startPos, endPos, new Vector2(0, 0));
            }
            else if (endPos.x < startPos.x && endPos.y < startPos.y)
            {
                m_Image.rectTransform.pivot = new Vector2(1, 1);
                m_Image.rectTransform.sizeDelta =  startPos-endPos;
                OnRectDrawEvent?.Invoke(startPos, endPos, new Vector2(1, 1));
            }
            else if(endPos.x > startPos.x && endPos.y < startPos.y)
            {
                m_Image.rectTransform.pivot = new Vector2(0, 1);
                m_Image.rectTransform.sizeDelta = new Vector2(Mathf.Abs(endPos.x-startPos.x),Mathf.Abs(endPos.y-startPos.y));
                OnRectDrawEvent?.Invoke(startPos, endPos, new Vector2(0, 1));
            }
            else
            {
                m_Image.rectTransform.pivot = new Vector2(1, 0);
                m_Image.rectTransform.sizeDelta = new Vector2(Mathf.Abs(endPos.x - startPos.x), Mathf.Abs(endPos.y - startPos.y));
                OnRectDrawEvent?.Invoke(startPos, endPos, new Vector2(1, 0));
            }
        }
        else if (Input.GetMouseButtonUp(0))
        {        
            m_Image.rectTransform.sizeDelta = new Vector2(0,0);
            startPos.x = 0;
            startPos.y = 0;
            //bool isFocusFaith = OnRectDrawCompletedEvent();

        }
    }


}

 

标签:鼠标,Image,rectTransform,Unity,endPos,new,框选,startPos,Vector2
From: https://www.cnblogs.com/WantPeach/p/18552135

相关文章

  • 【Unity】ScriptableObject的应用和3D物体跟随鼠标移动:鼠标放置物体在场景中
    需求说明结合前篇,仓库管理和获取鼠标点击的世界坐标位置两篇内容,已经实现了:鼠标或键盘控制玩家移动;玩家触碰物体后,将物体放入仓库;鼠标点击仓库栏中的物体,任意放在空间中的功能。接下来想要实现:鼠标点击仓库栏的物体之后,物体会跟随鼠标移动;键盘控制待放置的......
  • PICO & Unity VR实战 经验(1)
    (1)安装团结引擎Hub和编辑器,并在添加模块窗口处,勾选AndroidSDK&NDKTools和OpenJDK。和简体中文语言包。(2)点击新建项目,未安装里面有3D(URP),点击下载并使用。注:组件要是可以更新的,这里建议你更新。(3)如何导入PICOVR的SDK到Unity教程(4)导入完成时,会弹出一个窗口——警告,......
  • unity3d————场景异步加载
    总结本文介绍了Unity中场景切换的两种方法:同步切换和异步切换。同步切换在切换场景时会删除当前场景的所有对象并加载下一个场景的信息,可能导致卡顿。因此,异步切换被引入来解决这个问题。异步切换有两种实现方式:通过事件回调函数和通过协程。通过事件回调函数实现异步加载代......
  • CSS3 超实用属性:pointer-events(可穿透图层的鼠标事件)
    1、是什么pointer-events 直译为指针事件,该属性指定在什么情况下某个DOM可以成为鼠标事件的target。简而言之,就是允许/禁止DOM的鼠标事件(click事件、hover事件、mouse事件等鼠标事件)2、具体属性分析用法分析:pointer-events:auto|none|visiblePainted|visibleFill|......
  • MDK 的编译过程及文件类型全解——好记性不如烂鼠标
    本文是学习野火的指南针开发板过程的学习笔记,可能有误,详细请看B站野火官方配套视频教程(这个教程真的讲的很详细,给官方三连吧)引言:     我们用MDK编写源代码,然后编译生成机器码,再把机器码下载到STM32芯片上运行,但是这个编译、下载的过程MDK究竟做了什么工作?它编译后......
  • Unity 6发布:付费下载机制下线,游戏运行效果显著提升
    Unity6发布:付费下载机制下线,游戏运行效果显著提升点击蓝链领取游戏开发教程在十月中旬,Unity公司在多个平台上隆重发布了其游戏开发引擎的全新力作——Unity6版本,此版本恰好紧随Unity官方宣布废除“付费下载”制度之后问世,标志着一次重要的版本迭代。点击蓝链领取游戏......
  • 《Java核心技术 卷I》用户图形界面鼠标事件
    鼠标事件        如果只希望用户能够点击按钮或菜单,那么就不需要显式地处理鼠标事件,鼠标操作将由用户界面中的各种组件内部处理,不过,如果希望用户能使用鼠标画图,就需要捕获鼠标移动,点击和拖动事件。本节,我们将展示一个简单的图形编辑器应用,它允许用户在画布上放置、移......
  • unity3d————Resources异步加载
    知识点一:Resources异步加载是什么?在Unity中,资源加载可以分为同步加载和异步加载两种方式。同步加载会在主线程中直接进行,如果加载的资源过大,可能会导致程序卡顿,因为从硬盘读取数据到内存并进行处理是需要时间的。而异步加载则是Unity内部新开一个线程进行资源加载,这样就不会造......
  • 【Unity】鼠标点击获取世界坐标位置:物体移动至鼠标点击的位置
    需求说明鼠标点击3D场景时,可以获取其所在的世界坐标;鼠标点击3D物体时,可以获取该物体;鼠标点击3D物体时,可以让玩家移动至该物体;成果展示Scene部分关于仓库栏的设置,物体如何进入仓库内容【查看此篇】能够被获取的物体,必须需要是一个碰撞体,即绑定了碰撞体组件。Mouse3D需要......
  • 【Unity相机和角色控制插件】RPG Cameras & Controllers 提供了一套完整的相机和角色
    RPGCameras&Controllers是一款专为RPG游戏设计的Unity插件,提供了一套完整的相机和角色控制系统,帮助开发者快速实现第三人称视角和角色移动控制。这个插件包括了多个自定义选项,允许开发者轻松调整相机和角色控制的行为,适用于动作角色扮演类游戏(ARPG)或传统RPG类型的项......