Jump to content
Unity Insider Forum

Gewoltes Zittern / Ruckeln / Wackeln erzeugen


KaBau

Recommended Posts

Hi,
ich möchte gerne, dass bei einem Treffer meines Player die Camera etwas zittert. Bevor ich mich auf einem komplett falschen Weg begebe: Ich stelle mir vor, dass ich mit "Mathf.PingPong" die Bewegung ermittle und mit einer zweiten "Mathf" Berechnung die "float length" (gemäß https://docs.unity3d.com/ScriptReference/Mathf.PingPong.html ) verändere um diese auf "0" zu bekommen. Ob ich nun mit "Mathf.Lerp" oder "Mathf.SmothStep" oder einer anderen Berechnung arbeite werde ich noch testen. Meine Fragen hierzu:

1: kann bzw. darf ich überhaupt mit einer "Mathf" Berechnung in eine andere "Mathf" Berechnung eingreifen?
2: gibt es eventuell einen eleganteren Weg um ein Zittern zu erstellen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Geschafft:
Das von @Jomnitech genannte Tutorial hat mich auf dem richtigen Weg gebracht. Ich habe nicht wie am Ende vorgeschlagen das Asset verwendet, sondern lieber etwas eigenes programmiert (da weis ich besser, was in meinem Spiel passiert). Wer das Video nicht gesehen hat: Die Camera wurde einen EmtyGame Objet "CameraHolder" untergeordnet. Somit kann ich dieses unabhängig von der Camera bewegen (welche ein eigenes Bewegungsscript hat).

In meinem "PlyHealth.cs" Script habe ich folgenes eingebaut:
Am Anfang:

public CameraShake cameraShake;

und in dem Abschnitt, welcher prüft, ob der Player getroffen wurde:

 bool shakeYes = cameraShake.cameraHolderShakeYes;
        if (!shakeYes)
        {
            StartCoroutine(cameraShake.CamShake(.2f, .5f, 4)); // Wackeln der Camera mit Script CameraShake.cs
        }

Im Inspektor habe ich dann die entsprechende Zuweisung zum "CameraHolder" erstellt.

Das "CameraHolder" Objekt hat folgendes Script:

public class CameraShake : MonoBehaviour
{
    public bool cameraHolderShakeYes = false; //Script PlyHealth.cs greift hierrauf zu
    Vector3 cameraHolderPos;

    private void FixedUpdate()
    {
        if (cameraHolderShakeYes)
        {
            transform.position = cameraHolderPos;
        }
    }

    // wird im Script PlyHealth.cs gestartet
    public IEnumerator CamShake(float duration, float magnitude, int steps)
    {
        cameraHolderShakeYes = true;

        Vector3 originalPos = new Vector3 (0,0,0);
        int shakeSteps = steps - 1;
        float stepDuration = duration / steps;
        float startCamHolderX = transform.position.x;
        float startCamHolderZ = transform.position.z;
        float targetCamHolderX;
        float targetCamHolderZ;

        for (int i = 1; i <= shakeSteps; i++)
        {
            targetCamHolderX = Random.Range(-1f, 1f) * magnitude;
            targetCamHolderZ = Random.Range(-1f, 1f) * magnitude;

            for (var time = 0.0f; time < stepDuration; time += Time.deltaTime)
            {
                var progress = time / stepDuration;
                cameraHolderPos.x = Mathf.Lerp(startCamHolderX, targetCamHolderX, progress);
                cameraHolderPos.z = Mathf.Lerp(startCamHolderZ, targetCamHolderZ, progress);
                yield return null;
            }

            startCamHolderX = targetCamHolderX;
            startCamHolderZ = targetCamHolderZ;
            magnitude *= 0.6f;
            yield return null;
        }


        float lastStepDuration = stepDuration + 0.1f;
        for (var time = 0.0f; time < lastStepDuration; time += Time.deltaTime)
        {
            var progress = time / stepDuration;
            cameraHolderPos.x = Mathf.SmoothStep(startCamHolderX, originalPos.x, progress);
            cameraHolderPos.z = Mathf.SmoothStep(startCamHolderZ, originalPos.z, progress);
            yield return null;
        }

        cameraHolderShakeYes = false;
    }

Einige Anmerkungen:
- die Variable "magnitude" reduziere ich zwischenzeitlich um einen sanfteren Auslauf des Effekt zu bekommen.
- Vor der letzten Schleife habe ich die "stepDuration" für diesen Durchgang mit der Variablen "lastStepDuration" erhöht, da die Endposition 0,0,0 nie richtig eingenommen wurde.
- ich habe es mit "Mathf.Lerp" und "Mathf.SmoothStep" probiert. Auch wenn der Unterschied minimal ist gefällt mir letzteres besser.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...