Jump to content
Unity Insider Forum

Der Gebrauch von static in MonoBehaviour-Klassen


SaschaDev

Recommended Posts

Guten Tag zusammen,

mir ist aufgefallen, dass es in Unity viel seltener Sinn macht / nötig ist, "static"-Variablen zu benutzen als wenn man z.B. nur C# programmieren würde. Wenn ich z.B. in meinem Spiel nur einen Spieler haben will, dann kann ich:

1. Alle Variablen, die sich auf den Spieler beziehen, static machen, was aber dann dazu führt das gefühlt das halbe Projekt static wird, und mir nicht sinnvoll erscheint.

2. Da ich ja nur ein Player habe, und somit das Script nur einem GO in der Szene zugeordnet habe, mache ich die Variablen nicht static, sondern rufe diese in den anderen Scripten auf, ganz normal über:

playerScript = GameObject.Find("Player").GetComponent<Player>();

playerScript.variable1 = "";

Klar, wenn ich aber 2 Spieler hätte, müssten die Variablen static sein, weil das Script dann ja mehreren GO's in der Scene zugeordnet wäre.

Ich wollte aufjedenfall mal fragen, wie ihr "static" in euren Projekten gebraucht?

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 11 Minuten schrieb MustafGames:

Soweit ich das interpretieren kann, static = fest und nicht veränderbar (ein statisches GO, bleibt an der Stelle), wenn man also einen Script schreibt und alles static macht (Leben des Spielers z.b.) macht das keinen Sinn.

Ich glaube wir haben ein Missverständnis, ich meine nicht das hier:

image.thumb.png.bfa08850393767d0a22f08060f6cfd44.png

sondern das hier:

image.png.dd26565f10899c1f846a2886484f0063.png

 

Soweit ich weiß sind das unterschiedliche Dinge. Ich meine "static" im Sinne von C#.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Eine statische Variable ist an keine Instanz deiner Klasse gebunden (bzw. eine statische Klasse kann nicht instanziert werden)
Weshalb du darauf auch übergreifend per Klassenname zugreifen kannst.

Statische Variablen / Klassen sind also genau für solche Dinge sinnvoll, die garantiert bloß ein einziges mal existieren sollen.

Viel Sinn deinen Player statisch zu machen, machts aber dennoch nicht. Allein schon weil so eine statische Klasse / Variable einen ganz anderen Lebenszyklus hat.
Wenn dein Player z.B. stirbt (seine Leben sind auf 0) und du die Szene einfach neulädst, sind die Leben immer noch 0.

Ich glaub ich hab in meinen Projekten so gut wie gar nichts statisches, vielleicht irgend ne Editor Zeugs.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nur weil du zwei Spieler hast bedeutet das nicht, dass die Variablen automatisch static sein müssen. Wenn zwei Spieler dein Spiel zur gleichen Zeit im gleichen Raum / Netzwerk spielen, teilen beide Spieler die gleichen lokalen Daten, da sie ja beide das gleiche Programm öffnen.  Du schickst dann einfach Funktionen übers Netzwerk (auch RPC genannt), die an eine gewisse Logik gebunden sind. Diese Funktionen sind in der Lage, bei allen Spielern im Netzwerk zum gleichen Zeitpunkt ausgeführt zu werden. Sprich, selbst wenn deine Variable private wäre, könntest du über RPC's die lokalen Variablen aller Spieler im gleichen Netzwerk verändern / beeinflussen, so wie du es willst. 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 10 Stunden schrieb SaschaDev:

dass es in Unity viel seltener Sinn macht / nötig ist, "static"-Variablen zu benutzen als wenn man z.B. nur C# programmieren würde.

Es ist nicht mehr oder weniger sinnvoll (und vor allem nicht "weniger nötig") als in jeder anderen Situation. Du fällst im Unity-Kontext einfach nur schneller auf die Nase damit. Wenn du also ohne Unity spürbar öfter alles und jeden static machst, dann solltest du nochmal über deinen Programmierstil nachdenken ;)

Bevor das aber falsch verstanden wird: static ist nicht grundsätzlich böse oder so, aber man kann eigentlich in den allermeisten Fällen recht eindeutig sagen, ob static angebracht oder weniger sinnvoll ist. Und die allermeisten Leute tendieren dazu, erst mal auf alles blind static draufzuschmeißen, weil's damit erst mal funktioniert, und benutzen dann static viel zu oft in Fällen, wo es nicht angebracht ist. Dass static zu selten verwendet wird, kommt sehr selten vor.

Wenn du also sonst mehr static benutzt, weil Dinge damit zu funktionieren scheinen, du aber in Unity merkst, dass das alles weniger gut hinhaut, dann würde ich mir eher um deinen sonstigen Code Sorgen machen, und nicht um den für Unity :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 13 Stunden schrieb Maurice94:

Nur weil du zwei Spieler hast bedeutet das nicht, dass die Variablen automatisch static sein müssen.

Ok, das stimmt natürlich. Hab da irgendwie Mist geschrieben, bzw. zu sehr von meinem speziellen Fall aus gedacht.

vor 11 Stunden schrieb Sascha:

Es ist nicht mehr oder weniger sinnvoll (und vor allem nicht "weniger nötig") als in jeder anderen Situation. Du fällst im Unity-Kontext einfach nur schneller auf die Nase damit. Wenn du also ohne Unity spürbar öfter alles und jeden static machst, dann solltest du nochmal über deinen Programmierstil nachdenken ;)

Bevor das aber falsch verstanden wird: static ist nicht grundsätzlich böse oder so, aber man kann eigentlich in den allermeisten Fällen recht eindeutig sagen, ob static angebracht oder weniger sinnvoll ist. Und die allermeisten Leute tendieren dazu, erst mal auf alles blind static draufzuschmeißen, weil's damit erst mal funktioniert, und benutzen dann static viel zu oft in Fällen, wo es nicht angebracht ist. Dass static zu selten verwendet wird, kommt sehr selten vor.

Wenn du also sonst mehr static benutzt, weil Dinge damit zu funktionieren scheinen, du aber in Unity merkst, dass das alles weniger gut hinhaut, dann würde ich mir eher um deinen sonstigen Code Sorgen machen, und nicht um den für Unity :)

Ok, also bin nochmal tief in mich gegangen^^, und bin zu dem Schluss gekommen, dass ich auch sonst selten "static" benutze. Nach erneuten Nachdenken ist mir auch klar geworden, warum ich sonst auch häufig ohne auskomme. Hab mich da irgendwie verrannt. Auf jeden fall danke für die Antworten. 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...