- Home /
OnBecameVisible from a Specific Camera?
I'm writing a script to destroy certain game objects when the player looks at them. However, in the scene I'm working in, there are other cameras, used for things like render textures. I'm having a bit of an odd problem. Whenever the objects come into view of the main camera, they're destroyed properly, unless they're also in view of another camera, in which case they don't disappear.
This is my script at the moment.
public class DestroyOnVisible : MonoBehaviour {
float timeRemaining = 0.25f;
public bool visible = false;
void Start()
{
}
void Update ()
{
if (visible)
{
timeRemaining -= Time.deltaTime;
}
if (timeRemaining <= 0f)
{
Destroy(transform.parent.gameObject);
}
}
void OnBecameVisible ()
{
if (Camera.current.name == "FirstPersonCharacter")
{
visible = true;
}
}
void OnBecameInvisible ()
{
visible = false;
}
}
I've tried several other approaches, but all of them either had the same problem, destroyed the objects even when they were in view of just the render texture cameras, or destroyed them when the main camera was looking in their direction, even if it couldn't see them, which is not what I want either. Any help would be greatly appreciated.
Update:
I made some changes to the script using the "renderer extensions" IsVisibleFrom, and it's ALMOST working, but now I have a different problem. I'd like them to still be destroyed if viewed through a transparent object. I'm trying to use a layer mask to do this, but so far, I've been having issues. Either they don't get destroyed at all, always get destroyed when looking in their direction, or don't get destroyed only when viewed through an object on the "glass" layer. The first thing I tried was inverting the mask, but that made it so that they're never destroyed.
This is my new script.
public class DestroyOnVisible : MonoBehaviour {
float timeRemaining = 0.25f;
public bool visible = false;
public Renderer inVision;
public Transform player;
LayerMask mask;
void Start()
{
inVision = GetComponent<Renderer>();
LayerMask mask = LayerMask.GetMask("Glass");
}
void Update ()
{
CheckVisible();
if (visible)
{
timeRemaining -= Time.deltaTime;
}
if (timeRemaining <= 0f)
{
Destroy(transform.parent.gameObject);
}
}
void CheckVisible ()
{
player = GameObject.FindGameObjectWithTag("MainCamera").transform;
if (inVision.IsVisibleFrom(Camera.main))
{
if (Physics.Linecast(transform.position, player.position, mask))
{
visible = false;
Debug.Log("Obscured");
}
else
{
visible = true;
Debug.Log("Visible");
}
}
}
}
Your answer
Follow this Question
Related Questions
Material array not working, 2 Answers
Player launches into air when hitting steep slopes 0 Answers
Unitywebrequest returns fmod error 1 Answer
Classes in a main class 2 Answers