阵列仅在特定时间无法访问

时间:2019-04-03 05:54:21

标签: c# for-loop unity3d

我目前正在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;
    }

}

0 个答案:

没有答案