由于某种原因,当我重新激活对象池中的对象时,它们是静态的吗?

时间:2019-05-10 09:50:22

标签: c# unity3d game-engine game-development object-pooling

我目前正在开发游戏,但遇到了一个小问题。我目前正在尝试为将在游戏中不断出现的对象创建对象池,以提高游戏的帧率。但是,每当游戏开始时创建此对象池时,都会创建对象池,然后将其激活,然后将其停用,然后再次将其重新激活,则游戏对象始终在静态下被重新激活。我试图遍历我的代码以找出此问题可能来自何处,但我不知道。所有重新激活的游戏对象都具有刚体和适当的标签。

我尝试过所有可能造成此问题的不同类,但我自己并没有发现任何异常。

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 :(得分:0)

这是正常现象,当您禁用对象时,速度会重置。您必须先保存它们的速度,然后再将其停用。

我会寻找其他类型的优化,这会使代码更加复杂,并且可能有更好的优化方法。

编辑:一种快速的解决方案是取消激活精灵渲染器,而不是整个游戏对象。这样可以优化gpu负载,我想这是问题所在。