Уничтожьте игровой объект после того, как он покинет вид камеры в Unity - PullRequest
0 голосов
/ 13 марта 2019

В настоящее время я делаю игру в 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();
        }
    }
}

Я пытался решить эту проблему, сначала попросив объекты стать видимыми, чтобы они могли разрушаться, когда они находятся вне поля зрения камеры.,Короче я ищу версию коллайдера OnExit для OnBecameInvisible.Я думаю, я мог бы сделать весь экран коллайдером и использовать на нем выходной коллайдер.Кто-то может также знать, как я мог бы сделать коллайдер, который покрывает вид камеры?

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Это потому, что вы звоните 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);
    }        
}

Обратите внимание, что: Уничтожение / создание объектов - не лучшая практика в этих обстоятельствах. Потому что это заставляет сборщик мусора работать много, и это дорого и может замедлить вашу игру. Вместо этого вы можете использовать пул объектов . Он в основном помещает объект, который не находится в поле зрения, в пул объектов, и вы сохраняете их ссылки и можете использовать их позже. Следовательно, это дешевле, чем ваш метод.

1 голос
/ 13 марта 2019

Вы вызываете OnBecameVisible каждый кадр, поэтому в основном первый кадр, который объект разрушает сам.Удаление из Обновления должно помочь, Unity уже называет это для вас.

...