Unity - 单击一个对象会激活其他对象
Unity - Clicking on one object activates others
我正在尝试创建一个扫雷 + 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 的东西,但我真的需要更多关于它如何工作的解释(如果那是解决方案)。
如果 TileClick
脚本组件附加到您的预制件,那么对于您实例化的每个图块,您都会附加一个相应的 TileClick
组件。
单击时,所有这些块都会同时检测到输入,并且每个块都会调用 Instantiate
,但 transform.position
是与进行调用的图块对应的那个。这就是为什么看起来所有图块同时打开的原因,因为实际上,您每次单击时都会在每个图块上实例化一个 "open" 图块。
您应该将所有用户输入代码保存在单独的 MonoBehaviour
中,并将其附加到场景中的单个空 GameObject
。为了检测命中,您应该将一个 2DCollider
组件附加到您的瓷砖预制件(您可以根据瓷砖的形状决定类型),然后只需在您的用户输入代码中使用一个简单的 RayCast 来实例化一个 "open" 命中位置的方块:
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
我正在尝试创建一个扫雷 + 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 的东西,但我真的需要更多关于它如何工作的解释(如果那是解决方案)。
如果 TileClick
脚本组件附加到您的预制件,那么对于您实例化的每个图块,您都会附加一个相应的 TileClick
组件。
单击时,所有这些块都会同时检测到输入,并且每个块都会调用 Instantiate
,但 transform.position
是与进行调用的图块对应的那个。这就是为什么看起来所有图块同时打开的原因,因为实际上,您每次单击时都会在每个图块上实例化一个 "open" 图块。
您应该将所有用户输入代码保存在单独的 MonoBehaviour
中,并将其附加到场景中的单个空 GameObject
。为了检测命中,您应该将一个 2DCollider
组件附加到您的瓷砖预制件(您可以根据瓷砖的形状决定类型),然后只需在您的用户输入代码中使用一个简单的 RayCast 来实例化一个 "open" 命中位置的方块:
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