블루프린트와 렌더 타깃으로 플루이드 서피스 만들기

블루프린트와 렌더 타깃을 사용하여 실시간 플루이드 서피스 액터를 만드는 법입니다.

Windows
MacOS
Linux

FS_Header_Image.png

블루프린트와 렌더 타깃을 사용하면, 물을 발사체나 플레이어로 건드렸을 때 그 표면에 일어나는 현상을 시뮬레이션하는 플루이드 서피스(유체 표면)을 만들 수 있습니다. 여기서는 블루프린트와 렌더 타깃을 사용해서 렌더 타깃 작업 전용으로 구성되는 렌더 타깃 및 머티리얼 세트를 새로 만드는 방식으로 플루이드 서피스 액터를 만드는 법을 알아봅니다. 그런 다음 유체 표면을 건드리거나 총으로 쐈을 때 일어나는 유체 표면 상호작용이 포함 및 구현되는 블루프린트를 새로 만들어 구성해 보겠습니다.

여기서는 블루프린트와 렌더 타깃으로 하이트 필드 페인터 만들기 안내서에서 만들었던 것과 동일한 애셋을 사용합니다. 블루프린트와 렌더 타깃으로 하이트 필드 페인터 만들기 안내서를 이미 완료하지 않은 경우, 먼저 완료해 주시기 바랍니다. 이 예제 맵은 에픽 게임스 런처의 학습 탭에서 다운로드할 수 있는 Content Example 프로젝트에서도 찾을 수 있습니다.

1 - 프로젝트 구성

여기서는 플루이드 서피스 (유체 표면) 블루프린트를 만들 수 있도록 프로젝트를 구성하는 법에 대해 다뤄보겠습니다.

유체 표면 프로젝트 구성은 하이트 필드 페인터와 똑같습니다. 확인한 적이 없다면, 블루프린트와 렌더 타깃으로 하이트 필드 페인터 만들기 문서의 프로젝트 구성 부분을 참고하세요. 완료되었으면 새로운 Game Mode 와 HUD 가 있을 것입니다. 프로젝트를 실행시키면, 아래 그림과 같은 화면이 보일 것입니다.

HFP_PS_07.jpg

다음에는 플루이드 서피스 블루프린트 생성에 필요한 애셋을 생성하는 방법을 살펴보겠습니다.

2 - 필수 애셋 생성 & 구성

플루이드 서피스의 정상 작동을 위해서, 새 애셋을 조금 만들어줘야 할 것입니다. 하이트 필드 페인터용으로 생성된 애셋을 조금 사용하기도 할 것입니다. 다음 섹션에서는 이 애셋을 어떻게 구성해 줘야 하는지, 어떤 특수 프로퍼티를 사용해야 하는지 다뤄보겠습니다.

렌더 타깃 생성 & 셋업

플루이드 서피스의 정상 작동을 위해서는, 콘텐츠 브라우저 우클릭 컨텍스트 메뉴에서 고급 애셋 생성 > 머티리얼 & 텍스처 부분의 렌더 타깃 옵션을 선택하여 네 개의 렌더 타깃을 새로 만들어줄 필요가 있습니다.

HFP_RT_Creation_00.png

네 개의 렌더 타깃을 새로 만들고나서, 이름을 다음과 같이 지어줍니다:

  • Height0

  • Height1

  • Height2

  • HeightfieldNormal

FS_Render_Targets.png

머티리얼 생성 & 구성

플루이드 시뮬레이션의 작동을 위해서는, 두 개의 머티리얼을 새로 만들어야 합니다. 하나는 물에 쓸 것, 또 하나는 하이트맵 시뮬레이션에 쓸 것입니다. 머티리얼 생성을 위해서는, 콘텐츠 브라우저 우클릭 메뉴에서 기본 애셋 생성 부분의 머티리얼 옵션을 선택합니다.

