InputController.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. using UnityEngine;
  2. using UnityEngine.EventSystems;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Runtime.InteropServices;
  6. public class InputController : MonoBehaviour {
  7. private const float ORIGIN_SIZE = 25f;
  8. private const float MIN_SIZE = 10f;
  9. private const float MAX_SIZE = 25f;
  10. private const float MIN_ANGLE = 30f;
  11. private const float MAX_ANGLE = 80f;
  12. private const float FAR_AWAY_SIZE = 100f;
  13. public enum State
  14. {
  15. Faraway,
  16. ZoomIn,
  17. Battle,
  18. }
  19. public enum CameraMode
  20. {
  21. LockCraft = 0,
  22. FreeLook = 1
  23. }
  24. public State state;
  25. public CameraMode cameraMode;
  26. private BattleController battleController;
  27. private Plane groundPlane;
  28. private Vector3 lastMousePosition;
  29. public MoveMark moveMark;
  30. public bool lockCamera = true;
  31. private float targetDistance = FAR_AWAY_SIZE;
  32. public ITarget cameraLockedTarget;
  33. public Transform cameraPivot;
  34. public CameraShake cameraShake;
  35. public Transform cameraTrans;
  36. private float cameraSpeed = 2f;
  37. void Start ()
  38. {
  39. groundPlane = new Plane(new Vector3(0, 1f, 0), Vector3.zero);
  40. cameraPivot = GameObject.Find ("CameraPivot").transform;
  41. cameraShake = Camera.main.GetComponent<CameraShake>();
  42. cameraTrans = cameraShake.transform;
  43. UpdateCamera ();
  44. }
  45. private bool IsPointerOverUIObject()
  46. {
  47. PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
  48. eventDataCurrentPosition.position = new Vector2(Input.mousePosition.x, Input.mousePosition.y);
  49. List<RaycastResult> results = new List<RaycastResult>();
  50. EventSystem.current.RaycastAll(eventDataCurrentPosition, results);
  51. Debuger.LogWarning (results.Count);
  52. return results.Count > 0;
  53. }
  54. public void SetBattleController(BattleController battleController)
  55. {
  56. this.battleController = battleController;
  57. }
  58. public Vector3 cameraPosition
  59. {
  60. get{
  61. return cameraPivot.position;
  62. }
  63. }
  64. public void SetCameraTo(Vector3 pos)
  65. {
  66. cameraPivot.position = pos;
  67. }
  68. private void UpdateCameraPivot ()
  69. {
  70. if (cameraMode != CameraMode.LockCraft)
  71. return;
  72. if(lockCamera)
  73. {
  74. if(cameraLockedTarget != null)
  75. {
  76. if(state == State.ZoomIn)
  77. {
  78. targetDistance -= GameTime.deltaTime*(targetDistance - MAX_SIZE) * 3f;
  79. if(targetDistance < MAX_SIZE+0.1f)
  80. {
  81. targetDistance = MAX_SIZE;
  82. state = State.Battle;
  83. battleController.ReadyToAction();
  84. }
  85. UpdateCamera ();
  86. }
  87. cameraPivot.transform.position = Vector3.Lerp (cameraPivot.transform.position, cameraLockedTarget.position, GameTime.deltaTime * cameraSpeed);
  88. }
  89. }
  90. else
  91. {
  92. if(Input.GetMouseButtonDown(0))
  93. {
  94. lastMousePosition = Input.mousePosition;
  95. }
  96. else if(Input.GetMouseButton(0))
  97. {
  98. Vector3 currentMousePosition = Input.mousePosition;
  99. Vector3 lastWorldPosition = Camera.main.ScreenToWorldPoint(lastMousePosition);
  100. Vector3 currentWorldPosition = Camera.main.ScreenToWorldPoint(currentMousePosition);
  101. float deltaX = currentWorldPosition.x - lastWorldPosition.x;
  102. float deltaY = (currentWorldPosition.z - lastWorldPosition.z)/Mathf.Cos(Mathf.PI*10/180);
  103. Vector3 cameraPosition = Camera.main.transform.position;
  104. cameraPosition.x -= deltaX;
  105. cameraPosition.z -= deltaY;
  106. Camera.main.transform.position = cameraPosition;
  107. lastMousePosition = currentMousePosition;
  108. }
  109. }
  110. }
  111. private void UpdateCamera()
  112. {
  113. Vector3 camPos = cameraTrans.localPosition;
  114. camPos.z = -targetDistance;
  115. cameraTrans.localPosition = camPos;
  116. }
  117. void LateUpdate()
  118. {
  119. UpdateCameraPivot ();
  120. }
  121. // Update is called once per frame
  122. void Update ()
  123. {
  124. float mouseScrollWheel = Input.GetAxis("Mouse ScrollWheel");
  125. if(mouseScrollWheel != 0)
  126. {
  127. zoom(-mouseScrollWheel*2);
  128. }
  129. if(battleController.isGameOver || BattleController.battleType == BattleController.BattleType.Edit)
  130. {
  131. return;
  132. }
  133. if (cameraMode == CameraMode.LockCraft)
  134. CameraLockCraft ();
  135. else if (cameraMode == CameraMode.FreeLook)
  136. CameraFreeLook ();
  137. }
  138. private Vector3 mouseDownPos;
  139. private Vector3 mouseDownCameraPos;
  140. private void CameraFreeLook()
  141. {
  142. if (Input.GetMouseButtonDown (0)) {
  143. mouseDownPos = Input.mousePosition;
  144. mouseDownCameraPos = Camera.main.transform.position;
  145. }
  146. if(Input.GetMouseButton(0))
  147. {
  148. Vector3 currentMousePos = Input.mousePosition;
  149. Vector3 pos = Camera.main.transform.position;
  150. float deltaX = (currentMousePos.x - mouseDownPos.x) / Screen.width;
  151. float deltaY = (currentMousePos.y - mouseDownPos.y) / Screen.height;
  152. pos.x = mouseDownCameraPos.x - deltaX * 20f;
  153. pos.z = mouseDownCameraPos.z - deltaY * 20f;
  154. Camera.main.transform.position = Vector3.Lerp (pos, Camera.main.transform.position, GameTime.deltaTime * 10f);
  155. }
  156. }
  157. private void CameraLockCraft()
  158. {
  159. Craft ctrlCraft = battleController.GetCtrlCraft();
  160. if (ctrlCraft != null) {
  161. if (Input.GetMouseButtonDown (0) && !IsPointerOverUIObject ()) {
  162. doClick ();
  163. }
  164. if (Input.GetKeyDown (KeyCode.Q)) {
  165. battleController.AttempUsePower (ctrlCraft.GetPowerManager ().GetPowers () [1].GetId ());
  166. } else if (Input.GetKeyDown (KeyCode.W)) {
  167. battleController.AttempUsePower (ctrlCraft.GetPowerManager ().GetPowers () [2].GetId ());
  168. } else if (Input.GetKeyDown (KeyCode.E)) {
  169. battleController.AttempUsePower (ctrlCraft.GetPowerManager ().GetPowers () [3].GetId ());
  170. } else if (Input.GetKeyDown (KeyCode.A)) {
  171. battleController.AttempUsePower (ctrlCraft.GetPowerManager ().GetCrystalPowers () [0].GetId ());
  172. } else if (Input.GetKeyDown (KeyCode.S)) {
  173. battleController.AttempUsePower (ctrlCraft.GetPowerManager ().GetCrystalPowers () [1].GetId ());
  174. }
  175. } else {
  176. if (Input.GetMouseButtonDown (0) && !IsPointerOverUIObject ()) {
  177. LockNextCraft ();
  178. }
  179. }
  180. }
  181. private void doClick()
  182. {
  183. Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  184. RaycastHit hitInfo;
  185. if (Physics.Raycast (ray, out hitInfo)) {
  186. Debuger.LogWarning ("Physics.Raycast " + hitInfo.collider.gameObject.tag);
  187. if (hitInfo.collider.gameObject.tag == "Craft" || hitInfo.collider.gameObject.tag == "Tower") {
  188. Craft craft = hitInfo.collider.GetComponent<Craft> ();
  189. if (craft == null) {
  190. Debuger.LogError ("craft is null");
  191. return;
  192. }
  193. if (craft.team != battleController.GetCtrlCraft ().team) {
  194. battleController.GetCtrlCraft ().target = craft;
  195. battleController.GetCtrlCraft ().GetComponent<CraftAI> ().followTarget = true;
  196. return;
  197. }
  198. }
  199. }
  200. //do move
  201. float rayDistance;
  202. if (groundPlane.Raycast (ray, out rayDistance)) {
  203. Vector3 hitPos = ray.GetPoint (rayDistance);
  204. Debuger.LogWarning ("groundPlane.Raycast " + hitPos);
  205. moveMark.transform.position = hitPos;
  206. moveMark.particleSystem.Emit (1);
  207. battleController.GetCtrlCraft().GetComponent<CraftAI>().followTarget = false;
  208. battleController.GetCtrlCraft().forceMove = true;
  209. battleController.GetMessageManager().Move(battleController.GetCtrlCraft(), hitPos);
  210. }
  211. }
  212. public void LockNextCraft()
  213. {
  214. if (state != State.Battle)
  215. return;
  216. if (cameraLockedTarget == null || !(cameraLockedTarget is Craft) || (cameraLockedTarget as Craft).IsDead ())
  217. cameraLockedTarget = null;
  218. List<Player> playerList = battleController.GetBattleSession ().GetPlayerList ();
  219. Craft firstCraft = null;
  220. for(int i=0; i<playerList.Count; i++)
  221. {
  222. Player player = playerList [i];
  223. if (player.GetHero ().GetCraft () == null)
  224. continue;
  225. if (firstCraft == null)
  226. firstCraft = player.GetHero ().GetCraft ();
  227. if (cameraLockedTarget != null) {
  228. if(cameraLockedTarget == player.GetHero().GetCraft())
  229. {
  230. cameraLockedTarget = null;
  231. }
  232. } else {
  233. cameraLockedTarget = player.GetHero ().GetCraft ();
  234. break;
  235. }
  236. }
  237. if (cameraLockedTarget == null) {
  238. cameraLockedTarget = firstCraft;
  239. }
  240. }
  241. private void zoom(float value)
  242. {
  243. if(state == State.Battle)
  244. {
  245. targetDistance += value*10f;
  246. targetDistance = NumberUtil.forceBetween(targetDistance, MIN_SIZE, MAX_SIZE);
  247. UpdateCamera ();
  248. Vector3 rotation = Vector3.zero;
  249. rotation.x = MIN_ANGLE + (MAX_ANGLE - MIN_ANGLE) * ((targetDistance - MIN_SIZE) / (MAX_SIZE - MIN_SIZE));
  250. cameraPivot.transform.localEulerAngles = rotation;
  251. }
  252. }
  253. }