8. 발사체 제작(2)

MOON·2022년 7월 18일
0

유니티_3D_SpaceShooter

목록 보기
8/11
post-thumbnail

드럼통 구현


폭발효과 및 폭발력 생성

Barrel Asset Download
다운로드 받은 애셋 파일을 05.Models으로 옮긴다.


미리 임포트해 둔 Barrel모델을 Scene에 배치한 다음 총알을 발사해 폭발시켜보자
외부에서 임포트한 3D모델은 반드시 Transform의 Scale속성을 수정하지 말고, FBX Import Setting의 스케일 조정을 사용한다


빈 오브젝트 생성 : 이름 (Barrel)
Barrel FBX 파일은 Barral 하위 객체로 붙힘
Barrel 객체에 Capsule Collider / Rigidbody 컴포넌트를 추가하고 속성을 지정

Barrel에 Bullet을 제거하고 스파크 효과를 발생
RemoveBullet 스크립트를 적용
BarrelCtrl.cs 를 작성하고 Barrel 빈 오브젝트에 등록


파티클을 연결할 변수, 컴포넌트를 저장할 변수, 총알 맞은 횟수를 누적시킬 변수를 선언합니다.

Start()함수에서 GetComponent<>()를 통해 가져온다.
Update()함수에서 사용하면 매 프레임마다 가져오므로 비효율적이다.

if 가정문을 이용해 맞은횟수가 3회 이상이면 폭발 처리 ExpBarrel() 함수를 실행한다.

파티클을 동적으로 생성하며 5초 후에 제거한다.
rb.mass를 통해 Rigidbody컴포넌트에 mass를 1.0으로 수정해 무게를 가볍게 한다.
AddForce()를 통해 힘을 가하며 Vector3.up을 통해 방향을 지정한다.
이후 3초 후에 드럼통을 제거한다.

폭발 파티클 할당 (Explosion) : SmallExpolosionEffect로 들어가서[Open Particles] Loop를 UnCheck함

만들어진 Barrel를 프리펩으로 만든다.
하이어러키 뷰의 간략화
Barrel를 10개 정도 배치를 하려고 한다.
더미 게임 오브젝트(_STAGE)를 만들고 복제한 Barrel 게임 오브젝트를 하위로 만든다.


무작위로 텍스처 적용하기

여러개 배치한 드럼통은 한가지 텍스처로만 적용되어 있음
시작과 동시에 텍스처를 다양하게 변경
텍스처의 적용은 Mesh Renderer 컴포넌트에 연결된 Material에서 지정한다.
BarrelCtrl.cs 스크립트를 수정


무작위로 적용할 텍스처를 배열형식으로 선언한다.
Mesh Renderer 컴포넌트를 저장할 변수를 선언한다.

MeshRenderer는 자식으로 있기 때문에 GetComponentChildren<>()으로 가져온다.

무작위로 텍스처를 가져와야 하기 때문에 Random.Range() 함수를 사용하여 랜덤으로 가져온다.

무작위에 텍스터를 저장한다.
배열을 3개 만들고 각각 텍스처를 할당한다.


게임 시작시 랜덤하게 텍스처가 바뀜
폭발시 물리 엔진이 작동되어 터지는 효과를 발생



폭발력 적용하기

드럼통이 폭발하면서 주변의 물체까지 폭발력을 전달해 데미지를 주는 로직 구현
Layer를 하나 추가 : BARREL (7번 레이어)
Barrel 프리펩에 BARREL Layer를 적용 (모든 Barrel 들의 Layer가 바뀜)


폭발하는 드럼통 주변에 어떤 드럼통이 있는지에 대한 정보를 가져옴
Physics.OverlapSphere(원점, 반지름, 검출 대상 레이어)
Physics.OverlapSphere(pos, radius, 1<<7) - 7번 레이어

Collider[] colls
모든 Collider컴포넌트가 배열에 들어옴

폭발력 생성
Rigidbody.AddExplosionForce(횡 폭발력, 폭발 원점, 폭발 반경, 종 폭발력)
횡 폭발력 : 가로 방향으로 퍼지는 폭발력
종 폭발력 : 위로 솟구치는 힘

이제 폭발력을 적용할 BarrelCtrl 스크립트를 수정하자.

public float radius = 10.0f;

폭발 반경을 선언한다.


IndirectDamage() 함수를 사용해 간접 폭발력을 전달할 예정이다.

주변에 반경에 있는 드럼통을 모두 추출한다.
foreach를 통해 저장된 colls에서 coll로 하나씩 뽑아 사용한다.


사운드

내부적으로 FMOD라이브러리 사용

AudioListener 컴포넌트 : Scene에서 반드시 한개만 사용

  • 사람의 귀처럼 소리를 듣는 역할
  • Main Camera에 기본 컴포넌트로 추가되어 있음

AudioSource 컴포넌트 : 실제로 소리를 재생하기 위한 파일 (wav, mp3 등)

  • 소리를 발생시키는 역할
  • 씬에서 여러개의 AudioSource를 가질 수 있다.

