在游戏对象离开Unity中的相机视图后对其进行销毁

时间:2019-03-13 16:25:42

标签: unity3d game-development collider

我目前正在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对撞机版本。我想我可以使整个屏幕成为对撞机,并在其上使用Exit collider。有人可能还知道我怎么做一个可以覆盖相机视野的对撞机吗?

2 个答案:

答案 0 :(得分:2)

这是因为您从OnBecameInvisible()呼叫OnBecameVisible。因此,当它们可见时,它们会被破坏。

您的代码还在做很多多余的事情,您还可以从OnBecameVisible等中调用Update

您可以简单地使用它:

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

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

答案 1 :(得分:1)

您在每个帧都调用OnBecameVisible,因此基本上是对象销毁自身的第一个帧。从Update删除它应该可以解决问题,Unity已经为您调用了它。