在鼠标单击上选择块

时间:2016-04-04 06:23:53

标签: c# unity3d unity5

我有一个2.5d类型的游戏,下降的块(如俄罗斯方块)和正投影设置(我将我的游戏设置为" 3D"类型)。

我已经定义了这样一个块:

public class Block{
    public Block () {
        this.gameObj = GameObject.CreatePrimitive (PrimitiveType.Cube);
    }
        public GameObject gameObj;
}

我有一个BoardMgr(GameObj +仅脚本组件),我在这里生成这些块并将它们存储在一个数组中:

public class BoardMgr : MonoBehaviour {
    protected Block[] blocks;
    protected Block[,] board;
}

BoardMgr::update()中,区块一个接一个地落下(像俄罗斯方块)。现在,我想弄清楚当我点击一个块时,它是哪个块对象。这是点击检测代码:

if (Input.GetMouseButtonDown(0)) {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast (ray, out hit)) {
                Debug.Log ("Ray hit block");
                // How do I find which block got hit here ?
            } else {
                Debug.Log ("Ray missed block");
            }
        }

当我点击一个块时,我确实在控制台上看到ray hit block,但是,我如何访问哪个" Block"对象受到了打击?从RayCastHit,hit对象,我如何解码它引用哪个Block?

我是团结的新手(2天大)但不是gamedev的新手。试图通过统一找到我的方式。如果有人能指出我正确的方向,我会很感激。

3 个答案:

答案 0 :(得分:2)

//按名称检查GameObject

if (hit.collider.name == "brainydexter")
{
Debug.Log("Hit: "+hit.collider.name);
}

//按标签检查GameObject

if (hit.collider.CompareTag("brainydexterTag"))
{

}

//通过GameObject实例检查GameObject

GameObject otherGameObject = gameObject;
if (hit.collider.gameObject == otherGameObject)
{

}

编辑:这就是你需要的

使用数组循环遍历块,然后比较游戏对象实例。

for (int i = 0; i < blocks.Length; i++)
{
  if (hit.collider.gameObject == blocks[i].gameObj)
  {
    Debug.Log("Block hit is " + blocks[i].gameObj);
    break;
  }
}

答案 1 :(得分:1)

在你的if块中使用命中参数来检测被击中的对象,因为它具有光线与光线相撞的信息,例如hit.collider.tag ==&#34; myBlock&#34;

答案 2 :(得分:0)

我喜欢你的问题。而且我认为我得到了上述2个答案不是你想要的关键。

通常,统一开发人员想要制作这种块,他们将创建一个多维数据集并添加脚本作为元素来制作预制件。

但是,您定义块的方法更多是程序员,使用原始多维数据集创建C#类。

我认为一种方法是检查块的位置x和z以及阵列中每个块的位置。因为块正在下降,然后只是y正在改变,检查x和z是一个解决方案。

希望帮助。