Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

21.05.2017, 18:11

Unity UNET - Spieler trifft sich selbst

Hey Leute,

nach langer Zeit habe ich mich mal wieder Unity gewidmet und plane ein einfaches Multiplayer Spiel zu entwickeln.

Es handelt sich um ein 2D Top Down Spiel, bei dem sich zur Zeit die Spieler bewegen und abschießen können. Umgesetzt wie gesagt mit Unity und der HLAPI von UNET.

Das Schießen funktioniert bei mir folgendermaßen:
- Im Player Controller wird in der Update Methode geschaut, ob der lokale Spieler Space gedrückt hat
- Darauf hin wird ein Command ausgelöst: Auf dem Server wird eine Kugel erstellt und gespawnt
- Die Kugel wird mit NetworkServer.Spawn() an die Klienten übertragen

So, auf dem Server funktioniert das ja auch super. Beim Klienten hingegen kommt es zu Verzögerungen, sodass die Kugeln halt verzögert abgeschossen werden. Problematisch ist es nun, dass sich der Klient während der Verzögerung weiter bewegen kann und sich so in die Kugel hinein bewegen kann. Daraufhin verschwindet die Kugel fälschlicherweise beim Klienten, während sie beim Server noch weiterexistiert.

Leider weiß ich gerade überhaupt nicht wie ich das umgehen kann... Ich wäre für konkrete Vorschläge wirklich dankbar! Ich hänge nochmal meinen Code unten an.

Danke schonmal!

Auszug Player Controller:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    void Update()
    {
        if (!isLocalPlayer)
            return;

        if (Input.GetKeyDown(KeyCode.Space))
        {
            CmdFire();
        }
    }

    [Command]
    void CmdFire()
    {
        foreach(Transform t in bulletSpawn)
        {
            var bullet = (GameObject)Instantiate(bulletPrefab, t.position, t.rotation);
            bullet.GetComponent<Rigidbody2D>().velocity = bullet.transform.up * bulletSpeed;

            NetworkServer.Spawn(bullet);

            Destroy(bullet, 2.0f);
        }
    }


Bullet

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Bullet : MonoBehaviour {

    void OnCollisionEnter2D(Collision2D collision)
    {
        var hit = collision.gameObject;

        var health = hit.GetComponent<Health>();
        if (health != null)
        {
            health.TakeDamage(10);
        }

        Destroy(gameObject);
    }
}

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

21.05.2017, 18:38

Merk dir doch einfach in der Kugel, wer sie abgefeuert hat, und ignoriere Kollisionen mit diesem Spieler.

3

21.05.2017, 19:15

ja genau das versuche ich schon, aber ich verstehe leider nicht wie man richtig NetworkIDs übergibt.

4

22.05.2017, 08:46

ok ich habs hinbekommen :thumbsup:

Sneyke

Frischling

Beiträge: 33

Beruf: Softwareentwickler

  • Private Nachricht senden

5

22.05.2017, 10:09

Poste doch die Lösung. Dann kann auch die Nachwelt von deinen Erfahrungen profitieren.

webconqueror

Treue Seele

Beiträge: 124

Wohnort: Bergisch Gladbach

Beruf: Student

  • Private Nachricht senden

6

22.06.2017, 19:25

In der NetworkTransform-Komponente gibt es die Option "Network Send Rate".
Ich nehme mal an vielleicht hat er da den Wert einfach höher gestellt.

Werbeanzeige