unity-实现浮力效果,让玩家浮在水面上

准备工作:

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);
        }
    }

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值