U3D_TobaccoWarehouseISMDTSy.../Assets/Scripts/Ls/Trolleydrawing.cs

140 lines
4.2 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Trolleydrawing : MonoBehaviour
{
public Transform oneself;
public SkinnedMeshRenderer trolley;
public Button Hoibutton;
public Button Geidbutton;
public float rotationSpeed = 10f; // 旋转速度
private Vector3 lastMousePosition; // 上一次的鼠标位置
/// <summary>
/// 动画移动时间
/// </summary>
public float duration = 1.5f;
/// <summary>
/// 管理协程
/// </summary>
private Coroutine blendShapeCoroutine;
private Coroutine blendShapeCoroutine2;
/// <summary>
/// 放大缩小的速度
/// </summary>
public float zoomSpeed = 1f;
public float minScale = 0.8f; // 最小缩放比例
public float maxScale = 4f; // 最大缩放比例
void Start()
{
oneself = GetComponent<Transform>();
Hoibutton.onClick.AddListener(Unfold);
Geidbutton.onClick.AddListener(Restore);
}
void Update()
{
//if (Input.GetMouseButtonDown(0))
//{
// // 记录当前鼠标位置
// lastMousePosition = Input.mousePosition;
//}
//// 检测鼠标左键是否按住
//if (Input.GetMouseButton(0))
//{
// // 计算鼠标移动的距离
// Vector3 mouseDelta = Input.mousePosition - lastMousePosition;
// lastMousePosition = Input.mousePosition;
// // 计算旋转的角度
// //float rotationX = -mouseDelta.y * rotationSpeed * Time.deltaTime;
// float rotationY = mouseDelta.x * rotationSpeed * Time.deltaTime;
// // 应用旋转到模型
// oneself.Rotate(Vector3.up, -rotationY, Space.World); // 绕世界坐标系的 Y 轴旋转
// // oneself.Rotate(Vector3.right, -rotationX, Space.World); // 绕世界坐标系的 X 轴旋转
//}
// 获取鼠标滚轮的输入值
float scrollInput = Input.GetAxis("Mouse ScrollWheel");
// 计算缩放增量
Vector3 scaleChange = Vector3.one * scrollInput * zoomSpeed;
// 应用缩放增量
transform.localScale += scaleChange;
// 确保缩放值在规定范围内
transform.localScale = new Vector3(
Mathf.Clamp(transform.localScale.x, minScale, maxScale),
Mathf.Clamp(transform.localScale.y, minScale, maxScale),
Mathf.Clamp(transform.localScale.z, minScale, maxScale)
);
}
/// <summary>
/// 模型展开
/// </summary>
public void Unfold()
{
if (blendShapeCoroutine2 != null)
{
StopCoroutine(BlendShapeTransition(100));
}
blendShapeCoroutine2 = StartCoroutine(BlendShapeTransition(100));
}
/// <summary>
/// 模型还原
/// </summary>
public void Restore()
{
//如果已有协程开启就先关闭
if (blendShapeCoroutine != null)
{
StopCoroutine(blendShapeCoroutine);
}
blendShapeCoroutine = StartCoroutine(BlendShapeToZeroTransition());
}
// 协程实现 BlendShape 权重的平滑过渡
private IEnumerator BlendShapeTransition(float targetWeight)
{
float startWeight = trolley.GetBlendShapeWeight(0);
float elapsedTime = 0f;
while (elapsedTime < duration)
{
elapsedTime += Time.deltaTime;
float t = Mathf.Clamp01(elapsedTime / duration);
float currentWeight = Mathf.Lerp(startWeight, targetWeight, t);
trolley.SetBlendShapeWeight(0, currentWeight);
yield return null;
}
// 确保最终值被设置
trolley.SetBlendShapeWeight(0, targetWeight);
}
private IEnumerator BlendShapeToZeroTransition()
{
float startWeight = trolley.GetBlendShapeWeight(0);
float elapsedTime = 0f;
while (elapsedTime < duration)
{
elapsedTime += Time.deltaTime;
float t = Mathf.Clamp01(elapsedTime / duration);
float currentWeight = Mathf.Lerp(startWeight, 0f, t);
trolley.SetBlendShapeWeight(0, currentWeight);
yield return null;
}
// 确保最终值被设置为零
trolley.SetBlendShapeWeight(0, 0f);
}
}