FindObjectsWithTag 在 Unity 中以随机顺序带回对象?
FindObjectsWithTag bringing back objects in random order in Unity?
我正在尝试制作一个需要尽可能少维护的关卡,因为我打算添加更新以统一添加更多关卡(Unity 场景)。
为了解决这个问题,我试图让级别 select 为 Unity Build 设置中的每个级别创建按钮,然后从预制件创建模板对象,它可以在其中映射按钮创建到。
我大部分时间都在使用它,但出于某种原因,它以错误的顺序映射按钮,我正在尝试从下到上,而 Unity 似乎以随机顺序抓取游戏对象。
这是我的代码:
private Scene[] levels;
private int currentButtonId = 1;
public Transform buttonsHolder;
public GameObject buttonPrefab;
public GameObject buttonSlotsPrefab;
private GameObject[] levelButtonSlots;
private int currentLevelSlot = 0;
private int numSlotsToMove = 0;
private void Start()
{
var sceneCount = SceneManager.sceneCountInBuildSettings;
levels = new Scene[sceneCount];
for (var i = 0; i < sceneCount; i++)
{
// Beginning Setup
levels[i] = SceneManager.GetSceneByBuildIndex(i);
// Look for Level Placement Slots
levelButtonSlots = GameObject.FindGameObjectsWithTag("Level Slot");
// If there aren't enough Level Placement Slots make more by creating a template
if(levelButtonSlots.Length < levels.Length)
{
GameObject buttonSlots = Instantiate(buttonSlotsPrefab);
buttonSlots.transform.position = new Vector2(0, 10 * numSlotsToMove);
numSlotsToMove++;
}
// Go get those new placement slots
levelButtonSlots = GameObject.FindGameObjectsWithTag("Level Slot");
// Create Button
GameObject currentButton = Instantiate(buttonPrefab, buttonsHolder);
// Move it to the next slot
currentButton.transform.position = levelButtonSlots[currentLevelSlot].transform.position;
currentLevelSlot++;
// Add Text to a new button
TextMeshProUGUI buttonText = currentButton.GetComponentInChildren<TextMeshProUGUI>();
buttonText.text = (currentButtonId.ToString());
// Setup what which scene clicking a button will do
ButtonManager buttonScript = currentButton.GetComponentInChildren<ButtonManager>();
buttonScript.sceneToLoad = currentButtonId;
currentButtonId++;
}
}
编辑器中设置的buttonsHolder
变量是canvas。
buttonPrefab
是我在编辑器中设置的TextMeshPro 按钮预制件,它有level Buttons
标签和一个简单的脚本,当点击时加载指定的场景。
buttonSlotsPrefab
是我在编辑器中设置的游戏对象预制件,它有 Button Placement Slot
标签,它包含 8 个其他空游戏对象,每个都有 level slot
标签,我将这 8 个对象用作运行time.
按钮应放置位置的指南
同样,我的目标是将按钮从下往上放置,但 Unity 在 运行 时无缘无故吐出了这个:
对于某些变量的命名约定,我感到很抱歉,我已经连续两天在这 2 天感到疲倦和压力。一旦一切正常,我会解决这些问题。
经过进一步测试,我注意到当我第一次创建 buttonSlotPrefab
时,一切正常,但是,在重新启动 Unity(不更改任何文件)后,当我再次 运行 游戏后重新启动顺序随机化。这可能是 Unity 引擎中的错误吗?
如果我理解你的问题,那么你的按钮和槽的数量之间存在问题:你的槽在 y 轴上间隔开并且你并不总是屏幕底部的 levelsolt[0],所以
您可以在创建按钮之前对 y 轴上的水平槽进行排序(我不知道是升序还是降序):我正在使用 Linq,因此添加 using System.Linq;
if (levelButtonSlots.Any())//Same thing than levelButtonSlots.Length > 0
{
levelButtonSlots = GameObject.FindGameObjectsWithTag("Level Slot").OrderBy(go => go.transform.position.y).ToArray();
}
或
levelButtonSlots = GameObject.FindGameObjectsWithTag("Level Slot").OrderByDescending(go => go.transform.position.y).ToArray();
如果数组中没有值,我已经添加了一个测试,但也许错误不存在,我还没有测试过
我正在尝试制作一个需要尽可能少维护的关卡,因为我打算添加更新以统一添加更多关卡(Unity 场景)。
为了解决这个问题,我试图让级别 select 为 Unity Build 设置中的每个级别创建按钮,然后从预制件创建模板对象,它可以在其中映射按钮创建到。
我大部分时间都在使用它,但出于某种原因,它以错误的顺序映射按钮,我正在尝试从下到上,而 Unity 似乎以随机顺序抓取游戏对象。
这是我的代码:
private Scene[] levels;
private int currentButtonId = 1;
public Transform buttonsHolder;
public GameObject buttonPrefab;
public GameObject buttonSlotsPrefab;
private GameObject[] levelButtonSlots;
private int currentLevelSlot = 0;
private int numSlotsToMove = 0;
private void Start()
{
var sceneCount = SceneManager.sceneCountInBuildSettings;
levels = new Scene[sceneCount];
for (var i = 0; i < sceneCount; i++)
{
// Beginning Setup
levels[i] = SceneManager.GetSceneByBuildIndex(i);
// Look for Level Placement Slots
levelButtonSlots = GameObject.FindGameObjectsWithTag("Level Slot");
// If there aren't enough Level Placement Slots make more by creating a template
if(levelButtonSlots.Length < levels.Length)
{
GameObject buttonSlots = Instantiate(buttonSlotsPrefab);
buttonSlots.transform.position = new Vector2(0, 10 * numSlotsToMove);
numSlotsToMove++;
}
// Go get those new placement slots
levelButtonSlots = GameObject.FindGameObjectsWithTag("Level Slot");
// Create Button
GameObject currentButton = Instantiate(buttonPrefab, buttonsHolder);
// Move it to the next slot
currentButton.transform.position = levelButtonSlots[currentLevelSlot].transform.position;
currentLevelSlot++;
// Add Text to a new button
TextMeshProUGUI buttonText = currentButton.GetComponentInChildren<TextMeshProUGUI>();
buttonText.text = (currentButtonId.ToString());
// Setup what which scene clicking a button will do
ButtonManager buttonScript = currentButton.GetComponentInChildren<ButtonManager>();
buttonScript.sceneToLoad = currentButtonId;
currentButtonId++;
}
}
编辑器中设置的buttonsHolder
变量是canvas。
buttonPrefab
是我在编辑器中设置的TextMeshPro 按钮预制件,它有level Buttons
标签和一个简单的脚本,当点击时加载指定的场景。
buttonSlotsPrefab
是我在编辑器中设置的游戏对象预制件,它有 Button Placement Slot
标签,它包含 8 个其他空游戏对象,每个都有 level slot
标签,我将这 8 个对象用作运行time.
同样,我的目标是将按钮从下往上放置,但 Unity 在 运行 时无缘无故吐出了这个:
对于某些变量的命名约定,我感到很抱歉,我已经连续两天在这 2 天感到疲倦和压力。一旦一切正常,我会解决这些问题。
经过进一步测试,我注意到当我第一次创建 buttonSlotPrefab
时,一切正常,但是,在重新启动 Unity(不更改任何文件)后,当我再次 运行 游戏后重新启动顺序随机化。这可能是 Unity 引擎中的错误吗?
如果我理解你的问题,那么你的按钮和槽的数量之间存在问题:你的槽在 y 轴上间隔开并且你并不总是屏幕底部的 levelsolt[0],所以
您可以在创建按钮之前对 y 轴上的水平槽进行排序(我不知道是升序还是降序):我正在使用 Linq,因此添加 using System.Linq;
if (levelButtonSlots.Any())//Same thing than levelButtonSlots.Length > 0
{
levelButtonSlots = GameObject.FindGameObjectsWithTag("Level Slot").OrderBy(go => go.transform.position.y).ToArray();
}
或
levelButtonSlots = GameObject.FindGameObjectsWithTag("Level Slot").OrderByDescending(go => go.transform.position.y).ToArray();
如果数组中没有值,我已经添加了一个测试,但也许错误不存在,我还没有测试过