在上一篇发布完成后发现 效果不是很理想 重写
点击查看上一篇
前言
大家好!我来CSDN写个笔记
需求:在场景内获取所有的场景并用GUI生成按钮 完成多场景切换
问题:使用到EDITOR类必须放到Editor文件夹下,普通类获取不到Editor文件夹下的数据
解决办法:使用unity的注册事件 来完成数据的传输
注意:需要提前在Build setting 中把场景添加进来(记得点击Add Open Scene)
首先来看下思路
摘自彩色墨水
然后根据这篇文章的介绍
我们需要用到unity的事件注册
事件注册可以看下这位兄弟的文章【微笑的孙君】 点击传送门
上代码
首先呢!我们需要一个Editor文件夹 所以在Assets文件夹下创景一个Editor文件夹
然后添加c#脚本
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
namespace ScenesName
{
/// <summary>
/// 自动查找场景
/// </summary>
[InitializeOnLoad]
public class SearchScenes : MonoBehaviour
{
[HideInInspector]
public static List<string> nameList;
static SearchScenes()
{
CreateButtonScenes.Getname += AllScenes;
//print("AllScenes");
}
private static List<string> AllScenes()
{
nameList = new List<string>();
foreach (UnityEditor.EditorBuildSettingsScene S in UnityEditor.EditorBuildSettings.scenes)
{
string scenesName = S.path;
string[] Name = scenesName.Split('/');
foreach (var item in Name)
{
if (item.Contains(".unity"))
{
nameList.Add(item.Substring(0, item.IndexOf('.')));
}
}
}
return nameList;
}
}
}
然后在创建一个普通类来实现事件注册 和生成按钮
using UnityEngine;
using UnityEngine.SceneManagement;
using System.Collections.Generic;
using System;
public class CreateButton : MonoBehaviour
{
[HideInInspector]
public Vector2 scrollPosition;
[HideInInspector]
public List<string> nameList;
public static event Func<List<string>> Getname;
// Start is called before the first frame update
void Start()
{
nameList = Getname();
}
void OnGUI()
{
scrollPosition = GUILayout.BeginScrollView(scrollPosition, GUILayout.Width(300), GUILayout.Height(Screen.height));
foreach (var item in nameList)
{
if (GUILayout.Button(item))
{
ChangeScene(item);
}
}
GUILayout.EndScrollView();
}
void ChangeScene(string name)
{
SceneManager.LoadScene(name);
}
}
最后还需要一个不销毁物体的脚本 并动态挂载生成按钮的脚本
using UnityEngine;
public class DontDestory: MonoBehaviour
{
[HideInInspector]
public GameObject dontDestory;
private GameObject obj;
// Start is called before the first frame update
void Start()
{
if (!GameObject.Find("change(Clone)"))
{
GameObject obj = Resources.Load<GameObject>("prefab/change");
dontDestory = Instantiate(obj);
dontDestory.transform.SetPositionAndRotation(Vector3.zero, new Quaternion());
dontDestory.AddComponent<CreateButton>();
DontDestroyOnLoad(dontDestory);
}
}
}
就这些
如果有用记得点赞