用RayCast命中位置移动GameObject,使对象移向Raycast起始位置

时间:2018-08-30 22:06:24

标签: unity3d raycasting

我在Unity中有一个LineRenderer代表RayCast,所以它看起来像激光。我希望该激光器移动与之碰撞的对象,以便该对象遵循Raycast命中的hit.point

我的代码不起作用,因为我将这些GameObjects移到了hit.point上,这导致该对象趋向于Raycast的起点,因为自从该对象开始计算了一个新的hit.point正在移至hit.point。我知道为什么会发生这种情况,但是我不确定如何使对象随Raycast一起移动,但不会影响新的hit.point。

这是我附加在Laser GameObject上的脚本中的更新功能。 有人知道我该如何修复我的代码,以使对象随hit.point移动?

void Update()
    {
        Vector3 target = calculateDeltaVector();
        lr.SetPosition(0, palm.transform.position);
        RaycastHit hit;
        if (Physics.Raycast(palm.transform.position, target , out hit))
        {
            if (hit.collider)
            {
                lr.SetPosition(1, hit.point);
                if (hit.transform.gameObject.tag == "Chair")
                {
                    GameObject chair = hit.transform.gameObject;
                    // !!! move object to hit point, problem HERE
                    chair.transform.position = hit.point;
                    hitLock = false;
                }
            }

        }
        else lr.SetPosition(1, target * 50);
    }

2 个答案:

答案 0 :(得分:3)

在Unity Inspector中,您可以选择对象并将图层更改为“ 2:忽略射线广播”。这将使射线广播忽略该对象并对其进行检查。

答案 1 :(得分:0)

不知道,但是您的代码应该将椅子移到椅子上,这很可能会使椅子朝您走去。

您必须执行“开始和结束”光线投射移动,例如使用鼠标单击。 下面是示例

public class Mover : MonoBehaviour
{
    public Collider selectedChair;

    void Update ()
    {
        Vector3 target = calculateDeltaVector();
        lr.SetPosition(0, palm.transform.position);
        RaycastHit hit;
        if (Physics.Raycast(palm.transform.position, target , out hit))
        {
            if (hit.collider)
            {
                lr.SetPosition(1, hit.point);
                if (hit.transform.gameObject.tag == "Chair" && Input.GetMouseButton(0)) //if you want to move it you have to click mouse button first
                {
                    selectedChair = hit.collider;
                    hit.collider.enabled = false; //disable the collider of currently selected chair so it won't go towards you
                }

                if (selectedChair)
                {
                    // !!! move object to hit point, problem HERE
                    selectedChair.transform.position = hit.point;
                    hitLock = false;
                }

                if (Input.GetMouseButton(0))
                {
                    selectedChair.enabled true;
                    selectedChair = null; //release it
                }
            }

        }
        else lr.SetPosition(1, target * 50);
    }
}