Raycast 使用相同的脚本击中多个对象但只减少被击中对象的值?
Raycast to hit mutiple objects with the same script but only decrease the value of the object being hit?
我有 4 个对象,每个对象都附有 planhealth 脚本,因为现在这只会影响其中一个,我尝试为每个游戏对象制作 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;
}
首先,不要将其附加到每个游戏对象。仅将其附加到一个游戏对象。也许,一个空的游戏对象。
您当前正在使用 Raycast
函数重载:
bool Raycast(Vector3 origin, Vector3 direction, float maxDistance, int layerMask);
而且这无法确定点击了哪个GameObject。如果单击对象,它将简单地 return 为真。
您必须使用函数 Raycast
之一,它给出 RaycastHit
作为输出。你可以从这里找到哪个对象被击中。
bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance, int layerMask);
您可以按名称查看命中的游戏对象:
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.
我有 4 个对象,每个对象都附有 planhealth 脚本,因为现在这只会影响其中一个,我尝试为每个游戏对象制作 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;
}
首先,不要将其附加到每个游戏对象。仅将其附加到一个游戏对象。也许,一个空的游戏对象。
您当前正在使用 Raycast
函数重载:
bool Raycast(Vector3 origin, Vector3 direction, float maxDistance, int layerMask);
而且这无法确定点击了哪个GameObject。如果单击对象,它将简单地 return 为真。
您必须使用函数 Raycast
之一,它给出 RaycastHit
作为输出。你可以从这里找到哪个对象被击中。
bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance, int layerMask);
您可以按名称查看命中的游戏对象:
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.