Jump to content
Unity Insider Forum

malzbie

Moderators
  • Content count

    4,779
  • Joined

  • Last visited

  • Days Won

    293

malzbie last won the day on October 19

malzbie had the most liked content!

Community Reputation

1,446 Excellent

1 Follower

About malzbie

  • Rank
    Moderator
  • Birthday 10/30/1968

Profile Information

  • Gender
    Male
  • Location
    Kassel, Hessen, Deutschland

Recent Profile Visitors

16,528 profile views
  1. malzbie

    Unet oder aufs Neue networking warte

    Ich würde an deiner Stelle jetzt schon mal anfangen, denn dann lernst du auf jeden Fall, worauf es beim Netzwerkspiel ankommt. Da gibt es viele Logik-Hürden, die immer da sind. Egal, wie du die Infos von Rechner zu Rechner bringst.
  2. malzbie

    Animation mehrfach abspielen

    IEnumerator! Ich würde es aber anders machen. Ich würde der Animation einfach ein Event am Ende verpassen und damit in eine Funktion rein springen die einfach die Aniamtionen zählt und solange neu startet, bis die gewünschte Zahl fertig ist.
  3. malzbie

    Objekt im Objekt finden

    Wenn das ObjektOeffnen Script z.B. auf einer Schachtel oder einen Schrank zugewiesen ist und die 3 Objekte, die im Script zugewiesen sein könnten, quasi der Inhalt des Schrankes darstellen soll, dann wüsste ich nicht warum in dem Script die Objekte eines ganz anderen Schrankes aus einer anderen Szene drin sein sollten. Genauso kann das Script auch ohne die 3 zugewiesenen Objekte auskommen. Wenn z.B. nur 1 Objekt zugewiesen wäre und somit 2 Slots leer sind, ist das ja kein Problem. Du musst aber im Script überprüfen, ob da ein eine Referenz vorhanden ist oder eben nicht. Ein einfaches Beispiel: public GameObject platz1; void Irgendwas(){ if(platzhalter != null){ print(platz1.name); } } Kleines Praxisbeispiel: Ich baue virtuelle Flipper. Und wie du das ja bei Flippern kennst, gibt es Ziele die man treffen muss. Diese Ziele spielen einen Sound ab, der aber abhängig davon ist, welchen Zustand die Ziele haben. Jetzt könnte ich für jedes Ziel ein eigenes Script erzeugen und immer die selben Dinge einbauen. Das habe ich aber so nicht gemacht. Ich habe Soundobjekte gebaut, die irgendwo in der Szene liegen. Jedes Sound Objekt hat ein Script, welches ich von den Ziel-Objekten aus anspreche. Dieses Script heißt SFX_Script und da drin gibt es 3 public Funktionen. PlaySound, PlayBadSound und PlayThridSound habe ich die Funktionen genannt. Wenn ich den Flipper baue, weiß ich noch gar nicht wieviele Soundobjekte ich brauchen werde und genauso weiß ich auch nicht wieviele Ziele oder Wege es geben wird, die einen Sound abspielen sollen. Da alle Soundobjekte das gleiche Script haben, kann ich schlecht per Code danach suchen. Deswegen hat ein Ziel oder ein Wegetrigger eine public Variable vom Typ SFX_Script, bei der ich dann das das entsprechende Soundobjekt rein fallen lasse, wenn ich es dann irgendwann erstellt habe, also die Sound erzeugt wurden. Auch wenn es noch gar keine Sounds gibt ist mein Ziel_Script trotzdem funktionsbereit, weil ich eben da, wo das Script auf das SFX_Script zugreifen würde, vorher abfrage ob es denn nicht null ist.
  4. malzbie

    Objekt im Objekt finden

    Bin gestern gar nicht auf die Objekte eingegangen, mit denen du ja kommunizieren willst. Du hast bei Unity viele Möglichkeiten irgendwelche Referenzen zu anderen Objeken/Komponenten zu holen. Der einfachste Weg ist der mit der Public Variable, wo du das andere Objekt einfach im Inspector in den Slot fallen lässt. Schon hast du deine Referenz. Natürlich ist das Handarbeit und wenn du wirklich 100 Objekte hast, die alle Referenzen zu anderen Objekten haben müssen, ist das natürlich sehr aufwendig. Da willst du das eigentlich anders machen. Genauso ist das System problematisch, wenn diese Objekte zum Szenenstart noch gar nicht in der Szene sind. Dann kannst du diese händische Vorarbeit natürlich nicht machen. Es muss dann über den Code nach Objekten gesucht werden. Das ist nicht unbedingt besser, weil du beim Erstellen des Codes schon wissen musst, nach was du suchst. Das kann ein Name ein Tag oder aber eine Eigenschaft sein. Wenn aber jetzt mehrere Objekte in der Szene sind, die dieses gesuchte Auswahlkriterium haben, wird es problematisch. Ich denke da z.B. an eine GUI mit mehreren Buttons. Außerdem kannst du nicht ständig nach neuen Objekten suchen, die vielleicht irgendwann einmal in der Szene erscheinen können. Das würde viel zu viel Performance kosten, denn Suchen ist teuer! Da sollte sich dann das neu entstandene Objekt besser in eine Liste eintragen, wenn es denn nötig ist, dass man jedes Objekt in der Szene kennen muss. Es gibt natürlich auch das Referenzieren, welches bei einer Aktion passiert. z.B. wenn ein Objekt mit einem Ray auf ein anderes Objekt schießt oder 2 Objekte kollidieren. Da kann man alle Infos zum Objekt abfragen und auch jetzt noch ne Referenz bilden. Du musst also für dich entscheiden wie du die Referenzen bildest und das ist natürlich abhängig von der Situation. Eine öffentliche Variable für Objekte zu bilden und die händisch im Inspector zu bestücken (wenn die Szene es zulässt) ist meiner Meinung nach aber beste Weg, denn es spart Code und reduziert Fehler.
  5. malzbie

    Objekt im Objekt finden

    Ich mache die public, damit man die Werte beim Tutorial im Inspector sehen kann und auch mal schnell verändern kann. Natürlich sollte am Schluß nur das public sein, was auch von außen angesprochen oder abgefragt wird. HideInInspector versteckt die Variablen selbts wenn sie Public sind. Das ist wieder was ganz Anderes.
  6. malzbie

    DungeonGame

    Mir gefällt's! Super Schwertmoves! Jetzt muss nur noch der Golem auf den Hieb reagieren. Aber das kommt bestimmt auch noch.
  7. malzbie

    Objekt im Objekt finden

    Es ist ja schon etwas besser geworden, wie ich am Script sehe. Ich frage mich warum du dein Fleischbrockenobjekt überhaupt deaktiviert hast und es jetzt akrivieren willst. Genauso, warum ist das Script denn vorher aus? Das der Renderer erst dann an ist, wenn der Kühlschrank offen ist, ist für mich nachvollziehbar, aber der Rest eigentlich nicht. Wenn man mit dem Objekt erst dann interagieren soll, wenn der Kühlschrank auf ist, dann schalte einfach den Collider bzw. Trigger an oder aus. Je nach Situation. Natürlich kannst du auch das Fleisch mit dem Renderer ein und ausschalten, wenn deine Szene so aufgebaut ist, dass es keine Kühlschranktür gibt, die einfach vor dem Fleich liegen würde. Das Ganze GO (GameObject) zu aktivieren, ist aber etwas zu viel des Guten. Also: Du hast ein Fleisch-Gameobjekt, welsches Ativiert ist und auch ein enabled Script hat. Renderer und evtl Collider (wenn du per Klick aufs Objekt interagierst) sind zu Beginn disabled. Sobald der Kühlschrank auf ist, muss dein Fleischobjekt den Renderer und den Collider anschalten. Ob das Script des Fleischobjektes das selber tut, weil es von irgendwo eine Info bekommen hat, oder aber ein Script eines anderen Objektes das mit dem Fleischobjekt tut, ist eine Frage der Vorlieben. Es ist aber egal, wer es tut, derjenige muss wissen wann er es tun soll. Renderer, Collider und Script sind Behaviours die man mit Component.eabled=true aktiviert. Das Component vor dem Punkt ist explizit das Behaviour. Hast du also einen SpriteRenderer, einen BoxCollider2D und ein Script mit Namen InteraktivesElement, muss du sie auch genauso einbinden und ansprechen. Beispiel wo du alle nötigen Komponenten einschaltest: private InteraktivesElement dasScript; private BoxCollider2D derCollider; private SpriteRenderer derRenderer; public GameObject Fleisch; // hier wird das Gameobject im Inspector einfach rein getan. void Start(){ // hier werden die Komponenten des Fleisches kennengelert und den Variablen übergeben dasScript = Fleisch.GetComponent<InteraktivesElement>(); derCollider = Fleisch.GetComponent<BoxCollider2D>(); derRenderer = Fleisch.GetComponent<SpriteRenderer>(); void Update(){ if(kühlschrankAuf){ // hier werden die Komponenten angeschaltet dasScript.enabled=true; derCollider.enabled=true; derRenderer.enabled=true; } Beispiel wenn du das Komplette GameObjekt einfach aktivieren willst und alle Komponenten nicht extra aktiviert werden müssen. public GameObject Fleisch; // hier wird das Gameobject im Inspector einfach rein getan. void Start(){ void Update(){ if(kühlschrankAuf){ Fleisch.SetActive(true); } Du kannst natürlich auch von einem anderen GO das Fleisch beim Spielstart auch suchen und dann einer Variable zuwesen, aber das geht nur, wenn es aktiv ist. Inaktive Objekte findest du nicht. Und wie es immer so ist, wenn das GO selber inaktiv ist, dann sind alle seine Komponenten auch inaktiv. Selbst seine KinderObjekte wären inaktiv. DIe KindObjekte wären zwar für sich gesehen aktiv, aber wenn der Chef inaktiv ist, dann überstimmt er die Kinder einfach und somit sind sie im Ganzen gesehen auch inaktiv. Jetzt hat der Sascha geantwortet.... Egal ich poste das jetzt.
  8. malzbie

    Objekt im Objekt finden

    Du brauchst noch etwas Grundwissen. Ich könnte da jetzt einiges schreiben. Da ich aber vor einigen Jahren ein Video zu gemacht habe, biete ich dir das mal an. Das ist das erste Video einer ganzen Reihe auf meinem Kanal. Die weiteren Folgen lohnen sich bestimmt auch.
  9. malzbie

    In Z-Richtung bewegen

    Im Endeffekt ist das nicht viel anders als das, was du jetzt schon hast. Du kannst jetzt entweder "hardcoded" explizit die Leertaste abfragen float zNeu; if(Input.GetKey(KeyCode.Space){ zNeu=1f; } else{ zNeu=0f; } oder aber du gehst in den Inputmanager und definierst dir eine neue Achse, die dann einfach nur einen Positivwert hat. https://docs.unity3d.com/Manual/class-InputManager.html Die Achse nennst du z.B. Lateral und stellst alle Werte so ein wie sie auch bei Horizontal oder Vertikal zu finden sind. Ja und dann trägst du eben Space beim PostivButton ein. Diese Achse kannst du danach genauso nutzen wie Horizontal oder Vertical float zController = Input.GetAxis("Lateral"); Dann noch schnell zNeu definieren und unten bei transform.position in Vector3 mit einfügen.
  10. malzbie

    Multiple-Choice Test

    Du nutzt bei deiner Abfrage den | Operator. Das ist wahrscheinlich nicht das, was du willst. Du wilst bestimmt nicht ein logisches ODER haben sondern entweder das bedingte ODER || , wenn es Teilpunkte geben soll, oder das UND && wenn es nur Punkte gibt, wenn alles richtig ist. Hier der Unterschied der beiden ODER Varianten: https://docs.microsoft.com/de-de/dotnet/csharp/language-reference/operators/conditional-or-operator
  11. malzbie

    Bewegungsscript

    Genau.
  12. malzbie

    Bewegungsscript

    Das ist so, weil: transform.position.x ist die Position des Objektes auf der X Achse des Raumes. Welcher Wert das gerade ist, kannst du im Inspector oben rechts sehen, wenn du das Objekt in dr Szene angeklickt hast. Eine Bewegung im Raum auf der X Achse ist ja eigentlich immer nur ein Setzen auf einen gewissen Punkt. Und das passiert bei jedem Bild was gerendert wird. Wenn dein Computer bei deinem Spiel 60 Bilder pro Sekunde schafft, dann wird das Objekt auch 60 mal Pro Sekunde auf eine gewisse Position gesetzt. Ändert sich der Wert, wie z.B. in dem Script, so sieht es für dich so aus, als bewegt sich das Objekt sanft im Raum z.B. nach rechts. Aber eigentlich wurde bei jedem Frame die Position manipuliert. Im ersten Bild war die Position auf der 1 und im zweiten Bild ist sie auf der 2. usw. ! Es gibt nichts zwischen den Bildern und somit ist das auch keine Bewegung an sich. Sie läuft aber schnell genug ab, damit du das glaubst. Die Werte von transform.position kann man auslesen und auch beschreiben. Und das wird in deinem Code gemacht. xNeu ist eine Variable in die der Wert der jetzigen x-Position deins Objektes rein gespeichert wird. Zusätzlich wird zu diesem Wert ein 2ter Wert addiert. Der 2te Wert ist eine Multiplikation von der xEingabe und der deltaTime. xEingabe ist eine Variable, die ihren Wert weiter oben im Code von Input.GetAxis("Horizontal") bekommt. Das Input-Modul fragt alle möglichen Eingabegeräte wie die Tastatur und Joysticks ab. GetAxis("Horizontal") ist eine Explizite abfrage von einer JoysickAchse oder aber von vorher definierten Links- undRechts-Tasten, auf der Tastatur. Wird in keine Richtung gelenkt, dann kommt der Wert 0 zurück. Wird aber nach Rechts gelenkt, kommt ein Wert zurück der größer 0 ist. Der Maximalausschlag ist 1. In die andere Richtung wird der Wert negativ und hat einen Maximalwert von -1. deltaTime ist ein Zeitwert, der dir anzeigt, wieviel Zeit zwischen 2 Frames vergangen ist. Der dient dazu um auf allen Rechnern die gleiche "Geschwindigkeit" im Spiel zu bekommen. Bei einem Rechner wo 60 frames funktionieren, wäre der Wert 1/60sec. Bei einem Rechner der nur 30 frames schafft, wäre er 1/30sec. also doppelt so groß. Da mit diesen Werten multipliziert wird, ist es egal, wie schnell der Rechner ist, das Objekt würde in einer Sekunde bei beiden Rechnern gleich weit gekommen sein. So: xNeu bekommt jetzt also die alte Position des Objektes plus einen recht kleinen Wert (xEingabe * Time.deltaTime) hinzu, der entweder positiv oder negativ ist, je nachdem ob du nach links oder nach rechts lenkst. Dieser neue Wert wird weiter unten im Code jetzt der Transformkomponente übergeben. Also die alten Werte werden mit den neuen Werten aus xNeu und yNeu überschrieben. Und schwupps steht das Objekt jetzt an einer etwas anderen Position. Das passiert jedes Frame. Es wird geschaut wo hin gelenkt wird und wo das Objekt jetzt gerade ist. Dann wird ein bisschen was addiert und multipliziert und dem Objekt gesagt, wo es nun zu stehen hat. Wird nicht gelekt, kommt eine 0 zurück und dann bewegt sich das Objekt eben nicht. Denn alte Position plus 0 ist immer noch alte Position. So funktioniert das.
  13. malzbie

    2D Sidescroller Movement Problem

    Ich sehe jetzt nicht genau, warum das nur dann funktioniert, wenn du a drückst und dann d. Aber es könnte sein, dass moveX eben zu einem gewissen Zeitpunkt einfach noch nicht kleiner 0 ist, sonder vielleicht genau 0. Dann haut nämlich deine Bedingung nicht hin. Wenn du nur die GetAxis Werte abfragts, dann holst du die eine Beschleunigung mit rein. Denn beim Druck auf eine Taste geht der GetAxis-Wert ja nicht von irgendwas direkt auf 1 oder -1, sondern er beschleunigt auf diese Wert. Wenn er negativ war und jetzt positiv sein soll, dann wird der Wert über eine gewisse Zeit von -1 Richtung 0 gehen und dann weiter auf +1. Außerdem solltest du nicht 2 Variablen für rechts und links nehmen wenn es nur diese 2 Richtungen gibt, sondern einfach nur eine. z.B. die für Rechts. Wenn Rechts true ist, gehts nach rechts und wenn Rechts false ist, gehts eben nach links. Wenn du das so machst, hast du schon einmal eine mögliche Fehlerquelle ausgeschlossen. Dann würde ich die Rechst Variable nicht beim Tastendruck setzen, sondern wenn klar ist, dass sich der Player wirklich in die entsprechende Richtung bewegt. Ja und das wäre ja bei deiner Auswertung, ob moveX größer oder kleiner 0 ist. Also: void Update(){ moveX=Input.GetAxis("Horizontal"); if(moveX >0 &&!Rechts){ rechts=true; Flip(); } if(moveX<0 &&Rechts){ rechts=false; Flip(); } } void Flip(){ Vector3 thescale = transform.localScale; thescale.x*=-1; transform.localScale=thescale; } Ich habe jetzt den Code komplett aus deinem Bewegungskonstrukt raus genommen, denn du willst ja für die Anzeige des players nur wissen in welche Richtung er gucken soll. Dafür reicht GetAxis ohne weitere Multiplikation von Speed oder der deltaTime aus. Da moveX nicht mit der 0 verglichen wird, sondern immer nur ob es kleiner oder größer als 0 ist, bleibt die Ausrichtung des Players so lange beibehalten, bis es wirklich in die andere Richtung geht. Wenn er also nach einem Lauf stehen bleibt, dann schaut er mal nach rechts und mal nach links. Je nachdem, wie die vorige Bewegungsrichtung war. Willst du beim Stillstand eine besondere Animation einbauen, dann musst du halt auch die 0 abfragen. Aber das sind Designfragen bei denen du natürlich noch einge in den Code einbauen musst. Sol sollte es jetzt jedenfalls erstmal gehen.
  14. malzbie

    Gameobject ansprechen

    Fast genau richtig. Fast deswegen, weil in einem Script durchaus mehrere Klassen drin sein könnten und dann ist this die Klasse und nicht das Script. Dann macht das this auch richtig Sinn, denn es könnte Variablen gleichen Namens in beiden Klassen drin sein. In Unity nutzt man aber in der Regel nur eine Klasse pro Script somit ist die Klasse auch gleichzeitig das Script. Ich und auch andere Leute meinen immer die eine Klasse, wenn sie von Script sprechen. Das ist für echte Informatiker wahrscheinlich verwirren, aber so sind wir nun mal! Also nocheinmal: gameObject und transform sind automatisch referenzierte Variablen vom GameObject an dem das Script hängt (welches von Monobehavior erbt) und dessen Transform Komponente. Früher war sogar ein Rigidbody automatisch referenziert und, natürlich, mit kleinem r geschrieben. Das ist aber seit einiger Zeit nicht mehr so, denn ob ein Rigidbody an einem GameObject dran hängt oder nicht, ist ja nicht klar. Das GameObject selber ist aber immer da und es hat immer auch eine Transformkomponente dabei, deswegen sind diese 2 noch automatisch referenziert, aber die anderen Komponenten, die ja nicht zwingend an ein GameObject dran sein müssen, werden nicht mehr automatisch referenziert. Da muss man manuell ran gehen. So z.B.: bool irgendwas; Renderer renderer; void Awake(){ renderer=GetComponent<Renderer>(); } void Update(){ if(irgendwas){ renderer.enabled=true; } else{ rederer.enabled=false; } }
  15. malzbie

    Inventory Bedingungen zur Ausführung

    Das Gefällt mir gut!
×