Files
JJBB/Assets/Project/Script/Player/Controller/ProcessInputModule.cs
2024-08-23 15:49:34 +08:00

178 lines
5.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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