//called in every frame, execute if there's an ability is selected and pending target selection //use only mouse input atm. void SelectAbilityTarget() { if (selectedAbilityID < 0) { return; } //only cast on terrain and platform LayerMask mask = 1 << LayerManager.LayerPlatform(); int terrainLayer = LayerManager.LayerTerrain(); if (terrainLayer >= 0) { mask |= 1 << terrainLayer; } Ability ability = abilityList[selectedAbilityID]; if (ability.singleUnitTargeting) { if (ability.targetType == Ability._TargetType.Hybrid) { mask |= 1 << LayerManager.LayerTower(); mask |= 1 << LayerManager.LayerCreep(); } else if (ability.targetType == Ability._TargetType.Friendly) { mask |= 1 << LayerManager.LayerTower(); } else if (ability.targetType == Ability._TargetType.Hostile) { mask |= 1 << LayerManager.LayerCreep(); } } #if UNITY_IPHONE || UNITY_ANDROID || UNITY_WP8 Unit targetUnit = null; if (Input.touchCount >= 1) { Camera mainCam = Camera.main; if (mainCam != null) { Ray ray = mainCam.ScreenPointToRay(Input.touches[0].position); RaycastHit hit; if (Physics.Raycast(ray, out hit, Mathf.Infinity, mask)) { currentIndicator.position = hit.point + new Vector3(0, 0.1f, 0); validTarget = true; if (ability.singleUnitTargeting) { targetUnit = hit.transform.GetComponent <Unit>(); if (targetUnit != null) { currentIndicator.position = targetUnit.thisT.position; } else { validTarget = false; } } } else { validTarget = false; } } } else { if (validTarget) { ActivateAbility(ability, currentIndicator.position, targetUnit); } else { GameControl.DisplayMessage("Invalid target for ability"); } ClearSelectedAbility(); } #else Camera mainCam = Camera.main; if (mainCam != null) { Ray ray = mainCam.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit, Mathf.Infinity, mask)) { currentIndicator.position = hit.point + new Vector3(0, 0.1f, 0); Unit targetUnit = null; validTarget = true; if (ability.singleUnitTargeting) { targetUnit = hit.transform.GetComponent <Unit>(); if (targetUnit != null) { currentIndicator.position = targetUnit.thisT.position; } else { validTarget = false; } } if (Input.GetMouseButtonDown(0)) { if (validTarget) { ActivateAbility(ability, currentIndicator.position, targetUnit); ClearSelectedAbility(); } else { GameControl.DisplayMessage("Invalid target for ability"); } } } } if (Input.GetMouseButtonDown(1)) { ClearSelectedAbility(); } #endif }
public IEnumerator DragNDropRoutine() { GameControl.SelectTower(this); yield return(null); #if UNITY_IPHONE || UNITY_ANDROID || UNITY_WP8 || UNITY_BLACKBERRY _TileStatus status = _TileStatus.NoPlatform; while (Input.touchCount >= 1) { Vector3 pos = Input.touches[0].position; status = BuildManager.CheckBuildPoint(pos, -1, prefabID); if (status == _TileStatus.Available) { BuildInfo buildInfo = BuildManager.GetBuildInfo(); thisT.position = buildInfo.position; thisT.rotation = buildInfo.platform.thisT.rotation; } else { Ray ray = Camera.main.ScreenPointToRay(pos); RaycastHit hit; if (Physics.Raycast(ray, out hit, Mathf.Infinity)) { thisT.position = hit.point; } //this there is no collier, randomly place it 30unit from camera else { thisT.position = ray.GetPoint(30); } } if (Input.touches[0].phase == TouchPhase.Ended) { string exception = BuildManager.BuildTower(srcTower); if (exception != "") { GameControl.DisplayMessage(exception); } else { BuildManager.ClearBuildPoint(); } break; } yield return(null); } //if(status==_TileStatus.Available){ // string exception=BuildManager.BuildTower(srcTower); // if(exception!="") GameControl.DisplayMessage(exception); //} //else{ // GameControl.DisplayMessage("cancelled"); // BuildManager.ClearBuildPoint(); //} GameControl.ClearSelectedTower(); thisObj.SetActive(false); #else while (true) { Vector3 pos = Input.mousePosition; _TileStatus status = BuildManager.CheckBuildPoint(pos, -1, prefabID); if (status == _TileStatus.Available) { BuildInfo buildInfo = BuildManager.GetBuildInfo(); thisT.position = buildInfo.position; thisT.rotation = buildInfo.platform.thisT.rotation; } else { Ray ray = Camera.main.ScreenPointToRay(pos); RaycastHit hit; if (Physics.Raycast(ray, out hit, Mathf.Infinity)) { thisT.position = hit.point; } //this there is no collier, randomly place it 30unit from camera else { thisT.position = ray.GetPoint(30); } } //left-click, build if (Input.GetMouseButtonDown(0) && !UIUtilities.IsCursorOnUI()) { //if current mouse point position is valid, build the tower if (status == _TileStatus.Available) { string exception = BuildManager.BuildTower(srcTower); if (exception != "") { GameControl.DisplayMessage(exception); } } else { BuildManager.ClearBuildPoint(); } GameControl.ClearSelectedTower(); thisObj.SetActive(false); break; } //right-click, cancel if (Input.GetMouseButtonDown(1) || GameControl.GetGameState() == _GameState.Over) { GameControl.ClearSelectedTower(); BuildManager.ClearBuildPoint(); thisObj.SetActive(false); break; } yield return(null); } #endif thisT.position = new Vector3(0, 9999, 0); }