Jump to content
Unity Insider Forum

Update function / Input.getkey


DrSkillix

Recommended Posts

Hallo Leute,

bin gerade dabei Interaktionen zu gestalten und der Spieler soll Objekte inspizieren können. 

Wenn man mithilfe von TriggerEnter in der Nähe ist, soll "E" gedrückt werden. Ich kann das ganze 

mit     if(Input.GetKeyDown) machen, das funktioniert aber nur in einer Update Funktion oder? Wen dem so ist, wäre es bad practice 

wenn ich auf jedes Objekt eine Update Methode haue, in der dies abgefragt wird? Oder ist die Update Methode soweit optimiert dass es garnicht so rechenaufwendig ist? 

Bin auch offen für weitere Ratschläge oder Workarounds ! Wünsch euch nen schönen Sonntag ! 

 

Um es kurz nochmal genauer zu erklären, Objekte mit denen man interagieren kann haben ein Skript mit eigenen Methoden die ausgeführt werden sollen. Und diese Methoden sollen eben ausgeführt werden wenn "E" gedrückt wird und der Spieler sich in Reichweite befindet.

Link zu diesem Kommentar
Auf anderen Seiten teilen

An sich ist die Update Methode ja genau dafür da, um in jedem Frame etwas zu machen oder wenigstens abzufragen.
Natürlich summiert sich alles, was in all den Update Methoden gemacht wird. Genauso summiert sich auch alles was mit der Physik zu tun hat. Also z.B. auch  die OnTrigger Events.
Aber eine If Abfrage ob etwas nun eingetreten ist, oder nicht, kostet so gut wie gar nichts.

Du solltest dir jetzt vielleicht überlegen, ob es gut ist, dass jedes interagierbare Objekt ständig überprüft ob der Player im Trigger ist und dann selber etwas ausführt.
Oder ob es vielleicht besser ist, dass nur der Player triggert und erkennt, ob da ein Interagierbares Objekt ist. Wenn er das macht, dann kann er auch gleich die Tasten abfragen.

Aber wie auch immer:
Wenn jetzt das eine oder andere Objekt triggert und dann erkannt wird, dass der Player einem interagierbaren Objekt nahe ist, solltest du einfach eine entsprechende Variable auf true setzen. Und sobald sich der Player aus dem Trigger raus bewegt sollte diese Variable wieder auf false gehen.
In der Update Funktion würde dann ein Abfrage auf die Trigger-Variable sein. Und nur wenn diese Variable true ist, würde auch ein Tastendruck der Taste E abgefragt werden.
Ist die Variable nicht true, wird eben nichts weiter gemacht. Ganz einfach und kostet fast keine Leistung.

Es gäbe auch die Möglichkeit innerhalb der OnTriggerStay Funktion die Taste E abzufragen. Aber das würde ich eigentlich nicht machen, weil diese TriggerEvents mit der FixedTime ausgeführt werden und das kann viel öfters sein, als es in der Update gemacht würde. (Je nachdem, was für ein Wert in der FixedTime steht und mit welcher Framerate dein Spiel läuft)

Auf jeden Fall kannst du die Tastenabfrage nicht in der OnTriggerEnter machen, denn dann müsstest du E genau in dem Moment drücken, in dem dein Player in das Triggerobjekt eindringt. Das wirst du nur ganz selten mal schaffen. ;)

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 29 Minuten schrieb malzbie:

An sich ist die Update Methode ja genau dafür da, um in jedem Frame etwas zu machen oder wenigstens abzufragen.
Natürlich summiert sich alles, was in all den Update Methoden gemacht wird. Genauso summiert sich auch alles was mit der Physik zu tun hat. Also z.B. auch  die OnTrigger Events.
Aber eine If Abfrage ob etwas nun eingetreten ist, oder nicht, kostet so gut wie gar nichts.

Du solltest dir jetzt vielleicht überlegen, ob es gut ist, dass jedes interagierbare Objekt ständig überprüft ob der Player im Trigger ist und dann selber etwas ausführt.
Oder ob es vielleicht besser ist, dass nur der Player triggert und erkennt, ob da ein Interagierbares Objekt ist. Wenn er das macht, dann kann er auch gleich die Tasten abfragen.

Aber wie auch immer:
Wenn jetzt das eine oder andere Objekt triggert und dann erkannt wird, dass der Player einem interagierbaren Objekt nahe ist, solltest du einfach eine entsprechende Variable auf true setzen. Und sobald sich der Player aus dem Trigger raus bewegt sollte diese Variable wieder auf false gehen.
In der Update Funktion würde dann ein Abfrage auf die Trigger-Variable sein. Und nur wenn diese Variable true ist, würde auch ein Tastendruck der Taste E abgefragt werden.
Ist die Variable nicht true, wird eben nichts weiter gemacht. Ganz einfach und kostet fast keine Leistung.

