Jump to content
Unity Insider Forum

Raycast Hit Point verschoben (gelöst)


Jomnitech

Recommended Posts

Hallo Zusammen

Habe ein kleines Problem mit einem Raycast, und zwar scheint es so als ob der Impact Point sich verzieht wenn ich ein Objekt treffe. Komm gerade nicht drauf wo der Fehler liegt, ev. kann mir jemand helfen?

Script sieht wie folgt aus:

    void Shoot()
    {

        IsShooting = true;
        Debug.Log("shoot");
        //Substract Ammo
        currentAmmo--;
        //

        RaycastHit hit;

        for (int i = 0; i < MultiBullets; i++)
        {
            currentBullets++;

            // Weapon Scattering / Waffenstreuung
            //transform.localEulerAngles = new Vector3(0, 0, Random.Range(-WScattering, WScattering));

            if (Physics.Raycast(transform.position, transform.right, out hit, range,layer_mask))
            {
            
                    Debug.Log(hit.transform.name);
                    CharacterStats target = hit.transform.GetComponent<CharacterStats>();

                    if (target != null)
                    { 
                    _finalDamage = Mathf.Abs( Random.Range(_minDamage, damage)+(damage*.01f* pStats.rangeDamage.GetValue()));

                    target.TakeDamage(_finalDamage);
                    }

                    //Tracer Effect
                    GameObject tracerGO = Instantiate(TracerEffect, effectSpawner.transform.position, transform.rotation);

                    TracerTarget effect = tracerGO.GetComponent<TracerTarget>();
                    effect.startMarker = effectSpawner.transform.position;
                    effect.endMarker = hit.point;

                    Destroy(tracerGO, 3f);

                    if(hit.transform.tag == "Enemy")
                    {
                        //Blood Effect
                        GameObject bloodGO = Instantiate(bloodEffect, hit.point, Quaternion.LookRotation(hit.normal));
              
                    }
                    else
                    {
                        //Impact Effect
                        GameObject impactGO = Instantiate(impactEffect, hit.point, Quaternion.LookRotation(hit.normal));
                        EasyDecal decal = EasyDecal.ProjectAt(bulletHole.gameObject, hit.collider.gameObject, hit.point, hit.normal);
                    }
            }
            else
            {
            print("noHit");
                //Tracer Effect
                GameObject tracerGO = Instantiate(TracerEffect, effectSpawner.transform.position, transform.rotation);
                TracerTarget effect = tracerGO.GetComponent<TracerTarget>();
                effect.startMarker = effectSpawner.transform.position;
                effect.endMarker = effectSpawner.transform.position + transform.right * range;
                Destroy(tracerGO, 3f);
            }
            
            //Add Force to hit Object
            if (hit.rigidbody != null)
            {
                hit.rigidbody.AddForce(-hit.normal * impactForce);

            }

        }
        if (currentBullets >= MultiBullets)
        {
            currentBullets = 0;
        }
  
    }

Fehler sieht so aus:
Links: Ich schiesse am Objekt vorbei, Raycast ist gerade (so wie es sein soll)
Rechts: Ich schiesse auf das Objekt, Raycast hit.point ist weiter unten.

raycast.thumb.png.4fea7cf590c7e05365bd8f08f0882059.png

Edit:

Ev. noch anzumerken dass ich vorher transform.forward statt transform.right erwendet habe und da ist es mir nie aufgefallen, doch da ich jetzt die Waffen überarbeitet habe, habe ich das so angepasst, müsste aber doch trotzdem gehen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es braucht immer mindestens einen RB um eine Kollision zu erkennen. Sind Projektile oder halt Objekte zu schnell, kann es sein das der Trigger nicht ausgelöst wird, da die Abfrage ob es zu einer Kollision kommt nicht permanent läuft. Frag mich jetzt aber nicht in welchem Zeitintervall, den kenne ich leider nicht. Du müsstest halt wie thewhiteshadow schon sagte beim RB die Detection auf continuierlich einstellen, damit dauerhaft kontrolliert wird, ob eine Kollision stattfindet.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Was sind denn das für Aussagen hier? Ein Raycast ist absolut ausreichend, um einen Schuss zu simulieren, und entsprechend ist hier kein Rigidbody im Spiel.

Am Code kann ich soweit gerade nichts erkennen. Was mich etwas wundert ist, dass du 3D-Physik für etwas benutzt, was mir wir ein reines 2D-Spiel aussieht. Hast du mal von oben geschaut, ob der Schuss vielleicht einfach nur etwas von der Kamera weggeht? Ansonsten erstmal OnDrawGizmos rauskramen und die ganzen relevanten Positionen anzeigen lassen.

Kann es alternativ sein, dass du einen LineRenderer benutzt und in deinem TracerTarget-Script world space und local space durcheinander kommen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Sascha

vor 18 Stunden schrieb Sascha:

was mir wir ein reines 2D-Spiel aussieht

Habe ich nur gemacht damit es etwas ersichtlicher ist was ich meine, ist ansonsten schon ein 3d Game.

vor 18 Stunden schrieb Sascha:

Ansonsten erstmal OnDrawGizmos rauskramen und die ganzen relevanten Positionen anzeigen lassen.

Hat mir sehr weitergeholfen. War ein Denkfehler von mir, da der Raycast ja immer von der 0 Position aus startet. Ich bin irgendwie davon ausgegangen, dass bei Transform right der Raycast auch von der rechten Seite aus startet, weiss auch nicht warum 🙃.

Wie dem auch sein, als transform Referenz die Mündung statt die Waffe selbst gewählt und voilà, alles so wie es sein soll.

Vielen Dank für deine Hilfe

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...