using UnityEngine; using UnityEngine.EventSystems; using DG.Tweening; using UnityEngine.UI; using Yarn.Unity; public class Crowbar : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler { public float rotationSpeed = 10f; // 拖动旋转的速度 public float rotationThreshold = 30f; // 触发撬动完成的旋转阈值 public Transform crowbarVisual; //public Transform crowbarBox; public Transform crowbarInPosition; //public Transform crowbarOutPosition; public Transform crowbarSocket; public bool IsInDialogue { get; set; } = false; private Vector3 startPosition; private Quaternion startRotation= Quaternion.Euler(0f, 0f, -225f); private bool isInserted = false; private Vector3 lastMousePosition; private float progress = 0f; private Image image; private bool isPryingCompleted = false; private void Awake() { image = GetComponent(); } private void Start() { // startPosition = transform.position; // startRotation = transform.rotation; } public void MoveIn() { //transform.DOMove(crowbarInPosition.position, 0.5f); } public void MoveOut() { //transform.DOMove(crowbarOutPosition.position, 0.5f); } public void OnBeginDrag(PointerEventData eventData) { if (IsInDialogue || isInserted) return; image.raycastTarget = false; //crowbarSocket.Activate(); RectTransform canvasRectTransform = (RectTransform)transform.root; Vector3 worldPoint; if (RectTransformUtility.ScreenPointToWorldPointInRectangle(canvasRectTransform, eventData.position, eventData.pressEventCamera, out worldPoint)) { transform.position = worldPoint; } lastMousePosition = Input.mousePosition; } public void OnDrag(PointerEventData eventData) { if (IsInDialogue || isPryingCompleted) return; if (isInserted) { float deltaY = lastMousePosition.y - Input.mousePosition.y; lastMousePosition = Input.mousePosition; // 更新 lastMousePosition progress += deltaY*0.3f * Time.deltaTime; progress = Mathf.Clamp01(progress); // 确保 progress 不会小于0 // 计算插入旋转和插入旋转-45度之间的插值 float startAngle = crowbarSocket.transform.eulerAngles.z; float endAngle = startAngle + 40f; float currentAngle = Mathf.Lerp(startAngle, endAngle, progress); // 更新撬棍的旋转角度 crowbarVisual.rotation = Quaternion.Euler(0f, 0f, currentAngle); if (progress >= 1f) { // 触发撬动完成的逻辑 Debug.Log("Crowbar action completed."); isPryingCompleted = true; ResetCrowbar(); } } else { RectTransform canvasRectTransform = (RectTransform)transform.root; Vector3 worldPoint; if (RectTransformUtility.ScreenPointToWorldPointInRectangle(canvasRectTransform, eventData.position, eventData.pressEventCamera, out worldPoint)) { transform.position = worldPoint; } } lastMousePosition = Input.mousePosition; } public void OnEndDrag(PointerEventData eventData) { if (IsInDialogue) return; if (isInserted) { ResetCrowbarProgress(); } else { float snappingRange = 1f; // You might need to adjust this for WorldSpace Canvas if (Vector3.Distance(transform.position, crowbarSocket.transform.position) <= snappingRange) { transform.position = crowbarSocket.transform.position; crowbarVisual.rotation = crowbarSocket.transform.rotation; isInserted = true; //crowbarSocket.Deactivate(); } else { transform.DOMove(crowbarInPosition.position, 0.1f).OnComplete(() => { //crowbarSocket.Deactivate(); }); } } } private void ResetCrowbarProgress() { //isInserted = false; progress = 0f; crowbarVisual.rotation = Quaternion.Euler(0f, 0f, 180f); } private void ResetCrowbar() { isInserted=false; progress = 0f; crowbarVisual.rotation = startRotation; //isPryingCompleted = false; transform.DOMove(crowbarInPosition.position, 0.1f); } }