我有一个基于磁贴的游戏。我将塔作为瓷砖的儿童对象。我希望能够通过光线投射检测塔上的鼠标点击,而不是瓷砖。瓷砖和塔都有2d箱式对撞机。我可以检测到瓷砖上的点击,但是光线投射不会检测到塔上的点击。我怎么解决这个问题。感谢。
这是我的光线投射代码:
if (Input.GetMouseButtonDown(0))
{
Ray ray = camera.ScreenPointToRay(Input.mousePosition);
ray.origin = camera.transform.position;
RaycastHit2D hit = Physics2D.Raycast(camera.transform.position, -Vector2.up, 50, 8);
if (hit.collider != null && !EventSystem.current.IsPointerOverGameObject())
{
Debug.Log(hit.collider.transform.tag);
//Transform objectHit = hit.transform;
}
}
}
当我掩盖瓷砖(这里是第8层)时,我什么都没得到。虽然塔(如瓷砖)也有一个2d的盒子对撞机,但它似乎从来没有撞到过塔楼。
答案 0 :(得分:1)
Unity使用图层系统,您可以过滤出光线投影使用的图层。您可以使用它来击中特定的碰撞器,并避免其他像瓷砖/塔问题。语法(对于2d版本)是:
RaycastHit2D Raycast(Vector2 origin, Vector2 direction, float distance
= Mathf.Infinity, int layerMask = DefaultRaycastLayers, float minDepth
= -Mathf.Infinity, float maxDepth = Mathf.Infinity);
在这里,您可以看到layermask参数选择与父对象所在的图层不同的图层。然后使用检查器中的下拉菜单将子项放在不同的图层上。
您可以分别设置父级和子级游戏对象的图层。
希望有所帮助
答案 1 :(得分:1)
经过一番研究后,似乎所有对象的儿童对手都被认为属于父母。这样你就可以用较小的对撞机构建一个更复杂的对撞机,这种情况通常是需要的。仍然可以使用它的transform属性引用精确对撞机,例如:
if (hit.collider.transform != null)
{
//Execute code
}
这将特别指儿童对撞机。