Unity Engine

Cinemachine - Impulse

Aostols 2023. 1. 2. 09:14
반응형

Cinemachine Virtual Camera 에서 화면을 흔드는 것중 하나인 Cinemachine Impulse는 Noise보다 좀 더 정확하고 방향성을 가진 흔들림에 적합합니다.

Noise가 단순히 피격 후나 걷기 등의 흔들림을 표현 할 수 있따면 Impulse는 총기 반동등을 표현 할 수 있습니다.

 

Cinemachine Impulse 설정

우선 Cinemachine Impulse Listener를 추가 해야 합니다.

일반적인 컴퍼넌트 추가 방식이 아니고 Cinemachine Virtual Camera에서 하단에 Extensions가 보이는데 여기서 CinemachineImpulseListener를 추가해 줍니다.

 

이제 Impulse를 받는쪽은 되었으니까 주는 쪽을 추가 해 줍니다.

Cinemachine Impulse Source를 추가해 주는데 이것은 그냥 일반 컴퍼넌트 입니다.

Impulse Shape가 어떤 강도로 줄 것인지이고 Default Velocity가 방향 및 강도 입니다.

 

정확히 말하자면 Impulse Shape는 Velocity가 적용 될 그래프 입니다.

보통 초기 반동을 만들 떄 한번 크게 튀고 서서히 복귀 하는 것을 원하게 되는데 그럴떄 그래프를 조절하면 됩니다.

Bump 오른쪽의 0.2는 몇초동안 적용 될 것인가 입니다.

이제 기본 설정이 끝났으니 스크립트로 단순 테스트를 해보겠습니다.

 

Script

[SerializeField] private CinemachineImpulseSource _source;


void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        DoImpulse();
    }
}

private void DoImpulse()
{
    _source.GenerateImpulse();
}

흐름은 아주 단순합니다.

CinemachineImpulseSource에 GenerateImpulse()를 호출 해 주면 기본 세팅 된 값이 호출됩니다.

 

결과

 

수정

좀 더 디테일한 수정을 해보겠습니다.

Impulse Shape에서 Custom으로 바꿔 줍니다.

이제 그래프를 편집할 수 있는데 임의로 편집해 보겠습니다.

이 항목은 AnimationCurve변수로 스크립트에서 변경 할 수도 있습니다.

private void DoImpulse()
{
    _source.m_DefaultVelocity = new Vector3(0, 0, 3f);
    _source.m_ImpulseDefinition.m_ImpulseDuration = 0.5f;
    _source.GenerateImpulse();
}

스크립트에서 DefaultVelocity, Duration등을 변경 한 모습입니다.

m_ImpulseDefinition에서 m_CustomImpulseShape항목에 AnimationCurve를 설정 해 주면 커브도 런타임에서 변경 할 수 있습니다.

 

 

Impulse Channel

하나의 Impulse가 특정 카메라에서만 적용 되어야 하는 경우도 있을텐데 이떄 Impulse Channel을 사용합니다.

보통 다른곳의 레이어 개념과 비슷합니다.

Cinemachine Impulse Listener를 보게되면 Channel Mask로 표시되어 있는데 기본값만 있습니다.
Edit를 눌러서 추가해 줍니다.

저장하라고 뜨는데 적당한 곳에 저장 해 줍니다.

이제 내용을 살펴보면 초기에 있던 default만 있게 되는데 원하는 방향으로 편집 해 줍니다.

대충 변경하고 recoil로 테스트를 해 줍니다.

당연한 이야기 이겠지만 Impulse를 발생시키는 쪽과 듣는 쪽 모두 Recoil로 변경해 줍니다.

테스트를 해보자면 별 문제 없이 잘 되는것을 볼 수 있습니다.

 

private void DoImpulse()
{
    _source.m_DefaultVelocity = new Vector3(0, 0, 3f);
    _source.m_ImpulseDefinition.m_ImpulseDuration = 0.5f;
    _source.m_ImpulseDefinition.m_ImpulseChannel = 1;
    _source.GenerateImpulse();
}

ImpulseChannel 역시 스크립트로 런타임에서 변경 할 수 있습니다.

다만 변수가 int로 되어 있어서 Channel 번호가 바로 대입될것 같지만 비트마스크로 되어 있습니다.

0은 Nothing, 지금 여기서 3은 Everything입니다.

스크립트에서 1로 설정하였고 1은 recoil이기 때문에 역시 잘 동작 할 것입니다.

반응형

'Unity Engine' 카테고리의 다른 글

[Unity]Job System + String  (0) 2023.03.03
Cinemachine - Impulse + SecondaryNoise  (0) 2023.02.09
Cinemachine - Noise  (0) 2022.12.29
[Unity] Cinemachine - Blend  (0) 2022.12.21
[Unity] Cinemachine - 초기 세팅  (0) 2022.12.19