【ugui的坑】实现可拖拽的Sprite

2 篇文章 0 订阅
1 篇文章 0 订阅

最近由于个人项目的需要,必须去做一个可以被拖拽的Sprite出来。这里涉及到的两个问题。
1.Sprite应该可以响应点击事件,拖拽事件等。
2.如何从屏幕坐标系转换为世界坐标系。


关于问题1,解决方案很多,但我发现ugui是有一些已经封装好了的方法的,非常方便可以直接拿来使用。
方案一,可以使用给想要响应的物体绑上一个EventTrigger脚本来实现,然后在面板中选择想要触发的事件以及想要绑定的处理方法。这种方案适合你想要触发的处理方法不在本物体身上的时候,因为它允许直接指定其他物体上绑定的处理方法。但是我没在这种方法中找到与该事件相关的数据(比如,OnPointerDown时的鼠标位置)。
方案二,自己在想要响应的物体上绑上脚本,然后去实现接口(比如IDragHandler等)。这种方法的好处是你可以获得一个类型为PotinerEventData的数据对象,里面有一些与触发的时间有关的数据,不用自己手动去获取,比较方便。
如果看到这篇文章的你,有更好的方法,欢迎与我交流~


关于问题2,试了一下最传统的ScreenToWorldPoint的方法,他要求传入一个屏幕坐标系,但是我很难准确的定位我鼠标选中的Sprite的Z轴值应该为多少,试了官网上说的nearClipPlane,效果不是很好,然后还有人说应该用Ray去做,我觉得……太麻烦了,就在找一些简单的方法,然后就发现了ScreenPointToLocalPointInRectangle((RectTransform rect, Vector2 screenPoint, Camera cam, out Vector2 localPoint)这个方法。目前我的理解是,rect指的是你的屏幕坐标是相对于哪个RectTransform而言,然后screenPoint指的当然就是屏幕坐标,也就是你鼠标的位置,cam就是相对应渲染的那个摄像机(screenPoint和cam都可以通过PotinerEventData来获取到),而localPoint指的就是一个本地的二维向量,这里需要特殊处理的是,如果你指向rect的中心,他返回的值是0,0(目前的项目中是这样,多的还没来得及测试),也就是说,你要以localPoint为基础再加上rect的postion,最终得出的位置才是实际位置。


然后就是一些实际编码了,目前只要转换完成后直接把localPoint加上rect的位置然后直接赋值给对应的View就可以,处于美观考虑,有空的时候可能实现一下缓动什么的?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对整threeJS体系进行全面剖析。整理出全面的教学大纲,涵盖内容面非常广。此教学版本为threeJS107版本。关于版本不建议大家使用低于90的版本学习。以下是课程目录1-ThreeJS概览(基本图形简介,什么是点线面如何绘制点线面,什么是材质,什么是几何体,什么是相机,什么是渲染器,什么是场景)2-相机和渲染器(详解相机类型,渲染器如何使用,针对不同场景怎么用,怎么调效果,怎么渲染,怎么输出画布,如何解决透明问题等等)3-创建平面几何(常见的几何体如何使用,如何使用简单的几何体绘制出自定义自己想要的几何体,关于几何体的性能剖析,如何解决性能,几何体的渲染原理)4-高级图形算法常见库(求直线的斜率  计算线段与圆的交点 计算线段的长度 判断折线是否在多边形内 等等)5-sprite精灵(怎么让一个图标永远朝向屏幕,精灵的属性,精灵材质原理等,广告提示框必用)6-骨骼游戏动画(什么是模型动画,常见游戏案例,如何让人头进行各种攻击动作)7-3d模型加载(常见模型格式,如何渲染不同格式,不同格式的特点,什么格式性能优越,模型渲染异常,贴图不显示等问题详解)8-高阶动态纹理(你所不知道的纹理用法,我说你不知道,你肯定不知道)9-漫游轨迹以及其动画路径(怎么绘制贝塞尔曲线,如何使用曲线上的路径,跟随路径移动的原理,相机如何运动,物体如何运动)10-着色器(什么是着色器。初识着色器基础,着色器材质怎么用,怎么使用着色器库)11-常见渲染以及透明度问题12-对象拾取以及拖拽(3d世界里面如何拖拽物体,拖拽的原理,mousemove mouseon等的事件效果)13-世界坐标以及组的问题(什么是相对坐标,什么是世界坐标,什么是当前坐标,怎么转化父子坐标系,组的优化,为什么用组,组的优势)14-指定对象旋转中心(什么是物体的几何体中心,如何改变中心,如何绕轴转动)15-层级对象渲染(多个场景一键切换,切换的优势,针对大项目的用法)16-拓展了解系列(不定期不断更新案例,各种酷炫效果bloom,halo等,以及各种3d图表,粒子案例等,不断构建你的3d实践能力)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值