Base.RTS #1 – welcome back commander

Postanowiłem omówić trochę kodu który wrzuciłem. Jednak, aby podtrzymać klimat…

Obsługa jednostek gracza

Zastanawiałem się gdzie przechowywać informacje o „zaznaczonych” przez gracza jednostkach. Wpadłem wtedy na pomysł listy. Struktura listy ułatwi mi iterowanie po jej elementach i wykonywanie różnych operacji, np. wydawanie rozkazów

 

public static List<Unit> selectedUnits = new List<Unit>();

A tak działają wspomniane wcześniej metody.
Najważniejsza wydała mi się ta do oczyszczania listy.

    public static void ClearUnitsList()
    {
        if (selectedUnits.Count > 0)
        {
            foreach(Unit unit in selectedUnits)
            {
                unit.Selected.SetActive(false);
            }
            selectedUnits.Clear();
            Debug.Log("List Empty!");
        }
}

Najważniejsza, bo musi istnieć możliwość jej oczyszczenia. Ktoś może teraz powiedzieć, że wystarczyłoby same selectedUnits.Clear(), ale każdej jednostce ustawiamy też indykator (mądre słowo) zaznaczenia.

    public static void MovementOrder()
    {
        Debug.Log("Moving!");
        //Giving order to each selected unit
        Vector3 OrderCoordinates = new Vector3(0, 0, 0);
        RaycastHit hit;

        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (_Map.GetComponent<Collider>().Raycast(ray, out hit, Mathf.Infinity))
        {
            OrderCoordinates = hit.point;
            foreach (Unit unit in selectedUnits)
            {

                unit.Move(OrderCoordinates);
            }
        }
}

Kolejny fragment kodu odpowiada za wydawanie rozkazu ruchu. Z ciekawostek – wykorzystywane jest tu raycastowanie. Myślę że poza tym metoda jest dosyć jasna.

   public static void AttackOrder(GameObject _Target)
    {
        Debug.Log("Kill them!");
       // MovementOrder();
        foreach(Unit unit in selectedUnits)
        {
            unit.Target = _Target;
            // if(unit.targetInRange==false)unit.Move(_Target.transform.position);
            unit.Attack();
        }
}

Ta jest właściwie jeszcze łatwiejsza. Metoda ta jest wywoływana po kliknięciu na obiekt (budynek/jednostkę) przeciwnika, ten obiekt jest z resztą przekazany jako argument _Target.

Metody jednostek

Przyjrzymy się dwóm metodom – Move() i Attack().

 public void Move(Vector3 Target)
    {

        Navigator.destination = Target;
        Debug.Log("Going to target " + Target.ToString() );
}

Jak się pewnie domyślacie, Navigator to zmienna do której przypisany został komponent NavMeshAgent.
Nawigowanie po trójwymiarowej mapie w Unity jest wybitnie proste 🙂

public void Attack()
    {
        Debug.Log("Yaaaahoooo!");
        if (targetInRange) StartCoroutine("Fire");
        else { Move(Target.transform.position); }
}

Nie jest to może (na pewno nie jest) najbardziej elegancki sposób na zrobienie tego, Ale… Jest 🙂
W przypadku, gdy Target znajduje się w polu ataku jednostki wywoływany jest współprogram Fire(). W przeciwny, jednostka będzie się zbliżać do celu, aż przeciwnik w tym polu się znajdzie.

Posłowie

Szczerze? Nie wiedziałem że będzie aż tak trudno. Nawet z Unity napisanie choćby prostego systemu RTS-a nie należy do zadań łatwych dla samotnego wilka. Ponadto dał się we znaki brak czasu. Chyba trochę się wypaliłem w tym projekcie, ale część funkcjonalności już „działa”.

Mam wrażenie, że jestem lepszy w pisaniu gry, niż bazy kodu do gry 🙂

Reklamy
Base.RTS #1 – welcome back commander

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s