Es gäbe auch die Möglichkeit innerhalb der OnTriggerStay Funktion die Taste E abzufragen. Aber das würde ich eigentlich nicht machen, weil diese TriggerEvents mit der FixedTime ausgeführt werden und das kann viel öfters sein, als es in der Update gemacht würde. (Je nachdem, was für ein Wert in der FixedTime steht und mit welcher Framerate dein Spiel läuft)

Auf jeden Fall kannst du die Tastenabfrage nicht in der OnTriggerEnter machen, denn dann müsstest du E genau in dem Moment drücken, in dem dein Player in das Triggerobjekt eindringt. Das wirst du nur ganz selten mal schaffen. ;)

 

Danke dir ! Also das Interagieren funktioniert schon alles, ich hatte eben nur die Sorge dass wenn ich 10 Objekte in einer Szene habe und alle ne Update Funktion mit ner Tastenabfrage haben, ob das dann zu viel ist. Aber stimmt, das ganze auf den Spieler abzuwälzen würde auch gehen, allerdings wäre dann der Nachteil, dass mein Playerskript zig Abfragen hat ob das richtige Objekt zu triggern oder? Also das Spielerskript muss ja dann mittels Tags herausfinden um welches Objekt es sich handelt oder?

 

Danke für deine Mühe ! 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb DrSkillix:

ich hatte eben nur die Sorge dass wenn ich 10 Objekte in einer Szene habe und alle ne Update Funktion mit ner Tastenabfrage haben, ob das dann zu viel ist.

Wir reden hier von zehn mal "ein paar", sagen wir nochmal 10 Statements, mal 60 pro Sekunde. Mach von mir aus 144 draus. Das wären 14.400 Statements. Weißt du, wie viele Milliarden heutige Durchschnittsprozessoren davon pro Sekunde raushauen können? Mach dir mal keinen Stress. Faustregel ist: Performance ist erst dann dein Problem, wenn es überhaupt ein Problem ist. Wenn du performante Dinge schreibst ist das nicht schlecht, aber wenn du die Dinge erstmal zum Laufen kriegst ist das eben auch nicht schlechter.

vor 1 Stunde schrieb DrSkillix:

Aber stimmt, das ganze auf den Spieler abzuwälzen würde auch gehen, allerdings wäre dann der Nachteil, dass mein Playerskript zig Abfragen hat ob das richtige Objekt zu triggern oder?

Bin mir nicht sicher, ob ich dich richtig verstehe, aber ja. Objekte sollten sich so viel es geht um sich selbst kümmern. Objekte, die andere Objekte so richtig vollständig kontrollieren, sind keine gute Idee.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 20 Stunden schrieb Sascha:

Wir reden hier von zehn mal "ein paar", sagen wir nochmal 10 Statements, mal 60 pro Sekunde. Mach von mir aus 144 draus. Das wären 14.400 Statements. Weißt du, wie viele Milliarden heutige Durchschnittsprozessoren davon pro Sekunde raushauen können? Mach dir mal keinen Stress. Faustregel ist: Performance ist erst dann dein Problem, wenn es überhaupt ein Problem ist. Wenn du performante Dinge schreibst ist das nicht schlecht, aber wenn du die Dinge erstmal zum Laufen kriegst ist das eben auch nicht schlechter.

Bin mir nicht sicher, ob ich dich richtig verstehe, aber ja. Objekte sollten sich so viel es geht um sich selbst kümmern. Objekte, die andere Objekte so richtig vollständig kontrollieren, sind keine gute Idee.

Danke dür deine Antwort ! Da ich neu bin, kenne ich mich noch nicht wirklich aus. Gibt es denn Methoden zum überprüfen der Performance? Wenn ich nun ein Spiel entwickle und auch Vorgaben geben möchte zwecks Hardware Anforderungen, wie macht man das ? Ist vielleicht weit gegriffen, aber ich würde gerne mehr darüber lernen 😃

Vielen Dank für Eure Mühen !

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zum einen gibt's natürlich den stinknormalen Test, dass du das Spiel laufen lässt und schaust, wie gut das geht. Dann gibt's aber noch Unitys Profiler, mit dem man Frame für Frame schausn kann, was wieviel gekostet hat. Und zuletzt kannst du noch die Performance von zwei Dingen, die dasselbe auf unterschiedliche Art tun, mit einem Benchmark testen. Dafür hab ich mal eine kleine Klasse geschrieben, die man dafür benutzen kann.

Und weil ich vergessen habe, den Post auch abzusenden, war malzbie jetzt schneller :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...