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

Unity技术咨询:如何让树靠近桌子时自动吸附到桌面?

Unity实现树吸附桌面及物体高度测量方案

一、测量物体高度

Unity可以通过Renderer组件的Bounds属性精准获取物体实际尺寸,不受pivot位置影响:

  • 先获取物体的Renderer组件(如MeshRenderer或SkinnedMeshRenderer)
  • 用bounds.size.y得到物体原始高度,再乘以transform.lossyScale.y得到世界空间下的实际高度
  • 计算物体底部的世界坐标:物体底部Y = transform.position.y - (bounds.size.y * transform.lossyScale.y) / 2

示例代码片段:

Renderer treeRenderer = GetComponent<Renderer>();
float treeWorldHeight = treeRenderer.bounds.size.y * transform.lossyScale.y;
float treeBottomY = transform.position.y - treeWorldHeight / 2;

二、实现吸附到桌面的功能

核心思路

拖动树时检测与桌子的距离,当距离小于设定阈值时,计算树的目标位置——让树的底部刚好贴合桌子顶部(桌面)。

步骤及代码实现

  1. 基础拖动逻辑(先实现树的拖动):
public class DragTree : MonoBehaviour
{
    private Camera mainCam;
    private Vector3 offset;

    void Start()
    {
        mainCam = Camera.main;
    }

    void OnMouseDown()
    {
        // 计算鼠标与物体的位置偏移量
        offset = transform.position - mainCam.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, mainCam.WorldToScreenPoint(transform.position).z));
    }

    void OnMouseDrag()
    {
        Vector3 mousePos = mainCam.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, mainCam.WorldToScreenPoint(transform.position).z));
        transform.position = mousePos + offset;

        // 拖动过程中检测是否触发吸附
        CheckAndSnapToTable();
    }
}
  1. 检测并触发吸附:
    在上述脚本中添加CheckAndSnapToTable方法,假设桌子已设置Table标签:
public float snapThreshold = 0.5f; // 触发吸附的距离阈值

private void CheckAndSnapToTable()
{
    // 检测范围内的桌子
    Collider[] hitColliders = Physics.OverlapSphere(transform.position, snapThreshold);
    foreach (var collider in hitColliders)
    {
        if (collider.CompareTag("Table"))
        {
            Renderer tableRenderer = collider.GetComponent<Renderer>();
            float tableTopY = tableRenderer.bounds.max.y; // 桌面的Y坐标(桌子顶部)

            Renderer treeRenderer = GetComponent<Renderer>();
            float treeWorldHeight = treeRenderer.bounds.size.y * transform.lossyScale.y;
            // 计算树的目标Y位置:桌面高度 + 树高度的一半(保证底部贴合桌面)
            float targetY = tableTopY + treeWorldHeight / 2;

            // 更新树的位置,保留X、Z坐标,仅修改Y
            transform.position = new Vector3(transform.position.x, targetY, transform.position.z);
            break;
        }
    }
}

注意事项

  • 确保树和桌子都添加了Collider组件(桌子的Collider可设为Is Trigger,也可不设,按需调整)
  • 若为2D游戏,替换为Renderer2D、Physics2D.OverlapCircle等对应API
  • lossyScale是世界空间下的缩放值,能准确计算物体实际尺寸,适配有父物体的场景
  • 可根据手感调整snapThreshold(吸附触发距离)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:01:10