Unity - 当对象超出摄像机视图时停止调用对象

时间:2016-02-25 18:06:27

标签: android unity3d unityscript unity3d-2dtools

我正在使用Unity开发一款Android游戏,在我的游戏中,我实例化的是在相机可见的x方向移动的物体,当它们离开相机视图时,它们被摧毁,停止减慢处理速度和记忆。它运行正常,但是当我的播放器在垂直方向上移动时,会有实例化的对象,但它们不在摄像机视图中,然后它们不会被破坏。因此,当我的对象超出相机视图时,我想停止invokeRepeating。这是仅在对象处于视图中时才有效的代码。

    public GameObject colorbar;
    public Vector2 velocity = new Vector2(-3, 0);


    void Start () {

        GetComponent<Rigidbody2D>().velocity = velocity;
        transform.position = new Vector3(transform.position.x, transform.position.y, 0);
        InvokeRepeating("CreateObstacle", 1f, 1.8f);

    }

    // Update is called once per frame
    void Update () {

    }
    public void OnBecameInvisible()
    {
        Destroy(colorbar);
        Debug.Log ("Color bar is Destroyed");
    }
    void CreateObstacle()
    {
        Instantiate(colorbar);
        Debug.Log ("Color bar instantiating");
    }

}

1 个答案:

答案 0 :(得分:2)

您可以在创建对象时检查渲染器是否可见:

http://docs.unity3d.com/ScriptReference/Renderer-isVisible.html

void Awake(){
   if(GetComponent<Renderer>().isVisible == false){ 
       Destroy(this.gameObject);
    }
}

但最好是在不需要的情况下避免创建,这样你就可以获得应该创建对象的点,然后转换为屏幕点:

http://docs.unity3d.com/ScriptReference/Camera.WorldToScreenPoint.html

如果值在屏幕的边界内,那么你很好。你也可以从一个位置到另一个位置进行线播,如果没有任何东西可以停止演员,那么你就可以创造出来了。

Vector3 pos = ObjectPos;
Vector3 screenPos = Camera.main.WorldToScreenPoint(pos);
if(screenPos.x > 0 && screenPos.x < Camera.main.pixelWidth && 
   screenPos.y > 0 && screenPos.y < Camera.main.pixelHeight && screenPos.z > 0)
{
    if (Physics.Linecast(pos, Camera.main.transform.position) == false){
        // Create object
    }
}

请记住,这是使用对象的位置。如果你的物体很大,那么位置可能在外面而一些边缘在里面。最好的方法是检查网格的每个顶点。但是如果你有一个复杂的网格物体,那可能会花费很多,如果你处理一个立方体那么可能。