Jasontreks Blog

DM 보내기

메세지는 텔레그램 챗봇에 의해 익명으로 전달됩니다. 답장을 받으려면 이메일을 입력하세요.
Send

탄착 이펙트

액션 게임에서 퀄리티 높고 임팩트 있는 이펙트는 게이머의 마음을 사로잡는 매우 강력한 무기다. 그런 의미에서 탄착 이펙트는 매우 중요하기에 상당한 공을 들일 수밖에 없었다.

독탄의 탄착 이펙트는 이전에 화염 필드와 독 구름 포스트에서 다루었다. 남은 탄환은 일반탄, 화염탄인데 일반탄은 금속구의 강력한 충격과 파편 발산을 강조하는 느낌으로, 화염탄은 뜨거운 불을 지르는 느낌으로 이펙트를 제작하였다.

일반탄 탄착 - 충격이 강조된 폭발 이펙트

폭발의 한 종류이므로 먼저 연기가 빠르게 확산되는 파티클 시스템을 만들었다. 나는 이 게임에서 연기를 표현하기 위해 확보한 두 가지 텍스처가 있는데, 아래와 같다.

Abstract art Abstract art

이 중에서 나는 첫 번째(왼쪽) 연기 텍스처를 활용해 연기 확산 이펙트를 제작하였다. 두 번째 텍스처는 아예 쓰지 않았다. 첫 번째 텍스처는 두 번째에 비해 무언가 타서 나는 연기라기보단 뭉쳐져 있고 무게감이 있어 마치 먼지 구름과 같은 시각적 느낌을 주는데, 이는 포탄이 땅에서 터졌을 때 화염보단 충격에 의해 흙먼지가 강하게 퍼지는 현상을 표현하기 더 적합할 것이라 판단했기 때문이다.

여기에 불꽃이 튀기는 파티클 시스템과 포인트 라이트로 발광 효과만 더하면 완성이 된다. 발사 이펙트와 본질적으로 같은데 형태만 다른 것이다.

방사 이펙트 (보조 이펙트)

탄착 이펙트를 만들던 중 한 가지 고민이 들었다. 바로 파편이 방사하는 이펙트이다. 글로우 효과가 적용된 사각형 파티클들이 땅에서 하늘 방향으로 튀어 오른 다음 중력에 의해 떨어지는 이 파티클 시스템은 일반탄과 화염탄, 그리고 연못에 탄착하는 경우에도 나타나게 할 계획이었다. 다만 파티클 입자의 모습은 다르다.

즉 방사 이펙트는 파편이나 탄착 위치에 따라 파티클의 형태는 다르지만 같은 물리 현상의 정의를 공유한다는 점이 핵심이었다. 따라서 방사 이펙트는 여러 씬으로 만들 필요가 없이 Particle Process Material(PPM) 셰이더만 따로 저장한 뒤 코드에서 동적으로 불러와 적용할 수 있다.

func _ready() -> void:
	var ppm: ParticleProcessMaterial = ParticleProcessMaterial.new()
	match mode:
		0: ## 일반탄, 화염탄. 불꽃 튀기다 검게 변하는 래디얼
			ppm = load("res://Material/ppm_fx_radial_burst.tres")
			gpuRadial.trail_enabled = false
		1: ## 연못에 탄착 시, 물 입자 래디얼
			ppm = load("res://Material/ppm_fx_radial_water.tres")
			gpuRadial.trail_enabled = true
			gpuRadial.trail_lifetime = 0.1

그리고 산개 방향, 속도, 입자 크기 등만 값을 다르게 줌으로써 디테일도 살릴 수 있다.

var d: float = dir.dot(Vector2.RIGHT)
var t: float = inverse_lerp(-1, 1, d)
var dirX: float = lerp(-0.5, 0.5, t)

ppm.direction.x = dirX
ppm.initial_velocity_min = v_min
ppm.initial_velocity_max = v_max
ppm.scale_min = s_min
ppm.scale_max = s_max

gpuRadial.process_material = ppm

gpuRadial.emitting = true
gpuRadial.one_shot = true
gpuRadial.restart()

화염탄 탄착 - 화염이 강조된 폭발 이펙트

화염탄의 경우 먼지구름이 강한 압력으로 확산되는 효과가 아닌 풍부한 화염이 일어나는 효과에 중점을 두었다.

화염탄의 탄착의 파티클 역시 일반탄과 똑같은 두 텍스처를 사용하여 표현했는데, 처음에는 발사 이펙트, 탄환 궤적 이펙트 에서 사용한 좀 더 고운 질감의 연기 텍스처를 사용해 보았으나 이 텍스처가 폭발에 좀 더 어울리는 감이 있기도 했고 듬성듬성 있는 밝은 점이 불꽃을 표현하기에 좋았기 때문이다.

이 이펙트는 한 지점에서 빠르게 퍼지는 게 아니라 넓은 지역에서 동시다발적으로 파티클이 시작되는 것이 핵심이었다. 그리고 각 파티클의 시작 위치와 크기, 회전은 무작위적으로 결정되어야 자연스럽다.

이를 위해 Emission Shape를 Points, 즉 여러 지점에서 시작되는 옵션으로 설정하고 그 지점은 Noise Texture를 이용해 무작위성을 부여하였다.

선택한 Noise는 Perlin Noise를 사용했는데, 다른 어느 노이즈를 사용하더라도 Frequency가 일정하다면 비슷한 모양이 연출되기 때문에 노이즈의 종류는 크게 중요하지는 않다.

파티클 시스템 설정에서 Speed Scale을 매우 작게 설정하면 아주 천천히 재생되어 무작위 위치에서 파티클이 시작되는 모습을 직접 확인할 수 있다.

색상 변화는 아래와 같이, 잠시 동안 매우 밝은 색으로 시작해 화염 색에서 검은 연기 색으로 바뀌어 가도록 그라디언트 텍스처로 설정하였다.

앞에서 다루었던 방사 이펙트와 결합한 최종적인 이펙트의 모습은 아래와 같다.

다음 포스트

UI 디자인 - 전체적인 개선