[UE5] 적 AI 만들기 (4)

김재석·2025년 3월 13일
0

적이 죽었을 때 사라지는 효과 만들기

이제 적이 죽었을 때 사라지는 효과를 만드려고 한다. 프로젝트의 테마가 사이버펑크·가상현실이었기에 적이 나타날 때와 사라질 때 입자로 변해서 나타나는 연출을 하고 싶었다.

그때 같은 팀원이 스탠다드 2반에서 배웠다며 보여준 방식이 눈길을 끌었다. 알아보니 dissolve라고 했다. 이에 관해 조사해서 나름 그럴듯한 결과물을 만들 수 있었다. 좀 더 홀로그램같은 느낌으로 연출할 수 있었으면 좋았겠지만, 일단은 이정도면 만족스럽다.

'머티리얼로 이런 것도 돼?' 하고 머티리얼과 나이아가라 시스템에 흥미가 생긴 부분이기도 하다.


썸네일과 같은 효과를 주기 위해선 세 가지 세팅이 필요하다.
1. 해당 효과를 적용할 머티리얼에 적절한 노드를 추가해준다. (주로 Opacity Mask 노드를 사용)
2. 나이아가라 시스템으로 스켈레탈 메시의 표면을 따라 파티클이 생성되도록 한다.
3. 머티리얼을 다이나믹 머티리얼 인스턴스를 생성 후, 원하는 시점에 머티리얼과 나이아가라의 파라미터를 보간 변경한다.

머티리얼

  • 적 캐릭터의 스켈레탈 메시의 머티리얼을 확인한다.

  • Manny의 머티리얼은 2가지인데, 계속해서 머티리얼 인스턴스가 아닌 머티리얼이 나올 때가지 타고 올라가보면 하나의 머티리얼에서 나왔다는 것을 알 수 있다.

  • 머티리얼을 열어보면 여러 핀이 나오는데, 그 중 연결해야 할 것은 Opacity Mask다. 이름 그대로 불투명 마스크다.

  • 위와 같이 핀을 작성해준다.

  1. Texture는 TextureSampleParameter2D 노드를 만들고, 디테일 패널에서 Texture를 지정해줘야 한다. 이 텍스쳐가 맨 위의 GIF와 같이 사라질 때의 사라지는 패턴의 모양이다. (검은 부분, 흰 부분의 비율이 비슷할 수록 좋다.)
  2. 키보드 s 누른 상태로 좌클 혹은 우클릭 후 Scalar Parameter를 선택하여 노드를 배치한다. 이름은 Amount라고 지정하는데, 이 이름을 캐릭터의 이벤트그래프에서 사용하게 된다. (Set Scalar Parameter Value 노드)
  3. if 노드를 위처럼 연결해주고, 노드의 출력핀을 Opacity Mask에 연결한다.

  • 이후 해당 머티리얼을 부모로 갖는 인스턴스들을 열어보면, 위에서 설정한 텍스쳐와 파라미터가 글로벌로 들어와있음을 볼 수 있다. 우리는 뒤에서 이 파라미터를 동적으로 수정하여 사라지는 적의 모습을 연출하게 된다.

나이아가라 시스템

  • 나이아가라 파티클 시스템을 위의 머티리얼과 혼합하면 아래 GIF와 같이 dissolve의 경계 부분에 입자가 생성되어 마치 입자로 변해 사라지는 듯한 느낌을 줄 수 있다.

1. Sample Skeletal Mesh

  • 스켈레탈 메시의 표면, 버텍스, 본 데이터를 샘플링하여 활용하는 모듈
  • 메시의 표면을 따라 파티클이 생성되거나, 본 모양으로 파티클이 생성되는 등의 활용이 가능해짐
  • Particle Spawn에서 + 버튼을 눌러 Sample Skeletal Mesh 검색하여 생성
  • Preview Mesh에 사용할 스켈레탈 메시 지정 (이름 그대로 프리뷰 용도)
  • 아래로 내려 샘플링 타입을 Surface로 바꿔주면 캐릭터의 표면을 따라 파티클이 생성된다.



2. Sample Texture

  • 텍스쳐를 샘플링하여 파티클 속성을 제어하는 모듈
  • 텍스쳐의 패턴 모양으로 파티클 생성 가능.
  • 당연히 머티리얼과 동일한 텍스쳐를 사용해야 자연스럽겠지?

  • 텍스쳐의 경우 유저 파라미터를 만들어 지정한다. (Texture 검색)
  • 텍스쳐 UV는 오른쪽 아래 화살표를 눌러 Sample Skeletal MeshSampledUV를 지정해준다.
  • Apply Sampled RGBA to Particle Color 체크 해제.


3. Scratch Module

