Main/Assets/Code/Logic/_Required/Input/InputSystem.cs
2025-01-25 04:38:09 +08:00

428 lines
14 KiB
C#

using Thousandto.Code.Center;
using Thousandto.Code.Global;
using Thousandto.Code.Logic.LocalPlayerBT;
using Thousandto.Core.Base;
using System.Collections.Generic;
using UnityEngine;
using FLogger = UnityEngine.Gonbest.MagicCube.FLogger;
namespace Thousandto.Code.Logic
{
/// <summary>
/// 输入系统
/// </summary>
public class InputSystem : BaseSystem, IInputSystem
{
#region //私有变量
//点击处理
private HitHandler _hitHandler = new HitHandler();
//摄像机调整处理
private CameraAdjustHandler _cameraAdjustHandler = new CameraAdjustHandler();
//摇杆处理
private JoystickHandler _joystickHandler = new JoystickHandler();
//翻滚闪避处理器
private RollDodgeHandler _rollDadgeHandler = new RollDodgeHandler();
//玩家控制器
private IPlayerInputer _player = null;
//手势加载器
private IFingerGesturesEvent _fingerGesturesEvent = null;
//是否被激活
private bool _isActive = false;
//UI检测点击处理
private IUIChecker _checkHitUI = null;
private Dictionary<int, FingerState> _fingerStateTable = new Dictionary<int, FingerState>();
#endregion
#region //公共接口
//摇杆处理
public JoystickHandler JoystickHandler
{
get
{
return _joystickHandler;
}
}
public RollDodgeHandler RollDadgeHandler
{
get
{
return _rollDadgeHandler;
}
}
public CameraAdjustHandler CameraAdjustHandler
{
get
{
return _cameraAdjustHandler;
}
}
//初始化处理
public void Initialize()
{
_rollDadgeHandler.Initialize();
_isActive = false;
}
//卸载处理
public void Uninitialize()
{
_rollDadgeHandler.Uninitialize();
_isActive = false;
UnBindFingerGesturesHandler();
}
//设置UI检测对象
public void SetUIChecker(IUIChecker checker)
{
_checkHitUI = checker;
_joystickHandler.SetUIChecker(_checkHitUI);
}
//设置手势的事件处理器
public void SetFingerGesturesEventTrigger(IFingerGesturesEvent e, bool isBindHandler = false)
{
if (_fingerGesturesEvent != null)
{
UnBindFingerGesturesHandler();
}
_fingerGesturesEvent = e;
if (isBindHandler && _fingerGesturesEvent != null)
{
BindFingerGesturesHandler();
}
}
//进入场景的操作
public void EnterScene()
{
//使用协成
//获取当前被激活的场景
var scene = GameCenter.GameSceneSystem.GetActivedScene();
//获取当前角色
var lp = GameCenter.GameSceneSystem.GetLocalPlayer();
if (lp == null) return;
//初始化Player的行为树
PlayerBT.Initialize();
PlayerBT.InitializeBD(lp);
//1.刷新各个处理器的一些引用
_hitHandler.Refresh(scene.SceneCamera);
_joystickHandler.Refresh(scene.SceneCamera, scene.navigator, lp);
_cameraAdjustHandler.Refresh(scene.SceneCameraControl);
_player = lp;
//绑定手势操作的处理回调
BindFingerGesturesHandler();
_fingerStateTable.Clear();
_isActive = true;
GameCenter.RegFixEventHandle(LogicEventDefine.EID_EVENT_FORM_SHOW_AFTER, OnFormOpen);
GameCenter.RegFixEventHandle(LogicEventDefine.EID_EVENT_CANEL_MAINHANDLE, OnCanelMianHandle);
}
//离开场景的操作
public void LeaveScene()
{
_isActive = false;
//取消绑定手势操作的处理回调
UnBindFingerGesturesHandler();
//复位其他处理器
_hitHandler.Reset();
_cameraAdjustHandler.Reset();
_joystickHandler.Reset();
_player = null;
PlayerBT.Uninitialize();
GameCenter.UnRegFixEventHandle(LogicEventDefine.EID_EVENT_FORM_SHOW_AFTER, OnFormOpen);
GameCenter.UnRegFixEventHandle(LogicEventDefine.EID_EVENT_CANEL_MAINHANDLE, OnCanelMianHandle);
}
//取消所有输入
public void CanelAllInput()
{
_fingerStateTable.Clear();
if(_joystickHandler.Draging)
{
#if !USE_PC_MODEL
_joystickHandler.DoJoystickDragEnd();
#endif
}
}
//输入系统的心跳处理
protected override bool OnUpdate(float deltaTime)
{
if (_isActive)
{
_joystickHandler.Update();
PlayerBT.Run(deltaTime);
}
return true;
}
#endregion
#region //场景玩家手势操作控制处理 -- 私有方法
//绑定手势事件的处理
private void BindFingerGesturesHandler()
{
if (_fingerGesturesEvent == null) return;
_fingerGesturesEvent.OnFingerDown += FingerGestures_OnFingerDown;
_fingerGesturesEvent.OnFingerUp += FingerGestures_OnFingerUP;
_fingerGesturesEvent.OnPinchBegin += FingerGestures_OnPinchBegin;
_fingerGesturesEvent.OnPinchMove += FingerGestures_OnPinchMove;
_fingerGesturesEvent.OnPinchEnd += FingerGestures_OnPinchEnd;
_fingerGesturesEvent.OnFingerMoveBegin += FingerGestures_OnMoveBegin;
_fingerGesturesEvent.OnFingerMove += FingerGestures_OnMove;
_fingerGesturesEvent.OnFingerMoveEnd += FingerGestures_OnMoveEnd;
//FLogger.Log("BindFingerGesturesHandler)");
}
private void UnBindFingerGesturesHandler()
{
if (_fingerGesturesEvent == null) return;
_fingerGesturesEvent.OnFingerDown -= FingerGestures_OnFingerDown;
_fingerGesturesEvent.OnFingerUp -= FingerGestures_OnFingerUP;
_fingerGesturesEvent.OnPinchBegin -= FingerGestures_OnPinchBegin;
_fingerGesturesEvent.OnPinchMove -= FingerGestures_OnPinchMove;
_fingerGesturesEvent.OnPinchEnd -= FingerGestures_OnPinchEnd;
_fingerGesturesEvent.OnFingerMoveBegin -= FingerGestures_OnMoveBegin;
_fingerGesturesEvent.OnFingerMove -= FingerGestures_OnMove;
_fingerGesturesEvent.OnFingerMoveEnd -= FingerGestures_OnMoveEnd;
//FLogger.Log("UnBindFingerGesturesHandler)");
}
private int GetFingerStateCount(FingerState state)
{
int count = 0;
var iter = _fingerStateTable.GetEnumerator();
while (iter.MoveNext())
{
if (iter.Current.Value == state)
{
++count;
}
}
return count;
}
//按下操作处理
private void FingerGestures_OnFingerDown(int fingerIndex, Vector2 fingerpos)
{
if (!CheckHitUI(fingerIndex))
{
//判断是否在摇杆的处理范围内
#if !USE_PC_MODEL
if (_joystickHandler.EnableHoldDrag && _joystickHandler.JoystickArea.Contains(fingerpos))
{
_fingerStateTable[fingerIndex] = FingerState.HandleJoystick;
_joystickHandler.DoJoystickDragBegin(fingerpos, fingerIndex);
}
else
#endif
{
_fingerStateTable[fingerIndex] = FingerState.CheckSpace;
}
if (MainFunctionSystem.MainMenuIsShowed && GameCenter.MapLogicSwitch.IsCopyMap)
{
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_CLOSE_MAINMENU);
}
}
else
{
_fingerStateTable.Remove(fingerIndex);
}
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_ON_FINGER_DOWN);
}
//抬起的操作处理
private void FingerGestures_OnFingerUP(int fingerIndex, Vector2 fingerpos, float time)
{
if (!_fingerStateTable.ContainsKey(fingerIndex))
return;
var state = _fingerStateTable[fingerIndex];
if(state == FingerState.HandleJoystick)
{
#if !USE_PC_MODEL
_joystickHandler.DoJoystickDragEnd();
#endif
}
else if(state == FingerState.MoveOnSpace)
{
_cameraAdjustHandler.OnEndCameraYawMultiTouch(fingerIndex);
}
//判断是否点击了UI上的空白处
else if (state == FingerState.CheckSpace)
{
#if USE_PC_MODEL
if(Input.GetMouseButtonUp(0))
{
_hitHandler.OnHit(fingerpos);
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_ON_HIT_SCENE, fingerpos);
}
#else
_hitHandler.OnHit(fingerpos);
GameCenter.PushFixEvent(LogicEventDefine.EID_EVENT_ON_HIT_SCENE, fingerpos);
#endif
}
_fingerStateTable.Remove(fingerIndex);
}
//手指按下开始移动
private void FingerGestures_OnMoveBegin(int fingerIndex, Vector2 fingerPos)
{
if (!_fingerStateTable.ContainsKey(fingerIndex))
return;
var state = _fingerStateTable[fingerIndex];
if (state == FingerState.CheckSpace || state == FingerState.MoveOnSpace)
{
//只有一个点击空白处的移动才会处理摄像机移动
var count = GetFingerStateCount(FingerState.CheckSpace) + GetFingerStateCount(FingerState.MoveOnSpace);
if (count <= 1)
{
_cameraAdjustHandler.OnStartCameraYawMultiTouch(fingerIndex, fingerPos);
}
_fingerStateTable[fingerIndex] = FingerState.MoveOnSpace;
}
}
//手指按下移动中
private void FingerGestures_OnMove(int fingerIndex, Vector2 fingerPos)
{
if (!_fingerStateTable.ContainsKey(fingerIndex))
return;
var state = _fingerStateTable[fingerIndex];
if (state == FingerState.HandleJoystick)
{
#if !USE_PC_MODEL
//判断是否正在处理摇杆
_joystickHandler.DoJoystickDraging(fingerPos);
#endif
}
else if (state == FingerState.MoveOnSpace )
{
var count = GetFingerStateCount(FingerState.CheckSpace) + GetFingerStateCount(FingerState.MoveOnSpace);
if (count <= 1)
{
_cameraAdjustHandler.OnUpdateCameraYawMultiTouch(fingerIndex, fingerPos);
_joystickHandler.OnCameraYawChanged();
}
}
}
////手指按下移动结束
private void FingerGestures_OnMoveEnd(int fingerIndex, Vector2 fingerPos)
{
}
//两个手指进行捏或者划操作 -- 开始
private void FingerGestures_OnPinchBegin(Vector2 fingerPos1, Vector2 fingerPos2)
{
//如果正在操作摇杆,就无效
if (GetFingerStateCount(FingerState.HandleJoystick) > 0)
return;
if (!_fingerStateTable.ContainsKey(0))
return;
if (!_fingerStateTable.ContainsKey(1))
return;
var state0 = _fingerStateTable[0];
var state1 = _fingerStateTable[1];
if ((state0 == FingerState.CheckSpace || state0 == FingerState.MoveOnSpace) &&
(state1 == FingerState.CheckSpace || state1 == FingerState.MoveOnSpace))
{
_cameraAdjustHandler.OnStartCameraDistanceAdjust(fingerPos1, fingerPos2);
}
}
//两个手指进行捏或者划操作 -- 移动
private void FingerGestures_OnPinchMove(Vector2 fingerPos1, Vector2 fingerPos2, float delta)
{
//如果正在操作摇杆,就无效
if (GetFingerStateCount(FingerState.HandleJoystick) > 0)
return;
if (!_fingerStateTable.ContainsKey(0))
return;
if (!_fingerStateTable.ContainsKey(1))
return;
var state0 = _fingerStateTable[0];
var state1 = _fingerStateTable[1];
if ((state0 == FingerState.CheckSpace || state0 == FingerState.MoveOnSpace) &&
(state1 == FingerState.CheckSpace || state1 == FingerState.MoveOnSpace))
{
_cameraAdjustHandler.OnUpdateCameraDistanceAdjust(fingerPos1, fingerPos2);
}
}
//两个手指进行捏或者划操作 -- 结束
private void FingerGestures_OnPinchEnd(Vector2 fingerPos1, Vector2 fingerPos2)
{
_cameraAdjustHandler.OnEndCameraDistanceAdjust(); // do Dis adjust
}
#endregion
#region//私有工具方法
//判断是否点击的是UI界面
private bool CheckHitUI(int touchID)
{
return _checkHitUI.IsHitUI(touchID);
}
private void OnFormOpen(object obj,object sender=null)
{
var uiname = obj as string;
if (string.IsNullOrEmpty(uiname))
return;
if(_joystickHandler.Draging)
{
if (_checkHitUI.IsHitUI(_joystickHandler.CurTouchID, uiname))
{
CanelAllInput();
}
}
}
private void OnCanelMianHandle(object obj,object sender=null)
{
CanelAllInput();
}
#endregion
#region //私有类,枚举定义
//点击状态
private enum FingerState
{
HandleJoystick,
CheckSpace,
MoveOnSpace,
}
#endregion
}
}