Szenenreferenzen für Unity Chapter Loader SOC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Szenenreferenzen für Unity Chapter Loader SO

Post by Anonymous »

Ich versuche, ein Kapitelsystem ähnlich wie Half-Life zu erstellen, bei dem Spieler auswählen können, in welchem ​​Kapitel sie ein neues Spiel beginnen möchten, wobei jedes Kapitel mehrere Karten/Szenen enthält. Allerdings bin ich mir nicht sicher, wie das am besten geht, da Unity dumm ist, wenn es darum geht, Szenen manuell in Skripte einzufügen.
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);
}
}
Wie Sie sehen, muss UnityEditor den SceneAsset-Typ verwenden, der tatsächlich serialisierbar ist, aber in Builds überhaupt nicht funktioniert. Ich finde es dumm, dass Unity einen ganz eigenen Typ hat, anstatt nur SF-Szenenreferenzen zu ermöglichen, aber hey! Was kann ich dagegen tun?
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
Ich möchte das nicht tun, da es zu komplex erscheint (und ich möchte nicht 4 verschiedene Skripte für ein System), daher hoffe ich, dass es eine einfachere Lösung gibt, die immer noch genauso praktisch ist wie die von ChatGPT vorgeschlagene.
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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post