using Core.Input; using TowerDefense.Level; using TowerDefense.Towers; using TowerDefense.UI.HUD; using UnityEngine; using UnityInput = UnityEngine.Input; using State = TowerDefense.UI.HUD.EndlessGameUI.State; using KTGMGemClient; namespace TowerDefense.Input { [RequireComponent(typeof(EndlessGameUI))] public class EndlessTowerDefenseKeyboardMouseInput : KeyboardMouseInput { /// /// Cached eference to gameUI /// EndlessGameUI m_GameUI; /// /// 是否处于拖动状态。 /// protected bool isInDragState = false; /// /// Register input events /// protected override void OnEnable() { base.OnEnable(); m_GameUI = GetComponent(); if (InputController.instanceExists) { InputController controller = InputController.instance; controller.tapped += OnTap; controller.mouseMoved += OnMouseMoved; // River Add for Mouse Start Drag & Draged. controller.startedDrag += OnStartDrag; controller.dragged += this.OnDrag; controller.pressed += OnPressed; controller.released += this.OnEndDrag; } } /// /// Deregister input events /// protected override void OnDisable() { if (!InputController.instanceExists) { return; } InputController controller = InputController.instance; controller.tapped -= OnTap; controller.mouseMoved -= OnMouseMoved; controller.startedDrag -= this.OnStartDrag; controller.dragged -= this.OnDrag; controller.pressed -= OnPressed; controller.released -= this.OnEndDrag; } /// /// Handle camera panning behaviour /// protected override void Update() { base.Update(); // Escape handling if (UnityInput.GetKeyDown(KeyCode.Escape)) { switch (m_GameUI.state) { case State.Normal: if (m_GameUI.isTowerSelected) { m_GameUI.DeselectTower(); } else { m_GameUI.Pause(); } break; case State.BuildingWithDrag: case State.Building: m_GameUI.CancelGhostPlacement(); break; } } // place towers with keyboard numbers if (EndlessLevelManager.instanceExists) { int towerLibraryCount = EndlessLevelManager.instance.TowerLibrary.Count; // find the lowest value between 9 (keyboard numbers) // and the amount of towers in the library int count = Mathf.Min(9, towerLibraryCount); KeyCode highestKey = KeyCode.Alpha1 + count; for (var key = KeyCode.Alpha1; key < highestKey; key++) { // add offset for the KeyCode Alpha 1 index to find correct keycodes if (UnityInput.GetKeyDown(key)) { Tower controller = EndlessLevelManager.instance.TowerLibrary[key - KeyCode.Alpha1]; if (m_GameUI.isBuilding) { m_GameUI.CancelGhostPlacement(); } EndlessGameUI.instance.SetToBuildMode(controller); EndlessGameUI.instance.TryMoveGhost(InputController.instance.basicMouseInfo); break; } } // special case for 0 mapping to index 9 if (count < 10 && UnityInput.GetKeyDown(KeyCode.Alpha0)) { Tower controller = EndlessLevelManager.instance.TowerLibrary[9]; EndlessGameUI.instance.SetToBuildMode(controller); EndlessGameUI.instance.TryMoveGhost(InputController.instance.basicMouseInfo); } } } /// /// Ghost follows pointer /// void OnMouseMoved(PointerInfo pointer) { // We only respond to mouse info var mouseInfo = pointer as MouseCursorInfo; if ((mouseInfo != null) && (m_GameUI.isBuilding)) { m_GameUI.TryMoveGhost(pointer, false); } } float currentTimeScale = 1.0f; protected virtual void OnStartDrag(PointerActionInfo pointer) { if (GameConfig.IsNewbie) { if (!GameConfig.CanDragTower) { Debug.Log("新手不可以拖拽"); return; } } // select towers m_GameUI.TrySelectTower(pointer); // River: 为了开始拖动后可以直接显示GhostTower m_GameUI.TryMoveGhost(pointer, false); if (m_GameUI.HasTower) { EndlessUIStart.instance.SetDarkGround(true); this.isInDragState = true; AudioSourceManager.Ins.Play(AudioEnum.DragTower); m_GameUI.CheckAllCanPlace();//检查上阵宝石有么有可以合成的位置 if (!GameConfig.IsNewbie) { //新手引导这里会把引导的速度变慢 currentTimeScale = Time.timeScale; Time.timeScale = 0.5f; } else { GuideCtrl.Ins.BeginDrag5_1(); } } } protected override void OnDrag(PointerActionInfo pointer) { if ((pointer != null) && (m_GameUI.isBuilding)) { m_GameUI.TryMoveGhost(pointer, false); m_GameUI.CheckTowerPlace(pointer); } } /// /// 鼠标抬起 /// /// protected void OnEndDrag(PointerActionInfo pointer) { // EndDrag 只能放置相关的GhostTower. if (this.isInDragState) { EndlessUIStart.instance.SetDarkGround(false); AudioSourceManager.Ins.Play(AudioEnum.PutTower); m_GameUI.CloseCanPlaceRenderer();//关闭所有宝石示意 m_GameUI.onEndTowerDrag(pointer); this.isInDragState = false; if (!GameConfig.IsNewbie) Time.timeScale = currentTimeScale; } } private void OnPressed(PointerActionInfo pointer) { m_GameUI.OnPressed(pointer); } /// /// Select towers or position ghosts /// void OnTap(PointerActionInfo pointer) { // 不允许点击放置,只能拖拽 } } }