Drag

using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class Drag : MonoBehaviour { private Transform _trans;// 目标物体的空间变换组件
private Vector3 _vec3TargetScreenSpace;// 目标物体的屏幕空间坐标
private Vector3 _vec3TargetWorldSpace;// 目标物体的世界空间坐标
private Vector3 _vec3MouseScreenSpace;// 鼠标的屏幕空间坐标
private Vector3 _vec3Offset;// 偏移 void Awake() { _trans = transform; }
IEnumerator OnMouseDown()
{
// 把目标物体的世界空间坐标转换到它自身的屏幕空间坐标
_vec3TargetScreenSpace = Camera.main.WorldToScreenPoint(_trans.position);
// 存储鼠标的屏幕空间坐标(Z值使用目标物体的屏幕空间坐标)
_vec3MouseScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _vec3TargetScreenSpace.z);
// 计算目标物体与鼠标物体在世界空间中的偏移量
_vec3Offset = _trans.position - Camera.main.ScreenToWorldPoint(_vec3MouseScreenSpace);
// 鼠标左键按下
while (Input.GetMouseButton(0))
{
// 存储鼠标的屏幕空间坐标(Z值使用目标物体的屏幕空间坐标)
_vec3MouseScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, _vec3TargetScreenSpace.z);
// 把鼠标的屏幕空间坐标转换到世界空间坐标(Z值使用目标物体的屏幕空间坐标),加上偏移量,以此作为目标物体的世界空间坐标
_vec3TargetWorldSpace = Camera.main.ScreenToWorldPoint(_vec3MouseScreenSpace) + _vec3Offset;
// 更新目标物体的世界空间坐标
_trans.position = _vec3TargetWorldSpace;
// 等待固定更新
yield return new WaitForFixedUpdate();
}
}
}

Move

