我目前正在制作一款2D解谜逻辑游戏,但找不到任何关于如何创建关卡主页以选择关卡的资料。我的意思是,这是一个类似于"割绳子"的系统,这里有章节和关卡输入图像描述。对于unity游戏开发,你可以推荐哪些资源?
谢谢!
还没有试图建立它自己,因为我相信有来源或更快的方法。也正如我现在看到的,它看起来像所有的水平将在选择一个同时加载,但如果我错了,请纠正我
首先,你需要为关卡按钮创建一个预制件,上面附有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()
来更改何时创建它们。
你可以改进算法。希望能有所帮助。
你应该首先尝试自己创建它,因为这是最好的学习方法,并确保它能够正确执行特定于你的游戏的任务。
因为你是一个初学者,所以我认为最简单的方法是在编辑器中创建按钮,然后创建关卡选择控制器脚本。
在控制器脚本中创建按钮列表,添加按钮,创建关卡列表和关卡,并创建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变量作为关卡计数来分配函数。
(如果玩家处于1级,那么按钮1将被设置为可交互,并且1级将被分配给它的onClick)。
我在工作,所以我不能测试代码。但它应该工作得很好,并且希望能给你一个实现目标的方法之一的想法。
编码快乐!