南梦宫 拼图笔记 1.流畅的拖拽操作
实现:流畅的拖拽GameObject
主要注意:MonoBehaviour下的默认接口:
void OnMouseDown()
void OnMouseUp()
void Updata
还有一点:计算射线交点时候,代码里用的ray和plane, 而不是这个挂接的GameObject。如果使用ray和挂接的GameObject可能会出现:鼠标滑动过快,导致鼠标移除GameObject,不再计算位置。
using System.Collections; using System.Collections.Generic; using UnityEngine;/// <summary> /// 单个Piece的控制器 /// </summary> public class PieceControl : MonoBehaviour {/// <summary>/// 正确的位置 成功后不再移动/// </summary>private Vector3 mFinishedPos = Vector3.zero;/// <summary>/// 初始随机的错误位置/// </summary>private Vector3 mStartPos = Vector3.zero;private Camera mGameCamera = null;private GameObject mCameraObject = null;private PieceState mNowState = PieceState.None;private Vector3 mOffsetVec3 = Vector3.zero;/// <summary>/// 已经选中了这个对象/// </summary>private bool mIsClickObject = false;/// <summary>/// 鼠标是否按下/// </summary>private bool mIsMouseDown = false;private Vector3 oldInput = Vector3.zero;// Use this for initializationvoid Start(){mCameraObject = GameObject.FindGameObjectWithTag("MainCamera");mGameCamera = mCameraObject.GetComponent<Camera>();}void Update(){if (mIsMouseDown){DragingRefreshPos();}}// 按下鼠标按键时 void OnMouseDown(){this.mIsMouseDown = true;Debug.LogError("Down:"+this.name);GetBeginDownOffset();}// 松开鼠标按键时void OnMouseUp(){Debug.LogError("Up" + this.name);this.mIsMouseDown = false;}/// <summary>/// 获取刚拖动object时鼠标交点和object中心的偏移/// </summary>private void GetBeginDownOffset(){Vector3 rejectPos = Vector3.zero;if (GetClickProjectPos(ref rejectPos, Input.mousePosition)){mOffsetVec3 = transform.position - rejectPos;mIsClickObject = true;}}/// <summary>/// 根据GameObject和mouse的相对位置/// 每帧刷新拖动的位置/// </summary>private void DragingRefreshPos(){if (mIsClickObject){Vector3 rejectPos = Vector3.zero;if (GetClickProjectPos(ref rejectPos, Input.mousePosition)){transform.position = mOffsetVec3 + rejectPos;}}}/// <summary>/// 获取交点坐标/// 当鼠标射线和大plane相交/// </summary>/// <returns></returns>private bool GetClickProjectPos(ref Vector3 click3dPos, Vector3 inputPos){Ray ray = mGameCamera.ScreenPointToRay(inputPos);// Debug.LogError("GetClickProjectPos oldInput:" + oldInput + " inputpos:" + inputPos);oldInput = inputPos;Plane plane = new Plane(Vector3.forward, new Vector3(0.0f, this.transform.position.y, 0.0f));float rayDepth;if(plane.Raycast(ray,out rayDepth)){click3dPos = ray.origin + ray.direction * rayDepth;return true;}return false;}#region 碎片的状态private enum PieceState{None = -1,Idle = 0,Draging = 2,Finished = 3,Restart = 4,Snapping = 5//吸附过程中 }#endregion}
转载于:https://www.cnblogs.com/sun-shadow/p/9206173.html
南梦宫 拼图笔记 1.流畅的拖拽操作相关推荐
- WPF 的拖拽操作(DragDrop)
在WPF中似乎没有对拖拽操作进行改变,和以前的方式一样.如果曾近在 Windows 窗体应用程序中使用过鼠标拖放,就会发现在 WPF 中的编程接口实际上没有发生变化.重要的区别是用于拖放操作的方法和事 ...
- UE4 二维地图的缩放与拖拽操作
这里写自定义目录标题 UE4 二维地图的缩放与拖拽操作 拖拽和缩放 基础搭建 添加小图标 地图缩放 地图拖拽 实现部分 效果展示 小图标的重合显示 效果展示 UE4 二维地图的缩放与拖拽操作 纯蓝图实 ...
- 使用jq-ui实现选中多元素进行拖拽操作
使用jq-ui实现选中多元素进行拖拽操作 开发中为了方便用户想引入拖拽操作,但发现jq只支持单个节点拖拽,google百度了半天只有几个实现了多选拖拽了例子,但感觉不是很好用,所以干脆利用晚上时间自己 ...
- [模拟拖拽] 模拟将一个文件拖拽到一个软件窗口上,实现拖拽操作(微信语音播放器)...
"金蛇语音播放器" 是我随便写的一个假名.要实现的功能是: 我在网上下载了一个播放器,在自己公司的软件中使用,用来播放微信的语音. 因为版权问题,我不想让别人知道我用的是金蛇播放器 ...
- 微信小程序~触摸相关事件(拖拽操作、手势识别、多点触控)
touchstart 手指触摸动作开始 touchmove 手指触摸后移动 touchcancel 手指触摸动作被打断,如来电提醒,弹窗 touchend 手指触摸动作结束 拖拽操作案例1:(注意按钮 ...
- highchart的draggable-points.js依赖实现图表的动态拖拽操作
highchart的draggable-points.js依赖实现图表的动态拖拽操作 需求 实现 总结 需求 实现一个曲线图,能够通过鼠标去拖拽点,来进行修改图表 实现 例子基于vue来实现,如果是j ...
- html 拖放实现拼图游戏,Canvas drag 实现拖拽拼图小游戏
博主一直心心念念想做一个小游戏- 前段时间终于做了一个小游戏,直到现在才来总结,哈哈- 以后要勤奋点更新博客! 实现原理 1.如何切图? 用之前的方法就是使用photoshop将图片切成相应大小的图 ...
- 笔记十三 :Egret拖拽对象与吸附对象(基于通用MVC框架)
前言:拖拽对象是2D游戏中常用的一个功能,例如<植物大战僵尸>中种植植物的表现形式,拖拽植物卡片种植到相应的地点. 思路:在Egret中实现拖拽对象,需要用到TOUCH_MOVE事件的监听 ...
- Qt工作笔记-ListWidget拖动(拖拽)到QGraphicsScene【补坑】【Qt视图框架补坑】
关于以前的这篇博文,进行补坑 https://blog.csdn.net/qq78442761/article/details/80957186 坑的位置在这,采用上面这篇博文的配法,无法得到图元在场 ...
最新文章
- Python读取xlsx文件报错:raise XLRDError(FILE_FORMAT_DESCRIPTIONS[file_format]+‘; not supported‘)
- 【转】校园网综合布线系统设计方案
- 怎么用c语言画出坐标曲线,c语言打印贝塞尔曲线坐标(三阶)
- leetcode 153. Find Minimum in Rotated Sorted Array | 153. 寻找旋转排序数组中的最小值(二分查找)
- iview render的时候可以写控件的基本格式
- 关于python 和C++使用cv画矩形并填充颜色同时填充文字
- 作为window对象属性的元素 多窗口和窗体
- 学习笔记之04-第一个OC程序解析
- 构建之法阅读笔记之三
- gluoncv 目标检测,训练自己的数据集
- YOLO系列目标检测算法-YOLOv2
- 外包公司是做什么的?
- GH4199变形合金
- 罗翔陈佩斯:从狂妄到自省
- 费解的开关 Java
- 集中隔离第3天(其实说的都是前2天的事) 2022.2.27
- css3中-moz、-ms、-webkit、 - o -各什么意思
- pandas使用read_csv函数读取文件的前N行数据并保留表头、pandas使用read_csv函数读取制表符分割的文件(tab-delimited)、自定义设置sep参数
- 微信自媒体账号涉违规大规模被封
- BackupPC 备份迁移的使用
热门文章
- Unreal Engin_画廊制作笔记 _010给墙画添加灯光
- 24、Java——银行存款取款系统(对象+集合)
- JDBC——商品品牌数据的增删改查操作
- 强强联手:诚迈科技携手研华共同发起嵌入式Linux和Android联盟
- linux scp传输文件权限被拒绝,Linux的远程传输文件scp及出现Permission denied (publickey).lost connection问题解决方法...
- Azure Synapse Analytics (Azure SQL DW)性能优化指南(1)——使用有序聚集列存储索引优化性能
- 郑州大学计算机新媒体专业介绍,数字媒体专业介绍
- UltraEdit v14.00注册码
- 人是可以被驯养的——斯德哥尔摩综合症
- Weisfeiler-Lehman(WL)算法