using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectOrbitController : MonoBehaviour
{
#region 只有鼠标控制 没有触摸屏单指双指控制的逻辑(需添加)
//[Header("旋转设置")]
//[Range(50f, 500f)] public float rotateSpeed = 150f;
//[Header("缩放设置")]
//[Range(0.1f, 5f)] public float zoomSpeed = 0.5f;
//[Range(0.1f, 10f)] public float minScale = 0.5f;
//[Range(0.1f, 10f)] public float maxScale = 2f;
//private Vector3 _initialScale; // 初始缩放
//private Vector2 _lastMousePos; // 上一帧鼠标位置
//private void Start()
//{
// _initialScale = transform.localScale;
// isShuangZhi = false;
//}
//bool isShuangZhi;
//private void Update()
//{
// if (Input.touchCount == 2)
// {
// isShuangZhi = true;
// }
// // 1. 鼠标左键旋转物体
// if (Input.GetMouseButtonDown(0))
// {
// _lastMousePos = (Vector2)Input.mousePosition;
// }
// else if (Input.GetMouseButton(0))
// {
// Vector2 delta = (Vector2)Input.mousePosition - _lastMousePos;
// _lastMousePos = (Vector2)Input.mousePosition;
// // 绕Y轴(左右拖)、X轴(上下拖)旋转
// transform.Rotate(Vector3.up, -delta.x * rotateSpeed * Time.deltaTime, Space.World);
// transform.Rotate(Vector3.right, delta.y * rotateSpeed * Time.deltaTime, Space.World);
// }
// // 2. 滚轮缩放物体
// float scroll = Input.GetAxis("Mouse ScrollWheel");
// if (scroll != 0)
// {
// Vector3 newScale = transform.localScale + Vector3.one * scroll * zoomSpeed;
// // 限制缩放范围
// newScale = new Vector3(
// Mathf.Clamp(newScale.x, minScale, maxScale),
// Mathf.Clamp(newScale.y, minScale, maxScale),
// Mathf.Clamp(newScale.z, minScale, maxScale)
// );
// transform.localScale = newScale;
// }
//}
#endregion
[Header("旋转速度")]
[Range(50f, 500f)] public float rotateSpeed = 150f;
[Header("缩放设置")]
[Range(0.1f, 5f)] public float zoomSpeed = 0.5f;
[Range(0.1f, 10f)] public float minScale = 0.5f;
[Range(0.1f, 10f)] public float maxScale = 2f;
private Vector3 _initialScale; // 初始缩放
private Vector2 _lastMousePos; // 上一帧鼠标/触摸位置
private float _lastTouchDistance; // 上一帧双指距离
private bool _isFirstTouchInCurrentGesture; // 标记当前双指手势是否是首次触摸
private void Start()
{
_initialScale = transform.localScale;
}
private bool isShuangZhi;
private void Update()
{
// 处理触摸输入
HandleTouchInput();
// 处理鼠标输入(在没有触摸时生效)
if (Input.touchCount == 0)
{
HandleMouseInput();
}
}
///
/// 处理触摸屏输入
///
private void HandleTouchInput()
{
// 单指触摸 - 旋转
if (Input.touchCount == 1)
{
isShuangZhi = false;
_isFirstTouchInCurrentGesture = true; // 重置双指手势标记
Touch touch = Input.GetTouch(0);
if (touch.phase == TouchPhase.Began)
{
_lastMousePos = touch.position;
}
else if (touch.phase == TouchPhase.Moved)
{
Vector2 delta = touch.position - _lastMousePos;
_lastMousePos = touch.position;
// 绕Y轴和X轴旋转(与鼠标控制逻辑一致)
transform.Rotate(Vector3.up, -delta.x * rotateSpeed * Time.deltaTime, Space.World);
transform.Rotate(Vector3.right, delta.y * rotateSpeed * Time.deltaTime, Space.World);
}
}
// 双指触摸 - 缩放
else if (Input.touchCount == 2)
{
isShuangZhi = true;
Touch touch0 = Input.GetTouch(0);
Touch touch1 = Input.GetTouch(1);
// 仅在触摸移动时处理缩放
if (touch0.phase == TouchPhase.Moved || touch1.phase == TouchPhase.Moved)
{
// 获取当前双指距离
float currentDistance = Vector2.Distance(touch0.position, touch1.position);
// 仅在当前双指手势的首次触摸时初始化距离(解决跳变问题)
if (_isFirstTouchInCurrentGesture)
{
_lastTouchDistance = currentDistance;
_isFirstTouchInCurrentGesture = false; // 标记为非首次
}
else
{
// 双指张开→distanceDelta正→模型放大;双指收缩→distanceDelta负→模型缩小
float distanceDelta = currentDistance - _lastTouchDistance;
// 应用缩放(基于当前模型大小,而非重置)
Vector3 newScale = transform.localScale + Vector3.one * distanceDelta * 0.01f * zoomSpeed;
// 限制缩放范围
newScale = new Vector3(
Mathf.Clamp(newScale.x, minScale, maxScale),
Mathf.Clamp(newScale.y, minScale, maxScale),
Mathf.Clamp(newScale.z, minScale, maxScale)
);
transform.localScale = newScale;
// 更新上一帧距离(保留当前距离,用于下次计算)
_lastTouchDistance = currentDistance;
}
}
// 双指离开时标记为"手势结束",但保留_lastTouchDistance的值
else if (touch0.phase == TouchPhase.Ended || touch1.phase == TouchPhase.Ended)
{
_isFirstTouchInCurrentGesture = true;
}
}
else
{
isShuangZhi = false;
// 移除「重置_lastTouchDistance为0」的逻辑 → 保留上次双指距离,避免跳变
// _lastTouchDistance = 0; // 这行是导致跳变的核心原因,直接删除
_isFirstTouchInCurrentGesture = true;
}
}
///
/// 处理鼠标输入
///
private void HandleMouseInput()
{
// 鼠标左键旋转
if (Input.GetMouseButtonDown(1))
{
_lastMousePos = (Vector2)Input.mousePosition;
}
else if (Input.GetMouseButton(1))
{
Vector2 delta = (Vector2)Input.mousePosition - _lastMousePos;
_lastMousePos = (Vector2)Input.mousePosition;
transform.Rotate(Vector3.up, -delta.x * rotateSpeed * Time.deltaTime, Space.World);
transform.Rotate(Vector3.right, delta.y * rotateSpeed * Time.deltaTime, Space.World);
}
// 鼠标滚轮缩放
float scroll = Input.GetAxis("Mouse ScrollWheel");
if (scroll != 0)
{
Vector3 newScale = transform.localScale + Vector3.one * scroll * zoomSpeed;
newScale = new Vector3(
Mathf.Clamp(newScale.x, minScale, maxScale),
Mathf.Clamp(newScale.y, minScale, maxScale),
Mathf.Clamp(newScale.z, minScale, maxScale)
);
transform.localScale = newScale;
}
}
}