Menu
CoddyTech

Guncangan Kamera

Termasuk bagian Fisika dan Gameplay dalam perjalanan Unity di Coddy. Pelajaran 50 dari 71.

Guncangan adalah pergerakan acak singkat: selama beberapa persepuluh detik, kamera berada di posisi acak dekat posisi diamnya, dengan posisi baru di setiap frame, lalu kembali. Coroutine cocok digunakan karena berjalan selama beberapa frame dan berhenti dengan sendirinya. Kamera ini berguncang saat sebuah batu besar mendarat (skrip lain memanggil BoulderLanded(); file ini diawali dengan using System.Collections; untuk IEnumerator):

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 adalah pergeseran acak dengan panjang hingga strength ke arah mana pun, dan yield return null memilih pergeseran baru pada frame berikutnya. Menambahkan Time.deltaTime di setiap iterasi akan menghitung detik sebenarnya, sehingga guncangan berlangsung selama duration pada laju frame berapa pun. Baris terakhir mengembalikan kamera ke posisi semula; tanpa baris itu, kamera akan tetap di posisi terakhir akibat pergeseran tersebut.

Pada setiap frame, Unity menjalankan setiap Update(), lalu coroutine yang menunggu pada yield return null, kemudian setiap LateUpdate(). Jadi, kamera yang mengikuti objek dan mengatur posisinya di LateUpdate() akan menimpa perubahan akibat guncangan. Mengguncang localPosition menghindari masalah ini saat kamera menjadi child dari objek kosong yang melakukan gerakan mengikuti objek: parent bergerak, sementara kamera berguncang di sekitar posisinya di bawah parent.

challenge icon

Tantangan

Sedang

Buat kamera berikut berguncang saat kamu menekan Space.

  1. Tambahkan field Vector3 shake;, lalu di LateUpdate(), atur transform.position = player.position + offset + shake;.
  2. Di Shake(), selama elapsed < duration: shake = Random.insideUnitSphere * strength;, tambahkan Time.deltaTime ke elapsed, lalu yield return null;.
  3. Setelah perulangan, atur shake = Vector3.zero;.

Tekan tombol “Main”, jalankan permainan dan tekan Space: tampilan berguncang saat kamera mengikuti pemain. Lalu tekan tombol “Periksa”.

Coba sendiri

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()
    {
        // Goyangkan kamera selama duration detik, maksimal sejauh strength dari posisi saat mengikuti.
        yield return null;
    }
}

Semua pelajaran di Fisika dan Gameplay

Latihan sendiri: Playground Unity