Files
aibis-dream/Assets/Scripts/MiniGame/HuoShan/ExpressionPlug.cs
T

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);
}
}
}