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.
Görev
OrtaBu 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 fazlastrength(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;
}
}
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
1Rigidbody
Yerçekimi ve KütleAddForce ile İtmeDürtüyle ZıplamaFizik için FixedUpdateHızKinematik CisimlerTekrar: Fırlatma Rampası2Çarpışmalar
OnCollisionEnterNeye Çarptım?Çarpınca KırılYerde DurmakSekme ve SürtünmeCollider ŞekilleriTekrar: Kırılabilir Duvar