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 { /// /// 输入系统 /// 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 _fingerStateTable = new Dictionary(); #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 } }