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
|
{
|
/// <summary>
|
/// Cached eference to gameUI
|
/// </summary>
|
EndlessGameUI m_GameUI;
|
|
/// <summary>
|
/// 是否处于拖动状态。
|
/// </summary>
|
protected bool isInDragState = false;
|
|
/// <summary>
|
/// Register input events
|
/// </summary>
|
protected override void OnEnable()
|
{
|
base.OnEnable();
|
|
m_GameUI = GetComponent<EndlessGameUI>();
|
|
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;
|
}
|
}
|
|
/// <summary>
|
/// Deregister input events
|
/// </summary>
|
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;
|
}
|
|
/// <summary>
|
/// Handle camera panning behaviour
|
/// </summary>
|
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);
|
}
|
}
|
}
|
|
/// <summary>
|
/// Ghost follows pointer
|
/// </summary>
|
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;
|
float dragTime = 0;
|
bool isDraging = false;
|
|
protected virtual void OnStartDrag(PointerActionInfo pointer)
|
{
|
if (!isDraging)
|
{
|
Debug.Log("开始拖拽");
|
isDraging = true;
|
|
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 (isDraging && (pointer != null) && (m_GameUI.isBuilding))
|
{
|
m_GameUI.TryMoveGhost(pointer, false);
|
//m_GameUI.CheckTowerPlace(pointer);
|
m_GameUI.CheckTowerPlaceNew(pointer);
|
|
}
|
}
|
|
/// <summary>
|
/// 鼠标抬起
|
/// </summary>
|
/// <param name="pointer"></param>
|
protected void OnEndDrag(PointerActionInfo pointer)
|
{
|
// EndDrag 只能放置相关的GhostTower.
|
if (isDraging)
|
{
|
if (this.isInDragState)
|
{
|
EndlessUIStart.instance.SetDarkGround(false);
|
m_GameUI.CloseCanPlace();//关闭所有绿色底板
|
|
AudioSourceManager.Ins.Play(AudioEnum.PutTower);
|
m_GameUI.CloseCanPlaceRenderer();//关闭所有宝石示意
|
m_GameUI.onEndTowerDrag(pointer);
|
|
this.isInDragState = false;
|
|
if (!GameConfig.IsNewbie)
|
Time.timeScale = currentTimeScale;
|
}
|
Invoke("ResetDraging", 0.2f);
|
}
|
}
|
|
private void ResetDraging()
|
{
|
isDraging = false;
|
Debug.Log("isDraging = false");
|
if (m_GameUI.HasTower)
|
{
|
Debug.LogError("推拽已经结束了,为什么m_GameUI.HasTower是true????,强行恢复塔位");
|
m_GameUI.EndDragCancelPlaceTower();
|
}
|
if (m_GameUI.isBuilding)
|
{
|
Debug.LogError("推拽已经结束了,为什么 m_GameUI.isBuilding是true????");
|
}
|
}
|
|
private void OnPressed(PointerActionInfo pointer)
|
{
|
m_GameUI.OnPressed(pointer);
|
}
|
|
/// <summary>
|
/// Select towers or position ghosts
|
/// </summary>
|
void OnTap(PointerActionInfo pointer)
|
{
|
// 不允许点击放置,只能拖拽
|
}
|
}
|
}
|