Menu
CoddyTech

Kamera Sarsıntısı

Coddy'nin Unity Journey'sinin Fizik ve Oynanış bölümünün bir parçası. Ders 48 / 63.

Bir sarsıntı, rastgele konum değişikliklerinin kısa süreli bir dizisidir: saniyenin birkaç onda biri boyunca kamera dinlenme konumunun yakınında rastgele bir noktada durur; her karede yeni bir nokta belirlenir ve sonra kamera eski konumuna döner. Bir coroutine uygundur, çünkü birkaç kare boyunca çalışır ve kendiliğinden sona erer. Bu kamera, bir kaya indiğinde sarsılır (başka bir betik BoulderLanded() çağırır; dosya, IEnumerator için using System.Collections; ile başlar):

public float strength = 0.2f;
public float duration = 0.4f;
Vector3 rest;

void Start()
{
    rest = transform.localPosition;
}

public void BoulderLanded()
{
    StartCoroutine(Shake());
}

IEnumerator Shake()
{
    float elapsed = 0f;
    while (elapsed < duration)
    {
        transform.localPosition = rest + Random.insideUnitSphere * strength;
        elapsed += Time.deltaTime;
        yield return null;
    }
    transform.localPosition = rest;
}

Random.insideUnitSphere * strength, herhangi bir yönde en fazla strength uzunluğunda rastgele bir konum değişikliği oluşturur ve yield return null bir sonraki karede yenisini seçer. Her geçişte Time.deltaTime eklemek gerçek saniyeleri sayar; böylece sarsıntı, kare hızından bağımsız olarak duration kadar sürer. Son satır kamerayı geri getirir; bu satır olmasaydı kamera son konum değişikliğinin bıraktığı yerde kalırdı.

Her karede Unity önce tüm Update() yöntemlerini, sonra yield return null bekleyen coroutine'leri, ardından tüm LateUpdate() yöntemlerini çalıştırır. Bu nedenle, konumunu LateUpdate() içinde ayarlayan bir takip kamerası, sarsıntının yaptığı değişikliği geçersiz kılar. Kamera, takip işini yapan boş bir nesnenin alt öğesiyse localPosition değerini sarsmak bu sorunu önler: üst nesne hareket eder ve kamera da onun altındaki konumu çevresinde sarsılır.

challenge icon

Görev

Orta

Bu kamera oyuncuyu takip eder (ok tuşları kamerayı hareket ettirir): LateUpdate() içinde oyuncunun konumuna offset eklenmiş konumda bulunur ve hiçbir şeyin çocuğu değildir. Takip ederken çalışacak şekilde kamerayı salla:

  • Space tuşu kamerayı duration (0.4) saniye boyunca sallar. Sallanmanın her karesinde kamera, oyuncuyu takip ettiği konumu korurken bu konumdan en fazla strength (0.3) uzaklıkta yeni bir rastgele noktaya gider.
  • Sallanma sona erdiğinde, kamera tam olarak takip konumuna geri döner.

Space tuşu Shake() coroutine'ini zaten başlatıyor. Play'e bas, hareket et ve Space tuşuna bas, ardından Check'e bas.

Kendin dene

using System.Collections;
using UnityEngine;

public class ShakeFollow : MonoBehaviour
{
    public Transform player;
    public Vector3 offset = new Vector3(0, 4, -8);
    public float strength = 0.3f;
    public float duration = 0.4f;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(Shake());
        }
    }

    void LateUpdate()
    {
        transform.position = player.position + offset;
    }

    IEnumerator Shake()
    {
        // Kamerayı takip konumundan en fazla strength kadar uzaklaştırarak duration saniye boyunca salla.
        yield return null;
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Fizik ve Oynanış bölümündeki tüm dersler