Unity - 使用特定标记更改所有对象

时间:2018-04-20 16:05:40

标签: c# unity3d

我正在制作一个统一的游戏并添加了一个碰撞脚本,当我的玩家遇到一个块时它会运行。如果可能的话,我希望它选择具有特定标记的每个gameObject并禁用特定功能。例如,我的最终产品将禁用每个gameObject的attachedRigidbody中的useGravity功能,标签为" Obstacle"但是,我不确定如何将它编码为统一。我已经使我当前的代码禁用了命中实体的重力,但是我想同时为所有这些代码执行此操作。

void OnCollisionEnter (Collision collisionInfo)
{
    if (collisionInfo.collider.tag == "Obstacle")
    {
        collisionInfo.collider.attachedRigidbody.useGravity = false;
        GameManager.restartDelay = 4f;
        movement.enabled = false;
        FindObjectOfType<GameManager>().EndGame();
    }
}

对不起有任何困惑。

3 个答案:

答案 0 :(得分:1)

如果要查找具有特定标记的所有游戏对象,请使用FindGameObjectsWithTag。它返回带有上述标记的游戏对象数组。然后,它就像循环遍历数组并在每个对象上更改所需内容一样简单。

答案 1 :(得分:1)

碰撞时,找到每个带有标签的游戏​​对象并将其放入数组中,然后循环遍历数组中的每个对象并随意操作它。

void OnCollisionEnter (Collision collisionInfo)
{
    if (collisionInfo.collider.tag == "Obstacle")
    {
        GameObject[] obstacles = GameObject.FindGameObjectsWithTag("Obstacle");
        foreach(GameObject obst in obstacles)
            obst.GetComponent<RigidBody>().useGravity = false;

        GameManager.restartDelay = 4f;
        movement.enabled = false;
        FindObjectOfType<GameManager>().EndGame();
    }
}

答案 2 :(得分:0)

很简单...

您应该使用 FindGameObjectsWithTag ,记住 s 因为有多个对象。

之后,对每个项目使用 foreach 循环,然后禁用 useGravity

代码:

void OnCollisionEnter (Collision collisionInfo)
{
    if (collisionInfo.CompareTag(Obstacle))
    {
        GameObject[] allObstacles = GameObject.FindGameObjectsWithTag("Obstacle");
        foreach(GameObject obstacles in allObstacles)
            obstacles.GetComponent<RigidBody>().useGravity = false;

        GameManager.restartDelay = 4f;
        movement.enabled = false;
        FindObjectOfType<GameManager>().EndGame();
    }
}

我希望你清楚这一点。 <3

相关问题