如何在Unity中运行时捕捉两个对象?

4
这是我想连接另一个模型的3D模型,需要将它与顶部的银色连接器以及右侧的另一个模型拼接在一起(请帮助我吧)我想知道如何在运行时将两个3D对象拼接在一起。也就是说,在“播放”期间,用户必须能够上下、左右拖动以使一个对象与另一个对象拼接在一起。例如,就像“乐高”一样,一个3D对象应该与另一个3D对象拼接。我该如何实现这一点?
以下是我用于拖动的代码:
using System.Collections;

using UnityEngine;

public class drag : MonoBehaviour {

    Vector3 dist;
    float posX;
    float PosY;
    void OnMouseDown()
    {
        dist = Camera.main.WorldToScreenPoint(transform.position);
        posX = Input.mousePosition.x - dist.x;
        PosY = Input.mousePosition.y - dist.y;
    }
    void OnMouseDrag()
    {
        Vector3 curPos = new Vector3(Input.mousePosition.x - posX, Input.mousePosition.y - PosY, dist.z);
        Vector3 worldPos = Camera.main.ScreenToWorldPoint(curPos);
        transform.position = worldPos;
    }
}

取决于您想如何将它们拼接在一起。在特定的关节处连接它们?让它们完全处于相同的位置? - Ian H.
谷歌搜索捕捉逻辑?尝试弄清楚如何使对象相互捕捉(可能是x和z阈值)。 - bi0phaz3
@lan H. 我已经进行了编辑,请查看。我想要将另一个模型连接到其连接器的顶部,以及将另一个模型连接到连接器的右侧。请帮忙。 - Aishu
@bi0phaz3 感谢你,但很抱歉我已经搜索了一个星期,没有找到任何有效的解决方法。 - Aishu
1个回答

0

有很多方法可以实现这个目标。以下是我想到的第一种方法。如果我们分解一下可能构成一个“snap”的因素,我们就可以为每个可捕捉的子元素编写一个脚本:

1)将标签“parentblock”分配给您正在拖动的对象。
2)在父对象和可捕捉的子对象上附加触发器碰撞器。
3)当拖动的对象进入碰撞区域时,将其捕捉到父对象上。
4)存储从父对象到捕捉点的偏移量,以维持其位置。

bool snapped = false;
GameObject snapparent; // the gameobject this transform will be snapped to
Vector3 offset; // the offset of this object's position from the parent

Update()
{
    if (snapped == true)
    {
        //retain this objects position in relation to the parent
        transform.position = parent.transform.position + offset;
    }
}

void OnTriggerEnter(Collider col)
{
    if (col.tag == "parentblock")
    {
        snapped = true;
        snapparent = col.gameObject;
        offset = transform.position - snapparent.transform.position; //store relation to parent
    }
}

请记住,这只会将子对象捆绑到您拖动的1个主父对象。毋庸置疑,您可能需要调整此设置,以使其按照您的项目要求执行,但希望这能让您朝着正确的方向前进。(FYI我没有测试过这个,所以不能保证它可以立即正常工作)

是的!谢谢,请查看编辑后的问题,我已经附上了图片@ryemoss - Aishu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接