如何将盒子放到鼠标位置?

时间:2018-11-25 15:53:47

标签: c# unity3d

我正在尝试学习团结,并做了自己的第一场比赛,一开始就陷入困境。第一个想法是将一个盒子(立方体)放到鼠标位置。有很多关于获取鼠标位置的视频和帖子,我尝试使用它们。我的问题是,我得到的鼠标位置是相机的位置,而不是平面。 如您所见,这有点用,但并没有落到飞机上。 https://prnt.sc/lmrmcl

我的代码:

     void Update()
{
    Wall();
}

void Wall()
{
    if (Input.GetMouseButtonDown(0))
    {
        if (Input.GetMouseButtonDown(0))
        {
            wall = GameObject.CreatePrimitive(PrimitiveType.Cube);
            Rigidbody wallsRigidbody = wall.AddComponent<Rigidbody>();

            wall.transform.localScale = new Vector3(0.6f, 0.6f, 0.6f);
            wallsRigidbody.mass = 1f;
            wallsRigidbody.angularDrag = 0.05f;
            wallsRigidbody.useGravity = true;
            wallsRigidbody.constraints = RigidbodyConstraints.FreezeRotation;

            wall.transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition);

        }
        Debug.Log(Camera.main.ScreenToWorldPoint(Input.mousePosition));
        BoxCollider wallsCollider = wall.AddComponent<BoxCollider>();
        wallsCollider.size = new Vector3(1f, 1f, 1f);
    }
}

我应该如何更改代码以获得正确的位置?

1 个答案:

答案 0 :(得分:0)

这不是您问题的直接答案,但我希望它仍然可以将您带到您需要去的地方。

预制件是您的朋友!我强烈建议在这里利用它们,而不是直接在代码中构造多维数据集。

但是首先,请确保其他所有设置都正确。继续并在编辑器中手动构建一个多维数据集,并确保当您单击Play时,它会按预期下降。只要它具有刚体,对撞机并且您已启用重力(默认情况下为true),就应该如此。

如果可行,请将该多维数据集从Hierarchy视图拖动到Project视图的文件夹中。这将创建一个预制件。现在,您可以从Hierarchy视图中删除多维数据集。

更新脚本以拥有一个公共GameObject字段,例如

public GameObject cubeToCreate;

然后,在“检查器”窗格中,对于附加了该脚本的任何游戏对象,您都应该获得一个新字段“要创建的多维数据集”。将您的预制立方体拖动到该插槽中。

最后...将您的代码更新为wall = Instantiate(cubeToCreate)。您仍然需要更新位置,但是您应该能够删除上面具有的其余初始化逻辑,例如设置质量和阻力。


对于实际问题,与我有关的第一件事是您打算如何将2d鼠标单击变成3d点?对于“进入”屏幕的轴...游戏应如何确定该值?

Camera.main.ScreenToWorldPoint接受一个Vector3,但是您要传递给它一个Vector2(Input.mousePosition,它被转换为az = 0 Vector3),所以指向相机的点是0个单位-所以在与相机相交的平面。

我还没有这样做,但是我认为您需要做某种raycasting。也许创建一个不可见的2d平面,上面有一个对撞机,然后从相机投射物理射线,只要它撞击该平面,这就是您要创建立方体的地方。尽管This post面向2D,但有一些提示。这也可能太过分了-如果创建一个新的Vector3并使用鼠标位置对其进行初始化,则可以将z坐标设置为所需的任意值,但是创建多维数据集的距离为距的距离。相机,这不是最好的主意。

希望这会有所帮助。