블루프린트를 컴파일하고 저장해야 사용할 수 있다는 점, 잊지 마세요.

  • WaterMaterial 은 표면이 물과 같아 보이고 작용하도록 만드는 것입니다. WaterMaterial 제작을 시작하기 전, 디테일 패널에 다음과 같은 옵션이 설정되어 있는지 확인하시기 바랍니다.

    • Blend Mode: 블렌드 모드: Translucent

    • Lighting Mode: 라이팅 모드: Surface Translucency Volume

    • Used with Static Lighting: 스태틱 라이팅과 함께 사용: True

    • Uses Distortion: 디스토션 사용: True

    • Refraction Mode: 굴절 모드: Pixel Normal Offset

    Copy Expression Graph

    FS_Water_Material.png

  • HeightSim 머티리얼은 유체 시뮬레이션 표면에 총을 쏠 때 일어나는 다양한 물결을 전파하는 데 사용됩니다. HeightSim 머티리얼 제작을 시작하기 전, HeightSim 머티리얼의 디테일 패널에 옵션이 다음과 같이 설정되었는지 확인하세요.

    • Shading Model: 셰이딩 모델: Unlit

    • Allow Negative Emissive Color: 음수 이미시브 컬러 허용: True

    Copy Expression Graph

    FS_HeighSim_Material.png

  • ComputeNormal 머티리얼은 물 표면에 필요한 노멀을 만드는 데 쓰입니다. ComputeNormal 머티리얼 제작을 시작하기 전, ComputeNormal 머티리얼의 디테일 패널 에 다음과 같은 옵션이 설정되어 있는지 확인하세요.

    • Shading Model: 셰이딩 모델: Unlit

    • Allow Negative Emissive Color: 음수 이미시비 컬러 허용: True

    Copy Expression Graph

    FS_ComputeNormal_Material.png

  • MAT_ForceSplat 는 충격 지점과 충격 세기를 결정하는 데 사용됩니다. MAT_ForceSplat 머티리얼 제작을 시작하기 전, MAT_ForceSplat 머티리얼의 디테일 패널에 다음과 같은 옵션이 설정되어 있는지 확인하세요.

    • Blend Mode: 블렌드 모드: Additive

    • Shading Model: 셰이딩 모델: Unlit

    • Allow Negative Emissive Color: 음수 이미시브 컬러: 체크

    Copy Expression Graph

    HFP_Material_Creation_03.png

    MAT_ForceSplat 머티리얼은 하이트 필드 파라미터 에 사용된 머티리얼과 같습니다. 이 머티리얼을 이미 만든 적이 있다면, 그것을 사용해도 됩니다.

이제 필수 애셋 구성이 완료되었으니, 다음에는 각 부분이 어떻게 어우러져 플루이드 서피스 블루프린트를 만드는지 살펴보겠습니다.

3 - 블루프린트 구성

필수 머티리얼과 렌더 타깃 생성 및 구성이 완료되었으니, 블루프린트를 새로 만들어 플루이드 서피스(유체 표면) 액터로 작업하기 위한 환경설정을 해 줄 차례입니다.

블루프린트 생성 & 변수 구성

  1. 콘텐츠 브라우저의 우클릭 메뉴에서 기본 애셋 생성 부분의 블루프린트 클래스 옵션을 선택합니다.

    HFP_BP_Setup_00.png

  2. 부모 클래스 선택 창에서 Actor 를 선택하고 이름을 WaterSurface_BP 라 합니다.

    FS_Water_BP_Creation.png

  3. WaterSurface_BP 를 더블클릭하여 열고 다음 변수 유형을 추가합니다.

    FS_Var_Creation.png

  4. 변수 기본값을 다음과 같이 설정합니다:

    변수 이름

    변수 유형

    기본 값

    WaterMeshAsset

    Static Mesh

    SM_Plane1000_512 (Content Example 맵에 포함)

    WaterMaterial

    Material Interface

    WaterMaterial

    HeightState

    Integer

    0

    TimeAccumulator

    Float

    0.0

    WaterMID

    MaterialInstanceDynamic

    없음

    UpdateRate

    Float

    60.0

    TouchingCharacter

    Actor

    없음

    LastTouchingActorPosition

    Vector

    0, 0, 0

    InteractionDistance

    Float

    1.0

    MouseDown

    Bool

    Un-Checked

블루프린트 함수 생성 & 구성

