我正在尝试学习团结,并做了自己的第一场比赛,一开始就陷入困境。第一个想法是将一个盒子(立方体)放到鼠标位置。有很多关于获取鼠标位置的视频和帖子,我尝试使用它们。我的问题是,我得到的鼠标位置是相机的位置,而不是平面。 如您所见,这有点用,但并没有落到飞机上。 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);
}
}
我应该如何更改代码以获得正确的位置?
答案 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坐标设置为所需的任意值,但是创建多维数据集的距离为距的距离。相机,这不是最好的主意。
希望这会有所帮助。