Jump to content
Unity Insider Forum

malzbie

Moderators
  • Content Count

    5,064
  • Joined

  • Last visited

  • Days Won

    349

malzbie last won the day on November 13

malzbie had the most liked content!

Community Reputation

1,551 Excellent

2 Followers

About malzbie

  • Rank
    Moderator
  • Birthday 10/30/1968

Profile Information

  • Gender
    Male
  • Location
    Kassel, Hessen, Deutschland

Recent Profile Visitors

20,736 profile views
  1. Ja! Alles was wichtig ist, sollte auch erwähnt werden. OK. Da du mit Box Collidern besser zurecht kommst, als mit dem Meshcollider, gehe ich davon aus, dass eine der Wände, die der Meshcollider umspannt, wirklich sehr dünn ist. Und da du nicht über die Physik bewegst, kommt es eben zur Durchtunnelung. Ich sehe da eigentlich nur die Möglichkeit, das du Fixed Timestep reduzierst. https://docs.unity3d.com/Manual/class-TimeManager.html Geh mal auf 0.005. Geht auch noch tiefer, aber irgendwann kostet das so viel Performance, dass du den Zyklus nicht mehr erreichen kannst. Dieser Timestamp ist der Intervall, den die Physik durchfährt. Je kleiner der Wert ist umso öfter wird überprüft. Kostet aber jedes Mal Prozessorleistung. Merke dir auch: Je dicker ein Collider ist umso eher wird eine Kollision erkannt. Wenn von der einen Überprüfung zur anderen Überprüfung ein Objekt die Dicke eines Kolliders überwinden kann, ist der Kollider zu dünn oder das Objekt zu schnell. Dickere Collider können da Abhilfe schaffen. Genauso kannst und solltest du beim Rigidbody die Collision Detection auf auf "Continuous" oder "Continuous Dynamic" schalten. Um schnelle Bewegungen noch besser zu erfassen.
  2. Willkommen! Der Typ des Colliders hat nichts damit zu tun, ob du ihn bewegen kannst oder nicht. Auch ein MeshCollider bewegt sich mit dem Objekt mit, wenn das Objekt bewegt wird. Damit etwas kollidiert, also nicht durch andere Objekte duchflutscht, müssen diese Objekte jeweils einen Collider haben. Das sollte ja klar sein. Außerdem muss mindestens eines dieser Objekte einen Rigidbody haben, denn nur mit einem Rigidbody wird auch eine Kollision ausgewertet und die ganzen physikalischen Eigenschaften wie Reibung, Masse, Federung und Bremswirkung auf die Rotation oder Bewegung werden mit einberechnet. Ob jetzt alle Objekte einen Rigidbody haben oder nur der Ofen, hängt davon ab, welche Objekte physikalische Eigenschaften haben sollen. Das kann man also nicht so ohne Weiteres sagen. Man sollte aber an RB's sparen, denn jeder RB berechnet ja etwas und das kostet Leistung. Dinge, die nicht bewegt werden, brauchen keinen RB. Wenn du dann ein Objekt mit einem RB bewegst, dann soltest du das mit physikalischen Befehlen machen. Also nicht mit Transform-Befehlen arbeiten, denn die Physik wird in einem anderen Zyklus berechnet, als der Rest, der ja abhängig von der Framerate ist. Somit könnte es bei schnellen Bewegungen schnell zu Durchtunnelungen kommen. Nutze also die Force oder die Velocity um den RB zu bewegen.
  3. Ich habe mir das mal angeschaut. Die Figur hat ganz viele Materialien und für jedes Material auch eine Polygonselektion. Und wie du siehst, ist das erste Material mit der ersten Selektion in der Hierachie genau das, was bei dir nur eingefärbt wird. Ich habe das jetzt nicht in Unity getestet und ich weiß jetzt auch nicht aus dem Stehgreif, wie man per code die Selektionen bestimmen kann. Aber ein Tipp: Versuch doch mal die Figur ohne Texturen zu exportieren. Da sollte dann auch die Selektionsinfo weg sein. Es könnte auch an dem Haken Collapse UV Maps liegen. Der Exporter hat nämlich wirklich eine einzige UV Map raus, wo alle Selektionen übereinander liegen. Also mach die Haken für die Textures und die UVMap mal raus.
  4. malzbie

    Objekt bewegen

    Tja, da sind viele Dinge, die fehlen können und viele Dinge, die auf jeden Fall falsch sind. Hast du die Variable Target auch mit einem GameObject bestückt? Heissen deine Wände auch genauso, wie du die Namen abfragst? Hat dein Speed auch einen Wert? Hat denn deine Kugel einen Rigidbody, oder wenigstens beide Wände? Wenn 2 Dinge kollidieren sollen, muss mindestens ein RB dabei sein, denn nur darüber wird überhaupt eine Kollision erfasst. Aber das Hauptdingen, wenn jetzt alle Werte, Objekte und Namen richtig sind, ist das was du da bei der Kollision machst. In dem Moment, wo du mit einer Wand kollidierst, führts du Vector3.MoveTowards aus. Entweder in die eine Richtung, oder in die Andere. Aber eben nur in diesem einen Moment!!! In der Update hast du aber ein transform.Translate nach rechts, welches ständig ausgeführt wird. So kann das nicht gehen.
  5. Sach ma. Kann es sein, dass du da 2 UV Maps auf der Figur hast?
  6. Im Build sollte alles so funktionieren, wie du es im Editor siehst. Es sei denn du hast deine Prefabs in einem Ordner Namens Editor. Das da drin wird nicht mit exportiert. Schau außerdem, ob du irgendeine Fehlermeldung (rot) in der Console siehst, wenn du das Game im Editor testest. Gerade fehlende Zuweisungen oder IndexOutOfRange Fehler führen zu den dollsten Ergebnissen.
  7. Dafür, dass ihr ganz am "Anfang" seid, ist es echt nicht schlecht! Daumen hoch!
  8. Ich kann dich voll verstehen. Auch zu meiner Zeit gab es noch kein Informatik Studium. Ich habe aus Interesse von alleine mit Basic auf dem VC20 angefangen. Alles ohne Internet! Ich habe damals, vor 35 Jahren, schon viel gelernt, bin aber regelmäßig gescheitert. Und trotzdem bin ich heute in der Lage komplette Spiele zu erstellen (Grafik, Sound, Musik, Objekte, Logik), weil ich an all den Dingen interesse hatte und im Lauf der Zeit immer mehr gelernt habe. Was dir jetzt helfen könnte, ist Folgendes: Geh einfach einmal davon aus, dass du nicht ein Ding baust, um ein Spiel zu erstellen, sondern viele unterschiedliche Dinge, die miteinander Kommunizieren können und als Ganzes dann ein Spiel ergeben. Dei Puzzlespiel besteht aus vielen Dingen. Da ist der Ablageort, der 25 Bereiche hat, und da sind 25 Puzzleteile. Muss jedes Ding jetzt alles von den anderen Dingen wissen? Nein! Dem einzelnen Puzzleteil ist es doch total egal, was mit den Anderen Puzzleteilen ist. Es muss auch nicht wissen, wo es aufgehoben wurde und wo es hingelegt wird. Es muss aber wissen wenn es aufgehoben wird und wenn es hingelegt wird. Es sollte außerdem eine Identifikation haben und das Script kennen, welches die Auswertung macht, wo das Script auch immer liegt. Alle 25 Puzzleteile sind von der Art her also gleich und haben somit alle das gleiche Script. Sie unterscheiden sich eigentlich nur in der Identifikation, also von der Puzzleteil-Nummer. Wird jetzt eines dieser Puzzleteile mit der Maus angeklickt, weiss es, dass es etwas mit ihm passiert. Das Puzzleteil wacht also auf und könnte jetzt z.B. immer der Mausposition folgen, oder einfach nur seine Identifikationsnummer an das Auswertungsscript übergeben, oder, oder, oder. Wird dieses Puzzleteil jetzt wieder gehen gelassen, dann wird es auf jeden Fall dem Auswertungsscript sagen, dass es so ist und wo es sich gerade befindet. Es könnte also in eine Methode oder Funktion des Auswertungsscriptes rein springen und die wichtigen Daten gleich mit übermitteln. In dieser Funktion würde dann überprüft, ob das Teil nahe genug an seinem Soll-Ort liegt. Tut es das, dann würde das Teil an die exakte Position geschoben und sich irgendwie gemerkt, dass ein Teil richtig liegt. Das Puzzleteil macht also nur dann etwas, wenn es aufgehoben wird bzw. ist oder wenn es abgelegt wird. Sonst macht es eigentlich nichts. Das Auswertungsscript macht immer nur dann etwas, wenn das Puzzleteil in die Funktion oder Methode rein springt. Einmalig überprüft es, die richtige Position des Teils. Passt die Position, wird sich gemerkt, dass ein Teil richtig liegt und es wird zusätzlich überprüft, ob nun alle Teile richtig sind. Wenn ja, wird ein weiteres Ereignis gestartet, wobei der Erfolgstext angezeigt wird und dann auf beenden des Spiel gewartet wird. Wenn nein, passiert nichts. Eine andere Möglichkeit wäre, dass jedes Puzzleteil seinen Bestimmungsort schon kennen würde. Dann würde das Teil beim Ablegen selber überprüfen, ob es richtig liegt und dann eben einfach nur den Erfolg an das Auswertungsscript senden. Das könnte etwas einfacher zu handhaben sein. Wie dem auch sei. Du solltest dir einfach überlegen, was ein Ding alles können und wissen sollte um zu funktionieren. Welche Information ist für welches Ding wichtig und welche nicht. Sind viele Dinge nahezu gleich und unterscheiden sich nur in wenigen Bereichen, dann sollte man sie so aufbauen, dass sie wiederverwendbar sind. Ein Puzzleteil beommt einfach nur eine eigene Nummer, evtl. einen Zielort und eine entsprechende Grafik. Alles Andere ist bei allen Puzzleteilen gleich. Ein Informationsaustausch von einem Objekt zum Anderen sollte nur Ereignisgesteuert sein. Nur bei einer entscheidenden Änderung muss das andere Objekt etwas darüber wissen. Und auch nur dann, muss etwas ausgewertet werden. Ob jetzt ein Objekt eine Sache an ein anderes Objekt übermittelt, also z.B. in eine Methode rein springt, oder ob ein Objekt einen Variablen-Wert eines anderen Objektes zu gewissen Zeiten abfragt, ist eine Frage der Vorliebe, des Aufbaus und der Häufigkeit des Informationsaustausches. Beides geht und beides macht Sinn.
  9. Du darfst nicht im Check hochzählen, sondern da, wo du das Puzzleteil richtig platzierst. Das sollte ja für jedes Teil nur einmal passieren. (Sollte, denn diese Positionsabfrage sollte nur dann kommen, wenn du das Teil loslässt. Also bei OnMouseUp, oder so.) Aber es führen viele (alle) Wege nach Rom! Versuche jedenfalls gewisse Sachen immer nur bei einem Ereignis auszuführen, nicht ständig in der Update. Wenn ein Puzzleteil einmal liegt, also an die entsprechende Position gebracht wurde, ist das Ereignis da. Aber eben nur dann. Und nur dann erhöhst du den Zähler. Du kannst natürlich auch mit einer Liste oder einem Array arbeiten und dort etwas hinzufügen oder einen Wert einer Stelle ändern. Aber niemals immer wieder duch den ganzen Code fahren, denn das kostet Leistung! Das wäre nämlich so, als würdest du ein Buch lesen und bei jedem neuen Wort immer wieder von vorne anfangen, bis du beim nächsten neuen Wort bist, und dann wieder von vorne anfangen, usw. usw. Nur weil ein Rechner das irre schnell kann, heisst das nicht, dass es keine Zeit oder Leistung kostet.
  10. Ja, so wie es aussieht ist valueInRange einfach nur eine boolsche Variable die du da auf true setzt. Ich sehe da keinen zusammenhang mit irgendeinem Puzzleteil. Warum zählst du nicht einfach einen Wert hoch, sobald ein Puzzleteil an richtiger Stelle ist? Beim Puzzlestart hat der Zähler den Wert 0 und bei jedem einschnappen eines Puzzleteils erhöht sich dieser Wert um 1. Sobald die 25 (bei einem 25-teiligen Puzzle) erreicht ist, ist die Bedingung für deinen Text erfüllt. Da brauchst du nicht extra ne Liste für.
  11. Tja, ich gehe stark davon aus, dass dropdown1 keine Referenz zu irgendeiner Dropdown Komponente hat. Und wenn die dropdown1 Variable leer ist, bekommst du eine NullReferenceException, sobald du versuchst irgend etwas damit zu machen. Ist ja auch klar. Ein Dropdown ist wie ein Buch mit mehreren nummerierten Seiten. Du weisst wie man umblättert und du weisst wie man auf der gewünschten Seite etwas liest. Aber wenn du kein Buch in der Hand hast, kannst du nicht umblättern und auch nicht lesen. Und genau das sagt dir das Programm, mit der NullReferenceException. Es könnte dir jetzt etwas aus einer Seite vorlesen, kann es aber nicht, weil das vermutete Buch nicht da ist. Du wunderst dich vielleicht, dass es nicht schon eine Fehlermeldung gab, also du den Index1 mit einem Wert gefüllt hast. int index1 = dropdown1.value; Ja, da wirst du wahrscheinlich einen Defaultwert bekommen haben und das wird die 0 gewesen sein. Denn dropdown1 ist ja eine Variable vom Typ Dropdown und da ist schon klar, wie ich so einen Typ abfragen und bearbeiten kann. Du kennst also das Grundgerüst bzw. die Blaupause eine Dropdownelementes. Diese Variable hat aber leider keinen Verweis auf ein echtes Dropdownelement, was dann ja irgendeinen Valuewert haben kann, abhängig von der Anzahl der Elemente da drin. Hast du z.B. 3 Dropdownelemente da drin, dann könnte value 0, 1 oder 2 sein. Weiter unten willst du jetzt Informationen über den Text am entsprechenden Index abfragen. Ja und das geht nun nicht, denn die leere Dropdown Variable hat keine Infos. Dein Index ist also ausserhalb des Bereichs, denn es gibt keinen Bereich. Du musst unbedingt lernen, was die einzelnen Fehlermeldungen bedeuten, damit du selbstständig erkennst, wieso das jetzt ein Fehler ist und wie bzw. wo du ihn beheben kannst. Sobald du eine Fehlermeldung siehst (rot), bereinige sie! Auch wenn der Fehler evtl. in einem ganz anderen Script zu finden ist oder das Programm augenscheinlich weiter arbeitet. Erst wenn du keine Fehlermeldung mehr hast und dann immer noch ein Wert falsch ist, wie bei dir die 0, kann man von einem Logikproblem ausgehen.
  12. Wie du auf deinen Screenshot sehen kannst, steht unten in der Konsolenleiste eine Fehlermeldung. (NullReferenceException) Solange solch ein Fehler ansteht, ob nun für deine Berechnung bzw. Anzeige wichtig oder nicht, brauchen wir gar nicht im Code nach dieser einen Null zu suchen. Behebe erst einmal den Fehler.
  13. Hi Daniel. Ich bin der Meinung, dass deine Spielbeschreibung auf jeden Fall sehr gut ist. Solche Spiele sind wichtig. Ich könnte mir sogar vorstellen, dass der Bund dieses Spiel fördern würde. Die Förderung von Games wurde vom Bund endlich mal auf den Weg gebracht und ich habe auch schon auf Twiter ein Spiel gesehen, welches gefördert wird. Und dass war ein Plattformer. Da solltest du es unbedingt mal probieren. Ich denke, dass dieses Spielthema auf offene Ohren stößt. Hier etwas info dazu: https://www.bmvi.de/DE/Themen/Digitales/Computerspielefoerderung/computerspielefoerderung.html Dei Trailer gefällt mir, bis auf 2 Kleinigkeiten. Das Wassergeräusch, wenn die Kamera über dem Fluss ist, klingt eher nach einem Bächlein. Es plätschert so süß. Ganz am Schluß, wenn die Kamera den Jungen erreicht, stockt es ein wenig in der Kamerafahrt. Das sind Kleinigkeiten, ich weiß. Trotzdem wollte ich es mal erwähnen. Ich bin sehr gespannt, was ihr aus der Idee machen werdet.
  14. Ich probiere da nicht so viel mit unterschiedlichen Programmen rum. Ich selber nurtze nur Cinema4D und 3D Coat ( Cinema kostet viel, 3D Coat kostet etwas). Aber so ein Objekt geht mit allen 3D Programmen und natürlich auch in Blender. Blender ist nicht sehr einsteigerfreundlich, das sitimmt. Aber es es kann wirklich alles! Und das für ohne Geld! Ich wette mit dir, dass Blender eine Möglichkeit hat, dass du eine Scheibe, oder einen Zylinder erstellen kannst, die/der eben nur 6 Ecken hat. Und normalerweise sollte dann auch gleich eine UV Map erstellt werden, dass du da dann einfach eine Textur drauf legen kannst, die ohne Verzerrung dargestellt wird. Da musst du dann einfach mal ein paar Tutorials schauen, um mit Blender warm zu werden. Aber das ist echt nichts Schlimmes. Du musst sowieso die Grundlagen von 3D Objekterstellungen lernen, wenn du alleine ein Spiel erstelen willst. Es sei denn, du hast einen, der das für dich macht. Aber wer hat schon einen, der etwas für einen macht, wann man es braucht.
  15. Nein. Du kannst keine Grundobjekte ändern. Du kannst aber selber welche bauen. Etweder per Code, was recht aufwendig ist und ersteinmal gelernt werden will, oder aber du erzeugst soch ein Objekt in einem 3D Modeller und importierst es einfach. Es gibt auch Plugins/Assets mit denen du Objekte direkt in Unity bearbeiten kannst. Aber das würde ich jetzt nicht empfehlen, denn ein 6-Eck-Zylinder kannst du in jedem frei verfügbaren 3D Programm erstellen.
×
×
  • Create New...