(주의) 한 씬에서 여러대의 Camera를 설치할 경우 Camera마다 AudioListener 가 있으므로 한개만 남기고 다른 모든 AudioListener는 삭제 하도록 한다.

Resource/Sounds 폴더에서 WeaponSFX 패키지를 임포트 하여 06. Sounds폴더로 임포트
두 가지 무기의 총소리 , 폭발음


스테레오 음원을 모노 음원으로 변경
Rifle 폴더의 “p_m4_1” 사운드 파일의 속성에서 Force To Mono 를 체크한 후 Apply 버튼 클릭 (파일 크기를 줄임)
LoadType (임포트 옵션) - Decompress On Load 설정 - 작은 사이즈의 오디오에 적합

Compression Format (압축 포맷)
ADPCM 설정
노이즈가 포함되어 있어 총소리, 발걸음 소리와 같이 잡음이 일부 포함된 오디오에 적합


Bullet 프리펩을 선택
[Component] - [Audio] - [Audio Source]를 선택한 후에 AudioSource 콤포넌트를 추가

  • Play On Awake : 해당 콤포넌트가 활성화 될 때 자동 재생 여부
  • Min Distance : 볼륨 100% 값으로 음원이 들리는 영역 범위
  • Max Distance : 음원이 들리는 최대 범위


총소리 구현의 문제점
Bullet에다 AudioSource 컴포넌트를 적용했을 경우
벽이나 드럼통 가까이서 발사하면 Bullet이 충돌하자마자 삭제됨 -> 총소리가 모두 재생되기전에 사운드가 끊어지는 현상이 발생함
Bullet에다 AudioSource를 적용하는 것이 아니라. Player의 FireCtrl에다 직접 구현한다.

기존에 Bullet에 적용했던 AudioSource 컴포넌트는 삭제함
FireCtrl.cs 스크립트 수정


반드시 필요한 컴포넌트를 명시해 삭제되는 것을 방지하는 어트리뷰트
사용되는 음원을 할당할 변수, AudioSource 컴포넌트를 저장 할 변수를 선언한다.

Start() 함수에서 GetComponent를 통해 가져온다.


.PlayOneShot을 통해 음원을 재생시킨다.
참고로 중복으로 소리나도 가능하다.

음원 파일을 할당하면 사운드는 끝이 난다.



총구 화염 만들기

총구 화염(Muzzle Flash)의 구현은 실행 속도 및 처리 비용을 고려해 파티클 효과를 사용하지 않음
FirePos를 선택한 후 Quad 오브젝트 생성 및 이름 : MuzzleFlash
Mesh Collider컴포넌트 삭제

이미지 파일 임포트
Resources/Images/Weapons/MuzzleFlash.png -> 04.Images로 임포트
총알을 발사하면 네개의 이미지중 ¼ 이미지만 사용
텍스쳐의 오프셋 값을 변경해 4개의 이미지를 불규칙하게 노출하여 총구 화염을 구현

새로운 머터리얼 생성 : MuzzleFlash
04.Images/Materials/에 생성
쉐이더를 Particles/Addictive로 설정
Tiling (x, y) 90.5, 0.5) 로 지정

만들어진 머터리얼을 MuzzleFlash 게임 오브젝트에 적용

총을 발사할 때마다 MuzzleFlash가 깜박거리게 만들어보자
FireCtrl.cs를 수정해보자.

private MeshRenderer muzzleFlash;

를 통해 컴포넌트를 저장할 변수를 선언한다.

muzzleFlash = GetComponentInChildren<MeshRenderer>();
muzzleFlash.enabled = false;

자식에 있는 MeshRenderer를 가져오기 위해 InChildren를 추가로 붙여준다.
.enabled 를 false로 하여 오브젝트를 비활성화하여 보이지 않게 한다.

총을 발사할 때마다 MuzzleFlash가깜박거리게 만듬

코루틴 함수를 사용해보자.

StartCoroutine(ShowMuzzleFlash());

위에 코루틴 함수를 Fire() 함수에 적어주면 된다.
코루틴 함수는 시작시 StartCoroutine()를 사용하며
주로 Update()에 프레임마다 실행이 아니라 다르게 딜레이을 줄때 유용하게 사용 가능합니다.

코루틴에 관한것은 다른 글로 자세히 다루겠다.

IEnumerator은 코루틴 함수를 사용시 사용한다.
MuzzleFlash를 활성화 시키고 WaitForSeconds를 통해 0.2초 딜레이를 준다.
여기서 yield return 은 필수로 있어야 한다. 없으면 오류난다.
다시 오브젝트를 비활성화 시키면서 총구 화염을 꺼준다.

Player를 선택한 후 FirePos 밑의 MuzzleFlash 객체를 끌어다가 FireCtrl.cs 퍼블릭 변수에 할당한다.
총알 발사 시 총구에서 깜빡이는 현상을 볼 수 있다.

총구 화염의 크기와 회전을 랜덤하게 바꾸어 보자

오프셋 좌표값 랜덤함수로 사용하고 각도나 크기를 랜덤으로 출력한다.

이것으로 발사체 제작(2)를 마무리 하겠다.

profile
나만의 공간

0개의 댓글