如何在运行时以统一的方式捕捉两个对象?

时间:2017-08-01 11:12:25

标签: c# unity3d unity5 mesh-collider

this is the 3d model i wanted to connect another model like this to its silver connectors on top side and also another model to right side(so do help me to snap it)我想知道如何在运行时将两个3D对象拼接在一起。即在“播放”期间,用户必须能够向上,向下,向左,向右移动以与另一个对象捕捉一个对象。例如像“lego”,即。一个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;
    }
}

1 个答案:

答案 0 :(得分:0)

有许多方法可以实现这一目标。这是我提出的第一种方法。如果我们分解可能包含的内容,我们可以设置一个脚本来附加到每个可以抓住的孩子:

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个主父对象。不言而喻,您可能需要调整它以便它能够像您想要的那样专门针对您的项目执行,但希望这能让您朝着正确的方向前进。 (仅供参考我没有对此进行过测试,因此我不能保证它能够正常运行)