ShanxiKnowledgeBase/SXElectricityInformationAcq.../Assets/Scripts/Electroscope/AnimationManagerDemo.cs

100 lines
3.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<MeshRenderer>().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);
}
}