
为了给河流加浮力系统,于是我搞了个浮力插件来研究了下。插件是开源的,地址:
dbrizov/NaughtyWaterBuoyancygithub.com
两个重要的脚本是WaterVolume.cs和FloatingObject.cs。FloatingObject.cs挂到漂浮物上,WaterVolume.cs挂到水物体上。水物体的Tag设置为Water Volume。就可以用了,很简单。具体使用方法参看ReadMe页面。

核心原理分析
这个浮力系统的本质就是根据物体浸入水下的深度来计算一个给它向上的浮力,当完全浸入水中时浮力最大。完全离开水面时浮力为0,物体呈现自由落体。当调整物体的质量为适度的值时,物体的质量和浮力会保持平衡,物体就会漂浮在水面上。
核心代码主要在在FloatingObject.cs中的FixUpdate中。如下,对应进行了详细注释。其中体元的意思是把一个物体的整体浮力切分成若干离散力的组合。就如下面的红色方块。

下面简要分析它的浮力的计算流程:
1.进行参数的准备,计算每个体元的forceAtSingleVoxel,bounds ,voxelHeight ,worldPoint 。
//将总共的浮力分到每个体元
Vector3 forceAtSingleVoxel = this.CalculateMaxBuoyancyForce () / this.voxels.Length;
Bounds bounds = this.collider.bounds;
//每个体元的高度
float voxelHeight = bounds.size.y * this.normalizedVoxelSize;
//体元的世界坐标位置
Vector3 worldPoint = this.transform.TransformPoint (this.voxels[i]);
2.计