Ссылки на сцены для загрузчика глав Unity SOC#

Место общения программистов C#
Ответить
Anonymous
 Ссылки на сцены для загрузчика глав Unity SO

Сообщение Anonymous »

Я пытаюсь создать систему глав, аналогичную Half-Life, где игроки смогут выбирать, в какой главе начать новую игру, причем каждая глава содержит несколько карт/сцен. Однако я не уверен, какой способ сделать это лучше всего, поскольку Unity глупо помещает сцены в скрипты вручную.
Я хочу иметь возможность просто перетаскивать объекты сцены в мои скриптовые объекты, которые будут представлять каждую главу игры. Я хочу иметь возможность хранить начальную сцену и все остальные сцены в каждой главе, чтобы я мог ссылаться на них и загружать их, но я не хочу возиться с индексами сборки или, что еще хуже, со строками.
Однако вы не можете хранить сцены напрямую с типом «сцена» и сериализовать их. 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);
}
}
Как видите, мне нужно, чтобы UnityEditor использовал тип SceneAsset, который на самом деле является сериализуемым, но он вообще не работает в сборках. Я думаю, это глупо, что Unity имеет целый отдельный тип вместо того, чтобы просто делать ссылки на сцены научной фантастики, но эй! Что я могу с этим поделать?
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
Я не хочу этого делать, поскольку это кажется слишком сложным (и мне не нужны 4 разных сценария для одной системы), поэтому я надеюсь, что есть более простое решение, которое будет таким же удобным, как то, что предложил ChatGPT.
Пока я не получу ответ, я буду использовать это, но я не собираюсь использовать всю созданную им систему; У меня уже есть более простой сценарий загрузки, и я просто создам метастатический или постоянный сценарий SceneManager для загрузки сцен как с порталов перехода, так и с выбора главы главного меню.

Подробнее здесь: https://stackoverflow.com/questions/798 ... -loader-so
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»