使用蓝图和渲染目标创建流体表面

使用蓝图和渲染目标创建实时流体表面Actor的教程。

Windows
MacOS
Linux

FS_Header_Image.png

使用蓝图和渲染目标,您可以创建一个流体表面,模拟水被发射物或玩家击中时的情况。在下面的指南中,我们将通过创建一组新的渲染目标和专门设置为与渲染目标一同使用的材质,学习如何使用蓝图和渲染目标创建一个流体表面Actor。然后,我们将创建并设置一个新的蓝图,该蓝图将包含并驱动在流体表面被触摸或射击时,流体表面的交互作用。

本指南的一部分使用在使用蓝图和渲染目标创建高度场绘制器 教程指南中创建的相同资源。如果您尚未完成使用蓝图和渲染目标创建高度场绘制器 教程指南,请先完成该指南,然后再开始学习本指南。您还可以在内容示例(Content Example)项目中找到该示例贴图,该项目可以从Epic Games启动器的"学习(Learn)"选项卡下载。

1 - 项目设置

在本节中,我们将讨论如何设置您的项目,以便您可以创建一个流体表面蓝图。

流体表面的项目设置与高度场绘制器相同。如果尚未完成项目设置,请阅读使用蓝图和渲染目标创建高度场绘制器 教程指南中的 项目设置(Project Setup) 部分。完成后,您应拥有一个新的游戏模式和HUD。运行项目时,应看到类似下图的内容。

HFP_PS_07.jpg

在下一部分中,我们将介绍如何创建所有必要的资源以创建流体表面蓝图。

2 - 必要的资源创建和设置

为了使流体表面正常工作,我们需要创建一些新资源。我们还将使用为高度场绘制器创建的一些资源。在下面部分,我们将介绍如何设置每个资源以及需要使用的任何特殊属性。

渲染目标创建和设置

为了使流体表面正常工作,我们需要在 内容浏览器(Content Browser) 中右键单击,从显示的菜单中转到 创建高级资源(Create Advanced Asset) > 材质和纹理(Materials & Textures),然后选择 渲染目标(Render Target) 选项,从而创建四个新渲染目标。

HFP_RT_Creation_00.png

一旦创建了四个新渲染目标,将它们命名如下:

  • Height0

  • Height1

  • Height2

  • HeightfieldNormal

FS_Render_Targets.png

材质创建和设置

要使流体模拟起作用,我们需要创建两种新材质;一种材质用于水,另一种材质用于高度图模拟。要创建这些材质,在 内容浏览器(Content Browser) 中右键单击,并从 创建基础资源(Create Basic Assets) 列表中选择材质(Material)选项。

别忘了编译(Compile)并保存(Save)您的蓝图,以便使用它。

  • WaterMaterial 使表面看起来像水,行为也像水。在开始构建WaterMaterial之前,请确保在 细节(Details) 面板中为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材质的 细节(Details) 面板中设置了以下选项。

    • 着色模型(Shading Model):无光照(Unlit)

    • 允许Negative Emissive Color(Allow Negative Emissive Color):True

    Copy Expression Graph

    FS_HeighSim_Material.png

  • ComputeNormal 材质用于创建水表面所需的法线。 在开始构建ComputeNormal材质之前,请确保在ComputeNormal材质的 细节(Details) 面板中设置了以下选项。

    • 着色模型(Shading Model):无光照(Unlit)

    • 允许Negative Emissive Color(Allow Negative Emissive Color):True

    Copy Expression Graph

    FS_ComputeNormal_Material.png

  • MAT_ForceSplat 用于确定发生冲击的地方以及冲击有多大。在开始构建MAT_ForceSplat材质之前,请确保在MAT_ForceSplat材质的 细节(Details) 面板中设置了以下选项。

    • 混合模式(Blend Mode):叠加型(Additive)

    • 着色模型(Shading Model):无光照(Unlit)

    • 允许Negative Emissive Color(Allow Negative Emissive Color):勾选(Checked)

    Copy Expression Graph

    HFP_Material_Creation_03.png

    MAT_ForceSplat材质与高度场绘制器 中使用的材质相同。如果已创建了该材质,可随意使用它。

现在已经设置好了必要的资源,在下一部分中,我们将看看如何将各个部分整合起来以创建流体表面蓝图。

3 - 蓝图设置

既然已经创建并设置了所需的材质和渲染目标,现在可以创建一个新蓝图并将其配置为流体表面Actor。

蓝图创建和变量设置

  1. 在内容浏览器(Content Browser)中右键单击,并在菜单中的 创建基础资源(Create Basic Asset) 部分中,单击 蓝图类(Blueprint Class) 选项。

    HFP_BP_Setup_00.png

  2. 选取父类(Pick Parent Class) 窗口中,选择 Actor 并将其命名为`WaterSurface_BP`。

    FS_Water_BP_Creation.png

  3. 右键单击WaterSurface_BP打开它,然后添加以下变量类型。

    FS_Var_Creation.png

  4. 现在将各个变量设置为以下默认值:

    变量名称

    变量类型

    默认值

    WaterMeshAsset

    Static Mesh

    SM_Plane1000_512(包含在内容示例贴图中)

    WaterMaterial

    Material Interface

    WaterMaterial

    HeightState

    Integer

    0

    TimeAccumulator

    Float

    0.0

    WaterMID

    MaterialInstanceDynamic

    N/A

    UpdateRate

    Float

    60.0

    TouchingCharacter

    Actor

    N/A

    LastTouchingActorPosition

    Vector

    0, 0, 0

    InteractionDistance

    Float

    1.0

    MouseDown

    Bool

    未勾选(Un-Checked)

