Ich möchte Szenenobjekte einfach per Drag-and-Drop in meine skriptfähigen Objekte ziehen können, die jedes Kapitel des Spiels darstellen. Ich möchte in der Lage sein, die Startszene und alle anderen Szenen in jedem Kapitel zu speichern, damit ich sie referenzieren und laden kann, aber ich möchte nicht mit Build-Indizes oder schlimmer noch mit Zeichenfolgen herumfummeln.
Sie können Szenen jedoch nicht direkt mit dem Typ „scene“ speichern und serialisieren. UnityEditor bietet den ebenso effektiven, aber serialisierbaren SceneAsset-Typ, aber das ist nur Editor und ich möchte mich nicht damit herumschlagen. Ich habe versucht, AI zu fragen, aber sie sagt mir, ich solle nur mit dem Editor jonglieren. Hat jemand sonst gute Lösungen oder sollte ich das einfach tun?
ChatGPT hat diese Klassen geschrieben, die ich auch ein wenig bearbeitet habe, um einen Compilerfehler zu beheben:
Code: Select all
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
}
Code: Select all
using UnityEngine;
[CreateAssetMenu(fileName = "ChapterDatabase", menuName = "World Power/Chapter Database")]
public class ChapterDatabaseSO : ScriptableObject
{
public ChapterSO[] chapters;
}
Code: Select all
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 schlug dann vor, zwei getrennte Sätze von Variablen zum Speichern der Szenen zu verwenden, mit SceneAssets, die nur für den Editor bestimmt sind, und dann String-Referenzen sowie ein EditorOnly-Skript, das die Referenzen automatisch aktualisiert:
Code: Select all
#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
Bis ich eine Antwort bekomme, werde ich diese verwenden, aber ich werde nicht das gesamte System verwenden, das daraus erstellt wurde; Ich habe bereits ein einfacheres Ladeskript und werde einfach ein metastatisches oder persistentes SceneManager-Skript erstellen, um Szenen aus beiden Übergangsportalen UND der Kapitelauswahl im Hauptmenü zu laden.
Mobile version