using System; using UnityEngine; /// /// 简化版玩家拖拽脚本(Trigger触发判定,仅保留核心拖拽逻辑) /// [RequireComponent(typeof(PlayerControl))] public class PlayerDrag : MonoBehaviour { private DragItem _currentDragItem; private bool _isDragging; private bool _lastFrameGrabbing; private PlayerControl _control; private void Awake() { _control = GetComponent(); } private void Update() { var grabbing = _control.grabbing; var keyDown = !_lastFrameGrabbing && grabbing; var keyUp = _lastFrameGrabbing && !grabbing; // 按下G键:抓取物品(仅当触发接触且未拖拽时生效) if (keyDown && !_isDragging && _currentDragItem != null) { _isDragging = true; _currentDragItem.dragger = transform; // 给物品赋值拖拽锚点(玩家) } // 松开G键:放下物品(解除关联) if (keyUp && _isDragging) { _isDragging = false; if (_currentDragItem != null) { _currentDragItem.dragger = null; // 清空物品的拖拽锚点 } _currentDragItem = null; } // 更新抓取 _lastFrameGrabbing = grabbing; } private void OnTriggerStay(Collider other) { // 如果已在拖拽状态,直接返回,不处理新物品 if (_isDragging) return; // 尝试获取对方的DragItem组件,缓存为当前可抓取物品 DragItem dragItem = other.GetComponent(); if (dragItem != null) { _currentDragItem = dragItem; } } private void OnTriggerExit(Collider other) { // 如果已在拖拽状态,直接返回(避免拖拽中丢失目标) if (_isDragging) return; // 确认离开的是当前缓存的物品,清空缓存 DragItem dragItem = other.GetComponent(); if (dragItem != null && dragItem == _currentDragItem) { _currentDragItem = null; } } }