Jump to content
Unity Insider Forum

thewhiteshadow

Members
  • Gesamte Inhalte

    91
  • Benutzer seit

  • Letzter Besuch

  • Tagessiege

    6

Alle erstellten Inhalte von thewhiteshadow

  1. Danke für das Feedback. Zu 1: Hab ich wirklich versucht, aber dafür müsste ich die quaternion Klasse erweitern, das geht aktuell aber nicht mit Operatoren. Also '*' überladen oder ein cast. Quaternion arbeitet intern oft schon mit double, wenn man sich hier mal den decompilierten code anguckt. Zudem massiv nativ calls. Nachbauen macht da keinen Spaß. Ich könnte höchstens den * für Vector3d überlagern, was mathematisch aber auch nicht korrekt wäre. Die double Vector Klassen sind mMn. auch bei simple Richtungs-Transformation falsch angelegt. Ich benötige sie für eine Schnitt-Punkt Berechnung die bei float zu viel Rundungsfehler erzeugt. zu 2: Hab ich kurz überlegt, aber mir dann gedacht, dass ich beim Debuggen eigentlich meist egal ist, was das für eine Klasse ist, sondern einfach nur die Werte interessieren. Und das wird ja auch bei Vector2 und Vector3 gemacht. Ich hab mich da stark am deren Aussehen gehalten. Auch bei dem Drawer hab ich mich bemüht, dass der exakt gleich ausschaut. Wem es nicht gefällt. Source Code ist frei (public domain).
  2. Hallo, aus Anlass eines Projekts von mir war ich auf der Suche nach einer Implementierung der Vector Klassen mit doubles. Was ich gefunden hab war brauchbar, aber alles Andere als Vollständig. Also hab ich das Projekt kurzerhand geforkt und überarbeitet da das Original-Projekt offenbar nicht mehr gepflegt wird. Insbesondere einen Drawer, der zu den vorhandenen Klassen passt. https://github.com/TheWhiteShadow3/vector3d Falls jemand hier noch eine Verbesserung sieht oder etwas fehlt, darf er gerne bescheid geben oder einen Pull-Request stellen.
  3. protected static List<Intersection> LineCircleIntersection(Line l, Circle k) { float a = l.p1.y - l.p2.y; float b = l.p2.x - l.p1.x; float c = l.p2.x * l.p1.y - l.p1.x * l.p2.y; float d = c - a * k.origin.x - b * k.origin.y; float t = k.radius*k.radius * (a*a + b*b); var list = new List<Intersection>(); if (t < d*d) return list; float sq = Mathf.Sqrt(k.radius*k.radius * (a*a + b*b) - (d*d)); float x1 = k.origin.x - (a*d + b * sq) / (a*a+b*b); float y1 = k.origin.y + (b*d + a * sq) / (a*a+b*b); float x2 = k.origin.x - (a*d - b * sq) / (a*a+b*b); float y2 = k.origin.y + (b*d - a * sq) / (a*a+b*b); list.Add(new Intersection(new Vector3(x1, y1, 0), l, k)); if (t > d*d) list.Add(new Intersection(new Vector3(x2, y2, 0), l, k)); return list; } Hallo, ich möchte die Schnittpunkte einer Linie mit einem Kreis berechnen. Leider liegen die Schnittpunkte meines Algorithmus etwas daneben. Wenn der Kreis-Mittelpunkt auf der Linie liegt, funktioniert es. Formel ist von Wikipedia adaptiert: https://de.wikipedia.org/wiki/Schnittpunkt#Schnittpunkte_einer_Geraden_mit_einem_Kreis Linie ist definiert durch 2 Vektoren. Kreis durch Mitte und Radius. Ich finde den Fehler einfach nicht :( mfg TWS
  4. Hallo, ich benötige mal ne weitere Meinung zur Implementierung einer Auswahlmöglichkeit für einen Text Dialog System. Es geht hierbei um eine bedingte Anzeige von Texten nach einer Spieler-Auswahl in einem Dialog und die Darstellung im Inspektor. Das hier ist die Message Klasse für die Einträge. public class Message { public enum Type { NONE, TEXT, QUESTION, EVENT } public Type type; public int option = -1; public int speaker; public int emotion = 0; public string message = ""; public AudioClip voice; public string messageHookID; } Und Hier mal ein Ausschnitt aus dem Editor mit 2 Einträgen. Also es wird eine Frage gestellt. Der Spieler gibt eine Antwort (Option 1, 2 oder 3) und Abhängig davon wird der nachfolgende Eintrag angezeigt oder nicht. Aktuell war die Idee unter dem Typ eine Options-Auswahl anzuzeigen bei der man auswählen kann, bei welcher Antwort der der Eintrag angezeigt wird. Zusätzlich die Option "Alle". Jetzt hat diese Umsetzung den Nachteil, dass man keine verschachtelten Fragen erstellen kann. Oder man setzt unter die Optionsauswahl weitere. Für jede Frage eine. Das wäre aber sehr unpraktisch, da man schon bei wenigen Verschachtelungen komplett die Übersicht verliert. Schöner wäre es, wenn das Fork-Handling bereits in dem Fragen-Element gemacht wird. Aber da fällt mir nur sowas wie Index-Sprungmarken ein, was auch nicht sehr ansehnlich ist. Zumal der Index momentan nicht angezeigt wird. Jemand ne Idee, wie man das einfach und intuitiv umsetzen kann?
  5. Hallo, ich möchte in meinem Spiel die Möglichkeit implementieren, dass der Spieler sich an kleinen Wänden hochziehen kann. Ich hab aber noch Probleme damit die nächstgelegene Position der Wand zu ermitteln wo dessen Normal zum Spieler zeigt. Über den Raytrace erhalte ich nur die Position zu der forward-Richtung vom Spieler. Ich benötige aber Erstere für die Animation, damit die Hände später genau an der Kante greifen. Mein Ansatz bisher: Vector3 origin = transform.position + (Vector3.up * 1f); if (Physics.Raycast(origin, transform.rotation * Vector3.forward, out hitInfo, climbCheckDistance)) { (...) // Startpunkt über der Wand für den Down-Trace ermitteln. (50cm hinter der Kante in 2,10 Meter höhe) // Die Höhe ist die Kletterhöhe + 10cm Puffer. origin = transform.position - hitInfo.normal * 1.5f * (Vector3.Dot(origin - hitInfo.point, hitInfo.normal)) + (Vector3.up * 2.1f); (...) if (Physics.Raycast(origin, Vector3.down, out hitInfo, 1f)) { (...) Hiermit bekomme ich zwar schon sehr gut die Position raus. Leider liegt der Punkt tiefer in der Wand, je weiter der Spieler von der Wand weg steht. climbCheckDistance ist zwar klein, aber nicht klein genug, dass man es vernachlässigen könnte. Jemand ne Idee wie das besser geht?
  6. Wüsste nicht, dass das geht. Deaktiviere doch einfach das Terrain bzw. ersetze es zum testen durch eine kleine Plane. Oder du packst das Haus in eine andere Szenen und ladest diese additiv. dann kannst du die Lightmap mitnehmen.
  7. mein Mobile-Game kommt aktuell auf etwa 50000 tris im Screen und läuft bei mir (Honor c5) noch mit 60fps. Aber Shader und Shadow-Caster machen deutlich mehr aus, als die Polygone allein.
  8. Wenn ihr den Algorithmus ordentlich programmiert hättet, könntet ihr den Core einfach 1:1 kopieren. Das Grundproblem ist schon, dass der Algorithmus nix mit monobehavior zu tun hat, also bitte pack ihn in eine eigene Klasse. Spiel-Objekte sollten ihn nach einem Weg "fragen" und nicht implementieren. Die "Knoten" sollten auch nur die Informationen haben, die der Algorithmus braucht und evtl als interface implementiert werden. Außerdem sollten die Wegpunkte nicht von jedem Monster erstellt werden sondern als Struktur zentral (Singelton?) vorliegen. Bestenfalls vorgebacken.
  9. Du kannst die Auflösung der Highmap ändern. In den Einstellungen vom Terrain ziemlich weit unten. Wenn du deine Arbeit nicht zunichte machen willst, solltest du allerdings vorher deine Highmap exportieren und per Grafikprogramm skalieren und wieder importieren.
  10. Weil ich selber immer mal wieder danach suche wie ich ein bewegtes Ziel treffen kann. /// <summary> /// Addiert zum Zielvektor eine Bewegung des Zielobjekts und berechnet den Einschlagpunkt. /// </summary> /// <param name="target">Position des Zielobjekts</param> /// <param name="movement">Bewegung des Zielobjekts</param> /// <param name="bulletSpeed">Geschwindigkeit des Projektils</param> /// <returns>Einschlagpunkt</returns> public Vector3 AimMovingTarget(Vector3 target, Vector3 movement, float bulletSpeed) { float dist = (transform.position - target).magnitude; // C float relSpeed = movement.magnitude / bulletSpeed; // a/b float beta = Vector3.Angle(transform.position - target, movement) / 180f * Mathf.PI; // sin(alpha) = a/b * sin(beta) float sinA = relSpeed * Mathf.Sin(beta); // gamma = pi - alpha - beta float gamma = Mathf.PI - (Mathf.Asin(sinA) + beta); // A = C * sin(alpha) / sin(gamma) float hitDist = dist * sinA / Mathf.Sin(gamma); return target + movement.normalized * hitDist; } Und hier das gleiche als Approximation, falls man noch eine Beschleunigung oder andere Kräfte einfügen möchte, die nicht mehr trivial zu berechnen sind. /// <summary> /// Addiert zum Zielvektor eine Bewegung des Zielobjekts und berechnet den Einschlagpunkt. /// </summary> /// <param name="target">Position des Zielobjekts</param> /// <param name="movement">Bewegung des Zielobjekts</param> /// <param name="bulletSpeed">Geschwindigkeit des Projektils</param> /// <param name="increment">Schritweite der Approximation. Sollte kleiner als die Kollisionsbox des Ziels sein.</param> /// <returns>Ungefährer Einschlagpunkt</returns> public Vector3 AimMovingTarget(Vector3 target, Vector3 movement, float bulletSpeed, float increment = 0.01f) { Vector3 t = (target - transform.position); float time = 0; float lastErr = float.MaxValue; float err; do { time += increment; t += movement * increment; err = t.magnitude / bulletSpeed - time; if (lastErr < err) { break; } lastErr = err; } while (Mathf.Abs(err) >= increment); return t + transform.position; }
  11. ich habs jetzt doch noch hinbekommen. Im Grunde war es schon der richtige Ansatz. public float Aim(Vector3 target) { this.targetVector = target - v_Achse.transform.position; Quaternion targetRotation = Quaternion.LookRotation(targetVector, baseRotation * Vector3.up); // Für die Animation: Quaternion aniRotation = transform.worldToLocalMatrix.rotation * Quaternion.RotateTowards(vRotation, targetRotation, rotationSpeed * Time.deltaTime * 60f); // Erforderlich, da Quaternion.RotateTowards kein UP-Vector hat, so wie Quaternion.LookRotation. Vector3 euler = aniRotation.eulerAngles; euler.z = 0; this.vRotation = transform.localToWorldMatrix.rotation * Quaternion.Euler(euler); // Soll sich um die lokale XY-Achse drehen. euler.x = 0; this.hRotation = transform.localToWorldMatrix.rotation * Quaternion.Euler(euler); // Soll sich nur um die lokale Y-Achse drehen. }
  12. Hallo, ich hab ein Geschützturm, der sich einmal um die Y und dann um die X-Achse drehen kann und so ein Ziel anvisiert. Solange der Turm selber nicht gedreht ist, funktioniert es mit euler-Winkel ganz gut. Aber die Ausrichtung des Turms soll unabhängig vom Ergebnis sein. Der Turm soll also noch funktionieren wenn er z.B. an der Wand hängt. Ich bekomm zwar die gesamtdrehung mit Quaternion.LookRotation hin, aber für die einzelnen Gelenke und für die Animation müsste ich jetzt wissen, wie ich die winkel so transformieren muss, dass ich eine lokale Achse auf 0 setzen kann, aber ich weiß nicht wie. Ich habs mit localToWorldMatrix versucht, aber das funktioniert irgendwie nicht oder ich weiß nicht, wie man es richtig einsetzt. Bisher habe ich diese Funktion, die bei normaler Ausrichtung funktioniert: public void Aim(Vector3 target) { this.targetVector = target - v_Achse.transform.position; Quaternion targetRotation = Quaternion.LookRotation(targetVector, Vector3.up); // Für die Animation: Quaternion aniRotation = Quaternion.RotateTowards(vRotation, targetRotation, rotationSpeed * Time.deltaTime * 60f); // Erforderlich, da Quaternion.RotateTowards kein UP-Vector hat, so wie Quaternion.LookRotation. Vector3 euler = aniRotation.eulerAngles; euler.z = 0; this.vRotation = Quaternion.Euler(euler); // Soll sich um die lokale XY-Achse drehen. euler.x = 0; this.hRotation = Quaternion.Euler(euler); // Soll sich nur um die lokale Y-Achse drehen. }
  13. Hallo, ich habe einen Wegweiser modeliert und frage mich ob es möglich ist, die Beschriftung dynamisch draufzuschreiben. Evtl mit Partikeln oder Decals? Vermutlich brauche ich dafür eine Textur mit dem Alphabet. Gibt es für Unity so ne art BitmapFont Funktion?
  14. Hallo zusammen, wenn ich ein Haus oder so erstellen will für innen und außen, wie sollte ich das am besten aufteilen? Das Unity pro Objekt ein Material verwendet weiß ich aber macht es Sinn einzelne Elemente zu erstellen und diese mit Box-Collider zu versehen oder reicht es ganze Räume mit Mesh-Collider zu erstellen? Ist es besser das ganze Haus als Ganzes zu importieren oder die einzelnen Teile seperat um sie dann in unity zusammen zu setzen? Werden gleiche Meshs dazu als referenzen importiert oder hab ich dann z.B. 20 Wände mit 20 eigenen Meshs? p.s. ich modeliere in Blender.
×
×
  • Neu erstellen...