Files
JJBB/Assets/Project/Script/Player/Controller/ProcessInputModule.cs

178 lines
5.2 KiB
C#
Raw Normal View History

2024-08-23 15:49:34 +08:00
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
[RequireComponent(typeof(ProcessInput))]
public class ProcessInputModule : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler
{
// 仅仅追踪两根手指
private InputPointerData[] _fingers;
public ProcessInput processInput { get; private set; }
public ProcessCamera processCamera { get; private set; }
// 当前是操作摄像机还是角色运动
public bool isCameraMode { get; private set; }
private bool _clickOnPointerUp;
public event UnityAction<bool> onCameraModeChange;
private void Awake()
{
processInput = GetComponent<ProcessInput>();
processCamera = new ProcessCamera();
_fingers = new InputPointerData[2];
for (var i = 0; i < _fingers.Length; i++)
_fingers[i] = new InputPointerData();
SetCameraModel(true);
}
#if UNITY_EDITOR || UNITY_STANDALONE
private void Update()
{
var mouseWheel = Input.GetAxis("Mouse ScrollWheel");
if (mouseWheel != 0f)
processCamera.ScaleCamera(mouseWheel * 800f);
#if UNITY_EDITOR
if (Input.GetKeyDown(KeyCode.Space))
SetCameraModel(!isCameraMode);
#endif
}
#endif
public void SetCameraModel(bool cameraMode)
{
if (isCameraMode != cameraMode)
{
_clickOnPointerUp = false;
isCameraMode = cameraMode;
if (isCameraMode)
processInput.EndTouchPos();
if (onCameraModeChange != null)
onCameraModeChange(isCameraMode);
}
}
#region interface
private void CleanFingers()
{
_clickOnPointerUp = false;
for (var i = 0; i < _fingers.Length; i++)
_fingers[i].pointerId = null;
if (isCameraMode)
{
// 不需要处理
}
else
processInput.EndTouchPos();
}
private void OnApplicationFocus(bool hasFocus)
{
// App失去焦点时释放当前输入状态
if (!hasFocus)
CleanFingers();
}
// 注:任意被追踪的手指抬起,清除全部手指信息而不是回滚到单手指
public void OnPointerUp(PointerEventData eventData)
{
// 检查是否触发抬起点击
if (isCameraMode && _clickOnPointerUp)
{
if (_fingers[0].pointerId == eventData.pointerId)
processInput.StartOneFrameTouch(eventData.position);
}
_clickOnPointerUp = false;
var remove = false;
for (var i = 0; i < _fingers.Length; i++)
if (_fingers[i].pointerId == eventData.pointerId)
{
remove = true;
break;
}
if (remove)
CleanFingers();
}
public void OnPointerDown(PointerEventData eventData)
{
if (_fingers[0].pointerId == null)
{
_fingers[0].pointerId = eventData.pointerId;
_fingers[0].lastPos = eventData.position;
// 常规Touch开始
if (isCameraMode)
_clickOnPointerUp = true;
else
processInput.StartTouchPos(eventData.position);
if (FunctionExLogic.Instance() != null)
FunctionExLogic.Instance().ShowDetail(false);
}
else if (_fingers[1].pointerId == null)
{
_clickOnPointerUp = false;
_fingers[1].pointerId = eventData.pointerId;
_fingers[1].lastPos = eventData.position;
// 进入摄像机缩放模式
if (isCameraMode)
{
}
else
processInput.EndTouchPos();
}
}
public void OnDrag(PointerEventData eventData)
{
_clickOnPointerUp = false;
// 单手指模式
if (_fingers[1].pointerId == null)
{
if (_fingers[0].pointerId == eventData.pointerId)
{
if (isCameraMode)
processCamera.MoveCamera(eventData.delta);
else
processInput.MoveTouchPos(eventData.position);
}
}
// 双手指模式
else
{
InputPointerData current = null;
InputPointerData other = null;
if (_fingers[0].pointerId == eventData.pointerId)
{
current = _fingers[0];
other = _fingers[1];
}
else if (_fingers[1].pointerId == eventData.pointerId)
{
current = _fingers[1];
other = _fingers[0];
}
if (current != null)
{
current.lastPos = eventData.position;
var line = eventData.position - other.lastPos;
if (line != Vector2.zero)
{
line = line.normalized;
var scale = Vector2.Dot(line, eventData.delta);
processCamera.ScaleCamera(scale);
}
}
}
}
#endregion
public class InputPointerData
{
public int? pointerId;
public Vector2 lastPos;
}
}