在 Unity 中离开摄像机视图后销毁游戏对象
Destroy a game object after it leaves the view of the camera in Unity
我目前正在 Unity 中制作一款游戏,我试图在预制件的克隆离开摄像机视野后,仅在他们首先进入摄像机视野后才销毁它们.但是,出于某种原因,我的代码会在实例化后立即销毁克隆。有谁知道我该如何解决这个问题?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InteractControl : MonoBehaviour
{
Rigidbody2D rb;
GameObject target;
float moveSpeed;
Vector3 directionToTarget;
// Use this for initialization
void Start()
{
target = GameObject.Find("White Ball");
rb = GetComponent<Rigidbody2D>();
moveSpeed = 3f;
}
// Update is called once per frame
void Update()
{
MoveInteract();
OnBecameVisible();
}
/*void OnTriggerEnter2D(Collider2D col)
{
switch (col.gameObject.tag)
{
case "ColouredBall Highress":
BallSpawnerControl.spawnAllowed = false;
Destroy(gameObject);
target = null;
break;
case "Star":
Collision collision = new Collision();
break;
}
} */
void MoveInteract()
{
if (target != null)
{
if(ScoreScript.scoreValue > 3)
{
directionToTarget = (target.transform.position - transform.position).normalized;
rb.velocity = new Vector2(directionToTarget.x * moveSpeed,
directionToTarget.y * moveSpeed);
}
else
{
directionToTarget = new Vector3(0, -1, 0);
rb.velocity = new Vector2(0, directionToTarget.y * moveSpeed);
}
}
else
rb.velocity = Vector3.zero;
}
void OnBecameInvisible()
{
if (gameObject.tag == "ColouredBall Highress")
{
Destroy(gameObject);
}
if (gameObject.tag == "Star")
{
Destroy(gameObject);
}
}
void OnBecameVisible()
{
if (gameObject.tag == "ColouredBall Highress" || gameObject.tag == "Star")
{
OnBecameInvisible();
}
}
}
我试图通过首先要求对象变得可见来解决问题,以便它们能够在相机视野之外时被摧毁。简而言之,我正在寻找 OnBecameInvisible 的 OnExit collider 版本。我想我可以让整个屏幕成为一个对撞机并在其上使用 Exit 对撞机。有人可能也知道我如何制作覆盖相机视图的对撞机吗?
您每帧都调用 OnBecameVisible,所以基本上对象在第一帧就自行销毁。从更新中删除它应该可以解决问题,Unity 已经为您调用了它。
因为你从OnBecameVisible
调用了OnBecameInvisible()
。因此,当它们可见时,它们就会被摧毁。
您的代码还做了很多多余的事情,您还从 Update
等调用 OnBecameVisible
您可以简单地使用它:
Renderer m_Renderer;
void Start()
{
m_Renderer = GetComponent<Renderer>();
}
void Update()
{
//It means object is NOT visible in the scene if it is false is visible
if (!m_Renderer.isVisible)
{
Destroy(gameObject);
}
}
请注意: Destroying/Instantiating 对象不是这种情况下的最佳实践。因为它会导致垃圾收集器工作量很大,而且代价高昂,并且会减慢您的游戏速度。您可以改用 object pooling。它基本上将不在视野中的对象放入对象池中,您保留它们的引用并可以在以后使用它们。因此,它比您的方法成本更低。
我目前正在 Unity 中制作一款游戏,我试图在预制件的克隆离开摄像机视野后,仅在他们首先进入摄像机视野后才销毁它们.但是,出于某种原因,我的代码会在实例化后立即销毁克隆。有谁知道我该如何解决这个问题?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InteractControl : MonoBehaviour
{
Rigidbody2D rb;
GameObject target;
float moveSpeed;
Vector3 directionToTarget;
// Use this for initialization
void Start()
{
target = GameObject.Find("White Ball");
rb = GetComponent<Rigidbody2D>();
moveSpeed = 3f;
}
// Update is called once per frame
void Update()
{
MoveInteract();
OnBecameVisible();
}
/*void OnTriggerEnter2D(Collider2D col)
{
switch (col.gameObject.tag)
{
case "ColouredBall Highress":
BallSpawnerControl.spawnAllowed = false;
Destroy(gameObject);
target = null;
break;
case "Star":
Collision collision = new Collision();
break;
}
} */
void MoveInteract()
{
if (target != null)
{
if(ScoreScript.scoreValue > 3)
{
directionToTarget = (target.transform.position - transform.position).normalized;
rb.velocity = new Vector2(directionToTarget.x * moveSpeed,
directionToTarget.y * moveSpeed);
}
else
{
directionToTarget = new Vector3(0, -1, 0);
rb.velocity = new Vector2(0, directionToTarget.y * moveSpeed);
}
}
else
rb.velocity = Vector3.zero;
}
void OnBecameInvisible()
{
if (gameObject.tag == "ColouredBall Highress")
{
Destroy(gameObject);
}
if (gameObject.tag == "Star")
{
Destroy(gameObject);
}
}
void OnBecameVisible()
{
if (gameObject.tag == "ColouredBall Highress" || gameObject.tag == "Star")
{
OnBecameInvisible();
}
}
}
我试图通过首先要求对象变得可见来解决问题,以便它们能够在相机视野之外时被摧毁。简而言之,我正在寻找 OnBecameInvisible 的 OnExit collider 版本。我想我可以让整个屏幕成为一个对撞机并在其上使用 Exit 对撞机。有人可能也知道我如何制作覆盖相机视图的对撞机吗?
您每帧都调用 OnBecameVisible,所以基本上对象在第一帧就自行销毁。从更新中删除它应该可以解决问题,Unity 已经为您调用了它。
因为你从OnBecameVisible
调用了OnBecameInvisible()
。因此,当它们可见时,它们就会被摧毁。
您的代码还做了很多多余的事情,您还从 Update
等调用 OnBecameVisible
您可以简单地使用它:
Renderer m_Renderer;
void Start()
{
m_Renderer = GetComponent<Renderer>();
}
void Update()
{
//It means object is NOT visible in the scene if it is false is visible
if (!m_Renderer.isVisible)
{
Destroy(gameObject);
}
}
请注意: Destroying/Instantiating 对象不是这种情况下的最佳实践。因为它会导致垃圾收集器工作量很大,而且代价高昂,并且会减慢您的游戏速度。您可以改用 object pooling。它基本上将不在视野中的对象放入对象池中,您保留它们的引用并可以在以后使用它们。因此,它比您的方法成本更低。