准备工作:
1、给水cube添加tag:water,在水的box collider组件下选中is trigger
2、给玩家角色添加rigid body组件
以下脚本命名为floater,挂接在玩家角色上:
private bool isinwater;
private GameObject watergbj;
void Start()
{
isinwater = false;
watergbj = GameObject.FindWithTag("water");
}
//让水的脚本来调用这个函数
public void setisinwater(bool inwater)
{
isinwater = inwater;
}
void FixedUpdate()
{
if (isinwater)
{
calfloatage();
}
}
//计算浮力
private float watery;//水cube的y坐标
public float density = 1;//水的密度
private const float g = 9.8f;//重力加速度
private float floatforce;
private float h, h1, h2;
private void calfloatage()
{
//得到水面的y坐标
watery = watergbj.transform.position.y + watergbj.transform.localScale.y / 2;
//物体浸入水中的高度= 水面高度-下边缘高度 或 整个物体的高度
h1 = watery - (transform.position.y - transform.localScale.y / 2);
h2 = transform.localScale.y;
h = h1 > h2 ? h2 : h1;
//浮力公式:F浮=液体密度*重力加速度g*排开液体的体积
floatforce = density * g * transform.localScale.x * transform.localScale.z * h;
GetComponent<Rigidbody>().AddForce(0, floatforce, 0);
}
以下脚本挂接在水上:
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.GetComponent<floater>())//进入水面的物体如果带有floater脚本
{
other.gameObject.GetComponent<floater>().setisinwater(true);
}
}
private void OnTriggerExit(Collider other)
{
if (other.gameObject.GetComponent<floater>())//离开水面的物体如果带有floater脚本
{
other.gameObject.GetComponent<floater>().setisinwater(false);
}
}