Raycast使用相同的脚本命中多个对象,但只减少被击中对象的值?

时间:2017-05-14 08:02:57

标签: c# unity3d unity5 raycasting

我有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;
    }

1 个答案:

答案 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