gpt4 book ai didi

c# - 启动/更新变量范围

转载 作者:太空宇宙 更新时间:2023-11-03 20:58:05 25 4
gpt4 key购买 nike

我有一个 SceneController,它应该初始化一组空的 GameObject 生成器,每个生成器以相同的节奏一起工作。 RockSpawners 收到一系列时间延迟,并在生成另一 block 岩石之间等待 X 秒。

我在生成器启动时设置了 _nextSpawn = float.maxValue 并计划在“初始化”它们之后覆盖它(我自己的方法),但是即使我的调试日志说我已经覆盖了我的初始化时的 _nextSpawn 值,更新循环仍在报告 float.maxValue 并且没有任何结果产生,因为 _timeSinceLastSpawn 没有超过 float .maxValue 秒。

_nextSpawn 变量的范围是否遗漏了什么?至少乍一看,这似乎不是“这个”与“本地”的问题。

调试输出:0 0 3 3。 0 保持不变,3 将根据 rng 而变化。

场景 Controller .cs:

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

public class SceneController : MonoBehaviour {
[SerializeField] private GameObject _rockSpawnerPrefab;

public int numRocks = 6;
public int minSpawnDelaySec = 1;
public int maxSpawnDelaySec = 3;
private bool spawnersInitialized = false;

void Start () {
InitializeSpawners();
}

void Update () {
}

void InitializeSpawners() {
float[] pattern = new float[numRocks];

for (int i = 0; i < numRocks; i++) {
// Generate delays at half second increments within bounds
float delay = Mathf.Floor(Random.value * ((float)(maxSpawnDelaySec + 0.5f - minSpawnDelaySec) / 0.5f));
delay = delay * 0.5f + minSpawnDelaySec;
pattern[i] = delay;
}

GameObject spawner = Instantiate(_rockSpawnerPrefab) as GameObject;
spawner.transform.position = new Vector3(0, 4, 0);
RockSpawner rockSpawnerScript = spawner.GetComponent<RockSpawner>();
rockSpawnerScript.Initialize(pattern);
}
}

RockSpawner.cs

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

public class RockSpawner : MonoBehaviour {
[SerializeField] private GameObject _rockPrefab;

public float minSpawnDelay = 3f;
public float maxSpawnDelay = 6f;
private float[] _pattern;
private int _currentPattern;
private float _timeSinceLastSpawn;
private float _nextSpawn;

void Start () {
_currentPattern = -1;
_nextSpawn = float.MaxValue;
}

void Update () {
if (_pattern == null) return;

_timeSinceLastSpawn += Time.deltaTime;

if (_timeSinceLastSpawn > _nextSpawn) {
GameObject rock = Instantiate(_rockPrefab) as GameObject;
rock.transform.position = transform.position;

NextTimer();
}
}

public void Initialize(float[] pattern) {
_pattern = pattern;
NextTimer();
}

private void NextTimer() {
_timeSinceLastSpawn = 0;
_currentPattern += 1;
Debug.Log(_nextSpawn);
Debug.Log(this._nextSpawn);
this._nextSpawn = _pattern[_currentPattern];
Debug.Log(_nextSpawn);
Debug.Log(this._nextSpawn);
}

}

最佳答案

这与范围无关,与调用顺序有关。当您创建一个 GameObject 时,它的 Start method is called on the frame it's enabled ,而不是在创建对象时。因此,您的代码将调用 Initialize 首先,然后调用 Start 以覆盖值。

删除 Start 中的代码并处理 Initialize 中的所有内容,它应该可以正常工作。

关于c# - 启动/更新变量范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48361221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com