要求所挂载对象身上有碰撞器以及重力
挂载以下组件
using UnityEngine;
using UnityEngine.UI;
public class ObjectDragger : MonoBehaviour
{
private Vector3 screenPoint;
private Vector3 offset;
bool dragged = false;
private Vector3 newPosition;//赋值给物体的坐标位置
private Rigidbody body;
Vector3 mapInitScale;
void Start()
{
//获取自身重力
//body = gameObject.GetComponent<Rigidbody>();
//获取自身初始坐标
newPosition = transform.position;
mapInitScale=transform.localScale;
}
Vector3 oldPosition1;
Vector3 oldPosition2;
bool isImage = false;
void OnMouseDown()
{
if (Input.touchCount==1)
{
//按下鼠标时获取自身当前坐标的屏幕坐标
screenPoint = Camera.main.WorldToScreenPoint(gameObject.transform.position);
//按下鼠标时记录物体的世界坐标,和鼠标世界坐标的向量偏移
offset = gameObject.transform.position -
Camera.main.ScreenToWorldPoint(new Vector3(Input.GetTouch(0).position.x, Input.GetTouch(0).position.y, screenPoint.z));
}
else if (Input.touchCount > 1)
{
isImage = true;
//记录初始位置
oldPosition1 = Input.GetTouch(0).position;
oldPosition2 = Input.GetTouch(1).position;
}
}
void OnMouseDrag()
{
//保证单指移动
if (Input.touchCount==1)
{
//按下拖动鼠标时
dragged = true;
}
else if (Input.touchCount > 1)
{
//按下拖动鼠标时
dragged = false;
isImage = true;
}
}
private void OnMouseExit()
{
dragged = false;
}
void FixedUpdate()
{
if (dragged)
{
dragged = false;
//当前鼠标的屏幕坐标
Vector3 curScreenPoint = new Vector3(Input.GetTouch(0).position.x, Input.GetTouch(0).position.y, screenPoint.z);
//保持物体与鼠标的位置偏移量
newPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;
}
if (Input.touchCount > 1)
{
dragged = false;
//保证重新开始双指触摸记录的初始位置不是松开手时的位置,而是初始触摸的位置
if (Input.GetTouch(0).phase == TouchPhase.Began || Input.GetTouch(1).phase == TouchPhase.Began)
{
//记录初始位置
oldPosition1 = Input.GetTouch(0).position;
oldPosition2 = Input.GetTouch(1).position;
}
if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved)
{
//计算出当前两点触摸点的位置
var tempPosition1 = Input.GetTouch(0).position;
var tempPosition2 = Input.GetTouch(1).position;
float currentTouchDistance = Vector3.Distance(tempPosition1, tempPosition2);
float lastTouchDistance = Vector3.Distance(oldPosition1, oldPosition2);
//计算上次和这次双指触摸之间的距离差距
//然后去更改摄像机的距离
float distance = (currentTouchDistance - lastTouchDistance) * 0.2f * Time.deltaTime;
if (isImage)
{
transform.localScale += mapInitScale * distance;
}
//限制最小
if (transform.localScale.x < 4)
{
transform.localScale = mapInitScale * 0.5f;
}
//限制最大
if (transform.localScale.x > 16)
{
transform.localScale = mapInitScale * 2;
}
//备份上一次触摸点的位置,用于对比
//也是松开手时的位置
oldPosition1 = tempPosition1;
oldPosition2 = tempPosition2;
}
if (Input.GetTouch(0).phase == TouchPhase.Ended || Input.GetTouch(1).phase == TouchPhase.Ended)
{
isImage = false;
}
}
}
void LateUpdate()
{
if (Input.touchCount == 1)
{
//移动代码
transform.position = newPosition;
}
}
}