100 lines
3.4 KiB
C#
100 lines
3.4 KiB
C#
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);
|
||
}
|
||
} |