Unity - 当对象不在相机视图时停止调用对象

Unity - Stop invoking objects when object is out of camera view

我正在使用 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");
    }

}

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

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
    }
}

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