공부/Unity

[Unity] 좀비 서바이벌 Cinemachine, FK / IK, Scriptable Object를 활용한 총쏘기

굴러다니다니 2023. 5. 1. 16:47
728x90

플레이어를 따라오는 카메라 - Cinemachine

(책을 참고 p607)

windows > packet manager > unity registry의 Cinemachine 다운로드 

 

기존의 main camera에 cinemachine Brain camera component를 추가해준다

Cinemachine의 브레인 카메라와 가상 카메라를 이용할 것이다.

 

브레인 카메라: 게임 월드를 촬영하는 진짜 카메라, 씬에 하나만 존재

가상 카메라: 씬에 여러개 존재하며 카메라의 분신 역할

 - 브레인 카메라를 위한 여러 설정값을 제공, 여러 가상 카메라의 몸들을 두고 본체인 브레인 카메라가 몸을 바꿔 끼는 느낌

 

create empty > Follow cam으로 이름을 만들고 Cinemachine Virtual Camera component를 넣어준다

그 후 follow (따라가는 대상), look at (보는 대상) 모두 Player로 설정해준다

 

버추얼 카메라를 만들면 위와 비슷한 모양으로 뜰 텐데

분홍색은 하드리밋, 하늘색은 소프트존, 노란색은 데드존으로 노란색 부분에 존재하는 물체를 하늘색 영역까지는 부드럽게 따라가고, 하드리밋으로 간다면 순간이동처럼 아예 바로 잡아버린다

 

Follow Camera의 추가 설정을 위에와 같이 해준다

- Field of View (시야각)을 20으로 줄여 가까이

- 카메라와 몸체 사이의 간격을 world space 기준으로 계산해 거리를 (-8, 16, 8)만큼

- 추적 속도를 1에서 0.1로 전부 바꿔 신속하게

- 소프트 존을 없애 바로 따라가게 수정

 

카메라가 플레이어를 잘 따라온다!

 


총쏘는 궤적과 기능 만들기

인터페이스를 상속하는 클래스들은 인터페이스의 메소드를 반드시 구현해야됨

공격당할 수 있는 모든 대상은 IDamageable 인터페이스를 상속

피해 정도, 공격당한 위치와 공격당한 표면의 방향을 매개변수로 받는 OnDamage 함수를 정의하는 인터페이스를 선언했다.

 

총의 위치를 표현하기 위해 빈 오브젝트를 만들어 위치를 조정해준다

 

프리팹의 총을 unpack한 뒤 Gun Pivot의 자식개체로 불러와 위치를 잡아준다

 

일단 총을 쏘면 생기는 궤적을 나타내기 위해 line renderer를 추가해준다.

선의 크기는 쏠 때 스크립트에서 위치를 정해줄 것이기에 size를 0으로, width는 그래프 옆에 숫자 부분을 키보드로 바꿀 수 있으니 0.2로, 그림자가 생기는지를 뜻하는 Cast Shadows는 Off 로 꺼주고, material에 총알을 넣어준다

 

총쏠 때 소리도 나야되니깐 오디오 소스까지 추가해준다

총을 쏠 때 떨어지는 탄피 particle과 총쏘는 빛 효과인 Muzzle particle을 Gun 위치에 추가해준다

 

여러 종류의 총들을 구현할 수 있으므로, 변화를 더 쉽게 주기 위해 Scriptable Object로 선언해줄것이다

Scriptable Object를 받은 GunData에서 Asset Menu에서 이를 생성할 수 있게 만들어주었고, 총에 관련된 변수들을 선언해주었다

 

새로 생긴 GunData에 소리 두개를 할당시켜준 뒤

Gun Object에 넣을 gun script를 작성해준다

 

필요한 변수들을 미리 선언해두었다 + 주석

 

awake문으로 초기화를, onEnable문으로 총이 활성화 될 때 전체 예비 탄창을 초기화한후 탄알을 채운다.

초기화할때 사용한 탄알 양은 gundata에 접근해서 알 수 있고 용량은 magCapacity로 알 수 있다.

 

총알 발사시 나오는 effect를 코루틴으로 실행시켜보자

 

lineRenderer에 0번째는 총구 위치에서, 1번째는 충돌한 위치로 라인을 그리는 코루틴이다.

이를 이용해 마우스를 클릭할 시 발사 가능한 상태인지 체크하는 Fire() 메소드와 실제로 총을 발사하는 메소드를 만들어보자

이야 힘들다

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

코드만 쓰면 이해가 안될텐데 주석이랑 같이쓰니 쓰면서 이해가 된다

 

재장전 코드를 작성해보자

재장전이 가능한지 확인하는 Reload()와 재장전 하는 코루틴 함수로 나뉜다

코루틴 함수에서 주목해야 할 점은 탄창에 들어가는 탄알 개수 magCapacity, 현재 탄알 magAmmo, 내가 가지고있는 총알들의 남은 수 ammoRemain의 계산이 주된 내용이다

 

완성된 부분들은 인스펙터 창에서 채워준다


만든 총을 캐릭터의 손에 붙여주기 + 총을 쏘는 스크립트 만들기

애니메이터의 FK, IK의 이해

 

캐릭터의 애니메이션은 FK로 동작한다

FK : Forward Kinematics - 전진 운동학

부모 조인트에서 자식 조인트 순서로 움직임을 적용하고, 큰 단위의 관절 -> 세부적인 관절 의 순서로 움직인다

FK에서 손의 위치는 순서대로 계산된 결과이다.

 

IK : Inverse Kinematics - 역운동학

FK와는 반대로 자식 조인트의 위치를 먼저 결정하고 부모 조인트가 이에 맞춰 변형된다

 

그렇다면 이미 정해진 총의 위치에 손을 움직이려면? IK를 이용해 손의 위치를 바꿔줘야겠다!

FK를 이용하려면 이미 정해진 손의 위치에 하나하나 총의 위치를 옮겨야된다,, 우우,,

 

이용하려는 친구의 IK가 켜졌나 확인하고 시작한다

 

총을 쏘기위해 PlayerShooter script를 만들었다

update문에서 내 입력이 fire (좌클릭) 이면 함수의 fire을 진행시키고, isReload가  true라면 reload를 진행시킨다

애니메이터의 IK를 총에 맞춰 바꿔준다

 

플레이어 inspector에 넣어주고 알맞게 끌어와준다

 

올바르게 총 들려주기 성공!

만약 왼손과 오른손을 반대로 한다면 어떻게 될까

 

박진영이 목긁는거마냥

매우 어렵게 꼬아서 들고계신다

 

728x90