필수 변수를 포함한 블루프린트 생성이 완료되었으니, 함수를 몇 가지 생성해 줄 차례입니다. 여기서는 그 세 가지 함수는 무엇이고 어떻게 구성하는지에 대해 살펴보겠습니다.

블루프린트를 컴파일하고 저장해야 사용할 수 있다는 점, 잊지 마세요.

  • GetHeightRT 함수는 렌더 타깃의 높이를 구해 나중에 다시 사용할 수 있도록 저장합니다. 이 함수 생성을 시작하기에 앞서, 함수의 입력과 출력이 다음과 같은 정보로 구성되었는지 확인하시기 바랍니다.

    • 입력:

      • 이름: Index

      • 유형:Integer

    • 출력:

      • 이름: Heigh RT

      • 유형:텍스처 렌더 타깃 2D

      Copy Node Graph

      FS_Get_Height_Function.png

      세 가지 렌더 타깃 각각을 Return 노드의 Height RT 입력에 추가해 줘야 한다는 점 잊지 마세요.

  • GetLastHeight 함수는 유체 표면의 마지막 알려진 위치를 나중에 사용할 수 있도록 저장합니다. 이 함수 제작을 시작하기 전, 함수의 입력과 출력이 다음과 같은 정보로 구성되어 있는지 확인하세요.

    • 입력:

      • 이름: CurrentHeightIndex

      • 유형:Integer

      • 이름: NumFramesOld

      • 유형:Integer

    • 출력:

      • 이름: Heigh RT

      • 유형:Texture Render Target 2D

      Copy Node Graph

      FS_Store_Last_Height.png

  • Trace From Camera 는 하이트 필드 페인터 블루프린트에서 사용된 것과 동일한 트레이스입니다. 이 함수의 경우, 별도로 구성해 줘야 하는 입출력 변수는 없습니다.

    Copy Node Graph

    HFP_BP_Setup_05.png

블루프린트 컨스트럭션 그래프 구성

컨스트럭션 그래프는 유체 시뮬레이션의 정상 작동을 위해 스태틱 메시와 머티리얼 둘 다 생성하고 설정하는 데 사용됩니다. 다음 섹션에서는 세 가지 함수는 무엇인지, 그 구성 방법은 어떻게 되는지 살펴보겠습니다.

블루프린트를 컴파일하고 저장해야 사용할 수 있다는 점 잊지 마세요.

  • 컨스트럭션 그래프에서는, 물 표면에 필요한 스태틱 메시를 생성한 뒤, 다이내믹 머티리얼 인스턴스를 생성하여 그 스태틱 메시에 적용, 물 표면 시뮬레이션을 하도록 하겠습니다.

    Copy Node Graph

    FS_Con_Script.png

블루프린트 이벤트 그래프 구성

이벤트 그래프는 이 이펙트의 정상 작동을 위해 필요한 모든 것을 추가하고 연결하는 곳입니다. 여기서는 이벤트 그래프의 각 섹션이 어떤 역할을 하는지, 월드에 배치된 최종 블루프린트에 어떻게 영향을 주는지 알아보겠습니다.

