KaBau Geschrieben 6. Juni 2019 Melden Share Geschrieben 6. Juni 2019 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 More sharing options...
Jomnitech Geschrieben 6. Juni 2019 Melden Share Geschrieben 6. Juni 2019 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. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
KaBau Geschrieben 9. Juni 2019 Autor Melden Share Geschrieben 9. Juni 2019 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 More sharing options...
Jomnitech Geschrieben 9. Juni 2019 Melden Share Geschrieben 9. Juni 2019 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. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
KaBau Geschrieben 10. Juni 2019 Autor Melden Share Geschrieben 10. Juni 2019 Mit den Parameter StartCoroutine(cameraShake.CamShake(.3f, .4f, 4)); sieht es nun so aus: cameraShake.mp4 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Jomnitech Geschrieben 10. Juni 2019 Melden Share Geschrieben 10. Juni 2019 Sieht gut aus🖕 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.