/**********************************************************************************/ // функция убирающая юнита с карты, к примеру в случае смерти // /**********************************************************************************/ public void ReleaseUnitFromMap(CIGameObject unitCtr) { Point position = unitCtr.GetGlobalPosition(); int unitID = unitCtr.ID; Dictionary <int, CIGameObject> listOfUnits; // проверяем - работали ли мы уже с этим юнитом // если нет - выходим, ничего больше делать не надо, так как мы его и не учитывали if (!m_UnitToPoint.ContainsKey(unitID)) { Debug.LogWarning("UnitMapController unregistred unit was released at " + position); return; } // убираем все данные о юните listOfUnits = GetListOfUnitInPosition(m_UnitToPoint[unitID]); if (!listOfUnits.ContainsKey(unitID)) { Debug.LogWarning("UnitMapController! something wrong with inner structures! for unit at " + position); return; } listOfUnits.Remove(unitID); m_UnitToPoint.Remove(unitID); }
/**********************************************************************************/ // Функция возвращает главного противника для указанного игрока (противник данному игроку) // /**********************************************************************************/ public GameObject GetTarget(PLAYER unitOwnerId, Point unitPosition) { GameManager gm = GameManager.GetInstance(); // если играется дуэль - возвращаем в качестве цели "противного" инопланетянина if (gm.GameMode == GameManager.GAME_MODE.DUEL) { if (unitOwnerId == PLAYER.PL1) { return(gm.GetPlayersObject(PLAYER.PL2)); } else { return(gm.GetPlayersObject(PLAYER.PL1)); } } // если играется компания - пробуем определить ближайшего противника else if (gm.GameMode == GameManager.GAME_MODE.SINGLE) { GameObject closestTarget = null; int closestDist = 9999; // перебираем все актуальные цели и ищем ближайшую к нам foreach (var targetPair in m_npcTarget) { GameObject potantialTarget = targetPair.Value; CIGameObject gmo = potantialTarget.GetComponent <CIGameObject>(); Point tPosition = gmo.GetGlobalPosition(); Point dist = unitPosition - tPosition; int potDist = dist.GetSimpleLength(); // запоминаем новую ближайшую цель if (potDist < closestDist) { closestTarget = potantialTarget; closestDist = potDist; } } return(closestTarget); } Debug.LogError("Wrong GameMode!"); return(null); }
/**********************************************************************************/ // функция обновляет таблицы позиций юнитов // возвращает true, если координата была обновлена // /**********************************************************************************/ public bool UpdateUnitPosition(CIGameObject unitCtr) { Point position = unitCtr.GetGlobalPosition(); int unitID = unitCtr.ID; Dictionary <int, CIGameObject> listOfUnits; // проверяем - работали ли мы уже с этим юнитом // если нет - добавляем всё необходимое и выходим if (!m_UnitToPoint.ContainsKey(unitID)) { m_UnitToPoint[unitID] = position; listOfUnits = GetListOfUnitInPosition(position); listOfUnits[unitID] = unitCtr; return(true); } // проверяем, "изменилась ли координата?" // если нет - выходим Point oldPosition = m_UnitToPoint[unitID]; if (oldPosition.IsSamePoint(position)) { return(false); } // в противном случае перемещаем объект из старой позиции в новую // обновляем и перезаписываем позицию объекта // удаляем старые записи listOfUnits = GetListOfUnitInPosition(oldPosition); listOfUnits.Remove(unitID); // добавляем новые listOfUnits = GetListOfUnitInPosition(position); listOfUnits[unitID] = unitCtr; m_UnitToPoint[unitID] = position; return(true); }
/**********************************************************************************/ // основная функция движения к заданному объекту // /**********************************************************************************/ protected virtual void MoveToGObject(GameObject target) { // проверяем цель, если целей больше нет - останавливаемся if (target == null) { return; } // получаем и проверяем контроллер цели CIGameObject gmoTarget = target.GetComponent <CIGameObject>(); if (gmoTarget == null) { Debug.LogError("Wrong target! GMovingObject is NULL!"); return; } // двигаемся к намеченной цели Point pointToAchive = gmoTarget.GetGlobalPosition(); MoveToPoint(pointToAchive); }