unity3d 如何使用Unity 2D制作关卡选择页面和关卡作为单独的关卡

wr98u20j  于 2023-04-07  发布在  其他
关注(0)|答案(2)|浏览(195)

我目前正在制作一个2D益智逻辑游戏,找不到任何关于如何建立关卡主页来选择关卡的来源。我的意思是,这是一个类似于用章节和关卡enter image description here切断绳子的系统。你可以推荐什么样的来源,以及一般统一的游戏开发的好来源?
谢谢!
还没有尝试建立自己,因为我相信有来源或更快的方法。也因为我现在看到它,它看起来像所有级别将在同一时间加载在选择一个,但请纠正我,如果我错了

ldfqzlk8

ldfqzlk81#

首先,你需要创建一个预设的关卡按钮,并附上下面的LevelButton.cs脚本。这个类的作用是保存按钮引用并定义点击按钮时会发生什么。点击按钮时,它会通过路径加载关卡。为按钮字段分配一个button组件。

public class LevelButton : MonoBehaviour
    {
        public Button button;
        [HideInInspector] public string scenePath;

        private void OnButtonClicked()
        {
            button.onClick.RemoveAllListeners();
            SceneManager.LoadScene(scenePath);
        }

        public void Initialize(string scenePath)
        {
            this.scenePath = scenePath;

            button.onClick.RemoveAllListeners();
            button.onClick.AddListener(OnButtonClicked);
        }
    }

然后你需要创建一个脚本来为你所有的场景创建LevelButtons

public class LevelSectionHandler : MonoBehaviour
    {
        public LevelButton prefab;
        public Transform levelSectionParentTransform;
        List<Scene> sceneList = new List<Scene>();

        private void Awake()
        {
            Initialize();
        }

        private void GetAllScenesInBuildSettings()
        {
            Scene tempScene;
            int sceneCount = SceneManager.sceneCountInBuildSettings;

            for (int i = 0; i < sceneCount; i++)
            {
                tempScene = SceneManager.GetSceneByBuildIndex(i);
                if (tempScene.IsValid())
                {
                    sceneList.Add(tempScene);
                }
            }
        }

        private void CreateLevelBoard()
        {
            LevelButton tempLevelButton = null;

            for (int i = 0; i < sceneList.Count; i++)
            {
                tempLevelButton = Instantiate(tempLevelButton, levelSectionParentTransform);
                tempLevelButton.Initialize(sceneList[i].path);
            }
        }

        public void Initialize()
        {
            GetAllScenesInBuildSettings();
            CreateLevelBoard();
        }
    }

这个脚本所做的是它保存LevelButton预制件和Transform的引用,以将LevelButtons放置在它下面。将这些组件分配给脚本,然后运行游戏。它将在Awake中创建LevelButtons。您可以通过调用LevelSectionHandler.Initialize()更改何时创建它们。
你可以改进算法,希望有帮助。

5uzkadbs

5uzkadbs2#

你应该首先尝试自己构建它,因为这将是最好的学习方法,并确保它可以正确执行特定于你的游戏的任务。
由于你是一个初学者,我会说最简单的方法来完成这一点是创建编辑器中的按钮,然后创建一个级别选择控制器脚本。
在控制器脚本中创建一个按钮列表,添加按钮,创建一个级别列表和级别,并创建一个int。
如果玩家在0级,int = 0,1级,int = 1等。当玩家打开级别选择时,有一个for循环通过按钮运行。例如:

public List<Button> myButtons = new List<Button>();
public List<GameObject> myLevels = new List<GameObject>();
public int levelAt;

public void Start()
{
   for(int i = 0; i < levelAt; i++)
   {
      myButtons[i].interactable = true;
      myButtons[i].onClick.AddListener(delegate{chooseALevel(i); });
   }
}

public void chooseALevel(int level)
{
    //This function is called to start the level
    myLevels.SetActive(level);
}

在for循环中,我们获取按钮,如果玩家打开或通过了该级别,则将其设置为可交互。然后我们向按钮添加onClick事件,并将i变量用作级别计数。
(If玩家处于1级,则按钮1将被设置为可交互的,并且1级将被分配给它的onClick)。
我在工作,所以我不能测试代码。但它应该工作得很好,希望能给你一个想法的方法之一,你可以完成你的目标。
编码快乐!

相关问题