我有4个对象,每个对象附有planthealth脚本,因为它现在只影响其中一个,我已经尝试为每个游戏对象制作4个单独的脚本,但最终得到错误,不知道为什么。我假设这是一个非常糟糕的方式来实现这一点,所以如果有人可以帮我弄清楚如何使光线投射区分不同的对象,以便只有当光线击中特定对象时值才会增加。
void Ray()
{
Vector2 downward = rayOrigin.transform.TransformDirection(Vector2.down) * rayDistance;
Debug.DrawRay(rayOrigin.transform.position, downward, Color.green);
if (Physics.Raycast(rayOrigin.transform.position, rayOrigin.TransformDirection(Vector2.down), rayDistance, plant))
{
print("wew");
Plant_Health plant = plantRef.GetComponent<Plant_Health>();
plant.health += 0.25f;
}
答案 0 :(得分:3)
首先,不要将它附加到每个GameObject。仅将其附加到一个GameObject。也许,一个空的GameObject。
您当前正在使用Raycast
函数重载:
bool Raycast(Vector3 origin, Vector3 direction, float maxDistance, int layerMask);
并且无法确定单击哪个GameObject。如果单击一个对象,它将返回true。
您必须使用其中一个函数Raycast
,它将RaycastHit
作为输出。你可以从这里找到被击中的对象。
bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance, int layerMask);
您可以查看按名称命名的GameObjects:
RaycastHit hit;
Vector2 downward = rayOrigin.transform.TransformDirection(Vector2.down) * rayDistance;
Debug.DrawRay(rayOrigin.transform.position, downward, Color.green);
if (Physics.Raycast(rayOrigin.transform.position, rayOrigin.TransformDirection(Vector2.down),
out hit, rayDistance, plant))
{
if (hit.collider.name == "object1")
{
}
else if (hit.collider.name == "object2")
{
}
else if (hit.collider.name == "object3")
{
}
else if (hit.collider.name == "object4")
{
}
}
按标签:
if (hit.collider.CompareTag("tag1"))
{
}
else if (hit.collider.CompareTag("tag2"))
{
}
else if (hit.collider.CompareTag("tag3"))
{
}
else if (hit.collider.CompareTag("tag4"))
{
}
按图层:
if (hit.collider.gameObject.layer == yourLayerNum)
或者通过变换,游戏对象或对撞机的实例。您的选择方式是您的选择,但我建议您使用 TAGS 。