using System; using UnityEngine; using DefaultNamespace.ProcessMode; using DG.Tweening; public class AnimationManagerDemo : MonoBehaviour { public Camera mainCam; private Vector3 modelPosTemp; private Vector3 modelRotTemp; public Transform movingObject; // 验电笔 public Material blinkMaterial; private void Start() { blinkMaterial = movingObject.GetComponent().material; } void Update() { HandleMouseClick(); } private void HandleMouseClick() { if (Input.GetMouseButtonDown(0)) { Ray ray = mainCam.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit)) { modelPosTemp = movingObject.localPosition; modelRotTemp = movingObject.localEulerAngles; movingObject.SetParent(null); AnimationManager.AddAnimationGroup("MoveAndBlink", sequence => { sequence.Append(movingObject.DOMove(hit.point, 1) .OnUpdate(() => { AdjustObjectRotation(); }) .OnComplete(() => { BlinkAndHide(); })); }); // 播放动画 AnimationManager.PlayAnimationGroup("MoveAndBlink"); } } } private void BlinkAndHide() { AnimationManager.AddAnimationGroup("BlinkAndHide", blinkSequence => { float dura = 0.3f; blinkSequence.Append(blinkMaterial.DOFloat(1, "_SwitchOfEmi", dura)) .AppendInterval(dura) .Append(blinkMaterial.DOFloat(0, "_SwitchOfEmi", dura)) .AppendInterval(dura) .Append(blinkMaterial.DOFloat(1, "_SwitchOfEmi", dura)) .AppendInterval(dura) .Append(blinkMaterial.DOFloat(0, "_SwitchOfEmi", dura)) .AppendInterval(dura).OnComplete(() => { // movingObject.SetParent(mainCam.transform); // movingObject.localPosition = modelPosTemp; // movingObject.localEulerAngles = modelRotTemp; }); ; }); // 添加闪烁动画组 AnimationManager.PlayAnimationGroup("BlinkAndHide"); // 播放闪烁动画 } private void AdjustObjectRotation() { Vector3 directionToCamera = mainCam.transform.position - movingObject.position; // 计算相机与模型在垂直方向的关系,确定是在上方还是下方 bool isCameraAbove = mainCam.transform.position.y > movingObject.position.y; // 计算相机与模型在Y轴的角度 float verticalAngle = Vector3.Angle(Vector3.up, directionToCamera.normalized); // 根据相机在模型上方或下方来设置X轴的旋转角度 float rotationValue = isCameraAbove ? 90 : -90; float xRotation = Mathf.Lerp(60, 0, 1 - verticalAngle / rotationValue); // 计算Y轴旋转角度以确保笔的笔尖正确朝向相机 Vector3 forward = new Vector3(directionToCamera.x, 0, directionToCamera.z).normalized; float yRotation = Mathf.Atan2(forward.x, forward.z) * Mathf.Rad2Deg; // 判断相机是在碰撞器上方还是下方,设置Z轴旋转角度 float zRotation = isCameraAbove ? 0 : 180; // 应用所有旋转 movingObject.rotation = Quaternion.Euler(xRotation, yRotation, zRotation); } }