163 lines
4.6 KiB
C#
163 lines
4.6 KiB
C#
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<ExpressionCableSystem>();
|
|
_sprite = GetComponent<SpriteRenderer>();
|
|
_plugRootPos = transform.GetChild(0);
|
|
_trigger = GetComponent<EventTriggerEx>();
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
} |