Jump to content
Unity Insider Forum

Objektspawn auf Terrain mit Heightmap fehlerhaft (mit Raycast Hit)


Elharter

Recommended Posts

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

 

 

Capture.JPG

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

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 !?!?!?!

lol1.JPG

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

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

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...