我正在尝试创建一个Minesweeper + clicker / idle游戏进行练习。目前,我无法让点击工作正常。我通过代码在所有对象中产生,这意味着它们都是相同的预制件,但位于不同的位置。当我点击它们时,代码会激活所有这些代码,并且所有磁贴都会变为打开状态。我不确定我是否在这里使用了错误的点击功能,因为我知道还有一个OnMouseDown()
函数而不是Input.GetMouseButtonDown(0)
,但代码激活的唯一一个是第二个
public class TileClick : MonoBehaviour {
public GameObject openTile;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown(0)) {
Instantiate(openTile, transform.position, Quaternion.identity);
Object.Destroy(this.gameObject);
}
}
}
这是我的点击检测。虽然它确实检测到点击,但正如我之前所说,它会检测所有瓷砖并将其全部激活。我只希望它激活其中一个。我已经看过RayCasting的东西,但我真的需要更多解释这个东西是如何工作的(如果那是解决方案)。
答案 0 :(得分:1)
如果TileClick
脚本组件附加到预制件上,那么对于您实例化的每个图块,都会附加相应的TileClick
组件。
单击时,所有这些块同时检测到输入,并且每个块都调用Instantiate
,但transform.position
是与调用的块相对应的块。这就是为什么所有的瓷砖似乎同时打开的原因,因为事实上,你实际上是在打开一个" open"每次点击时都会在每个瓷砖上拼贴。
您应该将所有用户输入代码保存在单独的MonoBehaviour
中,并将其附加到场景中的单个空GameObject
。要检测点击,您应该将2DCollider
组件附加到您的图块预制件(您可以根据图块的形状决定类型),然后在您的用户输入代码中使用简单的RayCast来实例化& #34;开"在命中发生的位置处拼贴:
void Update () {
if (Input.GetMouseButtonDown(0)) {
RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition),
Vector2.zero);
if(hit.collider != null)
{
Instantiate(openTile,
hit.collider.gameObject.transform.position,
Quaternion.identity);
}
}
我强烈建议您了解RayCast的工作原理,因为它是一个非常有用的工具。这是一个很好的起点:https://docs.unity3d.com/ScriptReference/Physics2D.Raycast.html