Menu
CoddyTech

Kamera Sarsıntısı

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

Sarsıntı, rastgele ofsetlerin kısa süreli bir akışıdır: saniyenin birkaç onda biri boyunca kamera, dinlenme konumunun yakınındaki rastgele bir noktada kalır; her karede yeni bir noktaya geçer ve sonra geri döner. Coroutine kullanıma uygundur, çünkü birkaç kare boyunca çalışır ve kendi kendine sona erer. Bu kamera, bir kaya yere düştüğünde 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 uzunluğu en fazla strength olan rastgele bir ofsettir 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ı ne olursa olsun duration kadar sürer. Son satır kamerayı geri döndürür; bu satır olmazsa kamera, son ofsetin bıraktığı yerde kalır.

Unity her karede önce tüm Update() işlevlerini, ardından yield return null bekleyen coroutine'leri ve son olarak tüm LateUpdate() işlevlerini çalıştırır. Bu nedenle konumunu LateUpdate() içinde ayarlayan bir takip kamerası, sarsıntının yaptığı değişikliğin üzerine yazar. Kameranın, takip işini yapan boş bir nesnenin çocuğu olduğu durumda localPosition değerini sarsmak bu sorunu önler: üst nesne hareket eder, kamera da onun altındaki konumunun çevresinde sarsılır.

challenge icon

Görev

Orta

Aşağıdaki kamerayı Space tuşuna basınca salla.

  1. Vector3 shake; alanını ekle ve LateUpdate() içinde transform.position = player.position + offset + shake; ayarını yap.
  2. Shake() içinde, elapsed < duration koşulu sağlandığı sürece: shake = Random.insideUnitSphere * strength; değerini ata, Time.deltaTime değerini elapsed değişkenine ekle ve yield return null; ifadesini kullan.
  3. Döngüden sonra shake = Vector3.zero; ayarını yap.

“Oyna” düğmesine bas, oyunu çalıştır ve Space tuşuna bas: kamera takip ederken görüntü sarsılır. Ardından “Kontrol et” düğmesine 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şacak şekilde duration saniye boyunca salla.
        yield return null;
    }
}

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

Kendi başına pratik yap: Unity playground