Я хочу иметь возможность просто перетаскивать объекты сцены в мои скриптовые объекты, которые будут представлять каждую главу игры. Я хочу иметь возможность хранить начальную сцену и все остальные сцены в каждой главе, чтобы я мог ссылаться на них и загружать их, но я не хочу возиться с индексами сборки или, что еще хуже, со строками.
Однако вы не можете хранить сцены напрямую с типом «сцена» и сериализовать их. UnityEditor предоставляет столь же эффективный, но сериализуемый тип SceneAsset, но это только Editor, и я не хочу с этим связываться. Я пытался задать вопрос ИИ, но он посоветовал мне поэкспериментировать с режимом «Только редактор». Есть ли у кого-нибудь еще хорошие решения или мне просто следует сделать это?
ChatGPT написал эти классы, которые я также немного отредактировал, чтобы исправить ошибку компилятора:
Код: Выделить всё
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEditor;
[CreateAssetMenu(fileName = "NewChapter", menuName = "World Power/Chapter")]
public class ChapterSO : ScriptableObject
{
[Header("Basic Info")]
public string chapterName; // Display name
public int chapterOrder; // 1, 2, 3, etc.
[Header("Scene Info")]
public SceneAsset startMap; // First scene to load in the chapter
public SceneAsset endMap; // Optional: last scene
public SceneAsset[] includedMaps; // All scenes included in the chapter
}
Код: Выделить всё
using UnityEngine;
[CreateAssetMenu(fileName = "ChapterDatabase", menuName = "World Power/Chapter Database")]
public class ChapterDatabaseSO : ScriptableObject
{
public ChapterSO[] chapters;
}
Код: Выделить всё
using UnityEngine;
using UnityEngine.SceneManagement;
public class ChapterLoader : MonoBehaviour
{
public void LoadChapter(ChapterSO chapter)
{
if (chapter == null || chapter.startMap == null)
{
Debug.LogError("Chapter or start map is null!");
return;
}
string sceneName = chapter.startMap.name;
SceneManager.LoadScene(sceneName);
}
}
ChatGPT затем предложил иметь два отдельных набора переменных для хранения сцен: SceneAssets, предназначенные только для редактора, а затем строковые ссылки, и скрипт EditorOnly, который будет автоматически обновлять ссылки:
Код: Выделить всё
#if UNITY_EDITOR
using UnityEditor;
[CustomEditor(typeof(ChapterSO))]
public class ChapterSOEditor : Editor
{
public override void OnInspectorGUI()
{
DrawDefaultInspector();
ChapterSO chapter = (ChapterSO)target;
if (GUILayout.Button("Sync Scene Names"))
{
if (chapter.startMapEditor != null)
chapter.startMapName = chapter.startMapEditor.name;
if (chapter.endMapEditor != null)
chapter.endMapName = chapter.endMapEditor.name;
if (chapter.includedMapsEditor != null && chapter.includedMapsEditor.Length > 0)
{
chapter.includedMapNames = new string[chapter.includedMapsEditor.Length];
for (int i = 0; i < chapter.includedMapsEditor.Length; i++)
chapter.includedMapNames[i] = chapter.includedMapsEditor[i].name;
}
EditorUtility.SetDirty(chapter); // Save changes
AssetDatabase.SaveAssets();
Debug.Log("Scene names synced!");
}
}
}
#endif
Пока я не получу ответ, я буду использовать это, но я не собираюсь использовать всю созданную им систему; У меня уже есть более простой сценарий загрузки, и я просто создам метастатический или постоянный сценарий SceneManager для загрузки сцен как с порталов перехода, так и с выбора главы главного меню.
Подробнее здесь: https://stackoverflow.com/questions/798 ... -loader-so
Мобильная версия