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.
Görev
OrtaAşağıdaki kamerayı Space tuşuna basınca salla.
Vector3 shake;alanını ekle veLateUpdate()içindetransform.position = player.position + offset + shake;ayarını yap.Shake()içinde,elapsed < durationkoşulu sağlandığı sürece:shake = Random.insideUnitSphere * strength;değerini ata,Time.deltaTimedeğerinielapseddeğişkenine ekle veyield return null;ifadesini kullan.- 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
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 DuvarKendi başına pratik yap: Unity playground