138 lines
4.0 KiB
C#
138 lines
4.0 KiB
C#
using AibisDream.Framework;
|
|
using AibisDream.Utility;
|
|
using DG.Tweening;
|
|
using UnityEngine;
|
|
using UnityEngine.EventSystems;
|
|
|
|
namespace AibisDream
|
|
{
|
|
public class CordPull : MonoBehaviour, IInteraction
|
|
{
|
|
private static readonly int ShineFade = Shader.PropertyToID("_ShineFade");
|
|
|
|
private EventTriggerEx _trigger;
|
|
private SpriteRenderer _sprite;
|
|
private EngineSystem _engineSystem;
|
|
private Vector3 _initPos;
|
|
public float maxDistance;
|
|
|
|
private Vector3 _dragPoint;
|
|
private bool _isDragging;
|
|
|
|
private void Awake()
|
|
{
|
|
// 记录当前位置
|
|
InitRefs();
|
|
}
|
|
|
|
private void InitRefs()
|
|
{
|
|
_initPos = transform.position;
|
|
|
|
_trigger = GetComponent<EventTriggerEx>();
|
|
_engineSystem = transform.parent.GetComponent<EngineSystem>();
|
|
_sprite = GetComponent<SpriteRenderer>();
|
|
|
|
_trigger.Register(EventTriggerType.BeginDrag, OnBeginDrag);
|
|
_trigger.Register(EventTriggerType.EndDrag, OnEndDrag);
|
|
_trigger.Register(EventTriggerType.Drag, OnDrag);
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (_isDragging)
|
|
{
|
|
MoveToDragPos();
|
|
}
|
|
}
|
|
|
|
private void MoveToDragPos()
|
|
{
|
|
float curY;
|
|
// 如果拖拽点在上方,直接移动
|
|
if (_dragPoint.y > transform.position.y)
|
|
{
|
|
curY = _dragPoint.y;
|
|
}
|
|
// 如果拖拽点在下方,限速移动
|
|
else
|
|
{
|
|
curY = _dragPoint.y;
|
|
var pullDelta = Mathf.Abs(curY - transform.position.y) / maxDistance;
|
|
// 将增量同步给Engine
|
|
_engineSystem.AddAirPress(pullDelta);
|
|
}
|
|
|
|
transform.position = new Vector3(transform.position.x, curY, transform.position.z);
|
|
}
|
|
|
|
private void OnDrag(BaseEventData data)
|
|
{
|
|
// 这里是一些阻碍拖动的情况
|
|
if (!IsActive) return;
|
|
|
|
// 正常情况下不会出错
|
|
if (data is not PointerEventData pointerData) return;
|
|
|
|
// 设置拖拽目标点
|
|
SetDragTarget(pointerData.position);
|
|
}
|
|
|
|
private void OnBeginDrag(BaseEventData data)
|
|
{
|
|
// 这里是一些阻碍拖动的情况
|
|
if (!IsActive) return;
|
|
|
|
// 首次拖拽后关闭高亮
|
|
if (GlobalVariableKit.IsCordHighLight)
|
|
{
|
|
GlobalVariableKit.IsCordHighLight = false;
|
|
_sprite.material.SetFloat(ShineFade, 0);
|
|
}
|
|
|
|
// 正常情况下不会出错
|
|
if (data is not PointerEventData pointerData) return;
|
|
// 设置拖拽目标点
|
|
SetDragTarget(pointerData.position);
|
|
|
|
// 开始拖动的时候把原有的动画删掉
|
|
transform.DOKill();
|
|
_isDragging = true;
|
|
}
|
|
|
|
private void OnEndDrag(BaseEventData data)
|
|
{
|
|
_isDragging = false;
|
|
// 松手后抽回去
|
|
var retractTime = (_initPos.y - transform.localPosition.y) / _engineSystem.engineConfig.returnSpeed;
|
|
transform.DOMove(_initPos, retractTime);
|
|
}
|
|
|
|
private void SetDragTarget(Vector3 mousePos)
|
|
{
|
|
var worldPos = CameraKit.GetMouseWorldPos(mousePos);
|
|
|
|
var dragY = CommonUtil.Limit(worldPos.y, _initPos.y, _initPos.y - maxDistance);
|
|
|
|
_dragPoint = new Vector3(transform.position.x, dragY, transform.position.z);
|
|
}
|
|
|
|
public void ActiveShine()
|
|
{
|
|
_sprite.material.SetFloat(ShineFade, 1);
|
|
}
|
|
|
|
#region 交互限制相关
|
|
|
|
public bool IsActive => _engineSystem.isPullActive;
|
|
|
|
public bool IsAvailable => _engineSystem.isAvailable;
|
|
|
|
public GameObject GetGameObject()
|
|
{
|
|
return gameObject;
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
} |