using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class SeeModelManager : MonoBehaviour { [Header("目标模型")] public Transform targetModel; // 要旋转的模型 [Header("相机设置")] public Camera mainCamera; // 主相机 public float minDistance = 1f; // 相机最近距离 public float maxDistance = 10f; // 相机最远距离 [Header("控制参数")] public float rotationSpeedX = 2f; // 旋转速度 public float rotationSpeedY = 2f; // 旋转速度 public float zoomSpeed = 1f; // 缩放速度 private Vector3 cameraOffset; // 相机与模型的初始偏移 public Animator animator; private AnimationClip clip; [Header("UI 控制")] public Slider explosionSlider; // 当前爆炸程度 (0~1) [Range(0, 1)] public float explosionFactor = 0f; //是否手动介入 private bool m_isPlayChange = false; private bool m_isSliderChange = false; void Start() { clip = GetCurrentAnimationClip(animator); animator.speed = 0; if (targetModel == null) { Debug.LogError("请赋值目标模型(targetModel)!"); return; } if (mainCamera == null) { mainCamera = Camera.main; // 自动获取主相机 } // 记录相机与模型的初始偏移(用于缩放时保持方向) cameraOffset = mainCamera.transform.position - targetModel.position; // 确保相机初始看向模型 //mainCamera.transform.LookAt(targetModel.position); } private AnimationClip GetCurrentAnimationClip(object animator) { throw new NotImplementedException(); } void Update() { if (Input.GetMouseButton(0)) { if (m_isSliderChange) { m_isPlayChange = true; } } else { m_isSliderChange = false; } if (Input.GetMouseButtonUp(0) && m_isPlayChange) { m_isPlayChange = false; } //有手动介入的情况下,模型动画跟随进度条数值改变 if (explosionFactor != explosionSlider.value) { explosionFactor = explosionSlider.value; JumpToTime(explosionFactor); } // 鼠标左键拖拽控制旋转 if (Input.GetMouseButton(1)) { RotateModel(); } // 鼠标滚轮控制缩放(调整相机距离) float scroll = Input.GetAxis("Mouse ScrollWheel"); if (scroll != 0) { ZoomCamera(scroll); } } /// /// 让当前动画跳转到指定时间(秒) /// /// 目标时间比 public void JumpToTime(float timepercent) { if (animator == null) return; if (clip == null) { Debug.LogError("未找到当前播放的动画片段!"); return; } // 2. 检查目标时间是否在动画长度范围内(循环动画可忽略) if (timepercent < 0 || timepercent > 1) { Debug.LogWarning("目标时间超出动画长度!"); timepercent = Mathf.Clamp(timepercent, 0, 1); } // 3. 跳转到目标时间(通过Play方法强制设置归一化时间) // 注意:需传入当前动画状态的名称(或哈希值),确保精准控制 animator.Play(clip.name, -1, timepercent); // 可选:若需要暂停在目标时间,可设置speed为0 animator.speed = 0; } /// /// 当滑动条值改变时调用(实时控制) /// public void OnSliderValueChanged(float value) { m_isSliderChange = true; } /// /// 获取当前层正在播放的AnimationClip /// private AnimationClip GetCurrentAnimationClip(Animator anim) { AnimationClip[] animationClips = anim.runtimeAnimatorController.animationClips; return animationClips[0]; } // 旋转模型 void RotateModel() { // 获取鼠标在X、Y方向的拖动距离 float mouseX = Input.GetAxis("Mouse X") * rotationSpeedX; float mouseY = Input.GetAxis("Mouse Y") * rotationSpeedY; // 绕Y轴(世界空间)旋转(左右拖动) targetModel.Rotate(Vector3.up, mouseX, Space.World); // 绕X轴(自身空间)旋转(上下拖动),负号用于修正方向 targetModel.Rotate(Vector3.right, -mouseY, Space.Self); } // 缩放相机(调整与模型的距离) void ZoomCamera(float scroll) { // 计算新的相机位置(沿初始偏移方向调整距离) Vector3 newPosition = mainCamera.transform.position + mainCamera.transform.forward * scroll * zoomSpeed * -10; // *-10放大滚轮敏感度 // 限制相机与模型的距离在min和max之间 float distance = Vector3.Distance(newPosition, targetModel.position); if (distance >= minDistance && distance <= maxDistance) { mainCamera.transform.position = newPosition; } } }