Jump to content
Unity Insider Forum
KaBau

Gewoltes Zittern / Ruckeln / Wackeln erzeugen

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?

Share this post


Link to post
Share on other sites

Habe hierzu vor einer weile mal ein tut gesehen. Aber auch hier wird am Ende empfohlen ein bereits Existierendes Asset zu verwenden(kann man sich auf github runterladen), scheint also nicht so einfach zu sein einen sauberen Cam-Shake hinzubekommen.

 

  • Like 1

Share this post


Link to post
Share on other sites

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.

  • Like 1

Share this post


Link to post
Share on other sites

Freut mich das es dir geholfen hat. Das ist eben das schöne an Tutorials, man kann mitschreiben und gleich seine eigenen Ideen mit einfliessen lassen, statt einfach nur copy and paste von bereits vorhandenen Skripts.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...