Wywołanie funkcji u innego gracza

Programowanie gier multiplayer, chat, bazy danych i inne.

Wywołanie funkcji u innego gracza

Postprzez kanaron » 31 Sie 2016, 17:06

Mam problem z multiplayerem. Czy da się wywołać funkcję u innego gracza?
Problem jest w tym, że pocisk, który jako Raycast uderzy w część pancerza to ze skryptu dołączonego do tego pancerza wywołuje funkcję zadającą uszkodzenia.
W trybie singleplayer wszystko to oczywiście ładnie działa. Ale w multi jedynie wywoływało funkcję dla tamtego pancerza tylko u gracza, który wystrzelił. Na marginesie to właściwie nie rozumiem jak ją wywołał skoro dodałem, że jeśli nie jest to localPlayer to ma we wszystkich pancerzach wyłączyć ten skrypt.
No w każdym razie tak to nie działało. Zrozumiałem, że aby wywołać tę funkcję u trafionego gracza to muszę ją wywołać przez serwer. Tylko nie wiem jak. Próbowałem posłużyć się atrybutem [Command] ale albo nie tak to trzeba zrobić albo ja nie wiem jak to należy zrobić:
Kod: Zaznacz wszystko
[Command]
    public void CmdHit (NetworkInstanceId id, string name, float pen, float realArmor, float burstingCharge, bool underWater)
    {
        foreach (GameObject go in players)
        {
            if (go.GetComponent<NetworkIdentity>().netId == id)
            {
                EnemyPlayer = go;
                break;
            }
        }

        foreach(GameObject a in EnemyPlayer.GetComponent<Control>().ArmorMain.ArmorSegments)
        {
            if (a.name == name)
            {
                if(a.GetComponent<ArmorSingle>() != null)
                {
                    a.GetComponent<ArmorSingle>().Damage(pen, realArmor, burstingCharge, underWater);
                    Debug.Log("Command");
                    break;
                }
                else
                {
                    a.GetComponent<ArmorSingleAI>().Damage(pen, realArmor, burstingCharge, underWater);
                    break;
                }
            }
        }
    }


Wszystkie obliczenia trafienia są wyliczane w skrypcie pocisku, który należy do gracza, który wystrzelił. A potem skrypt pocisku wywołuje powyższą funkcję ze wszelkimi atrybutami wyliczonymi wcześniej. Najpierw szuka po ID gracza trafionego, potem szuka części pancerza i wywołuje już jak w trybie singleplayer funkcję zadającą uszkodzenia.
Tylko, że to też nie działa. W konsoli widzę, że Debug.Log() się wykonał, czyli cała funkcja wykonuje się cała. Ale nigdzie tych obrażeń nie ma. Ani u gracza strzelającego ani u trafionego.

Więc jak wywołać jakąś funkcję u innego gracza?
kanaron
 
Posty: 50
Rejestracja: 10 Wrz 2014, 17:15
Has thanked: 0 time
Been thanked: 0 time

Re: Wywołanie funkcji u innego gracza

Postprzez kanaron » 01 Wrz 2016, 14:40

Dobra... Długo grzebałem i wygrzebałem, że pewnie powinienem skorzystać z ClientRPC zamiast Command.
Więc podmieniłem to i... nadal nic. Funkcja już się nie wykonuje przez błąd:
Kod: Zaznacz wszystko
Did not find target for RPC message for 9

Od razu sobie sam odpowiem: ten obiekt musi być na scenie u każdego aby mógł wywołać funkcję RPC u każdego. Na razie spawnowałem go tylko u gracza, który wystrzelił.
No więc zmodyfikowałem skrypt z funkcją Shoot() i zmieniłem ją na Command. W tej funkcji tworzę obiekt, a potem wywołuję
Kod: Zaznacz wszystko
NetworkServer.Spawn(bullet);

No i wszystko byłoby fajnie gdyby to działało... Ale nie działa. Nadal spawnuje się tylko u tego kto wystrzelił. Więc jak spawnować obiekt u każdego klienta?
kanaron
 
Posty: 50
Rejestracja: 10 Wrz 2014, 17:15
Has thanked: 0 time
Been thanked: 0 time

Re: Wywołanie funkcji u innego gracza

Postprzez Hostur » 05 Wrz 2016, 11:23

bullet jako prefab ma network transform ?
Hostur
 
Posty: 648
Rejestracja: 05 Sie 2015, 07:36
Has thanked: 0 time
Been thanked: 0 time

Re: Wywołanie funkcji u innego gracza

Postprzez kanaron » 12 Wrz 2016, 14:17

Tak, ma. Dopiero z wakacji wróciłem, dlatego tyle nie odpisywałem. Ale rozwiązanie już znalazłem: napisałem dwa skrypty: do strzelania dla trybu singleplayer i do strzelania dla trybu multiplayer. Zapomniałem ich podmienić... Ciągle miałem przypisany skrypt z singleplayer, w którym nie było funkcji NetworkServer.Spawn()... Na to przeoczenie straciłem 65 godzin roboczych...

Teraz muszę jeszcze znaleźć rozwiązanie dla ClientRPC, bo ciągle mam błąd, że jest wywoływana ta funkcja w klienta.
kanaron
 
Posty: 50
Rejestracja: 10 Wrz 2014, 17:15
Has thanked: 0 time
Been thanked: 0 time


Wróć do Multiplayer i Sieć

Kto jest na forum

Użytkownicy przeglądający to forum: Brak zarejestrowanych użytkowników oraz 1 gość