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 静态网格体 SM_Plane1000_512(包含在 Content Example 地图中)
    WaterMaterial 材质接口 WaterMaterial
    HeightState 整数 0
    TimeAccumulator 浮点数 0.0
    WaterMID MaterialInstanceDynamic N/A
    UpdateRate 浮点数 60.0
    TouchingCharacter Actor N/A
    LastTouchingActorPosition 矢量 0, 0, 0
    InteractionDistance 浮点数 1.0
    MouseDown 布尔值 Un-Checked

蓝图函数创建和设置

蓝图和所需的变量创建完成后,即可开始创建一些函数。在以下部分中,我们将了解这三个函数,以及如何对它们进行设置。

编译并保存蓝图以便使用。

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

    • 输入

      • 名称:Index

      • 类型:整数

    • 输出

      • 名称:Heigh RT

      • 类型:2D 纹理渲染目标

      Copy Node Graph

      FS_Get_Height_Function.png

      需要将这三个渲染目标添加到 Return 节点上的 Height RT 输入。

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

    • 输入

      • 名称:CurrentHeightIndex

      • 类型:整数

      • 名称:NumFramesOld

      • 类型:整数

    • 输出

      • 名称:Heigh RT

      • 类型:2D 纹理渲染目标

      Copy Node Graph

      FS_Store_Last_Height.png

  • Trace From Camera 与 Height Field Painter 蓝图中使用的追踪相同。对此函数而言,没有需要设置的输入和输出变量。

    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 部分确定玩家当前是否已接触到放置在世界场景中的流体表面 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 时对其施加的力。

    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 波纹的传播,使波纹效果随时间消失。

    Copy Node Graph

    FS_ApplySim.png

  • Compute Surface Normal 部分为流体表面应用一条法线,使波纹效果更明显。

    Copy Node Graph

    FS_Compute_Surface_Normal.png

现在蓝图便已设置完成。下一部分我们将了解如何对所有内容进行设置,以便在 UE4 中使用。