单击鼠标选择块
selecting blocks on mouse click
我有一款 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 中命中对象,如何解码它引用了哪个块?
我是 Unity 的新手(2 天前)但不是 gamedev 的新手。试图通过这里的团结找到我的出路。如果有人能在这里指出正确的方向,我将不胜感激。
在您的 if 块中使用 hit 参数检测哪个对象被击中,因为它具有射线碰撞的信息,例如 hit.collider.tag == "myBlock"
//通过名称检查游戏对象
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;
}
}
我喜欢你的问题。而且我想我得到了使以上 2 个答案不是你想要的关键。
通常,unity 开发人员想要制作这种块,他们会创建一个立方体并将脚本作为元素添加到其中来制作预制件。
但是,您定义块的工作更多是程序员,使用原始立方体创建 C# class。
我认为一种方法是检查方块的 position.x 和 z 以及数组中每个方块的位置。因为方块正在掉落,所以只有 y 在变化,检查 x 和 z 是解决方案。
希望得到帮助。
我有一款 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 中命中对象,如何解码它引用了哪个块?
我是 Unity 的新手(2 天前)但不是 gamedev 的新手。试图通过这里的团结找到我的出路。如果有人能在这里指出正确的方向,我将不胜感激。
在您的 if 块中使用 hit 参数检测哪个对象被击中,因为它具有射线碰撞的信息,例如 hit.collider.tag == "myBlock"
//通过名称检查游戏对象
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;
}
}
我喜欢你的问题。而且我想我得到了使以上 2 个答案不是你想要的关键。
通常,unity 开发人员想要制作这种块,他们会创建一个立方体并将脚本作为元素添加到其中来制作预制件。
但是,您定义块的工作更多是程序员,使用原始立方体创建 C# class。
我认为一种方法是检查方块的 position.x 和 z 以及数组中每个方块的位置。因为方块正在掉落,所以只有 y 在变化,检查 x 和 z 是解决方案。
希望得到帮助。