Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单击鼠标选择块_C#_Unity3d_Unity5 - Fatal编程技术网

C# 单击鼠标选择块

C# 单击鼠标选择块,c#,unity3d,unity5,C#,Unity3d,Unity5,我有一个2.5d类型的游戏,带有下落方块(如俄罗斯方块)和正交投影设置(我已经将我的游戏设置为“3D”类型) 我定义了这样一个块: public class Block{ public Block () { this.gameObj = GameObject.CreatePrimitive (PrimitiveType.Cube); } public GameObject gameObj; } 我有一个BoardMgr(GameObj+纯脚本组件

我有一个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");
            }
        }
当我点击一个块时,我确实看到控制台上的
射线命中块
,但是,我如何访问哪个“块”对象被击中?从RayCastHit,hit object,我如何解码它引用的块


我是unity的新手(2天大),但对gamedev并不陌生。试图在这里找到我的统一之路。如果有人能在这里为我指出正确的方向,我将不胜感激。

在if块中,使用hit参数来检测哪个对象被击中,因为它包含光线碰撞的信息,例如hit.collider.tag==“myBlock”

在if块中,使用hit参数来检测哪个对象被击中,因为它有光线碰撞的信息,例如hit.collider.tag==“myBlock”

//按名称检查游戏对象

if (hit.collider.name == "brainydexter")
{
Debug.Log("Hit: "+hit.collider.name);
}
//按标签检查游戏对象

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

}
//按游戏对象实例检查游戏对象

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;
  }
}
for(int i=0;i
//按名称检查游戏对象

if (hit.collider.name == "brainydexter")
{
Debug.Log("Hit: "+hit.collider.name);
}
//按标签检查游戏对象

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

}
//按游戏对象实例检查游戏对象

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;
  }
}
for(int i=0;i
我喜欢你的问题。我想我找到了使以上两个答案不是你想要的答案的关键

通常,unity开发者想要制作这种块,他们将创建一个多维数据集,并将脚本作为元素添加到其中以制作一个预置

然而,定义一个块需要更多的程序员,用一个基本立方体创建一个C类。

我认为一种方法是检查块的位置。x和z与数组中每个块的位置一致。因为块在下降,所以只有y在变化,检查x和z是一种解决方案


希望能得到帮助。

我喜欢你的问题。我想我找到了使以上两个答案不是你想要的答案的关键

通常,unity开发者想要制作这种块,他们将创建一个多维数据集,并将脚本作为元素添加到其中以制作一个预置

然而,定义一个块需要更多的程序员,用一个基本立方体创建一个C类。

我认为一种方法是检查块的位置。x和z与数组中每个块的位置一致。因为块在下降,所以只有y在变化,检查x和z是一种解决方案



希望有帮助。

点击.collider.gameObject()
@但那会给我一个游戏对象。在我的例子中,它封装在
类型中。我想获得块类型引用,因为我需要从该块类型对象提取其他信息。你不能通过声明你的
Block
class Block:GameObject
来解决这个问题吗?我可以。但是,如何获取对块对象的引用?静态施法?是的,我认为你应该能够做到
Block Block=(Block)hit.collider.gameObject()
hit.collider.gameObject()
@但那会给我一个游戏对象。在我的例子中,它封装在
类型中。我想获得块类型引用,因为我需要从该块类型对象提取其他信息。你不能通过声明你的
Block
class Block:GameObject
来解决这个问题吗?我可以。但是,如何获取对块对象的引用?静态施法?是的,我认为你应该能够做到
Block Block=(Block)hit.collider.gameObject()请查看我正在定义的块类。我需要一个关于哪个区块对象被击中的引用。哦,好的,我明白了,所以你可以使用hit colllider游戏对象的GetInstanceID并运行数组的for循环来检查哪个区块被击中。请看我定义的区块类。我需要一个关于哪个块对象被击中的参考。哦,好的,我明白了,所以你可以使用命中colllider游戏对象的GetInstanceID,运行数组的for循环来检查哪个被击中。我知道它击中的对象的类型。它们都是块类型。我正在试图确定哪个块对象引用被击中。@brainydexter-似乎大多数人都懒得阅读实际问题。修改了答案。我读了问题和代码。他的评论实际上正确地解释了他真正想要的东西。除了循环所有的块,还有更好的方法来识别正确的块吗?我有相当多的块,每次我点击(我预计会很多),这将是一个相当昂贵的操作@伐木工人。引用是指获取对象的实例,以便以后可以对其进行修改。如果他得到了该游戏对象的引用,他可以在以后修改它。通过引用比较对象比通过名称甚至标记比较对象要快,因为名称和标记比较都在进行字符串工作,这很慢。参考示例:
GameObject newGameObj=oldGameOBject
。现在,oldGameObject引用被获取并保存在
newGameObj
reference中。你