Menu
CoddyTech

Guncangan Kamera

Termasuk bagian Fisika dan Gameplay dalam perjalanan Unity di Coddy. Pelajaran 48 dari 63.

Guncangan adalah rangkaian singkat offset acak: selama beberapa persepuluh detik, kamera berada di titik acak dekat posisi istirahatnya, titik baru dipilih pada setiap frame, lalu kamera kembali. Coroutine cocok untuk ini karena berjalan selama beberapa frame dan berakhir dengan sendirinya. Kamera ini berguncang saat sebuah batu besar mendarat (skrip lain memanggil BoulderLanded(); file 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 menghasilkan offset acak dengan panjang hingga strength ke segala arah, dan yield return null memilih offset baru pada frame berikutnya. Menambahkan Time.deltaTime pada setiap iterasi menghitung detik sebenarnya, sehingga guncangan berlangsung selama duration pada frame rate apa pun. Baris terakhir mengembalikan kamera ke posisi semula; tanpa baris itu, kamera tetap berada di posisi yang ditentukan oleh offset terakhir.

Pada setiap frame, Unity menjalankan setiap Update(), lalu coroutine yang menunggu pada yield return null, kemudian setiap LateUpdate(). Jadi, kamera yang mengikuti objek dan menetapkan posisinya di LateUpdate() akan menimpa apa pun yang dilakukan oleh guncangan. Mengguncang localPosition menghindari hal ini ketika kamera menjadi child dari object kosong yang melakukan gerakan mengikuti objek: parent bergerak, sementara kamera berguncang di sekitarnya.

challenge icon

Tantangan

Sedang

Kamera ini mengikuti pemain (panah menggerakkannya): di LateUpdate() kamera berada di posisi pemain ditambah offset, dan kamera bukan child dari apa pun. Buat kamera berguncang sambil tetap mengikuti pemain:

  • Space membuat kamera berguncang selama duration (0.4) detik. Pada setiap frame selama guncangan, kamera berada di lokasi acak baru dengan jarak hingga strength (0.3) dari posisi ikutan, sambil tetap mengikuti pemain.
  • Saat guncangan berakhir, kamera kembali tepat ke posisi ikutannya.

Space sudah memulai coroutine Shake(). Tekan Play, bergeraklah lalu tekan Space, kemudian tekan Check.

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, hingga sejauh strength dari posisi kamera saat mengikuti player.
        yield return null;
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Fisika dan Gameplay