示例#1
0
    /**********************************************************************************/
    // функция убирающая юнита с карты, к примеру в случае смерти
    //
    /**********************************************************************************/
    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);
    }
示例#3
0
    /**********************************************************************************/
    // функция обновляет таблицы позиций юнитов
    // возвращает 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);
    }
示例#4
0
    /**********************************************************************************/
    // основная функция движения к заданному объекту
    //
    /**********************************************************************************/
    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);
    }