using System; using UnityEngine; using DefaultNamespace.ProcessMode; using DG.Tweening; using Electroscope; /// /// 摄像机射线点击到物体,验电笔移动过去 /// public class CameraRayElectroscopeComponent : MonoBehaviour { private Material blinkMaterial; private Vector3 modelPosTemp; private Vector3 modelRotTemp; public Camera mainCam; //主相机 public Transform movingObject; // 验电笔模型 private void Start() { modelPosTemp = movingObject.localPosition; modelRotTemp = movingObject.localEulerAngles; 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)) { ChargedStateComponent cha = hit.collider.gameObject.GetComponent(); if (cha != null) { this.GetComponent().enabled = false; AnimationManager.AddAnimationGroup("MoveAndBlink", sequence => { sequence.Append(movingObject.DOMove(hit.point, 1) .OnUpdate(() => { AdjustObjectRotation(); }) .OnComplete(() => { BlinkAndHide(cha.ChargedState); })); }); AnimationManager.PlayAnimationGroup("MoveAndBlink"); // 播放移动动画 } } } } private void BlinkAndHide(ChargedState chargedState) { // 停止当前播放动画 AnimationManager.StopAnimationGroup("BlinkAndHide"); ResetBlinkState(); if (chargedState == ChargedState.Electric) { 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(() => { Debug.Log(modelRotTemp); movingObject.localPosition = modelPosTemp; movingObject.localEulerAngles = modelRotTemp; this.GetComponent().enabled = true; }); }); AnimationManager.PlayAnimationGroup("BlinkAndHide"); // 播放闪烁动画 } else { movingObject.localPosition = modelPosTemp; movingObject.localEulerAngles = modelRotTemp; this.GetComponent().enabled = true; } } /// /// 恢复默认状态 /// private void ResetBlinkState() { blinkMaterial.SetFloat("_SwitchOfEmi", 0); } /// /// 判断验电笔方向 /// 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); } }