블루프린트를 컴파일하고 저장해야 사용할 수 있다는 점 잊지 마세요.

  • Clear all render targets of data 는 블루프린트를 처음 실행시켰을 때 부작용이 나타나지 않도록 하기 위해 기존의 데이터 렌더 타깃 전부를 지우는 블루프린트 부분입니다.

    Copy Node Graph

    FS_Clear_All_RT.png

    Return 노드의 Height RT 입력에 세 가지 렌더 타깃 각각을 추가해야 한다는 점 잊지 마세요.

  • Check to see if Left Mouse Button is held down 은 사용자가 왼쪽 마우스 버튼을 눌렀는지 확인하는 블루프린트 부분입니다. 사용자가 왼쪽 마우스 버튼을 누르고 있으면, MouseDown 이 true 로 설정되고, 그렇지 않으면 false 로 설정됩니다.

    Copy Node Graph

    FS_Check_If_Left_Mouse.png

  • Take Damage Force 섹션은 스태틱 메시에서 맞은 위치를 찾아 그 부분에 ForceSplat 머티리얼을 적용하여 충격 이벤트 시뮬레이션으로 표면에 오프셋을 적용시키는 곳입니다.

    Copy Node Graph

    FS_Take_Damage_Force.png

  • Begin & End Overlap 섹션은 플레이어가 현재 월드에 배치된 플루이드 서피스 액터에 닿아있는지 여부를 검사합니다.

    Copy Node Graph

    FS_Begin_End_Overlap.png

  • Shoot when mouse is down 은 매 틱마다 왼쪽 마우스 버튼이 눌렸는지 확인하는 블루프린트 부분입니다. 왼쪽 마우스 버튼이 눌린 상태면 Trace From Camera 함수를 호출, 카메라 중앙에서 월드로 트레이스를 합니다.

    Copy Node Graph

    FS_Shoot_When_Mouse_Is_Down.png

  • Touching Character Force 는 플레이어가 플루이드 서피스 액터를 건드리면 적용할 힘을 업데이트하고 적용하는 것을 담당하는 블루프린트 부분입니다.

    Copy Node Graph

    FS_Touching_Char_FOrce.png

  • Fixed timestep, so fluid speed is framerate independent 는 유체 표면을 통해 전파되는 물결이 프로젝트의 프레임 속도와 상관없이 별도의 프레임 속도로 전파되도록 하는 블루프린트 부분입니다. 본질상 유체 표면의 물결은 레벨에 무슨 일이 벌어지든 상관없이 느려지거나 빨라지지 않습니다.

    Copy Node Graph

    FS_Fixed_Time_Step.png

  • Cycle Active heightfield 는 유체 표면을 쏘거나 건드렸을 때 유체 표면에 다양한 렌더 타깃을 순환시켜 보다 역동적인 반응을 내도록 만드는 블루프린트 부분입니다.

    Copy Node Graph

    FS_Cycle_Active_Heightfield.png

  • Apply fluid surface simulation kernel, which propagates waves 는 시간이 지남에 따라 플루이드 서피스 액터를 통해 전파되는 물결이 사그라들게 만드는 블루프린트 부분입니다.

    Copy Node Graph

    FS_ApplySim.png

  • Compute Surface Normal 은 물결이 보다 선명하고 잘 보이도록 유체 표면에 노멀을 적용하는 블루프린트 부분입니다.

    Copy Node Graph

    FS_Compute_Surface_Normal.png

블루프린트 구성이 완료되었으니, 다음에는 UE4 에서 이 모든 부분을 구성하는 법을 살펴보겠습니다.

4 - 최종 결과

플루이드 서피스 블루프린트의 여러 부품들을 전부 연결하고, 플루이드 서피스 블루프린트 컴파일과 저장을 마쳤으면, 레벨에 추가합니다. 레벨에 배치한 후에는, 레벨을 플레이하고 플루이드 서피스 액터를 마우스 왼쪽 버튼을 눌러 쏘거나 캐릭터로 그 위에 걸어가게 하는 식으로 상호작용할 수 있습니다. 아래 비디오에서 이러한 두 가지 유형의 상호작용을 확인할 수 있습니다.

이 비디오는 플루이드 서피스 블루프린트를 쐈을 때 어떤 일이 벌어지는지 보여줍니다.

이 비디오는 폰 기반 캐릭터로 플루이드 서피스 블루프린트 위를 걸어갈 때 어떤 일이 벌어지는지 보여줍니다.

Copy Node Graph

FS_Completed_Blueprint.png

완성된 플루이드 서피스 블루프린트 전체 사본입니다.

새로운 언리얼 엔진 4 문서 사이트에 오신 것을 환영합니다!

문서 사이트에 대한 의견을 모을 수 있는 피드백 시스템을 포함해서 여러가지 새로운 기능을 준비하고 있습니다. 아래 Documentation Feedback 포럼(영문) 또는 언리얼 엔진 네이버 공식 카페(한글) 중 편하신 곳에 의견이나 문제점을 알려 주세요.

새 시스템이 준비되면 알려 드리겠습니다.

네이버 카페
공식 포럼