using UnityEngine; public class DragItem : MonoBehaviour { private Vector3 SelfPivot { get { var p = transform.position; return new Vector3(p.x, 0, p.z); } } private Vector3 DraggerPivot { get { var p = dragger.position; return new Vector3(p.x, 0, p.z); } } private bool _dragging; public Transform dragger; private Vector3 _lastDirection; private Vector3 _lastSelfPivot; private float _lastAngle; private float _lastLength; private int _currentStep; private void FixedUpdate() { FixedUpdateDragger(); // 判断是否在拖拽 if (! _dragging) return; // 位置计算 var draggerPivot = DraggerPivot; var selfPivot = SelfPivot; var direction = (_lastSelfPivot - draggerPivot).normalized; var position = draggerPivot + direction * _lastLength; var y = transform.position.y; transform.position = new Vector3( position.x, y, position.z ); // 角度计算 if (direction != _lastDirection) { var angle = Vector3.SignedAngle(direction, _lastDirection, Vector3.up); var selfAngle = transform.eulerAngles; selfAngle.y -= angle; transform.eulerAngles = selfAngle; } // 记录值 _lastSelfPivot = selfPivot; _lastDirection = direction; } private void FixedUpdateDragger() { if (!_dragging && dragger != null) { _dragging = true; var draggerPivot = DraggerPivot; _lastSelfPivot = SelfPivot; _lastLength = Vector3.Distance(draggerPivot, SelfPivot); _lastDirection = (_lastSelfPivot - draggerPivot).normalized; } if (_dragging && dragger == null) _dragging = false; } }