我正在使用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");
}
}
答案 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
}
}
请记住,这是使用对象的位置。如果你的物体很大,那么位置可能在外面而一些边缘在里面。最好的方法是检查网格的每个顶点。但是如果你有一个复杂的网格物体,那可能会花费很多,如果你处理一个立方体那么可能。