You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity新手求助:如何让液体模型适配非均匀杯形容器?

解决Unity液体贴合杯形容器的方案

方法一:缩放+碰撞检测适配X/Z尺寸(适配现有圆柱模型,兼容倒水脚本)

  • 先对齐初始位置:将液体圆柱的底部与杯子内部底部对齐,直接在Scene视图拖动或修改Transform的Position,让圆柱Y坐标等于杯子内壁底部的Y值,解决悬浮问题。
  • 适配X/Z方向:
    1. 规则杯型(圆柱杯):测量杯子内壁半径,直接调整液体圆柱的Scale的X、Z值,让圆柱半径与杯子内壁半径一致。
    2. 不规则杯型:用简单代码自动贴合,给杯子添加Mesh Collider(勾选Convex),给液体圆柱添加Capsule/Box Collider,然后挂以下脚本:
using UnityEngine;

public class LiquidFitContainer : MonoBehaviour
{
    public Transform cupTransform;
    private Collider cupCollider;
    private Collider liquidCollider;
    private Vector3 initialScale;
    private float maxScaleXZ = 2f; // 限制最大缩放,防止溢出

    void Start()
    {
        cupCollider = cupTransform.GetComponent<Collider>();
        liquidCollider = GetComponent<Collider>();
        initialScale = transform.localScale;
        // 强制对齐杯子底部
        transform.position = new Vector3(cupTransform.position.x, cupCollider.bounds.min.y, cupTransform.position.z);
    }

    void Update()
    {
        // 仅在液体Y轴扩展时执行适配
        if (transform.localScale.y > 0.01f)
        {
            FitToContainer();
        }
    }

    void FitToContainer()
    {
        float currentScaleXZ = initialScale.x;
        bool isColliding = false;
        // 逐步放大X/Z直到触碰杯子内壁
        while (!isColliding && currentScaleXZ < maxScaleXZ)
        {
            transform.localScale = new Vector3(currentScaleXZ, transform.localScale.y, currentScaleXZ);
            isColliding = Physics.CheckBox(liquidCollider.bounds.center, liquidCollider.bounds.extents, transform.rotation, 1 << cupTransform.gameObject.layer);
            currentScaleXZ += 0.01f;
        }
        // 回退到碰撞前的缩放值
        transform.localScale = new Vector3(currentScaleXZ - 0.01f, transform.localScale.y, currentScaleXZ - 0.01f);
    }
}
  • 配置:将杯子的Transform拖入脚本的cupTransform字段,确保杯子和液体在同一Layer,或调整代码中的Layer掩码。该逻辑与你现有Y轴扩展的倒水脚本无冲突。

方法二:Mesh变形(无代码,适合规则杯型)

  • 复制杯子的Mesh:在Project视图右键杯子的Mesh资源选择复制,重命名为LiquidMesh。
  • 调整Mesh形状:打开LiquidMesh的Inspector面板,将Mesh的Y轴Scale设为极小值(比如0.01),作为液体初始状态。
  • 替换液体Mesh:将LiquidMesh赋值给液体对象的Mesh Filter,之后你的倒水脚本只需修改液体的localScale.y,液体形状会完全贴合杯子内壁。

方法三:免费插件快速实现

  • 前往Unity Asset Store搜索免费液体模拟插件(如「Simple Liquid」「Basic Liquid Simulator」),这类插件自带容器贴合功能,只需将杯子设为容器、液体设为内容物,即可自动适配边界,无需大量编码。

注意事项

  • 若之前的自定义代码无效,优先检查:是否给杯子/液体添加了Collider、Layer是否设置正确、缩放逻辑是否与倒水脚本冲突。

内容的提问来源于stack exchange,提问作者Skyler Peters

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 03:15:08