Правильное создание и уничтожение объектов

Раздел, посвящённый самому важному - скорости.

Правильное создание и уничтожение объектов

Сообщение DanDiablo 03 мар 2020, 16:47

Доброго времени суток, дамы и господа!
Я доделываю игру, там появляются и исчезают два вида объектов - птицы и яблоки.
Вот их код:

Создание птиц:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bird : MonoBehaviour
{
    [Header("Set in Inspector")]

    public GameObject leftBirdPrefab;

    public static float secondsBetweenBird = 10.0f;

    [HideInInspector]
    private GameObject _birdLeftBottom, _birdLeftTop;

    // Start is called before the first frame update

    void Awake(){
        _birdLeftBottom = GameObject.Find("BirdLeftBottom");

        _birdLeftTop = GameObject.Find("BirdLeftTop");
    }

    void LeftBirdRandom(){
        GameObject leftBird = Instantiate(leftBirdPrefab) as GameObject;

        leftBird.transform.position = Vector3.Lerp(_birdLeftBottom.transform.position, _birdLeftTop.transform.position, Random.Range(0f, 1f));

        Invoke("LeftBirdRandom", secondsBetweenBird);
    }
       

    void Start()
    {  
        Invoke("LeftBirdRandom", secondsBetweenBird);            
    }


    // Update is called once per frame
    void Update()
    {
 
    }
}
 


Движение птиц и уничтожение их за пределами экрана:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveBird : MonoBehaviour
{
    private Transform _thisTransform;

    public static float speedBird = 2.0f;

    public static float speedBirdAnimate = 1.0f;

    private float _camWidth;

    private float _camHeight;

    private Animator _moveBirdSpeed;

    // Start is called before the first frame update
    void Awake(){
        _camHeight = Camera.main.orthographicSize;
        _camWidth = _camHeight * Camera.main.aspect;
        _thisTransform = GetComponent<Transform>();
        _moveBirdSpeed = GetComponent<Animator>();
    }

    void Start()
    {
        _moveBirdSpeed.speed = speedBirdAnimate;
    }

    // Update is called once per frame
    void Update()
    {
        _thisTransform.position += new Vector3(speedBird * Time.deltaTime, 0f, 0f);

        if (this.transform.position.x > _camWidth)
        {
            Destroy(this.gameObject);
        }
       
    }
}

 


Создание яблок:

Синтаксис:
Используется csharp

private GameObject _randomApple1;

private GameObject _randomApple2;

void Awake(){

                _randomApple1 = GameObject.Find("RandomApple1");

                _randomApple2 = GameObject.Find("RandomApple2");
        }

    void Start()
    {
        //Сбрасывать яблоки раз в секунду
        Invoke("DropApple", 2f);
    }

    void DropApple(){
        int randomApplePrefab = Random.Range(0, applePrefab.Length);

        GameObject randomApple = applePrefab[randomApplePrefab];

        GameObject apple = Instantiate(randomApple) as GameObject;

        apple.transform.position = Vector3.Lerp(_randomApple1.transform.position, _randomApple2.transform.position, Random.Range(0f, 1f));
       
        Invoke("DropApple", secondsBetweenAppleDrops);
    }

 


Уничтожение яблок:

Синтаксис:
Используется csharp
public class Apple : MonoBehaviour
{
        private float _bottomY = -1f;

        void Awake()
        {

        }


    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        if (transform.position.y < _bottomY)
        {
                AudioManager.PlaySound(AudioManager.GetClips()[1]);

                if (this.gameObject.tag != "bad")
                {      
                        if (Basket.life == 0)
                        {
                                Basket.life = 0;
                                Basket.lifeGT.text = Basket.life.ToString();
                                Debug.Log("end");
                        }
                        else
                        {
                                Basket.life--;
                                Basket.lifeGT.text = Basket.life.ToString();
                        }
                }
                Destroy(this.gameObject);
        }
    }
 


На сколько я понимаю, это трудо-затрадные операции.

Вопрос. Как это сделать правильно?

Можно рабочий пример или на одном из моих скриптов?

Благодарю за внимание!
Я часть той силы, что хочет зла, но вечно совершает благо.
Аватара пользователя
DanDiablo
UNец
 
Сообщения: 17
Зарегистрирован: 03 авг 2019, 18:15
  • Сайт

Re: Правильное создание и уничтожение объектов

Сообщение Jarico 03 мар 2020, 17:47

Вместо того чтобы их создавать используя Instantiate и удалять используя Destroy добавь в скрипт яблок и птиц метод который будет сбрасывать все переменные до исходного состояния а потом просто отключай их и помещай в список чтобы потом снова использовать - это называется пул объектов (читай хабр)

Ты в место того чтобы заново создавать объекты будешь просто брать уже использованные объекты (но сброшенные до исходного состояния)
VK: _ttp://vk.com/salavan73
RakNet Client-Server Unity3D: _https://vk.cc/9xuZp8
RakNet Client-Server Github: _ttp://github.com/ep1s0de3/RakNet_Networking
RakNet Unity: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Jarico
Старожил
 
Сообщения: 548
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Правильное создание и уничтожение объектов

Сообщение DanDiablo 05 мар 2020, 15:13

Спасибо! Почитаю, постараюсь разобраться и понять. Ни когда такого не делал.
Я часть той силы, что хочет зла, но вечно совершает благо.
Аватара пользователя
DanDiablo
UNец
 
Сообщения: 17
Зарегистрирован: 03 авг 2019, 18:15
  • Сайт


Вернуться в Оптимизация

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3