스크래치 모듈은 나이아가라 시스템에서 강력한 커스텀 기능을 제공하는 모듈이다. (이름부터 메모장을 뜻하는 'Scratchpad'가 연상된다.) 스크래치 모듈을 만들어 머티리얼에 설정한 것과 동일하게 마스크가 동작하도록 할 것이다.

  • 스크래치 모듈을 처음 만들면 Map Get 노드 하나만 있을 것이다.
  • 핀을 4개 추가한다. float로 검색하여 4개 추가하고, 핀의 이름을 아래와 같이 설정한다.
  • 이후 노드를 위와 같이 연결한다.
  • 마지막 select / if 노드는 약간의 과정이 필요하다.
  1. 우클릭하여 select / if 노드를 생성하면 초기엔 노드의 모양이 많이 다르다. 아래 사진처럼 핀이 하나밖에 없는데, 오른쪽 연필 모양 버튼을 눌러 Static bool 타입으로 핀을 바꿔준다.

  2. 이후 바뀐 노드 옆에 float 노드를 하나 생성하여 핀을 아무 곳에나 연결해준다. 그리하면 Select 노드의 핀들이 NiagaraFloat 핀들로 바뀌게 된다.


  3. 필요없어진 float 노드는 삭제한다.

  • Output Module로 이어지는 Map Set 노드에 float 핀을 추가한다. 이름을 Kill로 바꾸고 우클릭하여 namespacePARTICLES로 설정한다.
  • select노드의 출력핀을 연결해준다.

  • 이제 모듈에서 나와 나이아가라 시스템 오버뷰 페이지에서 스크래치 모듈을 보면, Map Get 노드에서 추가했던 float핀들을 확인할 수 있다.
  • 파라미터에서 SampledR을 검색해 Texture 까지 끌어서 연결해준다.
  • 유저 파라미터 Amount를 만들어 Mask에 연결한다. 이후 이 Amount 값을 1~0까지 조절해보면 마스크 범위가 달라지는 것을 확인할 수 있다.
  • 이후 Kill Particles 모듈을 추가해 스크래치 모듈의 Map Set에서 추가했던 Kill을 연결해주고 비교 타입은 Equal로 설정한다.

  • 이미터를 2개 복사하여 Gravity Force 모듈만 붙여주었다. 하나는 아래로, 하나는 위로 향하게 하면 만들어진 입자가 위아래로 향하는 모습을 보여줄 수 있다.



다이나믹 머티리얼 인스턴스

이제 이벤트그래프 혹은 C++에서 머티리얼과 나이아가라 시스템의 변수값을 변화하도록 만들어야 한다. 머티리얼에 만들었던 스칼라 파라미터와 나이아가라 시스템에 만든 유저 변수를 게임 중 특정 상황에 동적으로 변경하게 된다.

1. Create Dynamic Material Instance

  • 위는 적 캐릭터의 BeginPlay()에 연결된 노드이다. 게임이 시작되면 적 캐릭터는 동적 머티리얼 인스턴스를 2개 생성한다. 타겟이 되는 Mesh는 현재 캐릭터의 스켈레탈 메시이고, 기반이 되는 머티리얼은 스켈레탈 메시에서 Get material 노드를 사용한다. 이때 인덱스는 아래와 같이 설정해야 한다.
  • 당연하게도 스켈레탈 메시의 머티리얼이 하나라면 노드도 하나만 연결하면 된다.

2. Niagara Particle System Component

  • 캐릭터의 컴포넌트에 나이아가라 파티클 시스템 컴포넌트를 추가한다.
  • 컴포넌트의 디테일 패널을 보면 위와 같은 모습을 볼 수 있다. Asset 부분에 위에서 만든 나이아가라 시스템을 지정한다.
  • 나이아가라 시스템 편집창에서 만들었던 유저 파라미터가 보이는데, 이중 AmountSet Niagara Variable 노드로 보간 수정 할 것이다.

3. Set Niagara Variable (float)

  • Timeline을 만들고, 트랙을 추가한다. 트랙의 길이는 5초이며 상황에 따라(On DeadOn Spawn) 0에서 1로 증가할 지, 1에서 0으로 감소할 지가 정해진다.

  • Set Scalar Parameter Value로 앞에서 생성한 동적 머티리얼 인스턴스의 스칼라 파라미터 Amount를 0에서 1로 선형 보간한다.

  • Set Niagara Variable (float)로 나이아가라 컴포넌트에 지정된 에셋(위에서 작성한)의 유저 파라미터 Amount를 0에서 1로 선형 보간한다.

이렇게 하면 아래와 같이 생성될 때의 효과를 줄 수 있고, 보간 방향을 뒤집어 1에서 0으로 가도록 만들면 썸네일처럼 소멸될 때의 효과를 줄 수 있다.

0개의 댓글

관련 채용 정보