0

我正在尝试创建一个扫雷+答题器/空闲游戏以进行练习。目前,我无法让点击正常工作。我通过代码生成了所有对象,这意味着它们都是相同的预制件,但位于不同的位置。当我单击它们时,所有这些代码都将激活,并且所有图块都变为打开状态。我不确定我是否在这里使用了错误的点击功能,因为我知道还有一个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 的东西,但我真的需要更多关于它是如何工作的解释(如果这是解决方案的话)。

4

1 回答 1

1

如果TileClick脚本组件附加到您的预制件,那么对于您实例化的每个图块,您都会TileClick附加一个相应的组件。

当您单击时,所有这些块会同时检测到输入,并且它们中的每一个都会调用Instantiate,但与transform.position发出调用的图块对应的是一个。这就是为什么看起来所有图块似乎同时打开的原因,因为实际上,每次单击时,您都会在每个图块上实例化一个“打开”图块。

您应该将所有用户输入代码保存在一个单独的MonoBehaviour中,并将其附加到场景中的一个空白处GameObject。为了检测命中,您应该将一个2DCollider组件附加到您的瓷砖预制件(您可以根据瓷砖的形状决定类型),然后只需在您的用户输入代码中使用简单的 RayCast 来实例化一个“打开”瓷砖命中发生的位置:

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

于 2017-06-26T13:08:33.510 回答