반응형
보통 카메라 흔드는 기능에 대해 구글링을 해보면 Random.insideUnitCircle이나 Sphere로 카메라를 흔드는 코드를 많이 볼 수 있었다. 그런데 이런식으로 구성을하면 끊기면서 흔들리는(?) 느낌이 강하게 들어서 좀 더 찾아보니 관련된 에셋이 몇개 있었는데 받아서 뜯어보니 Mathf.PerlinNoise라는 노이즈 함수를 이용해서 카메라를 흔드는것을 봤다.
에셋에서는 위치 및 회전값까지 변경해서 건드리고있었는데, 회전값까지 변경하는 코드는 카메라 흔들림이 너무 정신없어서 전부 빼고 x, y 좌표만 변경하는 방법으로 코드를 바꿨다.
※ Perlin noise (펄린노이즈)
- 단계적 텍스처를 만들기 위해 개발된 노이즈 함수, 지형(마인크래프트 등)을 생성할 때 이용한다고한다.
코드
using System.Collections;
using UnityEngine;
public class CamShake : MonoBehaviour
{
[SerializeField]
private float m_roughness; //거칠기 정도
[SerializeField]
private float m_magnitude; //움직임 범위
private void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
{
StartCoroutine(Shake(1f));
}
}
IEnumerator Shake(float duration)
{
float halfDuration = duration / 2;
float elapsed = 0f;
float tick = Random.Range(-10f, 10f);
while (elapsed < duration)
{
elapsed += Time.deltaTime / halfDuration;
tick += Time.deltaTime * m_roughness;
transform.position = new Vector3(
Mathf.PerlinNoise(tick, 0) - .5f,
Mathf.PerlinNoise(0, tick) - .5f,
0f) * m_magnitude * Mathf.PingPong(elapsed, halfDuration);
yield return null;
}
}
}
※ roughness : 거칠기 정도, 카메라가 움직이는 동안 카메라의 떨림을 제어하는 수치이다. 값이 높아질수록 카메라가 움직이는 시간동안 많이 떨린다.
※ magnitude : 카메라 움직임 범위, 카메라가 움직이는 범위 수치이다.
※ tick : 펄린노이즈 함수에 들어갈 값이다. 초반에 랜덤으로 값을 설정하는 이유는 노이즈 함수에 들어가는 값을 다르게하기 위해서이다. (항상 같은 움직임으로 흔들게 하고싶으면 틱값을 랜덤이 아닌 고정값으로 초기화하면 된다.)
결과
반응형
'Develoment > Unity' 카테고리의 다른 글
스프라이트 메쉬 제네레이터(Sprite mesh generator) (0) | 2024.06.04 |
---|---|
[유니티] NavMeshAgent 회전이 느린 문제 (0) | 2022.06.03 |
[유니티] Navigation Bake, NavMeshAgent Component (0) | 2022.06.03 |
[유니티] 모바일 제스처 기능(카메라 줌, 이동) 구현 (1) | 2022.03.11 |
[유니티] Android 펀치홀, iOS 노치 UI SafeArea 적용하기 (0) | 2022.02.01 |