要求所掛載對象身上有碰撞器以及重力
掛載以下組件
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;
}
}
}