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

De_Struktor

unregistriert

1

13.01.2014, 14:55

[Unity] Boolsche Operationen oder Events??

Hallo liebes Forum,

ich habe eine Frage bezüglich Events.

In meinem Srikpt möchte ich auf die boolesche variable eines anderen Skripts zu greifen, um in abhängigkeit davon, dann Funktionen auszuführen.
Da ich aber gelesen habe, dass eine hohe Kopplung zwischen den Klassen entsteht, wenn man auf Klassendaten innerhalb einer anderen Klasse zugreifen möchte. Mein Skript MUSS aber diese Variable lesen/schreiben um dann im eigenen Skript Aktionen zu vollziehen.

Das Spiel könnte man eigentlich auch über Events lösen, daher eine Frage der Perfomance halber: Wie perfomancelastig sind Events. Denn mit einer anderen Klasse über "Bool" zu kommunizieren, daraus resultiert 1. ein schlechter Programmierstiel(auch wenn es klappt) und 2. eine starke Kopplung der Klassen und man sollte mögliochst kohesive Klassen bauen.

Über eine Aufklärung wäre ich euch sehr dankbar :)

Mfg

De_Struktor

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

2

13.01.2014, 15:41

Ersteinmal: Warum willst du auf den Boolean zugreifen und was willst du dann machen?
Wenn du das nicht schreibst, können keine alternativen Lösungsmöglichkeiten genannt werden.

Mir sind keine nennenswerten Nachteile bei Events bekannt, allerdings sollte es ohnehin nicht ins Gewicht fallen, wenn das Event alle paar Sekunden, Minuten oder nur "einmalig" ausgelöst wird.
Um nicht direkt auf die andere Klasse zuzugreifen, könntest du entweder eine Basisklasse von dieser Verwenden (diese muss ggf. angelegt werden) oder du speicherst nur eine Referenz auf das GameObject und arbeitest dann mit SendMessage (fast das gleiche wie ein Event, nur mit geringeren Abhängigkeiten). Für letzteres wäre ganz nützlich zu wissen, dass die Methode auch einen optionalen Parameter vom Typ SendMessageOptions entgegen nimmt.

Wenn du nicht gerade ein Framework schreibst, welches gänzlich unabhängig von irgendwelchen anderen Klassen sein muss (die ja dann ggf. von anderen später geschrieben werden könnten), dann sehe ich kein so großes Problem darin, bestimmte Abhängigkeiten in Kauf zu nehmen. Allerdings sollte man immer überlegen, ob man wirklich ein Objekt dieser konkreten Ausprägung (Klasse) braucht oder ob es später nicht noch andere geben wird. Wenn letzteres der Fall ist, sollte man sich über eine geeignete Basisklasse oder eine Schnittstelle Gedanken machen.


Ein Beispiel, um die verschiedenen herangehensweisen zu veranschaulichen:
In dem zu entwickelnden Spiel gibt es Pickups (Items, die aufgehoben werden können und eine bestimmte Aktion ausführen).
Möglichkeit 1: Jedes Skript handhabt alles (Aufheben des Pickups, Auswirkung, Zerstörung (da verwendet), ggf. Zerstören des Pickups durch andere Fremdeinwirkungen)
Möglichkeit 2: Ein Skript handhabt das Aufheben und das Zerstören und ein anderes die Wirkung, Kommunikation über SendMessage
Möglichkeit 3: Ein Skript handhabt das Aufheben und das Zerstören und ein anderes, welches von einem Interface/einer Basisklasse abgeleitet ist, handhabt die Wirkung, Kommunikation über direkten Aufruf des entsprechenden Methode
Möglichkeit 4: Ein Skript stellt die Basisklasse dar und handhabt das Aufheben und Zerstören, das zugewiesene Skript erweitert dieses Skript um die Wirkung
Möglichkeit 5: Ein Skript handhabt das Aufheben und das Zerstören und entscheidet anhand eines Enumerationswert, was die Auswirkung ist (Kombinierbar mit Erweiterungsmethoden)
Möglichkeit 6: Ein Skript handhabt die Auswirkung und sucht zu Beginn nach dem anderen Skript, welches für das Aufheben und Zerstören zuständig ist, um sich dort bei einem Event zu registrieren
...

Auf Anhieb klingt vielleicht die eine Möglichkeit besser als die andere, allerdings gibt es noch Aspekte, die den Sinn diverser Möglichkeiten beeinflussen:
Es kann beliebig viele Wirkungen geben (die jeweils eigenen Code erfordern). -> Grundsätzlich mit allem Machbar, bei einer Enumeration muss diese jedes Mal erweitert werden, bei Möglichkeit 1 und 4 entsteht für jede Variation ein Skript.
Es kann beliebig viele Arten des Aufhebens/Zerstörens geben (verbrennen, zerquetschen, ins Wasser fallen/ertrinken, durch Sturzschaden, Aktivierung bedingt durch andere Items/Fähigkeiten...). -> Für das am Event Registrieren ist eine Basisklasse/ein Interface erforderlich, bei Möglichkeit 1 entsteht für jede Variation ein Skript.
Es können mehrere Wirkungen einem Gegenstand zugewiesen sein. -> Bei Möglichkeit 3 und 5 könnte es passieren, dass Anpassungen hierfür notwendig sind (Suchen/Zuweisen mehrerer Wirkungen, nicht nur einer), bei Möglichkeit 1 und 4 entsteht für jede Variation ein Skript.
Diverse Items Besitzen mehrere Aktivierungsmöglichkeiten -> bei Möglichkeit 1 und 4 entsteht für jede Variation ein Skript.
...

Abgesehen davon gibt es diverse Aspekte, die vom jeweiligen Geschmack abhängig sind:
Soll es je Item nur 1 Skript geben, welches es zum Item macht?
Muss für eine andere Wirkung ein anderes Skript angehanden oder ein Wert aus einer Liste ausgesucht werden?

In anderen Fällen würden sich nicht nur andere Möglichkeiten eher anbieten, sondern evtl. auch noch ganz andere Möglichkeiten überhaupt erst in den Sinn kommen.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Renegade

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

3

13.01.2014, 16:03

In meinem Srikpt möchte ich auf die boolesche variable eines anderen Skripts zu greifen, um in abhängigkeit davon, dann Funktionen auszuführen.


In der Softwareentwicklung unterscheidet man Kopplung in verschiedene Arten. Prinzipiell kann man sagen: Umso schwächer die Kopplung umso eigenständiger dein Skript. Hier mal der Wiki Eintrag.

Ich persönlich verwende gerne Daten- oder Datenstrukturkopplungen.
Erklär uns mal bitte genauer deinen Fall. Wie Sacaldur schon gesagt hat, ist es schwierig zu mutmaßen was du vor hast.

Was macht denn diese boolesche Variable?
Liebe Grüße,
René

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »Renegade« (13.01.2014, 16:30)


De_Struktor

unregistriert

4

13.01.2014, 16:34

Ich danke euch. Aber es hat sich erledigt, ich habe da mistgebaut :D^^

aber ich habe es nicht nötig iwelche abhängigkeiten zu krieren^^

Renegade

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

5

13.01.2014, 16:48

aber ich habe es nicht nötig iwelche abhängigkeiten zu krieren



(Link)
Liebe Grüße,
René

Werbeanzeige