Jump to content
Unity Insider Forum

Hans im Gestrüpp

Members
  • Content count

    21
  • Joined

  • Last visited

Community Reputation

1 Neutral

About Hans im Gestrüpp

  • Rank
    Member

Profile Information

  • Gender
    Male
  • Location
    NRW/Rees

Recent Profile Visitors

1,708 profile views
  1. Hans im Gestrüpp

    Hilfe bei Ausrichtung von Raycast Grid (ohne Transforms)

    Echt super, danke! Die Matrix Zeile beinhaltet ja schon die komplette Funktionalität. Danke, danke, danke! Wenn die MultiLineCast Methode rund läuft werde ich sie hier gerne veröffentlichen.
  2. Hans im Gestrüpp

    Hilfe bei Ausrichtung von Raycast Grid (ohne Transforms)

    Hey Sascha, danke für den Tipp! Dein Code snippet kann ich leider nicht anwenden, da Transforms wegfallen um die entstehende Funktion im Fall der Fälle allein mit Vektoren betreiben zu können, so wie bei Physics.LineCast. Ich habe diese Matrix.TRS Funktion mal unter die Lupe genommen und mir die Member angeschaut, daraus werde ich allerdings nicht schlau. Ich habe zwar eine Vorstellung davon wie in meinem Fall die Matrix aussehen müsste (Länge: 2 (Startpunkt, Endpunkt) Höhe und Breite unbestimmt (da einstellbar)), aber die Umsetzung ist das Problem. Wie lege ich z.B. die Länge einer Matrix von Punkt A nach Punkt B fest? Oder wie ändere ich die Höhe und Breite mit zwei Variablen in einem loop während Start und Ende der Matrix mittig an Startpunkt und Endpunkt anliegen? Auch wenn es ja nun dank Zer0Cold nicht mehr nötig ist, wäre ich um meiner Erfahrung Willen dankbar wenn mir jemand erklären könnte wie ich mein Vorhaben mit Matrizen umsetzen kann. Falls mal jemand Zeit hat.
  3. Hans im Gestrüpp

    Hilfe bei Ausrichtung von Raycast Grid (ohne Transforms)

    Wow, danke dafür Zer0! Ich hatte kleine Denkanstöße erwartet, aber dank dir kann ich dieses Unterprojekt schonmal abhaken. Ich frage mich wirklich wie man so gut wird in solchen Berechnungen. Für mich ergibt zum Beispiel die Formel für den Vektor startPoint überhaupt keinen Sinn. Wie kann man da durchblicken?! Wenn ich hier eine Offtopic Frage einbinden dürfte: Welche Gebiete der Mathematik sind denn ganz besonders hilfreich, um besser mit Vektoren und Rotationen klarzukommen? Edit: Im Nachinein fällt mir auf, dass ich die Variablen width und height eigentlich als Definition der Dimensionen aller Rays integrieren würde, sozusagen als Stapelhöhe und -breite und die Anzahl der Rays (numRows, numColumns) würde dann als Resolution dienen. Hier meine frühere, nennen wir es mal "Implementierung" dieser Funktionalität: for(int r = 0; r < numRows; r++) { for(int c = 0; c < numColumns; c++) { Gizmos.DrawRay(origin.position + new Vector3((width / numColumns) * c, (height / numRows) * r, 0), target.position - origin.position); } } Allerdings verändert sich die Breite bzw. Höhe beim Ändern der Ray Anzahl in geringem Maße (mit jeder Iteration weniger). Außerdem fehlt hier natürlich auch die elegante Ausrichtung. @Zer0Cool, wie würde ich dieses Verhalten in die startPoint Formel einbringen?
  4. Hallo, ich bin zurzeit dabei, eine Funktion zu erstellen, die mehrere Rays verschießt, allesamt parallel zueinander. Sie heißt "MultiLineCast" und wird genauso genutzt wie "Physics.Linecast" und der Check gibt true zurück sollte auch nur ein Ray sein Ziel erreichen. Als Parameter fällt Transform weg um die Möglichkeit zu erhalten die Funktion allein auf Basis von Vektoren auszuführen. Der Test Code für die Bündelung und Ausrichtung der Rays sieht momentan so aus: private void OnDrawGizmos() { if(origin != null && target != null) { Gizmos.color = Color.cyan; Gizmos.DrawSphere(origin.position, 0.2f); Gizmos.DrawSphere(target.position, 0.2f); for(int r = 0; r < numRows; r++) { for(int c = 0; c < numColumns; c++) { Gizmos.color = Color.green; Gizmos.DrawRay(origin.position + new Vector3(width * c, height * r, 0), (target.position - origin.position)); } } } } was dann so aussieht: So weit so gut. Hier tut sich folgendes Problem auf, das ich nicht bewältigen kann da ich in Mathe eine Null bin: Problem: Wenn ich einen der Punkte verschiebe, bleiben die Ray Ursprünge immer gleich im World Space (rote Kennzeichnung). Ich hätte allerdings gerne dass es sich wie bei Kennzeichnung blau verhält. Ich habe wirklich alles probiert und im Internet gesucht, aber all die Formeln und Snippets von UnityAnswers konnte ich einfach nicht umsetzen. Ich versuche sozusagen ein längs gestapeltes Bündel Rays von einem Punkt zum andern zu schießen während alle Rays im Stapel bündig bleiben, als würde ich einfach nur ein festes Objekt ausrichten. Wenn mir jemand bitte nur ein paar verständliche Formeln anbieten könnte die zu Unity's Kontext passen, das wäre sehr hilfreich. Vielen Dank schonmal für eure Zeit.
  5. Hans im Gestrüpp

    DoubleSided Cloth-Shader!

    Boah wieviele Stunden ich damit verbracht habe, Codeblöcke aus dem Internet zu fischen und jetzt bringen mir zwei lausige Worte den Frieden. Danke!
  6. Hans im Gestrüpp

    LookAt-Problem

    Hi, es ist völlig egal ob das zu drehende Objekt ein Child von etwas ist oder ob es über einen Bone gesteuert wird: Zunächstmal solltest du ein Empty GO zum Child deines LookAt Objektes machen und setzt danach die Positionswerte des Empty GOs auf 0 (nur für den Fall dass das LookAt Objekt standardmäßig nicht die selbe Position wie sein Parent hat) -- ParentObject ---- zu drehendes Objekt ------- Empty GameObject <- x, y, z Position = 0 Danach machst du das Empty GO zu einem Child von dem Objekt das auch als Parent für das Look At Objekt dient und setzt die Rotationswerte des Empty GOs auf 0. Für den Fall, dass nun die Z Achse (die Achse die das LookAt Skript auf sein Ziel ausrichten wird) nach unten guckt, drehst du das Empty GO einach so, dass sie in die von dir gewünschte Richtung zeigt, also ungefähr nach vorne: -- ParentObject ---- zu drehendes Objekt ---- Empty GameObject <- x, y, z Rotation = 0 - eventuell manuell anpassen Da die Rotation des Empty GameObjects nun ordentlich ausgerichtet sein wird, brauchst du nur noch das zu drehende Objekt zum Child des Empty GameObject machen... -- ParentObject ---- Empty GameObject ------- zu drehendes Objekt ...und das LookAt Skript vom zu drehenden Objekt entfernen und ein neues aufs Empty GO zu packen. Resultat: Das LookAt Skript richtet nun die Rotation des Empty GameObjects aus. Das stört weder Parent noch Child. Nur dass das Child jetzt nicht mehr bockig auf den Boden starrt. Es sei denn es ist so gewollt.
  7. Hans im Gestrüpp

    Teil 3: A* Pathfinder

    Ich würd ja anbieten dir irgendwie zu helfen, aber du weißt ja: Noah = Anfänger =) Falls Bedarf besteht, kann ich jeder Zeit die Pathfinding Scripts in C# bereitstellen.
  8. Hans im Gestrüpp

    Teil 3: A* Pathfinder

    Und wieder was neues gelernt. Ich war ganz schön naiv zu glauben, ich könnte als Anfänger mal eben an nem Pathfinding Script rumfummeln ohne das dabei völliger Murks bei rumkommt. :S Naja, jetzt funktioniert jedenfalls alles. Danke für deine Hilfe und die Zeit die du in die Korrektur investiert hast, Stephan. Ich freu mich schon auf den 4. Teil dieser Tutorialreihe. mfg Noah
  9. Hans im Gestrüpp

    Teil 3: A* Pathfinder

    Hehe Nach der Änderung entstehen wieder über 30 andere Fehler. Ich hÄng nochmal die Files unten dran, die geÄnderten Zeilen im PathFinder Skript hab ich mit Sternchen versehen. Falls jemand anders die Dinger nochmal überprüfen will.^^ Pathfinding Scripts.zip
  10. Hans im Gestrüpp

    Teil 3: A* Pathfinder

    Danke das du dir dafür Zeit nimmst Stephan. EDIT: Sorry ich hab die Zeilen einfach so aus deinem obigen Post kopiert. :-/ Dumm von mir.
  11. Hans im Gestrüpp

    Teil 3: A* Pathfinder

    Nur um nochmal sicherzugehen: Die Methode "PathNode(Waypoint wayPoint)" nehm ich nicht nur aus dem Script PathNode raus, sondern ich soll sie komplett entfernen? Wenn ja, dann entsteht nach ändern der oben genannten Zeile mit den Zeilen die du gepostet hast folgender Error. :S EDIT: Der Fehler bezieht sich auf die mit Slashes markierte Zeile: else//Wenn der Wegpunkt nicht in der openList ist { float GValue = currentPathNode.gValue + Vector3.Distance(currentPathNode.waypoint.transform.position, neighbourWaypoints[i].transform.position); float HValue = Vector3.Distance(neighbourWaypoints[i].transform.position, targetWaypoint.transform.position); float FValue = GValue + HValue; PathNode newPathNode = (PathNode)ScriptableObject.CreateInstance<PathNode();/////////////////////////////////////////////////////////////////////// newPathNode.waypoint = neighbourWaypoints[i]; newPathNode.gValue = GValue; newPathNode.hValue = HValue; newPathNode.fValue = FValue; newPathNode.parentPathNode = currentPathNode; openList.Add(newPathNode);
  12. Hans im Gestrüpp

    Teil 3: A* Pathfinder

    Das hab ich auch schon ausprobiert... das verursacht jedoch 34 Fehler wobei ich annehme, das der erste vom Compiler entdeckte Fehler der Grund für alle anderen ist. Der erste Fehler lautet: was sich in dem Pathfinder Skript auf folgende Zeile bezieht: PathNode startField = new PathNode(startWaypoint); ansonsten befindet sich das komplette ErrorLog im Anhang, diesmal ein wenig übersichtlicher danke für die Hilfe Stephan CompilerErrorLog.txt
  13. Hans im Gestrüpp

    Teil 3: A* Pathfinder

    Sorry für die späte Rückmeldung. Vielen Dank für den Tipp Stephan. Ich werd das jetzt gleich mal ausprobieren. EDIT: Jetzt meckert der Compiler wegen dieser Funktion rum: public void PathNode(Waypoint wayPoint) { waypoint = wayPoint; } Wenn ich die Funktion mit in das neue PathNode Skript packe, sagt mir der Compiler natürlich wieder dass die Namen unterschiedlich sein müssen. Wenn ich sie im PathFinder Skript an der Stelle belasse, wo sich zuvor die Klasse PathNode befand hat das 26 Fehler zufolge, die meisten davon CS1061 'er. Die ErrorLog Datei befindet sich im Anhang. CompilerErrorLog.txt
  14. Hans im Gestrüpp

    Teil 3: A* Pathfinder

    Das Problem ist beseitigt. Die beiden Skripte "Waypoint" und "WaypointManager" die ich oben gepostet habe, funktionieren einwandfrei. Sogar mit dem Gridspawning Zusatz, wenn man im Waypoint Skript aus dieser Zeile: public static ArrayList waypointsInRange; das static tilgt, dass ich fälschlicherweise hinzugefügt hatte. Die Zeile muss also so aussehen: public ArrayList waypointsInRange; und im WaypointManager Skript in dieser Zeile: Waypoint.AddNeighbour(neighbour); das W von Waypoints klein schreibt: waypoint.AddNeighbour(neighbour); Ich weiß auch nicht wie ich das sogar nach dem 50. mal drübergucken übersehen konnte. ~.~ Wie dem auch sei. Ich hab mich an die übersetzung des Pathfinder Skripts gemacht. Im Prinzip sieht alles gut aus und wenn man es testet gibt es sogar nur eine einzige Fehlermeldung, aber die hats in sich. Hier erstmal der PathFinder in c#. using UnityEngine; using System.Collections; public class PathFinder : MonoBehaviour { class PathNode { public float fValue = 0; public float gValue = 0; public float hValue = 0; public PathNode parentPathNode; public Waypoint waypoint; public void PathNode(Waypoint wayPoint) { waypoint = wayPoint; } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public static ArrayList GetPath(Waypoint startWaypoint , Waypoint targetWaypoint) { ArrayList openList = new ArrayList(); ArrayList closedList = new ArrayList(); PathNode currentPathNode; PathNode startField = new PathNode(startWaypoint); PathNode targetField = null; ArrayList pathArray; currentPathNode = startField; openList.Add(startField); if(startWaypoint != targetWaypoint) { while(targetField == null && openList.Count > 0) { int index = ReturnPathNodeWithLowestFValue(openList); currentPathNode = openList[index]; openList.RemoveAt(index); closedList.Add(currentPathNode); ArrayList neighbourWaypoints = currentPathNode.waypoint.waypointsInRange; for(int i = 0; i < neighbourWaypoints.Count; i++) { if(!IsInCL(closedList,neighbourWaypoints[i]))//Wenn der Wegpunkt nicht in der closedList ist { int indexInOL = IsInOL(openList,neighbourWaypoints[i]); if(indexInOL >= 0)//Wenn der Wegpunkt in der openList ist { float newGValue = currentPathNode.gValue + Vector3.Distance(currentPathNode.waypoint.transform.position,openList[indexInOL].waypoint.transform.position); if(newGValue < openList[indexInOL].gValue) { openList[indexInOL].parentPathNode = currentPathNode; openList[indexInOL].gValue = newGValue; openList[indexInOL].fValue = (newGValue + openList[indexInOL].hValue); } } else//Wenn der Wegpunkt nicht in der openList ist { float GValue = currentPathNode.gValue + Vector3.Distance(currentPathNode.waypoint.transform.position, neighbourWaypoints[i].transform.position); float HValue = Vector3.Distance(neighbourWaypoints[i].transform.position, targetWaypoint.transform.position); float FValue = GValue + HValue; PathNode newPathNode = new PathNode(neighbourWaypoints[i]); newPathNode.gValue = GValue; newPathNode.hValue = HValue; newPathNode.fValue = FValue; newPathNode.parentPathNode = currentPathNode; openList.Add(newPathNode); if(newPathNode.waypoint == targetWaypoint) { targetField = newPathNode; pathArray = ReturnPath(startField,targetField); break; } }//else }//if }//for }//while } return pathArray; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public static bool IsInCL(ArrayList closedL, Waypoint wayPoint) { bool isIn = false; for(int i = 0;i<closedL.Count;i++) { if(closedL[i].waypoint == wayPoint) { isIn = true; break; } } return isIn; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// public static int IsInOL(ArrayList openL, Waypoint wayPoint) { int index = -1; for(int i = 0; i<openL.Count; i++) { if(openL[i].waypoint == wayPoint) { index = i; break; } } return index; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public static int ReturnPathNodeWithLowestFValue(ArrayList openL) { PathNode pathNode = null; int index = -1; if(openL.Count >0) { for(int i = 0; i < openL.Count; i++) { if(index == -1) { pathNode = openL[i]; index = i; } else if(pathNode.fValue > openL[i].fValue) { pathNode = openL[i]; index = i; } } } return index; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public static ArrayList ReturnPath(PathNode startField, PathNode targetField) { ArrayList pathArray = new ArrayList(); PathNode currentPathNode = targetField; while(currentPathNode != startField) { pathArray.Add(currentPathNode.waypoint); currentPathNode = currentPathNode.parentPathNode; } pathArray.Reverse(); return pathArray; } } Folgender Fehler wird beim kompilieren dieses Skripts verursacht: 1. Entweder muss bei "class PathNode" oder "public void PathNode" der Name geändert werden was dazu führt, dass man sich durch den Rest des Codes durchklamüsern muss um alle andern "PathNode"'s zu ändern, was ich nicht hinbekomme, da ich die Klasse "PathNode" und die Funktion "PathNode" nicht auseinanderhalten kann. Oder 2. man entfernt bei "public void PathNode" einfach das void, was aber auch irgendwie nicht in Frage kommt, da das diesen Fehler zur Folge hat: Das führt somit auch nirgens hin. :S Also ich brauch jetzt erstmal ne Asperin gegen die Kopfschmerzen die mir dieses Skript beschert. Falls ich Fortschritte mache meld ich mich, falls mich vorher jemand erleuchtet, um so besser.
  15. Hans im Gestrüpp

    Teil 3: A* Pathfinder

    Also. Bei der Methode mit manuell platzierten Wegpunkten (6 stk. während des Testlaufs) ist Waypoint.Waypoints.Count = 6. Also scheint damit alles in Ordnung zu sein, bis auf das Problem natürlich, dass jeder Wegpunkt mit jedem anderen verbunden wird. Bei der Methode wo das Grid aus prefabs gespawned wird, ist Waypoint.Waypoints.Count = 0. Bei beiden Methoden sind die Wegpunkte ziemlich genau 1 Einheit voneinander entfernt. deltaL war beim Testen ungefähr 1.8f und maxDistanceBetweenWaypoints war 2.0f. Mein Scripting-Verständnis reicht leider noch nicht ganz aus, um das Problem selbstständig zu beheben. Ich werde wohl noch ein wenig debuggen und bescheidgeben wenn ich irgendwas Nennenswertes rausfinde. @Stephan: Das ist das Seltsame. Wenn ich maxDistanceBetweenWaypoints übertrieben runterschraube z.B auf 0.1f wird nichts verbunden. Logisch. Aber sobald ich in 0.1 Schritten die richtige Distanz zu finden versuche, ist bei 1.1f nichts verbunden und bei 1.2f sind wieder alle mit jedem verbunden... wobei dieser 0.1f Unterschied doch eigentlich nicht so viel ausmachen sollte, immerhin ist die Distanz zwischen all den Wegpunten 1.0f bis 2.0f. :-/ EDIT: Auf diesem Bild beträgt die Distanz zwischen den 9er Grids ca. 5 Einheiten. Der Abstand zwischen den einzelnen Wegpunkten pro Grid beträgt genau 1 Einheit. maxDistanceBetweenWaypoints habe ich auf 2.0f eingestellt. Das grüne Hindernis inklusive BoxCollider, welcher kein Trigger ist, unterbricht die GizmoLines/Rays nicht (weder zur Laufzeit noch im Editor). Das ist alles sehr mystisch. ... Hat jemand eine Idee wo das Problem liegen könnte? EDIT2: Ich hab das Problem mittlerweile etwas mehr eingegrenzt: Zunächstmal hab ich 2 Versionen des Wegpunktesystems nebeneinandergepackt(C# + Java). Im Gegensatz zur C# Version läuft die Java Version des Wegpunktsystems wie erwartet reibungslos. Da ich die Skripte der C# Version mit Debug.Logs zugeballert hab, lässt sich Folgendes mit Sicherheit sagen: Der Inhalt von "if(!hits.collider.isTrigger)" wird niemals ausgeführt. Darüber hinaus werden die GizmoLines in der C# Version nach einmaligem Spielstart auch im Editor angezeigt wenn das Spiel beendet wird und verschwinden erst nach erneutem Kompilieren. Bei der Java Version sind die GizmoLines ausschließlich zur Laufzeit sichtbar. Sagen tut mir das jedoch nichts. Im übrigen sind die Transform-Attribute der Wegpunkte und alle anderen Einstellungen identisch mit denen der Java Version (die selben wie im 2. Tutorial). Ich hoffe immernoch dass mir jemand helfen kann das ganze in C# auf die Reihe zu kriegen. Ich werd dann mal weiterschauen...
×