Merge branch 'bugfix/章节加载顺序错乱' into 'develop'

fix: 修复章节加载顺序错乱问题

See merge request aibis-dream/aibis-dream!705
This commit is contained in:
2026-04-28 09:34:35 +00:00
31 changed files with 23 additions and 77 deletions
@@ -11,7 +11,6 @@ namespace AibisDream.SystemEditor
serializedObject.Update();
EditorGUILayout.PropertyField(serializedObject.FindProperty("exits"), true);
EditorGUILayout.PropertyField(serializedObject.FindProperty("displayOrder"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("yarnProject"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("firstSceneName"));
@@ -16,7 +16,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: aaef579ad8bdda542b503b40ce6773a8, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: 640f90d7758f6524f8735352da531604, type: 3}
firstSceneName: Scene/ClinicOut
title:
@@ -16,7 +16,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: ff82a99e791be3e41acf40232f908eb3, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: 640f90d7758f6524f8735352da531604, type: 3}
firstSceneName: Scene/ClinicOut
title:
@@ -16,7 +16,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: 362a7dfb573114247a33c0e290b698eb, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: fceb65c69f946c740992b742bc01a6a2, type: 3}
firstSceneName: Scene/ClinicOut
title:
@@ -16,7 +16,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: 8d8b11f0c2fbc4d4cb8c2857d98383c9, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: dc075ea1c729cec4484634a00ebb03a4, type: 3}
firstSceneName: Scene/HuoShanFixScene
title:
@@ -16,7 +16,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: 172e1298764e87a4b9ed51264b908ba9, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: 31109973cccc10642a3bc09bc70f47d3, type: 3}
firstSceneName: Scene/PeipeiFixScene
title: "10\u5E74\u524D"
@@ -16,7 +16,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: 68a9c1b8c5230454bb9498fd2ab5714b, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: 26fc6619bbcda734a81361b8bb615f04, type: 3}
firstSceneName: Scene/PeipeiFixScene
title: "\u4F69\u4F69"
@@ -16,7 +16,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: afc5b01ef301cc74db7cae741acad427, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: 247e2ccd847942843bb87841bb9888c5, type: 3}
firstSceneName: Scene/PeipeiFixScene
title:
@@ -16,7 +16,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: e749fe0f9aa32f44097e037f52a5bfe0, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: 05ccf66391562af43835d718ca36f508, type: 3}
firstSceneName: Scene/PeipeiFixScene
title:
@@ -16,7 +16,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: 2f763a2c04ecafb4981379b7363f9791, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: ab71ff7b298372f48a262ad5b949c395, type: 3}
firstSceneName: Scene/OpenFixScene
title:
@@ -16,7 +16,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: afc5b01ef301cc74db7cae741acad427, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: fa8082420f7bb5b4a8ab33a59c70bcc9, type: 3}
firstSceneName: Scene/ExpressFixScene
title:
@@ -16,7 +16,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: e749fe0f9aa32f44097e037f52a5bfe0, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: 3bb399faf6caadd4c89f85b7aa83c388, type: 3}
firstSceneName: Scene/YingliFixScene
title:
@@ -15,7 +15,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: ac5ca9a66ff22ab4b9cd5adbdade6b8c, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: 2fa76ffaa57f62244b77be9b25ca14c2, type: 3}
firstSceneName: Scene/OpenFixScene
title: "\u68A6"
@@ -15,7 +15,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: 68a9c1b8c5230454bb9498fd2ab5714b, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: 26fc6619bbcda734a81361b8bb615f04, type: 3}
firstSceneName: Scene/PeipeiFixScene
title: "\u4F69\u4F69"
@@ -15,7 +15,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: dadf07a02eb4b8d4c8bdf1739a10c9c5, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: 533dc422c8871c143a551bd5d446b439, type: 3}
firstSceneName: Scene/SubWay
title: "\u5730\u94C1\u4E0A"
@@ -15,7 +15,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: ada4bdc2db5594e4f860c90b3a4b9da8, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: 293561ce52efc594399242651d44b366, type: 3}
firstSceneName: Scene/ClinicOut
title: "\u5348\u4F11"
@@ -15,7 +15,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: 653fbfbb55fef7740a2360590e29d552, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: 29ebe788cfe2c084e88ffdd8e2f93378, type: 3}
firstSceneName: Scene/ClinicOut
title: "\u9152\u676F\u548C\u724C"
@@ -15,7 +15,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: 172e1298764e87a4b9ed51264b908ba9, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: 759b6e8a16f70084e8fe77eded076218, type: 3}
firstSceneName: "Scene/\u68A6\u5883"
title: "\u542F\u793A"
@@ -15,7 +15,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: 8d8b11f0c2fbc4d4cb8c2857d98383c9, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: f7d7db96cdd264f4dbb3341df5deeccc, type: 3}
firstSceneName: Scene/HuoShanFixScene
title: "\u706B\u5C71"
@@ -15,7 +15,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: afc5b01ef301cc74db7cae741acad427, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: 247e2ccd847942843bb87841bb9888c5, type: 3}
firstSceneName: Scene/PeipeiFixScene
title: "\u505C\u6B62\u60F3\u8C61"
@@ -15,7 +15,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: 0bdbd8e46fa688e49a5a670b78b6f956, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: 6ecfe80fd0370554db9a7ec3a173f7e3, type: 3}
firstSceneName: Scene/SubWay
title: "\u5730\u94C1\u4E0A"
@@ -15,7 +15,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: a4dba2e2976607d45a28d4c8cade6b0a, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: 25f49957c68bca34bb1aeafec7feca8b, type: 3}
firstSceneName: Scene/ClinicOut
title: "\u7B2C\u4E8C\u5929\u4E2D\u5348"
@@ -15,7 +15,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: aaef579ad8bdda542b503b40ce6773a8, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: ec06c945cb99fb544b1dd9a2a6ea9a7b, type: 3}
firstSceneName: Scene/ClinicOut
title: "\u5915\u9633"
@@ -15,7 +15,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: 362a7dfb573114247a33c0e290b698eb, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: 62f2a99a47fc652449b846035a739529, type: 3}
firstSceneName: "Scene/\u68A6\u5883"
title: "\u542F\u793A"
@@ -13,7 +13,6 @@ MonoBehaviour:
m_Name: GeneralEnd
m_EditorClassIdentifier:
exits: []
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: e6bac2644a8a04b4899ce2fe8ae1f4fc, type: 3}
firstSceneName: Scene/Bridge
title: "\u7ED3\u675F"
@@ -16,7 +16,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: ada4bdc2db5594e4f860c90b3a4b9da8, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: 9c6e0818864e6964d83f946e81e32916, type: 3}
firstSceneName: Scene/ExpressFixScene
title:
@@ -16,7 +16,6 @@ MonoBehaviour:
exits:
- exitName: default
targetScene: {fileID: 11400000, guid: 10601ce26230723479d875a630f15732, type: 2}
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: b81ce7d02242fc74daf531067098286f, type: 3}
firstSceneName: Scene/ExpressFixScene
title:
@@ -14,7 +14,6 @@ MonoBehaviour:
m_EditorClassIdentifier:
nextScene: {fileID: 0}
exits: []
displayOrder: 0
yarnProject: {fileID: 7545569452688597077, guid: a2b0fa96399ebca4c9c61e346f95b037, type: 3}
firstSceneName: Scene/Scene/ExpressFixScene
title: "\u77F3\u5934\u7684\u5FC3"
+3 -31
View File
@@ -24,11 +24,7 @@ namespace AibisDream
cacheChapter = ParseChapterTitle(saveFilePath);
}
// 优先从 GameManager 获取全量章节并按 displayOrder 排序
var allChapters = GameManager.Instance?.GetAllSceneSos();
var sourceList = allChapters != null
? allChapters.OrderBy(so => so.displayOrder).ToList()
: ChapterData.chapterList;
var sourceList = GameManager.Instance.GetAllSceneSos();
// 拼接章节列表
var chapterList = sourceList
@@ -37,7 +33,7 @@ namespace AibisDream
{
chapterSo = chapterSo,
title = chapterSo.title,
chapter = chapterSo.chapter,
chapter = chapterSo.chapter,
desc = chapterSo.description,
pic = chapterSo.coverPic,
hasSaveFile = cacheChapter == chapterSo.name
@@ -89,43 +85,19 @@ namespace AibisDream
[GlobalData]
public class ChapterData
{
public readonly TalkSceneSO firstChapter;
public List<TalkSceneSO> chapterList;
public List<string> unlockedChapterList;
public ChapterData()
{
Directory.CreateDirectory(ConstRef.SaveFilePath);
firstChapter = GameManager.Instance.firstTalkSo;
LoadChapterList();
LoadUnlockChapters();
}
private void LoadChapterList()
{
var all = GameManager.Instance?.GetAllSceneSos();
if (all != null)
{
chapterList = all.OrderBy(so => so.displayOrder).ToList();
}
else
{
chapterList = new List<TalkSceneSO>();
var curChapter = firstChapter;
do
{
chapterList.Add(curChapter);
curChapter = curChapter.GetNextScene();
} while (curChapter != null && !chapterList.Contains(curChapter));
}
}
private void LoadUnlockChapters()
{
unlockedChapterList = File.Exists(ConstRef.ChapterProgressPath)
? JsonUtil.ReadBeanArray<string>(ConstRef.ChapterProgressPath).ToList()
: new List<string> { firstChapter.name };
: new List<string> { GameManager.Instance.firstTalkSo.name };
}
public void SaveUnloadChapters()
+20 -17
View File
@@ -1,15 +1,12 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using AibisDream.FixSystem;
using AibisDream.Framework;
using AibisDream.Kit;
using AibisDream.UI;
using AibisDream.Utility;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using Yarn.Unity;
namespace AibisDream
@@ -20,9 +17,8 @@ namespace AibisDream
public GameLoopState state;
private TalkSceneSO[] _totalSceneSos;
public RunMode runMode;
private List<TalkSceneSO> _totalSceneSos;
[Header("生产环境数据(一般不动)")] public TalkSceneSO firstTalkSo;
[Header("单场景测试")] public TalkSceneSO testTalkSo;
@@ -32,6 +28,11 @@ namespace AibisDream
private BindProperty<TalkSceneSO> _currentTalkSceneSo;
private readonly GameLoopData _data = new();
public override void OnSingletonInit()
{
LoadAllSceneSos();
}
private void Start()
{
@@ -42,9 +43,6 @@ namespace AibisDream
// 场景So事件注册
_currentTalkSceneSo = new BindProperty<TalkSceneSO>();
_currentTalkSceneSo.Register(item => _data.curSceneSoName = item.name);
// 加载SO
Addressables.LoadAssetsAsync<TalkSceneSO>("SceneSO", null).Completed += LoadTalkSo;
#if UNITY_EDITOR
if (runMode == RunMode.SingleScene)
@@ -73,15 +71,17 @@ namespace AibisDream
#endif
}
private void LoadTalkSo(AsyncOperationHandle<IList<TalkSceneSO>> handle)
private void LoadAllSceneSos()
{
if (handle.Status == AsyncOperationStatus.Succeeded)
_totalSceneSos = new List<TalkSceneSO>();
var visited = new HashSet<TalkSceneSO>();
var current = firstTalkSo;
while (current != null && !visited.Contains(current))
{
_totalSceneSos = handle.Result.ToArray();
}
else
{
Debug.LogError("Failed to load textures.");
_totalSceneSos.Add(current);
visited.Add(current);
current = current.GetNextScene();
}
}
@@ -255,11 +255,14 @@ namespace AibisDream
}
}
public TalkSceneSO[] GetAllSceneSos() => _totalSceneSos;
public List<TalkSceneSO> GetAllSceneSos()
{
return _totalSceneSos;
}
public void SetSceneSoByName(string soName)
{
_currentTalkSceneSo.Value = Array.Find(_totalSceneSos, so => so.name == soName);
_currentTalkSceneSo.Value = Array.Find(_totalSceneSos.ToArray(), so => so.name == soName);
}
public void StartDialog()
-1
View File
@@ -23,7 +23,6 @@ namespace AibisDream
private const string DEFAULT_EXIT_NAME = "default";
public List<SceneExit> exits = new();
public int displayOrder;
public YarnProject yarnProject;