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();

如果数组中没有值,我已经添加了一个测试,但也许错误不存在,我还没有测试过