为什么在销毁“摄影机”视图中的一个游戏对象时,我的代码每次生成两个游戏对象(而不是一个)?

时间:2019-07-01 16:43:50

标签: c# unity3d

我自己编写了用于飞禽游戏的脚本(学习统一脚本的最佳方法)。 为了优化性能,我想一次只生成5个Obstacle gameObjects(ObjectsOnScreen)。所以我编写了一个代码来在离玩家16个单位的情况下销毁gameObject,并且编写了一个少于5个ObjectsOnScreen的新障碍物。 。 但是我的代码破坏了一个障碍物,同时生成了两个对象(而不是一个),因此最终对象将随着时间的推移而增加,并保持不变。 请告诉我我的代码中的错误。谢谢。

 //GameManager script::

    public class GameManager : MonoBehaviour
{

static public int ObjectsOnScreen = 0;
public float poleDistance;
public int gapWidth;
static public bool reset=false;
float x = 8;
int gap;
public GameObject obstacle;
    void FixedUpdate()
    {
        if(reset)
        {
            UnityEngine.SceneManagement.SceneManager.LoadScene(0);
        }
        if(ObjectsOnScreen<5)
        {
            gap = Random.Range(-6, 6);
            GenerateObstacle(x, gap);
            x += poleDistance;
            Debug.Log("gap = " + gap);
            ObjectsOnScreen++;
        }
    }

    void GenerateObstacle(float x , float gap)
    {
        GameObject Top = Instantiate(obstacle, new Vector3(x, 8, 0) , Quaternion.identity);
        GameObject Bottom = Instantiate(obstacle, new Vector3(x, -8, 0), Quaternion.identity);
        Top.transform.localScale = new Vector3(1, (8 - gap)-gapWidth, 1);
        Bottom.transform.localScale = new Vector3(1, -(8 + gap)+gapWidth, 1);
    }
}

//Obstacle Script::

public class ObstacleScript : MonoBehaviour
{
    GameObject player;
    void Awake()
    {
        player = GameObject.Find("Player");
    }

    void FixedUpdate()
    {

        if ((transform.position.x - player.transform.position.x) <= -16)
        {
            GameManager.ObjectsOnScreen--;
            Destroy(gameObject);
        }
    }
    private void OnCollisionEnter2D(Collision2D collision)
    {
        PlayerScript player = collision.gameObject.GetComponent<PlayerScript>();
        if(player!=null)
        {
            GameManager.reset = true;
        }
    }
}

1 个答案:

答案 0 :(得分:3)

您正在GenerateObstacle函数中调用两次实例化,该函数当然将实例化两个对象(而不是一个对象)...

GameObject Top = Instantiate(obstacle, new Vector3(x, 8, 0) , Quaternion.identity);
GameObject Bottom = Instantiate(obstacle, new Vector3(x, -8, 0), Quaternion.identity);

但是您正在做ObjectsOnScreen++,它只会递增1。然后,两个障碍物将自己删除,从而有效地减少了两次。

您可能应该增加两个ObjectsOnScreen += 2才能获得准确的计数。