蓝图函数创建和设置

既然已经创建了蓝图及其所需的变量,是时候创建一些函数了。在下面部分,我们将介绍这三个函数以及如何设置它们。

别忘了编译(Compile)并保存(Save)您的蓝图,以便使用它。

  • GetHeightRT 函数将获取并存储渲染目标的高度,以供稍后使用。在开始创建此函数之前,请确保使用以下信息设置函数的输入和输出。

    • 输入(Inputs)

      • 名称:索引(Index)

      • 类型:整型(Integer)

    • 输出(Outputs)

      • 名称:高度RT(Heigh RT)

      • 类型:纹理渲染目标2D(Texture Render Target 2D)

      Copy Node Graph

      FS_Get_Height_Function.png

      切勿忘记将三个渲染目标都添加到Return节点上的 高度RT(Height RT) 输入。

  • GetLastHeight 函数将存储流体表面的最后已知高度,以便以后使用。在开始创建此函数之前,请确保使用以下信息设置函数的输入和输出。

    • 输入(Inputs)

      • 名称:CurrentHeightIndex

      • 类型:整型(Integer)

      • 名称:NumFramesOld

      • 类型:整型(Integer)

    • 输出(Outputs)

      • 名称:高度RT(Heigh RT)

      • 类型:纹理渲染目标2D(Texture Render Target 2D)

      Copy Node Graph

      FS_Store_Last_Height.png

  • Trace From Camera 追踪与高度场绘制器蓝图中使用的追踪相同。对于该函数,不需要设置输入或输出变量。

    Copy Node Graph

    HFP_BP_Setup_05.png

蓝图构造图表设置

构造图表用于创建和设置静态网格体和材质,以用于让流体模拟正常工作。 在下面部分,我们将介绍这三个函数以及如何设置它们。

别忘了编译(Compile)并保存(Save)您的蓝图,以便使用它。

  • 在构造图表中,我们将创建一个水表面需要的静态网格体,然后创建一个动态材质实例并将其应用到该静态网格体,用于模拟水表面。

    Copy Node Graph

    FS_Con_Script.png

蓝图事件图表设置

在事件图表中,添加和连接让该效果正确工作所需的所有内容。在下面部分,我们将介绍事件图表的每个部分的作用,以及它如何影响放置在世界场景中的最终蓝图。

别忘了编译(Compile)并保存(Save)您的蓝图,以便使用它。

  • 清除数据的所有渲染目标(Clear all render targets of data) 是蓝图的一部分,用于清除它们可能包含的任何先前数据的所有渲染目标,以确保在第一次运行蓝图时不会出现瑕疵。

    Copy Node Graph

    FS_Clear_All_RT.png

    切勿忘记将三个渲染目标都添加到Return节点上的 高度RT(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) 部分检查玩家当前是否正在触摸已放置在世界场景中的流体表面Actor。

    Copy Node Graph

    FS_Begin_End_Overlap.png

  • 按下鼠标时射击(Shoot when mouse is down) 是蓝图的一部分,用于在每个Tick都检查是否按下了鼠标左键。当鼠标左键被按下时,会调用 Trace From Camera 函数,从摄像机中心追踪到世界场景。

    Copy Node Graph

    FS_Shoot_When_Mouse_Is_Down.png

  • Touching Character Force 是蓝图的一部分,负责在玩家触摸流体表面Actor时,应用和更新施加于流体表面Actor的力。

    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) 是蓝图的一部分,用于处理波纹通过流体表面Actor时的传播,使波纹看起来像是随着时间的推移而消失。

[REGION:fullwidth]
[INCLUDE:#ApplySim]
[/REGION]
  • 计算表面法线(Compute Surface Normal) 是蓝图的一部分,用于对流体表面应用法线,这有助于使波纹更明显,更容易看到。

    Copy Node Graph

    FS_Compute_Surface_Normal.png

既然已经设置了蓝图,在下一部分中,我们将看看如何设置所有东西以在UE4中使用。

4 - 最终结果

当流体表面蓝图的各个部分都已连接,且流体表面蓝图已编译并保存,将其添加到一个关卡中。一旦放置在一个关卡中,您就可以运行该关卡,然后就可以通过按下鼠标左键来射击该流体表面蓝图,或者让您的角色在其上行走,从而与该流体表面蓝图互动。下面一些视频展示了这两种类型的互动。

该视频展示当您向流体表面蓝图射击时发生的情况。

该视频展示当您用一个基于Pawn的角色走过流体表面蓝图上会发生的情况。

Copy Node Graph

FS_Completed_Blueprint.png

这是整个完整流体表面蓝图的副本。

Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback