3

这是 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;
    }
}
4

1 回答 1

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

于 2017-08-01T13:38:23.073 回答