Elharter Geschrieben 15. Februar 2018 Melden Share Geschrieben 15. Februar 2018 Hallo, irgendwas hats in meinem Code und ich finde den Fehler nicht... ich instanziere diverse Objekte per Script. Davor erstelle ich ein Terrain. void CreateTrackObject(GameObject prefab, float x_clamped, float y_clamped, float rotation, bool TerrainRotation, float worldSize, string tagdecl) { GameObject trackObject = Instantiate(prefab, new Vector3(x_clamped, 50, y_clamped), Quaternion.identity); trackObject.transform.parent = trackobjectsParent.transform; trackObject.tag = tagdecl; RaycastHit hit; float distanceToGround = 0; if (Physics.Raycast(trackObject.transform.position, Vector3.down, out hit)) { distanceToGround = hit.distance; Vector3 incomingVec = hit.point - trackObject.transform.position; Vector3 reflectVec = Vector3.Reflect(incomingVec, hit.normal); Debug.DrawLine(trackObject.transform.position, hit.point, Color.red, 30, false); //show-spawn line Debug.DrawRay(hit.point, reflectVec, Color.green, 30, false); //show reflection-line trackObject.transform.position = hit.point; if (TerrainRotation == true) { trackObject.transform.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal); } } //maybe this line should be moved to a higher line-position after rayhasthit hit trackObject.transform.localEulerAngles = new Vector3(0, rotation, 0); } An sich funktioniert das soweit ganz gut....aber in manchen Fällen fliegen die Objekte in der Luft obwohl NICHTS in der Nähe ist was kollidieren kann. Siehe Foto. Woran kann das liegen? Ich habe auch schon versucht Objekten den Layer "IgnoreRaycast" zu geben um zu verhindern das sich die gegenseitig im Weg sind -> hilft nix. lg Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 15. Februar 2018 Melden Share Geschrieben 15. Februar 2018 Lass dir mal ausgeben, was du genau triffst: print(hit.transform.gameObject) Ich vermute, dein Ray trifft ein anderes Objekt und nicht den Boden. Wenn das stimmt, dann würde ich dem Boden ein Layer (="Ground") verpassen und so den Layer für den Raycast setzen: LayerMask groundLayer = LayerMask.GetMask("Ground"); if (Physics.Raycast(trackObject.transform.position, Vector3.down, out hit,100, groundLayer.value)) Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Elharter Geschrieben 15. Februar 2018 Autor Melden Share Geschrieben 15. Februar 2018 okay....das bringt erleuchtung...aber ich bin noch verwirrter als vorher: Wirft: Object Booth_Prefab (UnityEngine.GameObject)/ hitted:StandNew(Clone) (UnityEngine.GameObject) .... Booth = sind diese Hütten StandNew sind die Tribünen... wtf die sind nicht mal irgendwie in der Nähe !?!?!?! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Elharter Geschrieben 15. Februar 2018 Autor Melden Share Geschrieben 15. Februar 2018 Okay noch besser eingegrenzt mit: if (Physics.Raycast(trackObject.transform.position, Vector3.down, out hit)) { distanceToGround = hit.distance; Vector3 incomingVec = hit.point - trackObject.transform.position; Vector3 reflectVec = Vector3.Reflect(incomingVec, hit.normal); Debug.DrawLine(trackObject.transform.position, hit.point, Color.red, 30, false); //show-spawn line Debug.DrawRay(hit.point, reflectVec, Color.green, 30, false); //show reflection-line if (!hit.transform.gameObject.name.Contains("Terrain")) { Debug.DrawLine(trackObject.transform.position, hit.point, Color.yellow, 60, false); //show line if the object didnt hit terrain Debug.Log("Object " + prefab + "/ hitted:" + hit.transform.gameObject); } trackObject.transform.position = hit.point; if (TerrainRotation == true) { trackObject.transform.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal); } } dH ich sehe wenn ein Objekt NICHT auf dem Terrain hitted.... ich krieg ne gelbe Linie und einen Debug.Log raus... Ergebnis1: Object StandNew (UnityEngine.GameObject)/ hitted:StandNew(Clone) (UnityEngine.GameObject) Die Tribüne hitted sich selbst..... toll. Ergebnis2 eine Barriere hittet ein Objekt das gar nicht auf der Map existiert...... meine Vermutung also: beim reload des Tracks sind "alte" Objekte noch kurz vorhanden. Vor jedem Track-Load cleare ich alle vorhergehenden Trackobjekte mit: //clear existing Trackobjects foreach (Transform child in trackobjectsParent.transform) { GameObject.Destroy(child.gameObject); } Offensichtlich dauert das zu lange... Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Elharter Geschrieben 15. Februar 2018 Autor Melden Share Geschrieben 15. Februar 2018 Ok .... gelöst und erledigt. Ich setze einfach für alle Trackobjekte > trackObject.layer = 2; // set Ignore Raycast Layer Somit stehen sich alle Objekte nicht mehr gegenseitig im Weg herum. Auch wenn noch ein paar alte (nicht zerstörte Objekte) beim Ladevorgang vorhanden sind. Yeah - danke Zer0 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 15. Februar 2018 Melden Share Geschrieben 15. Februar 2018 Sieht langsam immer besser aus deine Map, wenn du Gras brauchst Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.