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

3
我在Unity中使用LineRenderer表示RayCast,它看起来像一束激光。我希望这个激光能够移动与之碰撞的物体,使得物体跟随Raycast的碰撞点hit.point移动。
我的代码不起作用,因为我将这些游戏对象移动到了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个回答

4
在Unity检视器中,您可以选择对象并将层更改为“2:忽略射线投射”。这将使射线投射忽略该对象并穿过它。

我希望这个物体可以被激光击中时检测到,因为这个激光可以移动物体。例如,如果你击中一个“椅子”物体,那么激光会通过击中点将椅子移动,直到关闭激光。 - karamazovbros
那么椅子是固定距离于激光的起点还是会根据你瞄准的位置前后移动呢? - TechnoRazor
椅子(以及其他物体)可以在任何距离处。假设它被某种“牵引光束”击中,那么激光可以将其移动到受击范围内的任何位置。 - karamazovbros
你能解释一下 chair.transform.parent = hit.transform; 这行代码的作用是什么吗? - TechnoRazor
哎呀,对于这个问题应该是chair.transform.position。我试图使用另一个对象的变换来移动它。非常抱歉,我会将其更改为chair.transform.position = hit.point。 - karamazovbros
显示剩余2条评论

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);
    }
}

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