Unity3d 在游戏对象离开摄像机的视野后销毁它

Unity3d 在游戏对象离开摄像机的视野后销毁它,unity3d,game-development,collider,Unity3d,Game Development,Collider,我目前正在Unity中制作一个游戏,我试图在一个预制场的克隆人离开摄像机的视野后,在他们已经进入摄像机的视野后,才能摧毁他们。然而,由于某些原因,我的代码在克隆实例化后会立即销毁它们。有人知道我如何解决这个问题吗 using System.Collections; using System.Collections.Generic; using UnityEngine; public class InteractControl : MonoBehaviour { Rigidbody2D

我目前正在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();
        }
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类交互控制:单行为
{
刚体2d rb;
游戏对象目标;
浮动速度;
矢量3指向目标;
//用于初始化
void Start()
{
target=GameObject.Find(“白球”);
rb=GetComponent();
移动速度=3f;
}
//每帧调用一次更新
无效更新()
{
MoveInteract();
OnBecameVisible();
}
/*无效OnTriggerEnter2D(碰撞的R2D列)
{
开关(col.gameObject.tag)
{
案例“彩色球女高音”:
BallSpawnerControl.spawnAllowed=false;
摧毁(游戏对象);
target=null;
打破
案例“Star”:
碰撞=新的碰撞();
打破
}
} */
void MoveInteract()
{
如果(目标!=null)
{
如果(ScoreScript.scoreValue>3)
{ 
directionToTarget=(target.transform.position-transform.position).normalized;
rb.velocity=新矢量2(方向到目标x*移动速度,
方向至目标y*移动速度);
}
其他的
{
directionToTarget=新向量3(0,-1,0);
rb.velocity=新矢量2(0,方向到目标y*移动速度);
}
}
其他的
rb.速度=矢量3.0;
}
void onbecame隐身()
{
如果(gameObject.tag==“彩色球女高音”)
{
摧毁(游戏对象);
}
如果(gameObject.tag==“Star”)
{
摧毁(游戏对象);
}
}
void OnBecameVisible()
{
if(gameObject.tag==“彩色球女高音”| | gameObject.tag==“星形”)
{
onbecame隐身();
}
}
}

我试图解决这个问题,首先要求物体变得可见,这样当它们不在摄像机的视野内时就可以被破坏。简而言之,我正在寻找OnBecameInvisible上的OnExit对撞机版本。我想我可以把整个屏幕做成一个对撞机,并在它上面使用退出对撞机。有人可能也知道我如何制作一个覆盖摄影机视图的对撞机吗?

您正在调用BecameVisible每一帧,因此基本上第一帧对象会破坏自身。从更新中删除它应该可以做到这一点,Unity已经为您调用了它。

这是因为您从
OnBecameVisible
中调用
OnBecameVisible()
。因此,当它们可见时,它们就会被摧毁

此外,您的代码正在做许多冗余的事情,您也可以从
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);
    }        
}
渲染器m_渲染器;
void Start()
{
m_Renderer=GetComponent();
}
无效更新()
{
//如果对象为false,则表示该对象在场景中不可见
如果(!m_Renderer.isVisible)
{
摧毁(游戏对象);
}        
}

请注意:在这种情况下,销毁/实例化对象不是最佳做法。因为它会导致垃圾收集器大量工作,而且价格昂贵,并且会降低游戏速度。您可以使用。它基本上将不在视野中的对象放入对象池,您保留它们的引用,以后可以使用它们。因此,它的成本比您的方法要低。

但OnBecomeVisible应该要求对象首先处于可见状态,然后才能进入不可见状态。我该如何解决这个问题?@MauriceBekambo您的代码中没有跟踪“我以前是可见的”。现在您正在从
Update
调用
OnBecameVisible
(而不是让Unity为您调用它!),这个方法所做的就是调用
OnBecameVisible
,所做的就是销毁对象。注意
OnBecameVisible()
本身就是从
Update()
调用的。是的,我不明白为什么。