본문 바로가기

Unity 개발 공부

[내배캠] 본캠 51 시네마신, UniTask

시네마신 카메라 api 이용해보기..

cinemachine 이란 

Unity 카메라 배치, 이동이아닌, 영화 찰용 기법처럼 다채로운 카메라 워크 (트래킹, 트랜지션, 쉐이크)를
코딩없이 구현할수 있게 해주는 패키지다.

구성요소

Cinemachine Brain
씬의 메인카메라에 붙여서 작동
여러 virtual Camera 사이의 전환을 관리(blend)
우선순위(Priority)가 가장 높은 Virtual Camera를 활성카메라로 선택한다.

Cinemachine Virtual Camera(VCam)
촬영을 수행할 카메라 설정 덩어리
복수의 VCam을 만둘어 두고 , 상황에 따라 우선순위를 조절한다.
실제 Unity 카메라에는 Brain만 붙이고, 촬영 세부 설정은 VCam 에서 처리한다.
이때 메인카메라처럼 카메라가아닌 빈오브젝트에 해당 컴포넌트를 붙여넣는다.

PipeLine Components( Cinemachine Component)
Virtual Camera 아래에 붙는 모듈들이며 대표적으로는

Composer : 대상(Target)을 화면의 어느영역에둘지 프레이밍
Transposer: 대상과 일정 거리, 각도를 유지하며 따르게 follow
Noise: 카메라 흔들림(Shake) 담당
Extensions : Cinemachine에 없는 기능을 확장(예 : 충돌회피, 카메라 랙) 등

CinemachineBasicMultiChannelPerlin 은 Noise 모듈로 
그안의
m_AmplitudeGain은 진폭을 조절하는 내부 프로퍼티다. 소위 얼마나 크게 흔들릴지 결정한다.
변수를 선언했다면 .으로 꺼내올수있다.
m_FrequencyGain 도 있는데, 이는 흔들림의 속도, 진동수를 나타낸다. 값이 클수록 카메라가 빠르게 진동한다.

 

 

----------------------

UniTask
Unity에서 비동기는 적합하지는않음
그래서 패키지를 받아서 할수있음. Release로 패키지를 받아서 설치하면 된다.
바로 UniTask다.
팀플때는 서로 상의후에 진행하는게좋다...
설치후 
UniTaskTest로 만들어보자.

추가해야할 네임스페이스필요
using Cysharp.Threading.Tasks;

async void Start()
{

}

라고 하면 비동기 Start가 된다.
async void Start()
{
 Debug.Log("3초대기")
await UniTask.Delay(3000);
Debug.Log("3초 후 실행");
}

원래라면 코드가 주루룩 동작해야했다면, 
완전히 비동기가 가능하다. 주로 외부적 통신의 목적이 크다. 인게임 요소에서도 쓸수는있다만...

코루틴으로도 할수있거나 update로 할 수 있는것들을 그냥 구현해보고 ,, 필요에 의해서 쓸수있으면 좋다는뜻.

async UniTaskVoid Start()
{

}

이렇게 도 할 수 있다. 좀더 안정적일 수 있다.

코루틴대체품처럼 보이지만 느낌이 다르다.
코루틴은 비동기가 아니다. 라이프사이클 안에 얹혀놓은 다른형태의 코드일뿐.

버튼에 대한 대기도 가능하다.

ButtonWaiter라는 코드를 만들어보자.

public Button startButton;

private async UniTaskVoid Start()
{

await startButton.OnClickAsync();
Debug.Log("버튼클릭됨");
}

이렇게 해놓으면 실제로 버튼을 하나 만들어서  버튼 클릭전까지 한줄의 코드로 대기를 걸수있다.

await UniTask.WaitUntil( () => isReady); 
이런식으로 while문으로 계속 돌면서 기다리게하는 것도 비동기로 한줄로 가능하다.

await UniTask.Yield(); 이것은 Yield Return null; 처럼 한프레임 기다리게 하는 코드다.

씬전환처리도 가능하다.
...사용설명서 읽기.


UniRx 도 써보자.. 코드가 짧게 다될수있음.. update 돌릴필요가 없어진다..Start() 단에서 이것저것 가능하다.