Unity常用的三种拖拽方法(内置方法 + 接口 + Event Trigger组件)

这篇具有很好参考价值的文章主要介绍了Unity常用的三种拖拽方法(内置方法 + 接口 + Event Trigger组件)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


目录

内置方法OnMouseDrag【对象含有Collider组件】

配对小游戏

Event Trigger组件

接口

窗口小案例


内置方法OnMouseDrag【对象含有Collider组件】

OnMOuseOver()检测鼠标是否进入到这个2D贴图

当鼠标进入或离开2D贴图,会相应的放大、缩小

private void OnMouseEnter()

    {

        transform.localScale += Vector3.one * 0.1f;

    }

    private void OnMouseExit()

    {

        transform.localScale -= Vector3.one * 0.1f;

}

经验:只会在2D场景贴图和3D场景中使用OnMouseDrag等内置方法

配对小游戏

unity 拖拽,UNITY基础,unity,游戏引擎

 

​
private bool isFinished;//是否拖到了正确位置

    [SerializeField] private Transform correctTrans;

    private Vector2 startPos;

    // Start is called before the first frame update

    void Start()

    {

        startPos = transform.position;

}

//如果没有拖拽到正确位置,图片在松开鼠标的时候,回到一开始位置

    private void OnMouseDrag()

    {

        if(isFinished==false)

        {//图片跟着鼠标一起移动

            Vector2 cursorPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);



 

            transform.position = new Vector2(cursorPos.x, cursorPos.y);

        }

    }

    private void OnMouseUp()

    {

  //如果当前拖得图片和对应正确位置足够小,就让当前图片固定到正确位置,否则回到原来位置       if(Mathf.Abs(transform.position.x-correctTrans.position.x)<=0.5f&&Mathf.Abs(transform.position.y-correctTrans.position.y)<=0.5f)

        {

            transform.position = correctTrans.position;

            isFinished = true;

        }

        else

        {

            transform.position = new Vector2(startPos.x, startPos.y);

        }

}

​

调整Sorting Layer渲染层顺序

Event Trigger组件

Event Trigger—>Add New Event Type根据不同的事件类型实现不同的交互效果

unity 拖拽,UNITY基础,unity,游戏引擎

 

private Vector3 startPos;

    void Start()

    {

        startPos = transform.position;

    }

    public void DragMethod()

    {

        transform.position = Input.mousePosition;

        //如果UI模式是ScreenSpace Overlay,可以直接将鼠标位置信息赋值给transform.position

    }

    public void EndDragMethod()

    {

        GameObject slotGo = GameObject.Find("Slot");

        //在所有游戏对象中通过名字查找

        float dist = Vector3.Distance(transform.position, slotGo.transform.position);

        if (dist <= 100)

            transform.position = slotGo.transform.position;

        else

            transform.position = startPos;

    }

接口

引用 using UnityEngine.EventSystems命名空间

接口中方法没有方法体的,接口的成员,也都是(隐式的)public公共类

使用这个接口必须将接口中未实现的方法加以实现

有关Drag的接口,BeginDrag,EndDrag,IDrag

BeginDrag和EndDrag要在有IDrag的基础上

public class Move : MonoBehaviour,IBeginDragHandler,IEndDragHandler,IDragHandler

{

    private RectTransform rectTrans;

    private CanvasGroup canvasGroup;

    void Start()

    {

        rectTrans = GetComponent<RectTransform>();

        canvasGroup = GetComponent<CanvasGroup>();

    }

    public void OnDrag(PointerEventData eventData)

    {

        rectTrans.anchoredPosition += eventData.delta;

        //获取这个UI图片相对于Anchor锚点的位置坐标信息

        //eventData.delta自从上一次Update,用户拖着这个对象所移动的2D位置坐标信息      

    }

    public void OnBeginDrag(PointerEventData eventData)

    {

        canvasGroup.blocksRaycasts = false;

        canvasGroup.alpha = 0.5f;

    }

    public void OnEndDrag(PointerEventData eventData)

    {

        canvasGroup.blocksRaycasts = true;

        canvasGroup.alpha = 1f;

    }

表示在刚开始拖拽的整个过程中,鼠标不会在去把这个UI物体当作阻挡物,

保证拖拽物品到槽的上方时,鼠标能顺利的去忽略这个UI物体

}

Canvas Group组件  管理这一物体包括它的子物体的所有UI对象(透明度,可交互,是否遮挡等属性)

鼠标只有放在槽上方的时候松开,才能判断拖拽的物体在槽内还是槽外

,IDrapHander 在松开物品后被调用,若没有调用,槽被上一层所拖拽的UI对象所遮罩了,无法获取到鼠标何时松开Drop的操作

public class Slot : MonoBehaviour,IDropHandler

{

    public void OnDrop(PointerEventData eventData)

    {

        eventData.pointerDrag.GetComponent<RectTransform>().anchoredPosition = GetComponent<RectTransform>().anchoredPosition;

    }    

}

eventData.pointerDrag直接获取鼠标当前拖拽的这个游戏对象

若鼠标和拖拽的点的位置偏离过大

,去检查Canvas画布中Scale数值是否为1

窗口小案例

通过接口实现针对不同的UI面板窗口,进行拖拽的功能,并且点击的窗口会显示在UI的最高层

unity 拖拽,UNITY基础,unity,游戏引擎

 

public class Anli : MonoBehaviour,IBeginDragHandler,IDragHandler

