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);
}
}
|