RaycastHit只在撞击collider时工作



我正在做一个与众不同的游戏。我制作了一条光线,用collider撞击图像并改变某些文本属性。问题是,只要我触摸屏幕,它就会检测到光线,并改变文本。我该如何解决这个问题呢?我还检查了屏幕上所有其他对象的光线投射目标。

public List<GameObject> hiddenObjects;
public Text test;
public Text click;    
GameObject[] objekti;
private RaycastHit2D result;
// Start is called before the first frame update
void Start()
{
//This is for a list that will fill with GameObjects 
objects= GameObject.FindGameObjectsWithTag("Slike");
hiddenObjects = new List<GameObject>();
for (int i = 0; i < objects.Length; i++)
{
hiddenObjects.Add(objects[i]);
}
}
// Update is called once per frame
void Update()
{
if (Input.touchCount > 0)
{
Vector2 camRay = Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position);
result = Physics2D.Raycast(camRay, (Input.GetTouch(0).position));
if (result.collider.gameObject)
{
click.text = "CLICK";                
}
//This is supposed to delete 1 object at time as it is clicked on
for (int j = 0; j < hiddenObjects.Count; j++)
{
if (hiddenObjects[j] = null)
{
hiddenObjects.RemoveAt(j);
}
} 
//Simple if statement if list is empty, print "Win"
if (hiddenObjects.Count == 0)
{
test.text = "WIN";
}
}
}

根据您提供的信息。我认为在这些代码中:

if (result.collider.gameObject)
{
click.text = "CLICK";                
}

您需要通过name属性或通过比较标签来识别被击中的对象。

为简单起见,我们按名称来做。

在Unity的左侧菜单中A.K.A "Hierarchy"假设游戏对象名为objecttodetecthiton;您可以将上面的代码更改为:

if (result.collider.gameObject.name.Equals("ObjectToDetectHitOn"))
{
click.text = "CLICK";                
}

如果你在代码中实例化游戏对象,这将不起作用,因为它们将在名称的末尾添加(Clone)。在这种情况下,您必须使用String类的. contains()方法。

最好的方法是给GameObject添加一个标签,假设你创建了一个名为"objecttodetectray"的标签。然后像这样使用代码:

if (result.collider.gameObject.CompareTag("ObjectToDetectRay"))
{
click.text = "CLICK";                
}

让我知道如果这不起作用,或者如果它是不清楚的,我会尝试进一步解释。

最新更新