По какой-то причине, когда я реактивирую объекты в моем пуле объектов, они статичны? - PullRequest
0 голосов
/ 10 мая 2019

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

Я пытался пройтись по всем различным классам, которые могли бы создать эту проблему, но я сам не нашел ничего необычного.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class SpawnPoint: MonoBehaviour
{

    public Transform SpawnPoints;
    public GameObject[] interact;
    List<float> StarPositions = new List<float>();
    int Interact;
    int index = 1;
    public int pooledAmount = 40;
    List<GameObject> colouredBalls;
    public static bool spawnAllowed;
    public static int count = 0;


    public void Start()
    {
        colouredBalls = new List<GameObject>();
        for (int c = 0; c < pooledAmount; c++)
        {
            GameObject obj = (GameObject)Instantiate(interact[0]);
            obj.SetActive(false);
            colouredBalls.Add(obj);
        }

        if (ScoreScript.scoreValue < 5)
        {

            Vector2 pos = Camera.main.WorldToViewportPoint(transform.position);


            for (int x = 1; x < 5; x++)
            {
                //Vector3 SpawnPos = spawnPoints[d].position;
                int NrSpawnpoints = 4;
                int NrSpaces = NrSpawnpoints + 1;
                double Xlegnth = 1.0;
                double spawnPosX = x * Xlegnth / NrSpaces;
                pos.x = (float)spawnPosX;
                pos.y = 1.3f;
                Vector2 Posi = Camera.main.ViewportToWorldPoint(pos);
                Instantiate(SpawnPoints, Posi, Quaternion.identity);

                //Debug.Log(Posi);
            }

        }

        spawnAllowed = true;
        InvokeRepeating("SpawnAInteract", 0f, 1f);
    }

    void SpawnAInteract()
    {

        if (spawnAllowed)
        {
            int randomSpawnPoint;
            Vector2 pos = Camera.main.WorldToViewportPoint(transform.position);
            //Vector2 starpos = Camera.main.WorldToViewportPoint(transform.position);

            if (index % 10 != 0)
            {
                for (int d = 1; d < 5; d++)
                {
                    //Vector3 SpawnPos = spawnPoints[d].position;
                    int NrSpawnpoints = 4;
                    int NrSpaces = NrSpawnpoints + 1;
                    double Xlegnth = 1.0;
                    double spawnPosX = d * Xlegnth / NrSpaces;
                    pos.x = (float)spawnPosX;
                    pos.y = 1.3f;
                    Vector2 Posi = Camera.main.ViewportToWorldPoint(pos);

                    if (!colouredBalls[d].activeInHierarchy)
                    {
                        colouredBalls[d].transform.position = Posi;
                        colouredBalls[d].transform.rotation = transform.rotation;
                        colouredBalls[d].SetActive(true);
                        //Debug.Log("Nr active Balls:" + f + colouredBalls[f].activeInHierarchy);
                        Debug.Log("Nr active Balls:" + d + colouredBalls[d].activeInHierarchy);
                        count++;
                        break;


                    }

            }

                index++;
            }
            else
            {
                for (int d = 1; d < 5; d++)
                {
                    int NrSpawnpoints = 4;
                    int NrSpaces = NrSpawnpoints + 1;
                    double Xlegnth = 1.0;
                    double spawnPosX = d * Xlegnth / NrSpaces;
                    pos.x = (float)spawnPosX;
                    pos.y = 1.3f;
                    Vector2 Posi = Camera.main.ViewportToWorldPoint(pos);

                    StarPositions.Add((float)spawnPosX);
                    //Debug.Log("Starpositions " + StarPositions.ToString());
                    //edit this
                    double StarPos = spawnPosX - Xlegnth / NrSpaces / 2;

                    //Change to a list
                    //Debug.Log("Star " + d);
                    StarPositions[d - 1] = (float)StarPos;
                }

                //edit this to make the star appear at the StarPosition directly to the left or to the right of the WhiteBall
                Vector2 Start = new Vector2(0, 0);
                Vector2 StartCon = Camera.main.ViewportToWorldPoint(Start);

                float whiteBallX = GameObject.FindWithTag("White Ball").transform.position.x;

                for (int d = 1; d < 5; d++)
                {
                    if (whiteBallX >= StartCon.x && whiteBallX <= StarPositions[d - 1])
                    {
                        int[] potentialStarPositions = { d, d + 2 };
                        int positionIndex = Random.Range(0, 2);
                        int randomSpawnPoin = potentialStarPositions[positionIndex];
                        pos.x = StarPositions[randomSpawnPoin];
                        pos.y = 1.3f;
                        Vector2 StarPosi = Camera.main.ViewportToWorldPoint(pos);
                        Interact = 1;

                        Instantiate(interact[Interact], StarPosi, Quaternion.identity);

                        break;
                    }
                }
                index++;
            }
        }
    }

}



using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectDestroy: MonoBehaviour
{
    public Transform CameraCollider;
    int NonActive = 0;

    void Start()
    {
        Vector3 ScreenSize = new Vector3(1.5f, 1.5f, 1.5f);
        Vector3 ScreenSizeAdj = Camera.main.ViewportToWorldPoint(ScreenSize);
        CameraCollider.localScale = ScreenSizeAdj;
        Vector3 ScreenPos = new Vector3(0.5f, 0.5f, 0);
        Vector3 ScreenPosAdj = Camera.main.ViewportToWorldPoint(ScreenPos);
        Instantiate(CameraCollider, ScreenPosAdj, Quaternion.identity);

    }

    private void OnTriggerExit2D(Collider2D other)
    {

        if (other.gameObject.CompareTag("ColouredBall Highress") || other.gameObject.CompareTag("Star"))
        {

            other.gameObject.SetActive(false);

        }
    }

}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class InteractControl : MonoBehaviour
{

    Rigidbody2D rb;
    GameObject target;
    float moveSpeed;
    Vector3 directionToTarget;
    Renderer m_Renderer;

    void Start()
    {
        target = GameObject.Find("White Ball");
        rb = GetComponent<Rigidbody2D>();
        moveSpeed = 3f; //Movement speed of all the obstacles and powerups
        MoveInteract(); //Method responsable for the movement of the obstacles and powerups, gets called at start
    }


    void MoveInteract() //Method responsable for the movement of the obstacles and stars
    {
        if (target != null)
        {
            if(ScoreScript.scoreValue > 5) //Determine when RedBall goes from going down in a straigh line to following white ball
            { 

            directionToTarget = (target.transform.position - transform.position).normalized;
            rb.velocity = new Vector2(directionToTarget.x * moveSpeed,
                                        directionToTarget.y * moveSpeed);
            }
            else //Red Ball goes down in a straigh line
            {
                directionToTarget = new Vector3(0, -1, 0);
                rb.velocity = new Vector2(0, directionToTarget.y * moveSpeed);

            }
        }
        else
             rb.velocity = Vector3.zero;

    }
}

1 Ответ

0 голосов
/ 10 мая 2019

Это нормально, когда вы деактивируете объект, скорость сбрасывается.Вы должны сохранить их скорость перед деактивацией, а затем снова установить ее при повторной активации.

Я бы искал другой вид оптимизации, это делает код более сложным и, вероятно, существуют более эффективные способы его оптимизации.

Изменить: быстрое решение будет деактивировать рендерер спрайтов, а не весь игровой объект.Это позволит оптимизировать загрузку графического процессора, что, я думаю, является проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...