Массив недоступен только в определенное время - PullRequest
1 голос
/ 03 апреля 2019

В настоящее время я создаю фоновый эффект параллакса в Unity и начинаю с некоторого начального кода, над которым я пытаюсь поработать.Код работает по большей части, с некоторыми небольшими проблемами, которые я медленно решаю.

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

Когда я запускаю один и тот же сценарий и он вызывает Update () каждый кадр, я ожидаю, что у него будет одинаковый размер длины poolObjects.Однако, когда я звоню с начальным размером пула 10, я получаю 10, затем 2, затем 0, затем 10, 2, 0 и т. Д.

Я обрезаю его, но публикую то, что я считаюздесь актуально.Надеюсь, вы поможете мне увидеть то, что, вероятно, очевидно!

Я вижу «В объекте GetPool», но, поскольку длина никогда не> 0, я никогда не вижу в цикле For, что крайне важно.Я не могу понять, почему длина poolObjects будет отображаться как 0.

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

public class Parallaxer : MonoBehaviour {

    class PoolObject {
        public Transform transform;
        public bool inUse;
        public PoolObject(Transform t) { transform = t; }
        public void Use() { inUse = true; }
        public void Dispose() { inUse = false; }
    }
...
    public int poolSize;
    public float shiftSpeed;
    public float spawnRate;
...

    float spawnTimer;
    PoolObject[] poolObjects;
    float targetAspect;
    GameManager game;

    void Awake() {
        Configure();
    }

    void Start() {
        game = GameManager.Instance;
    }
...
    void Update() {
        Debug.Log(poolObjects.Length + "Len here of pool objects");
        if (game.GameOver) return;

        Shift();
        spawnTimer += Time.deltaTime;
        if (spawnTimer > spawnRate) {
            Spawn();
            spawnTimer = 0;
        }
    }

    void Configure() {
        //spawning pool objects
        targetAspect = targetAspectRatio.x / targetAspectRatio.y;
        // targetAspect = Camera.main.aspect;
        // Debug.Log(targetAspectRatio.x +" " +  targetAspectRatio.y);
        poolObjects = new PoolObject[poolSize];
        for (int i = 0; i < poolObjects.Length; i++) {
            GameObject go = Instantiate(Prefab) as GameObject;
            Transform t = go.transform;
            t.SetParent(transform);
            t.position = Vector3.one * 1000;
            poolObjects[i] = new PoolObject(t);
        }

        if (spawnImmediate) {
            SpawnImmediate();
        }
    }

    void Spawn() {
        //moving pool objects into place
        Transform t = GetPoolObject();
        Debug.Log("In to Spawn" + t);
        if (t == null) return;
        Vector3 pos = Vector3.zero;
        pos.y = Random.Range(ySpawnRange.minY, ySpawnRange.maxY);
        pos.x = (defaultSpawnPos.x * Camera.main.aspect) / targetAspect;
        // Debug.Log("Spwaning");
        // Debug.Log(Camera.main.aspect);
        // Debug.Log(immediateSpawnPos.x + " " + immediateSpawnPos.y + " " + targetAspect);
        t.position = pos;
        // Debug.Log(pos);
    }

    void SpawnImmediate() {
        Transform t = GetPoolObject();
        if (t==null) return;
        Vector3 pos = Vector3.zero;
        pos.y = Random.Range(ySpawnRange.minY, ySpawnRange.maxY);
        pos.x = (immediateSpawnPos.x * Camera.main.aspect) / targetAspect;
        t.position = pos; 
        Spawn();
    }

    void Shift() {
        //loop through pool objects 
        //moving them
        //discarding them as they go off screen
        Debug.Log(poolObjects.Length + "Finding Length");
        for (int i = 0; i < poolObjects.Length; i++) {

            poolObjects[i].transform.position += -Vector3.right * shiftSpeed * Time.deltaTime;
            Debug.Log(poolObjects[i].transform.position);
            CheckDisposeObject(poolObjects[i]);
        }
    }

    void CheckDisposeObject(PoolObject poolObject) {
        //place objects off screen
        if (poolObject.transform.position.x < (-defaultSpawnPos.x * Camera.main.aspect) / targetAspect) {
            poolObject.Dispose();
            poolObject.transform.position = Vector3.one * 1000;
        }
    }

    Transform GetPoolObject() {
        //retrieving first available pool object
        Debug.Log("In GetPool Object" + poolObjects.Length);
        for (int i = 0; i < poolObjects.Length; i++) {
            Debug.Log("This is not showing up "+ poolObjects[i].inUse);
            if (!poolObjects[i].inUse) {
                poolObjects[i].Use();
                return poolObjects[i].transform;
            }
        }
        return null;
    }

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