Unity 实现物体拖拽
Unity实现拖拽:

也可以继承Unity EventSystem中的接口实现。
当鼠标按下的时候以左键为例:
Using System.Collections;
Using System.Collections.Generic;
Using UnityEngine; public class Test:MonoBehavioout{ private Vector3 mousePos;//鼠标位置屏幕 private Vector3 targetPos;//目标位置 private Vector3 offect;//偏移位置鼠标转世界坐标与transform.position的偏移量 private Transform tran;//目标体Transform组件 void Awake(){
tran=transform;//获取Transform组件
} Ienumerator OnMousedown{//Mono中的OnMouseDown可以改成协程
mousePos=new Vector3(Input.mousePosition.x,Input.mousePosition.y,tran.position.z);
offect=tran.position-Camera.main.ScreenToWorldPoint(mousePos);
while(Input.GetMouseButton()){
mousePos=new Vector3(Input.mousePosition.x,Input.mousePosition.y,tran.position.z);
targetPos=offect+Camera.main.ScreenToWorldPoint(mousePos);
tran.position=targetPos;
yield return new WaitForFixedUpdate();
}
}
当需要拖拽的物体是UI是,会阻挡射线检测即OnMouseDown等消息机制无法监听到,为了解决这个情况我们需要用到EventTrigger组件,用法类似给Button加上函数。
最重要的是对于UI使用的坐标并非transform组件而是rectTransform组件,故坐标为anchoredPosition才是UI的rect坐标。为了使鼠标坐标能够转换为rectPos坐标需要用到RectTransformUtility.ScreenPointToLocalPointInRectangle()函数,例子如下:
using UnityEngine;
using System.Collections; public class Test:MonoBehaviour{ Canvas canvas;//当前UI所在的画布
RectTransform rectTransform; void Statr(){
rectTransform=transform as RectTransform;//将当transform组件转换为RectTransform
canvas=GameObject.Find(“Canvas”).GetComponent<Canvas>();
} void Update(){
Vector2 Pos;
if(RectTransformUtility.ScreenPointToLocalPointInRectangle
(canvas.transform as RectTransform,Input.mousePosition,canvas.worldCamera,out pos))
rectTransform.anchoredPosition=pos;
}
其中rect 代表当前UI父对象的Rect,screecPoint代表需要转换成LocalPoint的屏幕坐标,cam代表渲染的相机,LocalPoint存储当前的LocalPos。若Canvas渲染模式为Overlay(叠加)模式cam为null。

Unity 实现物体拖拽的更多相关文章
- Unity编辑器 - DragAndDrop拖拽控件
Unity编辑器 - DragAndDrop拖拽控件 Unity编辑器的拖拽(DragAndDrop)在网上能找到的资料少,自己稍微研究了一下,写了个相对完整的案例,效果如下 代码: object d ...
- 在屏幕拖拽3D物体移动
3D物体的拖拽不同于2D的.因为3D物体有x,y,z当然.实际拖拽还是在XZ平面.只是多了几个转换 using UnityEngine; using System.Collections; publi ...
- NGUI的拖拽和放下功能的制作,简易背包系统功能(drag and drop item)
一我们添加sprite,给sprite添加背景图片和添加box collider,但是drag and drop item在attach中是找不到的只能在add component中查找添加,如下图: ...
- 【狼】unity 鼠标拖拽物体实现任意角度自旋转
主要涉及函数 Input.GetAxis(“Mouse x”) 可取得鼠标横向(x轴)移动增量 Input.GetAxis(“Mouse y”) 可取得鼠标竖向(y轴)移动增量 通过勾股定理获取拖拽长 ...
- Unity实现放大缩小以及相机位置平移实现拖拽效果
放大缩小功能是游戏开发中用到的功能,今天就来讲一下Unity中放大缩小怎么实现. 1.IDragHandler, IBeginDragHandler, IEndDragHandler这三个接口是Uni ...
- TriggerPrefab 拖拽物体
模拟经营类游戏 有一个特点,就是 拖拽物体.常见的有<帝国><红警><部落战争><凯撒大帝>等等 2d 拖拽 大部分都是 用 OnDrag 方法来 拖动 ...
- [Unity]背包效果-使用NGUI实现物品的拖拽效果Drag
背包效果-使用NGUI实现物品的拖拽效果Drag 效果实现如图 对象层级关系图 PacketCell - Right 对象作为单元格背景 PacketContainer 对象作为单元格容器 Packe ...
- Unity输出PC端(Windows) 拖拽文件到app中
需求:给策划们写一个PC端(Window)的Excel导表工具.本来用OpenFile打开FileExplorerDialog后让他们自己选择想要添加的Excel文件就行了,结果有个需求是希望能拖拽E ...
- Unity UGUI 实现简单拖拽功能
说到拖拽,那必然离不开坐标,UGUI 的坐标有点不一样,它有两种坐标,一种是屏幕坐标,还有一种就是 UI 在Canvas内的坐标(暂时叫做ugui坐标),这两个坐标是不一样的,所以拖拽就需要转换. 因 ...
随机推荐
- Linux往log中写日志
void writelog(const char* log) { time_t tDate; struct tm* eventTime; time(&tDate);//得到系统当前时间 //将 ...
- 微信小程序 setData动态设置数组中的数据
setdata传递动态数据值必须为对象(只能是key:value) 语法如下 this.setData({ filter: 1212 }) 如果setdata要传递数组呢? 首先相到的是 this.s ...
- Jmeter之cookie的处理方式,token处理
cookie是什么 由于http是无状态的协议,一旦客户端和服务器的数据交换完毕,就会断开连接,再次请求,会重新连接,这就说明服务器单从网络连接上是没有办法知道用户身份的.怎么办呢?那就给每次新的用户 ...
- LAMP 系统性能调优之网络文件系统调优
LAMP 系统性能调优之网络文件系统调优 2011-03-21 09:35 Sean A. Walberg 网络转载 字号:T | T 使用LAMP系统的用户,都想把自己LAMP性能提高运行的速度提高 ...
- HDU-2389-Rain on your Parade (最大匹配,kopcroft-karp)
链接: https://vjudge.net/problem/HDU-2389 题意: You're giving a party in the garden of your villa by the ...
- javascript(腾讯)
var a={key:"1",value:2}; war b=a; b.value+=a.key, 打印b.value是多少,a.value呢? 答案:都是21.因为javascr ...
- Codeforces 1272D
题意:给定一个长度为n的数组a,你至多可以删去其中的一个元素,找出最长的连续(严格)上升子序列的长度. 分析:读完题之后可以发现这道题和模板:连续上升子序列很相像,首先可以确定方向是dp:状态是当前的 ...
- 视图:setContentView()
1.setContentView的作用是将View加载到根view之上,这样当显示view时,先显示根view,然后在显示子view,以此类推,最终将所有view显示出来. 2.setContentV ...
- HY中考游记
回首三年荏苒,还是有许多忘不了,有始有终,最后以一篇游记来记录落幕吧 Day -inf 为了准备中考从机(颓)房回到学校了,停课这么久,也该好好备考了 希望能回到以前的文化课水平QAQ Day -? ...
- sh_01_九九乘法表
sh_01_九九乘法表 def multiple_table(): # 1. 打印 9 行小星星 row = 1 while row <= 9: col = 1 while col <= ...