using UnityEngine;
using System.Collections; public class Move : MonoBehaviour
{
public Transform target;
float distance = 30f;
float xSpeed = 150f;
float ySpeed = 150f;
float yMinLimit = -180f;
float yMaxLimit = 180f;
float x = 0f;
float y = 0f;
Vector2 oldPosition1;
Vector2 oldPosition2;
private bool flag_Roable = true;//自动旋转标志 private System.DateTime oldTime;
private System.DateTime nowTime;
// Use this for initialization
void Start()
{
transform.eulerAngles = new Vector3(0, -90, 0);
Vector3 angles = transform.eulerAngles;
x = angles.y;
y = angles.x;
if (GetComponent<Rigidbody>())
{
GetComponent<Rigidbody>().freezeRotation = true;
}
oldTime = System.DateTime.Now;
} // Update is called once per frame
void Update()
{
nowTime = System.DateTime.Now;
System.TimeSpan ts1 = new System.TimeSpan(oldTime.Ticks);
System.TimeSpan ts2 = new System.TimeSpan(nowTime.Ticks); System.TimeSpan ts = ts2.Subtract(ts1).Duration();
if (ts.Seconds > 8 && !Input.anyKey)
{
flag_Roable = true;
oldTime = System.DateTime.Now;
}
if (Input.anyKey)
{ if (Input.touchCount == 1)
{
if (Input.GetTouch(0).phase == TouchPhase.Moved)
{
//x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
//y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
x = Input.GetAxis("Mouse X") * xSpeed ;
y = Input.GetAxis("Mouse Y") * ySpeed ;
transform.Rotate(Vector3.up * -x * Time.deltaTime, Space.Self);
transform.Rotate(Vector3.right * y * Time.deltaTime, Space.Self);
}
}
if (Input.touchCount > 1)
{
if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved)
{
Vector2 tempPosition1 = Input.GetTouch(0).position;
Vector2 tempPosition2 = Input.GetTouch(1).position;
if (isEnlarge(oldPosition1, oldPosition2, tempPosition1, tempPosition2))
{
float oldScale = transform.localScale.x;
float newScale = oldScale * 1.025f;
transform.localScale = new Vector3(newScale, newScale, newScale);
}
else
{
float oldScale = transform.localScale.x;
float newScale = oldScale / 1.025f;
transform.localScale = new Vector3(newScale, newScale, newScale); }
//备份上一次触摸点的位置,用于对比
oldPosition1 = tempPosition1;
oldPosition2 = tempPosition2;
}
}
} } bool isEnlarge(Vector2 oP1, Vector2 oP2, Vector2 nP1, Vector2 nP2)
{
//函数传入上一次触摸两点的位置与本次触摸两点的位置计算出用户的手势
var leng1 = Mathf.Sqrt((oP1.x - oP2.x) * (oP1.x - oP2.x) + (oP1.y - oP2.y) * (oP1.y - oP2.y));
var leng2 = Mathf.Sqrt((nP1.x - nP2.x) * (nP1.x - nP2.x) + (nP1.y - nP2.y) * (nP1.y - nP2.y));
if (leng1 < leng2)
{
//放大手势
return true;
}
else
{
//缩小手势
return false;
}
}
// private Touch oldTouch1; //上次触摸点1(手指1)
//private Touch oldTouch2; //上次触摸点2(手指2)
//void Update()
//{
// //没有触摸,就是触摸点为0
// if (Input.touchCount <= 0)
// {
// return;
// } // //多点触摸, 放大缩小
// Touch newTouch1 = Input.GetTouch(0);
// Touch newTouch2 = Input.GetTouch(1);
// //第2点刚开始接触屏幕, 只记录,不做处理
// if (newTouch2.phase == TouchPhase.Began)
// {
// oldTouch2 = newTouch2;
// oldTouch1 = newTouch1;
// return;
// }
// //计算老的两点距离和新的两点间距离,变大要放大模型,变小要缩放模型
// float oldDistance = Vector2.Distance(oldTouch1.position, oldTouch2.position);
// float newDistance = Vector2.Distance(newTouch1.position, newTouch2.position);
// //两个距离之差,为正表示放大手势, 为负表示缩小手势
// float offset = newDistance - oldDistance;
// //放大因子, 一个像素按 0.01倍来算(100可调整)
// float scaleFactor = offset / 100f;
// Vector3 localScale = transform.localScale;
// Vector3 scale = new Vector3(localScale.x + scaleFactor,
// localScale.y + scaleFactor,
// localScale.z + scaleFactor);
// //在什么情况下进行缩放
// if (scale.x >= 0.05f && scale.y >=0.05f && scale.z >= 0.05f)
// {
// transform.localScale = scale;
// }
// //记住最新的触摸点,下次使用
// oldTouch1 = newTouch1;
// oldTouch2 = newTouch2;
//}
}