{

    public RectTransform panelRectTrans;

    public void OnBeginDrag(PointerEventData eventData)

    {

        panelRectTrans.SetAsLastSibling();

        //设置为同级最下方的位置

    }

    public void OnDrag(PointerEventData eventData)

    {

        panelRectTrans.anchoredPosition += eventData.delta;

    }

}

【盘点】Unity常用的三种拖拽方法(内置方法 + 接口 + Event Trigger组件)_哔哩哔哩_bilibili

【仅当学习笔记,若有冒犯,必删】文章来源地址https://www.toymoban.com/news/detail-811989.html

到了这里,关于Unity常用的三种拖拽方法(内置方法 + 接口 + Event Trigger组件)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity鼠标带动物体运动的三种方法

    目录 第一种:物体跟随鼠标移动。 第二种:鼠标拖动物体运动。 第三种:鼠标点到哪,物体运动到哪。 描述:鼠标左键点击物体,将物体拾起,松开鼠标左键,物体跟随鼠标光标移动。再次点击鼠标左键,物体不在跟随鼠标,处于静止状态。 实现方法:射线。 165767804284

    2024年02月02日
    浏览(57)
  • Mysql - 常用插入数据的三种方法详解及练习

    目录 🥙8.1.1 mysql中常用的三种插入数据的语句 1. insert into - 插入数据 2. replace into - 插入替换数据 3. insert ignore - 如果已存在,忽略当前新数据 🥙8.1.2 以上三种方法的练习及区分 🥙8.1.3 说明 🥙8.1.4 牛客练习题 1. insert into - 插入数据 数据库会检查 主键 ,如果出现重复会报错

    2024年03月24日
    浏览(45)
  • 【Unity】 基础交互入门(按钮点击事件的三种方法)

    1、在资源面板创建C#脚本 2、创建点击事件需要执行的代码(这里以loadMain为例),新增一个叫OnStartButtonClick的Public方法。 可以选择生成或者调试,从VS更新代码到Unity。 3、场景中创建Button和empty(生成空的GameObject) 4、将代码挂在刚刚的GameObject上(这里将GameObject重命名为

    2024年02月09日
    浏览(50)
  • 在Unity中挂载C#脚本的三种方法

    ①在Project(工程)窗口的某个文件夹中(也可以选择新建在Assets(资源根目录)中),然后单击鼠标右键,选择Create-C# Script 注意:扩展名在Unity编辑器中是隐藏的! ②然后再直接拖拽到Hierarchy(层级视图)你想要挂载的物体上 ①在Project(工程)窗口的某个文件夹中(也可

    2024年02月03日
    浏览(38)
  • 【100个 Unity实用技能】☀️ | Unity读取本地文件(Json,txt等)的三种方法示例

    老规矩,先介绍一下 Unity 的科普小知识: Unity 是 实时3D互动内容创作和运营平台 。 包括 游戏开发 、 美术 、 建筑 、 汽车设计 、 影视 在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和

    2023年04月08日
    浏览(66)
  • 实现ConfigMap热更新的三种常用方法:使用sidecar、CI脚本和自定义Controller

    目录 背景 方法一:使用ConfigMap-Reload Sidecar 方法二:使用CI脚本实现ConfigMap热更新 方法三:使用Controller实现ConfigMap热更新 结论 ConfigMap是Kubernetes中用来存储配置信息的一种资源类型。在Kubernetes集群中,ConfigMap被广泛地用于存储应用程序的配置信息。这些配置信息可以包括环

    2024年02月09日
    浏览(47)
  • 电力系统分析常用的三种迭代方法(雅克比、高斯赛德尔、牛顿拉夫逊法)求解方程的精确解

    一、分别运用雅克比、高斯-赛德尔两种迭代方法计算如下方程:    解:由于系数方程组不满足严格行(列)对角优矩阵的条件,即迭代不收敛,故将方程组转化成以下形式:   (一)Jacobi迭代法: 迭代方程可以化为:  得迭代矩阵:  可以在Matlab编写出以下迭代程序,创

    2024年01月18日
    浏览(52)
  • rsync常用的三种用法

    用法1:本地用法 类似于cp、dd命令,实现备份文件的复制(备份) # rsync /etc/passwd /home/passwd.bak # rsync -b --suffix=.bak2 --backup-dir=/tmp/ /etc/passwd /home/passwd.bak --suffix=xxx        指定旧备份文件的后缀名 --backup-dir=xxxx   指定将旧备份文件移动到哪个位置下 1 2 3 4 用法2:远程shell 利用

    2024年01月17日
    浏览(37)
  • Docker——常用挂载的三种方式

    在 Docker 中,有三种常见的挂载方式,它们分别是: 绑定挂载(Bind Mounts) :绑定挂载是将主机上的文件或目录挂载到容器中。这种挂载方式允许容器与主机之间共享文件和目录,并且对其中一个的更改会直接影响到另一个。可以通过在运行容器时使用  -v  或  --mount  参数

    2024年02月12日
    浏览(57)
  • JavaScript中常用的三种弹窗

    目录 一、alert(警告框) 二、confirm(确认框) 三、prompt (提示框)   JavaScript 中可以创建三种消息框:警告框、确认框、提示框。         alert()方法是显示一条弹出提示消息和确认按钮的警告框。 需要注意的是 :         alert()是一个阻塞的函数,如果我们不点确认

    2024年02月13日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包