Unity - 单击一个对象可激活其他对象

时间:2017-06-26 09:39:16

标签: c# click unity2d

我正在尝试创建一个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的东西,但我真的需要更多解释这个东西是如何工作的(如果那是解决方案)。

1 个答案:

答案 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