Drag(拖拽)和Move(移动)两个脚本的更多相关文章

  1. H5 语义化、基本事件 浅析 (含file对象、drag拖拽等)

    1.语义化标签 帮助搜索引擎,盲人设备等程序,辨识网页内容信息,明确网页区域分布,不体现任何样式,但存在浏览器兼容性问题,如IE8下无<header>标签. ① H5基本语义标签: < ...

  2. html5 - drag 拖拽

    参考资料: 张鑫旭             : http://www.zhangxinxu.com/wordpress/2011/02/html5-drag-drop-%E6%8B%96%E6%8B% ...

  3. HTML5新特性之Canvas+drag(拖拽图像实现图像反转)

    1.什么是canvas 在网页上使用canvas元素时,会创建一块矩形区域,默认矩形区域宽度300px,高度150px.. 页面中加入canvas元素后,可以通过javascript自由控制.可以在其 ...

  4. html drag 拖拽用法和注意事项

    1.拖拽过程中的事件暂时jQuery里还没有,只能通过html DOM 来进行绑定,不然无法获取dataTransfer对象 2.在dragstart .dragover 等事件中可以用 evt.pr ...

  5. html5 Sortable.js 拖拽排序源码分析

    最近公司项目经常用到一个拖拽 Sortable.js插件,所以有空的时候看了 Sortable.js 源码,总共1300多行这样,写的挺完美的.   本帖属于原创,转载请出名出处. 官网http:// ...

  6. 一步一步实现JS拖拽插件

    js拖拽是常见的网页效果,本文将从零开始实现一个简单的js插件. 一.js拖拽插件的原理 常见的拖拽操作是什么样的呢?整过过程大概有下面几个步骤: 1.用鼠标点击被拖拽的元素 2.按住鼠标不放,移动鼠 ...

  7. div拖拽缩放jquery插件编写——带8个控制点

    项目中需要对div进行拖拽缩放,需要有控制面板8个控制点的那种,原以为这么常见的效果应该能搜索到很多相关插件,然而可以完成拖拽的实繁,却找不到我想要的,还是自己动手丰衣足食吧 效果预览(只支持pc端) ...

  8. angular实现draggable拖拽

    前言:最近项目要实现一个拖拽功能,我在网上开始了各类搜寻,虽然后面因为数据原因舍弃了拖拽的这一需求,但是为了不辜负最近的研究,还是来记录一下. 场景需求:面试预约选时间节点,候选人之间是可以相互交换的 ...

  9. HTML5之拖拽(兼容IE和非IE)

    前世:项目中需要拖动div,然后和某个div进行位置交换,这不是关键,关键是还要保存位置,然后在下次打开的时候按照保存的位置显示.还好本人功力深厚,一下子就想到了用localStorage来保存,事实 ...

  10. 【转】IE沙箱拖拽安全策略解析

    https://xlab.tencent.com/cn/2015/12/17/ie-sandbox-drop-security-policy/ IE沙箱逃逸是IE浏览器安全研究的一个重要课题,其中有一 ...

随机推荐

  1. 自然语言处理(nlp)比计算机视觉(cv)发展缓慢,而且更难!

    https://mp.weixin.qq.com/s/kWw0xce4kdCx62AflY6AzQ 1.  抢跑的nlp nlp发展的历史非常早,因为人从计算机发明开始,就有对语言处理的需求.各种字符 ...

  2. 一句话总结kNN算法

    一句话总结kNN算法 核心:模板匹配,将样本分到离它最相似的样本所属的类. kNN算法本质上使用了模板匹配的思想.要确定一个样本的类别,可以计算它与所有训练样本的距离,然后找出和该样本最接近的k个样本 ...

  3. .net mvc session失效问题

    最近解决基于.net mvc项目的session失效问题,这个跟大家聊聊. 1.问题分析 .net mvc中,Session失效需要考虑几种情况: 基于权限认证的Action,使用非Ajax请求: 基 ...

  4. mysql innodb存储引擎和一些参数优化

    mysql 的innodb存储引擎是事务性引擎,支持acid.innodb支持版本控制和高并发的技术是svcc:需要重点注意:myisam只缓存索引,innodb缓存索引和数据:

  5. C#:在匿名方法中捕获外部变量

    先来一段代码引入主题.如果你可以直接说出代码的输出结果,说明本文不适合你.(代码引自<深入理解C#>第三版) class Program { private delegate void T ...

  6. Centos7 安装Tomcat并运行程序

    运行环境:Centos7 jdk:1.8.0_171  Tocmcat:8.5.31 下载地址 :https://tomcat.apache.org/download-80.cgi#8.5.31 Ap ...

  7. maven springTest结合junit单元测试

    1.引入相关依赖 <dependency> <groupId>junit</groupId> <artifactId>junit</artifac ...

  8. python实例一

    https://www.cnblogs.com/evablogs/p/6754839.html 有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序分析: 方法一:该 ...

  9. Unity2018 Open C# Project Error

    错误日志 升级到Unity2018之后,使用 Open C# Project 打开VS工程,出现报错,无法启动VS. 错误日志如下: ArgumentException: Value does not ...

  10. Asp.Net Core 全局模型验证

    public class ActionFilter : IActionFilter { /// <summary> /// action 执行之前 /// </summary> ...