public Rigidbody GetNearUnit(UnitMechanics unit, Vector3 current_position) { Rigidbody near_position = null; List <Transform> current_list; current_list = (unit is EarthUnit) ? mars_units : earth_units; if (current_list.Count == 0) { return(near_position); } //работа с листом проверка дистанции float current_distance = Mathf.Infinity; float distance = 0f; RaycastHit hit; for (int i = 0; i < current_list.Count; ++i) { distance = (current_position - current_list[i].localPosition).sqrMagnitude; if (distance < current_distance && Physics.Raycast(new Ray(current_position + Vector3.up * 5f, (current_list[i].localPosition - current_position)), out hit, 40f) && hit.collider.CompareTag("Unit")) { near_position = current_list[i].GetComponent <Rigidbody>(); current_distance = distance; } } return(near_position); }
//получение ui для юнита public Transform GetUnitUI(UnitMechanics unit) { Transform ui; if (unit is EarthUnit) { ui = Instantiate(units_ui[0], unit.transform.position, Quaternion.Euler(90f, 0f, 0f), GameObject.FindGameObjectWithTag("Scene Canvas").transform.Find("Units UI")).transform; EventTrigger.Entry entry = new EventTrigger.Entry { eventID = EventTriggerType.PointerDown }; entry.callback.AddListener(delegate { PlayerSelectUnit(unit); }); ui.GetComponent <EventTrigger>().triggers.Add(entry); } else { //пока назначение UI для юнита ui = Instantiate(units_ui[1], unit.transform.position, Quaternion.Euler(90f, 0f, 0f), GameObject.FindGameObjectWithTag("Scene Canvas").transform.Find("Units UI")).transform; } ui.position = new Vector3(transform.position.x, 0.2f, transform.position.z); SetupUnitUI(ui); return(ui); }
//+++ public void CheckSelectedUnit(UnitMechanics unit) { if (selected_unit == null) { return; } if (selected_unit == unit) { PlayerDeselectUnit(); } }
//отметка занятых точек public void PointIsBooked(UnitMechanics unit, Transform point) { if (unit == null) { point.GetComponent <Image>().color = new Color(1f, 1f, 1f, 0.4f); } else { point.GetComponent <Image>().color = new Color(0f, 1f, 0f, 0.4f); } }
public void ResetUnitList(UnitMechanics unit) { if (unit is EarthUnit) { earth_units.Remove(unit.transform); } else { mars_units.Remove(unit.transform); } }
//выбор юнита при нажатие на UI элемент - событие PointerDown public void PlayerSelectUnit(UnitMechanics unit)//+++ { if (unit.UnitIsMoving()) { return; } if (selected_unit != null) { PlayerDeselectUnit(); } selected_unit = unit as EarthUnit; selector_ui.transform.position = unit.transform.localPosition + Vector3.up * 1f; //selector_ui.transform.localPosition += Vector3.up * 30f;//смещение по оси Y в зависимости от камеры selector_ui.SetActive(true); ChangeAvatarImage(unit.unit_type); }
private void OnTriggerExit(Collider other) { if (other.CompareTag("Unit")) { UnitMechanics current_unit = other.GetComponent <UnitMechanics>(); if (current_unit is EarthUnit) { earth_units.Remove(current_unit.transform); } else { mars_units.Remove(current_unit.transform); } current_unit.RegistrationZone(null); } }
//возврат в пул объекта public void ReturnObjectInPool(Rigidbody obj, byte code_pool) { //стд. действия со всеми объектами obj.velocity = Vector3.zero; obj.angularVelocity = Vector3.zero; obj.position = Vector3.zero; obj.gameObject.SetActive(false); if (obj.CompareTag("Bullet")) { obj.transform.SetParent(pool_bullet); obj.GetComponent <TrailRenderer>().enabled = false; } else { UnitMechanics current_unit = obj.GetComponent <UnitMechanics>(); Transform current_pool = (current_unit is MarsUnit) ? pool_mars_units : pool_earth_units; switch (code_pool) { //!!!Пока реализуется только 1-ый пул!!! case (1): //пул солдатов current_unit.transform.SetParent(current_pool.GetChild(code_pool - 1)); break; case (2): //пул офицеров break; case (3): //пул лег. тех. break; case (4): //пул танков break; case (5): //пул пво break; default: break; } obj.useGravity = true; } }
public void RefreshCaptureZone(UnitMechanics unit) { if (unit is MarsUnit && capture != 0) { if (capture > 0) { capture -= 5; } else { capture = 0; } if (capture == 0) { transform.GetChild(0).gameObject.SetActive(false); for (int i = 0; i < zone_points.Length; ++i) { zone_points[i].SetPointImage(null); } } player_controller.RefreshZoneFlag(zone_ui, (float)capture / 100); } }
//занять точку public void SetUnitInPoint(UnitMechanics unit) { current_unit = unit; }
//конструктор public PointInfo(Transform position) { point_position = position.position; current_unit = null; }