using UnityEngine; using AibisDream.FixSystem; using UnityEngine.EventSystems; using AibisDream.Framework; using AibisDream.Kit; using AibisDream.Utility; using DG.Tweening; namespace AibisDream { [RequireComponent(typeof(EventTriggerEx))] public class ExpressionPlug : MonoBehaviour, IInteraction { private static readonly int ShineFade = Shader.PropertyToID("_ShineFade"); private Vector3 _startPos; private readonly Vector3 _pickupOffset = new(0, 0, 0); private readonly Quaternion _pickupRotationOffset = Quaternion.Euler(0, 0, 150); private readonly Quaternion _initRotation = Quaternion.Euler(0, 0, 180); private ExpressionCableSystem _cableSystem; private SpriteRenderer _sprite; private Transform _plugRootPos; private EventTriggerEx _trigger; private ISocket _currentSocket; private ExpressionCable _cable; // 对应的线缆 private bool _isDragging; private bool _isPhysicCableActive; [Header("调试设置")] public float detectRadius = 1f; // 增加检测半径 public LayerMask socketLayer; // 设置插槽层级 private void Awake() { InitComponentRef(); EventRegister(); _startPos = transform.position; } private void InitComponentRef() { _cableSystem = GetComponentInParent(); _sprite = GetComponent(); _plugRootPos = transform.GetChild(0); _trigger = GetComponent(); } private void EventRegister() { _trigger.Register(EventTriggerType.Drag, OnDrag); _trigger.Register(EventTriggerType.PointerDown, OnPointerDown); _trigger.Register(EventTriggerType.PointerUp, OnPointerUp); } private void OnDrag(BaseEventData eventData) { if (!IsAvailable) return; if (!_isDragging) return; if (eventData is PointerEventData pointerData) { transform.position = CommonUtil.GetMouseWorldPos(pointerData.position, transform); UpdateCable(); } } private void OnPointerDown(BaseEventData eventData) { if (!IsAvailable) return; _isDragging = true; if (_currentSocket != null) { PullUpSocket(); } AdjustPlugPos(); _sprite.enabled = true; } private void OnPointerUp(BaseEventData eventData) { _isDragging = false; // 寻找最近的可用插槽 if (_cableSystem.TryFindClosestSocket(transform.position, out var socket)) { InsertSocket(socket); } else { ReturnToStartPosition(); } } private void InsertSocket(ISocket targetSocket) { // 修改插头位置 transform.position = targetSocket.GetSocketPos(); _cable.SetEndPos(transform); // 处理插槽插入 _currentSocket = targetSocket; targetSocket.PlugIn(); _sprite.enabled = false; } public void PullUpSocket() { // 修改线缆终点 _cable.SetEndPos(_plugRootPos); // 处理插槽拔出 _currentSocket?.PlugOut(); _sprite.enabled = true; _currentSocket = null; } public void ReturnToStartPosition() { transform.DOMove(_startPos, 0.1f); transform.rotation = _initRotation; _cable.SetEndPos(_plugRootPos); } private void AdjustPlugPos() { transform.position += _pickupOffset; transform.rotation = _pickupRotationOffset; } public void SetCable(ExpressionCable cable) { _cable = cable; } private void UpdateCable() { if (_cable != null) { _cable.UpdateEndPosition(_plugRootPos.position); } } public bool IsActive => true; public bool IsAvailable => true; public GameObject GetGameObject() { return gameObject; } // 用于调试 private void OnDrawGizmosSelected() { Gizmos.color = Color.yellow; Gizmos.DrawWireSphere(transform.position, detectRadius); } } }