Menu
CoddyTech

카메라 흔들림

Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 63개 중 48번째.

흔들림은 짧은 무작위 오프셋의 연속입니다. 몇 분의 1초 동안 카메라는 원래 위치 근처의 무작위 지점에 머물며, 매 프레임마다 새로운 지점을 선택한 뒤 원래 위치로 돌아갑니다. 여러 프레임에 걸쳐 실행되고 저절로 끝나는 코루틴이 적합합니다. 이 카메라는 바위가 착지할 때 흔들립니다(다른 스크립트에서 BoulderLanded()를 호출하며, 파일 맨 앞에는 IEnumerator를 사용하기 위해 using System.Collections;가 있습니다).

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는 어느 방향으로든 최대 길이가 strength인 무작위 오프셋이며, yield return null은 다음 프레임에 새로운 오프셋을 선택합니다. 매번 Time.deltaTime을 더하면 실제 시간이 계산되므로, 프레임 속도와 관계없이 흔들림은 duration 동안 지속됩니다. 마지막 줄은 카메라를 원래 위치로 되돌립니다. 이 줄이 없으면 카메라는 마지막 오프셋이 남긴 위치에 그대로 머뭅니다.

각 프레임마다 Unity는 모든 Update()를 실행한 다음, yield return null을 기다리는 코루틴을 실행하고, 그다음 모든 LateUpdate()를 실행합니다. 따라서 LateUpdate()에서 위치를 설정하는 추적 카메라는 흔들림이 적용한 값을 덮어씁니다. 카메라가 추적을 담당하는 빈 오브젝트의 자식이면 localPosition을 흔들어 이 문제를 피할 수 있습니다. 부모 오브젝트가 움직이고 카메라는 그 아래에서 자기 위치를 중심으로 흔들립니다.

challenge icon

챌린지

중급

이 카메라는 플레이어를 따라갑니다(화살표로 움직입니다). LateUpdate()에서 플레이어의 위치에 offset을 더한 위치에 있으며, 어떤 것의 자식도 아닙니다. 카메라가 플레이어를 따라가는 동안 작동하는 흔들림 효과를 적용하세요:

  • Space를 누르면 카메라가 duration(0.4)초 동안 흔들립니다. 흔들리는 동안 매 프레임마다 카메라가 플레이어를 따라가는 위치를 기준으로 최대 strength(0.3)만큼 떨어진 새로운 무작위 위치에 놓이면서, 플레이어를 계속 따라갑니다.
  • 흔들림이 끝나면 카메라는 따라가는 위치로 정확히 돌아옵니다.

Space를 누르면 이미 Shake() 코루틴이 시작됩니다. Play를 누르고, 움직이며 Space를 누른 다음 Check를 누르세요.

직접 해보기

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()
    {
        // 카메라가 따라가는 위치를 기준으로 duration초 동안 최대 strength만큼 흔듭니다.
        yield return null;
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

물리와 게임플레이의 모든 레슨