Jump to content
Unity Insider Forum

thewhiteshadow

Members
  • Content Count

    90
  • Joined

  • Last visited

  • Days Won

    5

thewhiteshadow last won the day on July 17 2018

thewhiteshadow had the most liked content!

Community Reputation

12 Gut

About thewhiteshadow

  • Rank
    Advanced Member

Recent Profile Visitors

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

  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. Du kannst doch die Y-Komponente nachträglich auf 0 setzen bzw. welchen Offset du auch immer hast, oder nich?
  4. 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
  5. Erscheint mir wie ein Fall für Physics.BoxCast o.ä. Du testest damit den Weg von der alten zur neuen Position und verschiebst es dann um RaycastHit.distance zu Maus hin. Es findet somit keine Kollision statt.
  6. Du hast nur die Möglichkeit mehrere Assets in Packages zu bündeln. Das gleiche, was du auch über den Asset Store runterladest. Die kannst du aber genau so gut auf deine Platte packen und bei Bedarf in deine Projekte importieren. Einen übergreifenden Ressourcne-Path gibt es nicht. Möglicherweise gibt es im Store auch eine Art Sync-Tool, kann ich aber nicht sagen. mfg TWS
  7. 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?
  8. Ich hab den Fehler durch ein wenig refactoring behoben, auch wenn ich immer noch nicht genau nachvollziehen kann, warum der Fehler auftritt.
  9. ich dachte eigentlich, das ich das tue 😕 // Avatar ist das Custom-Skript, in der der Code aus meinem vorherigen Post steht. if (avatar != null) { avatar.Speaking = false; avatar.Active = false; }
  10. Ok, das Image ist es nicht, es ist das gameObject. MissingReferenceException: The object of type 'SpriteAvatar' has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object. TWS.Dialogs.SpriteAvatar.get_image () (at Assets/Scripts/Dialog/SpriteAvatar.cs: 60 ) 55: get { 60: if (gameObject != null && 65: _image == null) 66: _image = GetComponent<Image>(); // Ich hab die leeren Zeilennummern ausgelassen Ich weiß, dass der == und != Operator bei GameObject überladen ist (was das schlechteste API-Desing ist was ich je gesehen hab), aber dass er eine Exception auslösen kann, halte ich für außerst eigenartig.
  11. Danke für die Antwort. Im Editor gibt es keine "Frames" (nur Event getriggerte Updates) und dort funktioniert Destroy alleine nicht. Im Spiel führt DestroyImmediate zu keinen Problemen, auch wenn ich mir schon überlegt habe, ggf. einen Fork einzubauen.
  12. Hallo, ich bin dabei für ein SkriptableObject eine Visualisierung im Editor zu erstellen. Diese erstellt ein Object aus einem Prefab und zeigt es solange an, wie das Asset im ProjektOrdner ausgewählt ist (über einen Custom Inspector). Ändert man etwas im Inspector, soll sich die Visualisierung ändern. Genauer bei dessen UI Image Komponente wird das sprite ausgetasuscht. Wählt man das Asset ab, wird das Visualisierungs-Objekt wieder gelöscht. Bei der ersten Auswahl funktioniert es super. Auch im Spiel klappt es wunderbar. Wenn ich das Asset jedoch im Editor ein zweites mal auswähle (oder ein anderes vom gleichen Typ), spinnt er rum. Es wird eine MissingReferenceException geworfen, wenn ich das image auf null prüfe. private Image image{ get{ if (gameObject != null && _image == null) //<-- Error! _image = GetComponent<Image>(); return _image; } } Ich muss das Objekt für die Visualisierung dynamisch erzeugen, weil es nicht regulärer Bestandteil der Szene ist und im Spiel auch erst zur Laufzeit erzeugt wird. Ich denke, er bekommt das mit dem DestroyImmediate und anschließenden Instantiate nicht auf die Reihe, aber warum wirft er den Fehler bei der null Abfrage?
  13. 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?
  14. Das was du womöglich suchst sind ScriptableObject's
  15. So was ähnliches hatte ich auch mal. Das liegt glaub ich an einem Rigidbody an deinem Enemy. Das "sammelt die Collider ein". Da der Raycast über die Physik-Engine läuft, trifft er das Rigidbody mit seinen Collidern. Trigger-Events funktionieren ohne Physik und treffen daher nur den Collider. Lustig ist auch, dass OnCollisionEnter wiederum das Rigidbody treffen würde. Meine Lösung war die Events einfach weiter zu geben.
×
×
  • Create New...