1

我正在尝试进行一个级别选择,该级别选择需要尽可能少的维护,因为我打算添加更新以统一添加更多级别(Unity 场景)。

考虑到这一点,我试图让关卡选择为 Unity Build 设置中的每个关卡创建按钮,然后从预制件创建一个模板对象,它可以在其中映射它创建的按钮。

我让它大部分工作,但由于某种原因,它以错误的顺序映射按钮,我试图从下到上,Unity 似乎正在抓取 Gameobjects 是随机顺序。

这是我的代码:

    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变量在编辑器中设置并且是画布。这buttonPrefab是我在编辑器中设置的 TextMeshPro 按钮预制件,它有level Buttons标签和一个简单的脚本,点击时会加载指定的场景。这buttonSlotsPrefab是我在编辑器中设置的一个游戏对象预制件,它有Button Placement Slot标签,它包含 8 个其他空游戏对象,每个都有level slot标签,我使用这 8 个对象作为运行时按钮应该放置在哪里的指南。

同样,我的目标是从下到上放置按钮,但是 Unity 在运行时会无缘无故地吐出这个:

对于某些变量的命名约定,我感到很抱歉,我已经连续两天感到疲倦和压力了。一旦我开始工作,我会解决这些问题。

经过进一步测试,我注意到当我第一次创建时buttonSlotPrefab,一切正常,但是,在重新启动 Unity(不更改任何文件)后,当我在重新启动后再次运行游戏时,顺序会随机化。这可能是 Unity 引擎中的错误吗?

4

1 回答 1

1

如果我理解您的问题,那么您在按钮和插槽的数量之间存在问题:您的插槽在 y 轴上间隔开,并且屏幕底部的 levelsolt[0] 并不总是如此,所以

您可以在创建按钮之前在 y 轴上订购(升序或降序)水平槽:我正在使用 Linq,所以使用 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();

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

于 2020-05-22T06:40:10.167 回答