实现:流畅的拖拽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.流畅的拖拽操作相关推荐

  1. WPF 的拖拽操作(DragDrop)

    在WPF中似乎没有对拖拽操作进行改变,和以前的方式一样.如果曾近在 Windows 窗体应用程序中使用过鼠标拖放,就会发现在 WPF 中的编程接口实际上没有发生变化.重要的区别是用于拖放操作的方法和事 ...

  2. UE4 二维地图的缩放与拖拽操作

    这里写自定义目录标题 UE4 二维地图的缩放与拖拽操作 拖拽和缩放 基础搭建 添加小图标 地图缩放 地图拖拽 实现部分 效果展示 小图标的重合显示 效果展示 UE4 二维地图的缩放与拖拽操作 纯蓝图实 ...

  3. 使用jq-ui实现选中多元素进行拖拽操作

    使用jq-ui实现选中多元素进行拖拽操作 开发中为了方便用户想引入拖拽操作,但发现jq只支持单个节点拖拽,google百度了半天只有几个实现了多选拖拽了例子,但感觉不是很好用,所以干脆利用晚上时间自己 ...

  4. [模拟拖拽] 模拟将一个文件拖拽到一个软件窗口上,实现拖拽操作(微信语音播放器)...

    "金蛇语音播放器" 是我随便写的一个假名.要实现的功能是: 我在网上下载了一个播放器,在自己公司的软件中使用,用来播放微信的语音. 因为版权问题,我不想让别人知道我用的是金蛇播放器 ...

  5. 微信小程序~触摸相关事件(拖拽操作、手势识别、多点触控)

    touchstart 手指触摸动作开始 touchmove 手指触摸后移动 touchcancel 手指触摸动作被打断,如来电提醒,弹窗 touchend 手指触摸动作结束 拖拽操作案例1:(注意按钮 ...

  6. highchart的draggable-points.js依赖实现图表的动态拖拽操作

    highchart的draggable-points.js依赖实现图表的动态拖拽操作 需求 实现 总结 需求 实现一个曲线图,能够通过鼠标去拖拽点,来进行修改图表 实现 例子基于vue来实现,如果是j ...

  7. html 拖放实现拼图游戏,Canvas drag 实现拖拽拼图小游戏

    博主一直心心念念想做一个小游戏-  前段时间终于做了一个小游戏,直到现在才来总结,哈哈- 以后要勤奋点更新博客! 实现原理 1.如何切图? 用之前的方法就是使用photoshop将图片切成相应大小的图 ...

  8. 笔记十三 :Egret拖拽对象与吸附对象(基于通用MVC框架)

    前言:拖拽对象是2D游戏中常用的一个功能,例如<植物大战僵尸>中种植植物的表现形式,拖拽植物卡片种植到相应的地点. 思路:在Egret中实现拖拽对象,需要用到TOUCH_MOVE事件的监听 ...

  9. Qt工作笔记-ListWidget拖动(拖拽)到QGraphicsScene【补坑】【Qt视图框架补坑】

    关于以前的这篇博文,进行补坑 https://blog.csdn.net/qq78442761/article/details/80957186 坑的位置在这,采用上面这篇博文的配法,无法得到图元在场 ...

最新文章

  1. Python读取xlsx文件报错:raise XLRDError(FILE_FORMAT_DESCRIPTIONS[file_format]+‘; not supported‘)
  2. 【转】校园网综合布线系统设计方案
  3. 怎么用c语言画出坐标曲线,c语言打印贝塞尔曲线坐标(三阶)
  4. leetcode 153. Find Minimum in Rotated Sorted Array | 153. 寻找旋转排序数组中的最小值(二分查找)
  5. iview render的时候可以写控件的基本格式
  6. 关于python 和C++使用cv画矩形并填充颜色同时填充文字
  7. 作为window对象属性的元素 多窗口和窗体
  8. 学习笔记之04-第一个OC程序解析
  9. 构建之法阅读笔记之三
  10. gluoncv 目标检测,训练自己的数据集
  11. YOLO系列目标检测算法-YOLOv2
  12. 外包公司是做什么的?
  13. GH4199变形合金
  14. 罗翔陈佩斯:从狂妄到自省
  15. 费解的开关 Java
  16. 集中隔离第3天(其实说的都是前2天的事) 2022.2.27
  17. css3中-moz、-ms、-webkit、 - o -各什么意思
  18. pandas使用read_csv函数读取文件的前N行数据并保留表头、pandas使用read_csv函数读取制表符分割的文件(tab-delimited)、自定义设置sep参数
  19. 微信自媒体账号涉违规大规模被封
  20. BackupPC 备份迁移的使用

热门文章

  1. Unreal Engin_画廊制作笔记 _010给墙画添加灯光
  2. 24、Java——银行存款取款系统(对象+集合)
  3. JDBC——商品品牌数据的增删改查操作
  4. 强强联手:诚迈科技携手研华共同发起嵌入式Linux和Android联盟
  5. linux scp传输文件权限被拒绝,Linux的远程传输文件scp及出现Permission denied (publickey).lost connection问题解决方法...
  6. Azure Synapse Analytics (Azure SQL DW)性能优化指南(1)——使用有序聚集列存储索引优化性能
  7. 郑州大学计算机新媒体专业介绍,数字媒体专业介绍
  8. UltraEdit v14.00注册码
  9. 人是可以被驯养的——斯德哥尔摩综合症
  10. Weisfeiler-Lehman(WL)算法