Jump to content
Unity Insider Forum

Mr 3d

Members
  • Content count

    653
  • Joined

  • Last visited

  • Days Won

    23

Mr 3d last won the day on June 20

Mr 3d had the most liked content!

Community Reputation

129 Excellent

About Mr 3d

  • Rank
    Christian
  • Birthday 12/09/1999

Profile Information

  • Gender
    Male
  • Location
    Bayern

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Mr 3d

    Boolean als Trigger (gelöst)

    Normalerweise speichert man doch einfach den letzten Status der Variable und überprüft im nächsten Update ob er immer noch gleich ist.. oder hab ich die Frage falsch verstanden? ^ bool wert; bool lastWert; void Update(){ if(wert != lastWert){ //geändert lastWert = wert; } }
  2. Mr 3d

    Frage: genau bis 90 Grad rotieren

    Sowas? Da würde ich einfach eine Animation machen.. oder muss es dynamisch sein?
  3. Mr 3d

    Frage: genau bis 90 Grad rotieren

    Klar geht das auch ohne Coroutine^ Quaternion targetRotation; float rotSpeed; void Awake(){ setTargetRotationEuler(new Vector3(90, 0, 0)); } void Update(){ transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, rotSpeed * Time.deltaTime); } void setTargetRotationEuler(Vector3 rot){ targetRot = Quaternion.Euler(rot); } Mir würden auch noch drei andere Wege einfallen, wie man das umsetzen könnte.. Welcher Weg der beste ist kommst stark auf deinen Zusammenhang an.. Edit: Möchtest du 'transform' drehen, oder das GameObject 'topSide' ?
  4. Mr 3d

    Frage: genau bis 90 Grad rotieren

    Nein, wenn du 'Rotate()' in die Update Methode schreibst, wird das Object jeden Frame um die '90 * Time.deltaTime' um die x-Achse gedreht. Also dreht sich dein Objekt dauerhaft mit 90° pro Sekunde. Wenn man nach 'rotate 90 degree smooth' sucht, findet z.B. das hier: https://answers.unity.com/questions/1202034/smooth-90-degree-rotation-on-keypress.html
  5. Und nochmal ein kleiner Nachtrag für zukünftige Leser.. Allein durch das Aufteilen auf mehrere Dispatch Aufrufe, verhindert man nicht, dass das Timeout Limit nicht überschritten wird. Nach dem was ich gelesen habe, werden die Dispatch Aufrufe gequeued und dann zusammen ausgeführt, was wieder zu dem Timeout führt. Wenn man aber nach jedem Dispatch 'GL.Flush();' aufruft, erzwingt man, dass sie direkt und nacheinander bearbeitet werden. Zumindest hat das für mich den Fehler behoben.^^
  6. Was auch daran liegen könnte, dass ich im shader vergessen habe den 'startOffset' hinzu zu addieren
  7. Hi, ich habe einen relativ aufwendigen Compute Shader, der eine Textur generiert. Bei Texturen, die größer als ~1024 Pixel sind, erreiche ich aber das 2 Sekunden Timeoutlimit von Windows ( https://docs.microsoft.com/en-us/windows-hardware/drivers/display/timeout-detection-and-recovery ) Ich weiß, dass man den in der Registry anpassen kann, will ich aber nicht^^ Meine Idee wäre jetzt einfach gewesen die große Textur in vier (oder mehr) Teile zu teilen und diese nacheinander zu verarbeiten. In etwa so: int size = texSize / 16; // (texSize / 2) / 8; 8x8 Threadgruppen int offset = texSize / 2; for(int y = 0; y < 2; y++) { for (int x = 0; x < 2; x++) { compute.SetInts("startOffset", x * offset, y * offset); compute.Dispatch(kernelIndex, size, size, 1); } } Nur wartet der Mainthread nicht darauf, dass die erste Dispatchgruppe fertig ist. Zumindest arbeiten alle Gruppen mit dem selben 'startOffset'. Aber wie kann ich jedem Dispatch einen eigenen 'startOffset' setzen? Jemand ne Idee?
  8. Mr 3d

    Bitselect bei Floats - ComputeShader

    Kleiner Nachtrag dazu: Tatsache^^ Ich habe eben mal meinen "performanten" Zahlen-Switch-Code mit einfachen If-Abfragen ersetzt und mir den kompilierten Code angeschaut. Der Compiler hat die Branches einfach wegoptimiert und der Code läuft jetzt knapp 20% schneller! Also Notiz an mich selbst: einfach den Compiler die Arbeit machen lassen
  9. Mr 3d

    Knockback in 2D spielen

    Hi, ich sehe da mehrere Probleme mit deinem Code: - innerhalb deiner while-Schleife in der Coroutine hast du kein 'yield return null;'. Das heißt, dass die Schleife in einem Frame bis zum Ende durchläuft. In Zeile 118 hattest du schon den richtigen Ansatz, aber du musst es in die Schleife reinziehen, damit er nach jedem Durchlauf der Schleife bis zum nächsten Frame wartet. Und ich bin mir grad nicht ganz sicher ob 'yield return 0;' auch geht, ich würde 'yield return null;' verwenden. - es ist generell etwas unlogisch den Knockback über mehrere Frames auszuführen. Vor allem, weil du nach jedem Durchlauf die Velocity wieder auf 0 setzt. Viel logischer klingt es doch dem Spieler einen starken Impuls zu geben, der ihn wegschubst. Dazu würde ich mal versuchen bei 'AddForce' den 'ForceMode' auf 'Impulse' zu setzten. ^ - du übergibst als Richtung für den Knockback die aktuelle Position des Spielers. Die Kraft drückt deinen Spieler also weg vom Ursprung der Szene. Wenn du stattdessen von der Spielerposition die Position der Spikes abziehst (und den Vektor dann normalisierst), sollte der Spieler von den Spikes weggedrückt werden. Dann kannst du ggf. noch einen gewissen Impuls nach oben geben. Das würde dann etwa so aussehen: public void Knockback(float pwr, float upPwr, Vector2 dir){ dir.Normalize(); rb2d.velocity = new Vector2(0, 0); rb2d.AddForce(dir * pwr + Vector2.up * upPwr, ForceMode2D.Impulse); } playerC.Knockback(100, 10, playerC.transform.position - transform.position); //Einheiten nicht getestet
  10. Mr 3d

    Zuweisungsproblem

    Hi, wenn du willst, dass 'instScaleMax' gleich 'instScaleMinS1 + 1' ist, dann würde ich das auch einfach so hinschreiben ^^ Wenn du willst, dass der Wert von 'instScaleMinS1' um eins erhöht wird und danach zugewiesen wird, musst du das '++' als Präfix schreiben. ( https://docs.microsoft.com/de-de/dotnet/csharp/language-reference/operators/increment-operator ) So wie du es momentan hast, mit '++' als Postfix, wird der Wert zugewiesen, und danach um 1 erhöht.
  11. Mr 3d

    Interpolation zwischen Zellen

    Hi, wenn du die Koordinaten der Zelle vom letzten und diesem Frame hast, kannst du dir eine Gerade durch diese zwei Punkte denken. Dann kannst du von jeder Zelle den Abstand zu dieser Geraden berechnen, und wenn der z.B. kleiner 1 ist, färbst du die Zelle. Im Grunde ist das das gleiche, wie wenn du versuchst eine Linie auf ein 100x100 Pixel Bild zu zeichnen. Bei Google findet man dazu mehrere Wege. Das was ich oben beschrieben habe würde etwa so aussehen: private bool[,] Cells = new bool[100, 100]; private void Line(int x1, int y1, int x2, int y2){ Vector2 start = new Vector2(x1, y1); Vector2 dir = new Vector2(x2-x1, y2-y1); float sqrLengthInv = 1f / Vector2.Dot(dir, dir); for(int y=0;y<100;y++){ for(int x=0;x<100;x++){ float k = Vector2.Dot(new Vector2(x-x1, y-y1), dir) * sqrLengthInv; //projektion auf die Gerade Vector2 closestOnLine = start + dir * k; bool onLine = k>=0 && k<=1 && (closestOnLine-start).magnitude < 1; Cells[x][y] = onLine; } } } (nicht getestet)
  12. Mr 3d

    Objekt per Maus bewegen

    Ob du Translate benutzt, oder wie ich die Position direkt setzt, macht keinen Unterschied. Bei beiden wird das Objekt einfach an die neue Position 'teleportiert'. Wenn du einen Rigidbody verwendest, solltest du zum einen die Bewegung in FixedUpdate ausführen, und mit der 'velocity' / ApplyForce() vom Rigidbody arbeiten. Stimmt, aber ich wüsste nicht, was das für einen Unterschied machen soll? Ist der Input negativ, ist die Bewegung negativ und umgekehrt. Hast du mein 'edit' gesehen? Mit 'transform.TransformDirection()' kannst du den Bewegungsvektor entsprechend der Ausrichtung deines Objekts drehen. https://docs.unity3d.com/ScriptReference/Transform.TransformDirection.html
  13. Mr 3d

    Objekt per Maus bewegen

    Ich glaube du machst dir das komplizierter als es eigentlich ist. public Vector2 MinMaxX; public Vector2 MinMaxY; public float sensitivity; private void Update(){ Vector3 kameraPosition = kameraTransform.position; Vector2 movement = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")) * sensitivity * Time.deltaTime; kameraPosition.x = Mathf.Clamp(kameraPosition.x + movement.x, MinMaxX.x, MinMaxX.y); kameraPosition.z = Mathf.Clamp(kameraPosition.z + movement.y, MinMaxY.x, MinMaxY.y); kameraTransform.position = kameraPosition; } "fällt das Objekt um mitsamt Kamera einfach um" Hat dein Objet einene Rigidbody Componente? Wenn ja, solltest du nicht mit Translate() arbeiten. Außerdem holst du dir immer wieder die mausInputX, mausInputY und Position der Kamera. Das kannst du alles einfach einmal am Anfang machen. Das ist performanter und kürzer.. edit: Wenn du noch willst, dass die Bewegung abhängig von der Rotation ist, kannst du das so machen: Vector3 movement = kameraTransform.TransformDirection(new Vector3(Input.GetAxis("Mouse X"), 0, Input.GetAxis("Mouse Y")) * sensitivity * Time.deltaTime); Und dann natürlich noch "kameraPosition.z + movement.y" zu "kameraPosition.z + movement.z" ändern..
  14. Du kannst dir ja mal ausgeben lassen welches Objekt den Trigger auslöst.. void OnTriggerEnter2D(Collider2D other) { if (!other.CompareTag("Player")) { Debug.Log(other.name); } }
  15. Mr 3d

    [Kartenspiel] Grundgedanken eines Newbies

    Ich glaube, dass da in Saschas Code ein kleiner Dreher drin ist.. Zum einen hast du Recht, dass das 'void' an der Stelle keinen Sinn ergibt. Aber der Rückgabewert ist nicht vom Typ 'Transform', sondern 'Vector3'. Die Formel sieht richtig aus. Sie gibt dir aber nur den Abstand vom Startpunkt. Wenn du die Position ausrechnen willst, würde ich es so machen wie Sascha. Nur 'plus' die Startposition, nicht 'mal'. Und die Verschiebung nach Rechts mit dem Abstand zwischen zwei Karten multiplizieren. Also: public Vector3 GetCardPosition(int index) { return firstPoint + Vector3.right * (cardwidth + padding) * index; }
×