前言
这里需要实现水体接触承灾体时的高亮效果。然而,发现水体始终无法检测到碰撞,那么该如何判断水体已经到达指定位置并触发相应事件呢?
解决办法:
使用 Fluid Flux 的接口进行检测:
添加对应的Component
这里添加一个定时器,用来检测水源的速度是否为0,来判断水流是否到达特定区域。
白色的Cube为检测点,可以看到水流可以正常检测。
目前仅可以使用该方法进行检测。
目前已尝试无法实现的办法:
1.采用碰撞盒体检测
这里先采用重叠的方法检测碰撞:
出现了一个有趣的现象:水源和碰撞盒在场景中确实发生了物理碰撞,但"与组件开始重叠时"的事件却未被触发。
既然产生了阻挡,那不妨采用“组件命中时”这个事件去尝试,同时调整碰撞盒的碰撞预设为“BlockAll”:
发现虽然产生了物理碰撞,但是该事件依然不会触发。但值得注意的是:Pawn依然可以被阻挡并且触发对应事件:
经过测试,用“Surface_Water”同样也无法识别碰撞:
这里突然意识到一个问题:碰撞盒只有在运行时(Runtime)与其他Actor发生碰撞后才能触发相应事件。这意味着,如果在游戏运行前已经存在于碰撞盒内部的Actor,将无法触发碰撞事件。而碰撞盒从一开始就被放置在"BP_FluxSimulation"内部。
因此,将碰撞盒放置在 BP_FluxSimulation 外部,并通过运行时动态调整 BP_FluxSimulation 的位置来实现碰撞效果:
在“BP_FluxSimulation”场景中放置一个 Cube,这样可以更直观地观察BP_FluxSimulation的运动轨迹。当 Cube 移动到碰撞盒时,可以注意到左上角会显示两条碰撞信息。
目前仅 BP_FluxSimulation 与碰撞盒发生了接触,打印输出正常显示。但水源尚未触及碰撞盒,为何会出现打印信息?希望有大佬可以解答一下。
在实际开发中,不可能让 BP_FluxSimulation 动态移动,所以这个方法也无法使用。
2.采用射线检测
这里创建一条射线来检测水源的流动:
这里发现,射线检测没办法检测到扩散的水源:
这里尝试将碰撞改成BlockAll查看效果:
这里发现在水源没流动的时候射线已经击中上面不明的物体,呈现红色:
弹出后发现 BP_FluxSimulation 的高度与射线命中高度重叠,这里应该是射线命中了模拟框而非水源:
所以该方法也无法使用。
总结:
可能需要结合其他碰撞检测方法,因为水体与网格体接触时会产生交互效果。或许我只是还没找到正确的检测方式,欢迎各位大佬指正。