public void deselect_active_unit() { if (selected_unit_List.Contains(active_unit)) { selected_unit_List.Remove(active_unit); } if (active_unit != null) { active_unit.setDeselected(); } active_unit = null; }
public void create_Unit() { GameObject new_Minion = (GameObject)Instantiate(minion_prefab, spawn_point.transform.position, minion_prefab.transform.rotation); //Пичкаем нашего миньена бонусами: Movement_Units new_minion_script = new_Minion.GetComponent <Movement_Units> (); new_minion_script.max_hp += hp_Bonus; new_minion_script.armor += armor_Bonus; new_minion_script.atack_power += atack_Power_Bonus; new_minion_script.atack_speed += atack_Speed_Bonus; //Так как казармы вне фонтана то добавляем миньена на карту: GameManager.Instance.player_units_in_Map_List.Add(new_minion_script); GameManager.Instance.player_money -= spawn_minion_Coast; GameManager.Instance.updateMoney(); }
//Добавляем Юниты в коллайдере в спиcок выбранных: void OnTriggerEnter(Collider coll) { //Мы выделяем своих: //Debug.Log (coll.gameObject.tag); if (coll.gameObject.tag == "player_unit") { Movement_Units selected = coll.gameObject.GetComponent <Movement_Units> (); if (!GameManager.Instance.selected_unit_List.Contains(selected)) { GameManager.Instance.selected_unit_List.Add(selected); //Помечаем Unit как выбранный(управляемый игроком): GameManager.Instance.active_unit = selected; selected.setSelected(); } } }
//Метод получает на вход список и выводит наиближайший к нам обьект: public Movement_Units select_Enemy(List <Movement_Units> enemy_list) { //ВНИМАНИЕ! это место подлежит дальнейшей оптимизации. (думаю для тех количеств юнитов что у меня на уровне такое решение возможно) //Для выборки получаем первый элемент: Movement_Units select_enemy = enemy_list [0]; float distance_to_enemy = Vector3.Distance(this.gameObject.transform.position, select_enemy.gameObject.transform.position); for (int i = 0; i < enemy_list.Count; i++) { float next_distance = Vector3.Distance(enemy_list [i].gameObject.transform.position, this.gameObject.transform.position); if (next_distance < distance_to_enemy) { distance_to_enemy = next_distance; select_enemy = enemy_list [i]; } } return(select_enemy); }
//У всех кто вышел отключаем регенерацию: void OnTriggerExit(Collider coll) { if (coll.gameObject.tag == "player_unit") { Movement_Units inputed_unit = coll.gameObject.GetComponent <Movement_Units> (); //Добавляем юнит в сисок "У фантана" if (GameManager.Instance.player_unit_in_save_zone_List.Contains(inputed_unit)) { GameManager.Instance.player_unit_in_save_zone_List.Remove(inputed_unit); } //Удаляем из списка карты: if (!GameManager.Instance.player_units_in_Map_List.Contains(inputed_unit)) { GameManager.Instance.player_units_in_Map_List.Add(inputed_unit); } inputed_unit.regeneration = false; } }
//при нажатии на правую кнопку мыши снимаем выделение с юнитов: public void deselect_all_units() { //Отключаем активные здания: if (Input.GetMouseButtonDown(1)) { //Если мы были в казарме: if (GameManager.Instance.ui == GameManager.ui_type.distance_kazarm || GameManager.Instance.ui == GameManager.ui_type.melee_kazarm) { GameManager.Instance.disable_ui(); GameManager.Instance.ui = GameManager.ui_type.empty; } } if (GameManager.Instance.selected_unit_List.Count > 1) { if (Input.GetMouseButtonDown(1)) { if (GameManager.Instance.active_unit != null) { GameManager.Instance.active_unit = null; } for (int i = 0; i < GameManager.Instance.selected_unit_List.Count; i++) { Movement_Units next = GameManager.Instance.selected_unit_List [i]; next.setDeselected(); } GameManager.Instance.selected_unit_List.Clear(); } } else { if (Input.GetMouseButtonDown(1)) { GameManager.Instance.deselect_active_unit(); } } }
//убираем пометку: public void deselectTarget() { active_enemy = null; }
//Помечаем как мешень: public void setTarget(Movement_Units target) { active_enemy = target; }
//Метод возвращает позицию клика: public IEnumerator getPositionClick() { if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit, 100)) { //Если игрок кликает на другого юнита игрока: if (hit.collider.gameObject.tag == "player_unit") { if (hit.collider.gameObject != GameManager.Instance.active_unit) { //Debug.Log ("Ты кликнул на другого юнита"); //Проверяем если выбрана не группа юнитов а один единственный, снимаем выдление с текущего и выделяем нового: if (GameManager.Instance.selected_unit_List.Count == 1) { GameManager.Instance.deselect_active_unit(); } //Теперь отмечаем новый юнит как помеченный: GameManager.Instance.active_unit = hit.collider.gameObject.GetComponent <Movement_Units> (); GameManager.Instance.active_unit.setSelected(); } } else //Игрок выделил казарму: if (hit.collider.gameObject.tag == "kazarm_melee") { hit.collider.gameObject.GetComponent <Kazarm> ().kazarm_selected = true; Debug.Log("Игрок выбрал казарму пехотинцев"); deselect_all_units(); //Отображаем интерфейс управления казармой: GameManager.Instance.ui = GameManager.ui_type.melee_kazarm; } else if (hit.collider.gameObject.tag == "kazarm_distance") { hit.collider.gameObject.GetComponent <Kazarm> ().kazarm_selected = true; Debug.Log("Игрок выбрал казарму стрелков"); deselect_all_units(); //Отображаем интерфейс управления казармой: GameManager.Instance.ui = GameManager.ui_type.distance_kazarm; } else if (hit.collider.gameObject.tag == "enemy") { //итак игрок кликнул на врага, указываем всем подконтрольным унитом данного врага как цель: for (int i = 0; i < GameManager.Instance.selected_unit_List.Count; i++) { GameManager.Instance.selected_unit_List [i].active_enemy = hit.collider.gameObject.GetComponent <Movement_Units> (); //ну и переводим их в атаку GameManager.Instance.selected_unit_List [i].order = Movement_Units.minion_order.atack; } } else { if (GameManager.Instance.active_unit != null) { //Передаем нашему подконтрольному юниту кординаты для дислокации: if (GameManager.Instance.selected_unit_List.Count > 0) { for (int i = 0; i < GameManager.Instance.selected_unit_List.Count; i++) { Movement_Units select_unit = GameManager.Instance.selected_unit_List [i]; select_unit.setDestination(hit.point); select_unit.order = Movement_Units.minion_order.empty; } } } Debug.DrawLine(ray.origin, hit.point); result = hit.point; result.y = 0f; } } } click_position = result; yield return(new WaitForSeconds(2f)); //Итак стартую выделение: selectBoxSone(click_position); yield return(null); }