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;
二、实现吸附到桌面的功能
核心思路
拖动树时检测与桌子的距离,当距离小于设定阈值时,计算树的目标位置——让树的底部刚好贴合桌子顶部(桌面)。
步骤及代码实现
- 基础拖动逻辑(先实现树的拖动):
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(); } }
- 检测并触发吸附:
在上述脚本中添加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
相关产品推荐
相关产品推荐

