技能主要更新,修复卡顿并加入动画,以及各种其他更新。
This commit is contained in:
@@ -1,22 +1,34 @@
|
||||
using UnityEngine;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections;
|
||||
|
||||
public class SongDataLibrary : MonoBehaviour
|
||||
{
|
||||
public static SongDataLibrary Instance;
|
||||
private Dictionary<int, SongData> songDataDictionary = new Dictionary<int, SongData>();
|
||||
|
||||
// 指定存放在 "song_songIndex" 目录下的各个子文件夹名称
|
||||
// 例如:如果你有 Assets/Resources/song_songIndex/FolderA 和 FolderB,则在 Inspector 中填写 { "FolderA", "FolderB" }
|
||||
// ָ������� "song_songIndex" Ŀ¼�µĸ������ļ�������
|
||||
// ���磺������� Assets/Resources/song_songIndex/FolderA �� FolderB������ Inspector ����д { "FolderA", "FolderB" }
|
||||
public string[] subfolderNames;
|
||||
|
||||
[Header("Song List")]
|
||||
[SerializeField] SongList songList;
|
||||
[SerializeField] bool useSongListIfAvailable = true;
|
||||
|
||||
[Header("Async Load Settings")]
|
||||
[SerializeField] int yieldEvery = 16;
|
||||
[SerializeField] bool logLoadProgress = false;
|
||||
|
||||
public bool IsLoaded { get; private set; }
|
||||
public bool IsLoading { get; private set; }
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (Instance == null)
|
||||
{
|
||||
Instance = this;
|
||||
DontDestroyOnLoad(gameObject);
|
||||
LoadSongData();
|
||||
StartCoroutine(LoadSongDataCoroutine());
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -24,49 +36,141 @@ public class SongDataLibrary : MonoBehaviour
|
||||
}
|
||||
}
|
||||
|
||||
private void LoadSongData()
|
||||
private IEnumerator LoadSongDataCoroutine()
|
||||
{
|
||||
// 先加载直接放在 "song_songIndex" 目录下的 SongData
|
||||
SongData[] assets = Resources.LoadAll<SongData>("song_songIndex");
|
||||
foreach (SongData data in assets)
|
||||
if (IsLoading || IsLoaded)
|
||||
{
|
||||
if (!songDataDictionary.ContainsKey(data.songID))
|
||||
yield break;
|
||||
}
|
||||
|
||||
IsLoading = true;
|
||||
songDataDictionary.Clear();
|
||||
|
||||
// Allow one frame to render before heavy load begins
|
||||
yield return null;
|
||||
|
||||
// prefer SongList if available to avoid heavy Resources.LoadAll
|
||||
if (useSongListIfAvailable)
|
||||
{
|
||||
if (songList == null)
|
||||
{
|
||||
songDataDictionary.Add(data.songID, data);
|
||||
Debug.Log("加载到 SongData, songID: " + data.songID + ", 名称: " + data.songName);
|
||||
SongSelectUI ui = Object.FindAnyObjectByType<SongSelectUI>();
|
||||
if (ui != null)
|
||||
{
|
||||
songList = ui.songList;
|
||||
}
|
||||
}
|
||||
else
|
||||
if (songList != null && songList.songs != null && songList.songs.Count > 0)
|
||||
{
|
||||
Debug.LogWarning("重复的 songID: " + data.songID);
|
||||
yield return LoadFromList(songList.songs, "songList");
|
||||
IsLoaded = true;
|
||||
IsLoading = false;
|
||||
yield break;
|
||||
}
|
||||
}
|
||||
|
||||
// 再遍历每个子文件夹,加载其中的 SongData
|
||||
foreach (string subfolder in subfolderNames)
|
||||
yield return LoadFromPath("song_songIndex", "root");
|
||||
|
||||
if (subfolderNames != null)
|
||||
{
|
||||
SongData[] subAssets = Resources.LoadAll<SongData>("song_songIndex/" + subfolder);
|
||||
foreach (SongData data in subAssets)
|
||||
for (int i = 0; i < subfolderNames.Length; i++)
|
||||
{
|
||||
if (!songDataDictionary.ContainsKey(data.songID))
|
||||
string subfolder = subfolderNames[i];
|
||||
if (string.IsNullOrEmpty(subfolder))
|
||||
{
|
||||
songDataDictionary.Add(data.songID, data);
|
||||
Debug.Log("从 " + subfolder + " 加载到 SongData, songID: " + data.songID + ", 名称: " + data.songName);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
yield return LoadFromPath("song_songIndex/" + subfolder, subfolder);
|
||||
// yield a frame between folders to reduce hitch
|
||||
yield return null;
|
||||
}
|
||||
}
|
||||
|
||||
IsLoaded = true;
|
||||
IsLoading = false;
|
||||
}
|
||||
|
||||
private IEnumerator LoadFromPath(string path, string label)
|
||||
{
|
||||
SongData[] assets = Resources.LoadAll<SongData>(path);
|
||||
if (assets == null || assets.Length == 0)
|
||||
{
|
||||
if (logLoadProgress)
|
||||
{
|
||||
Debug.Log("SongDataLibrary: no assets found at '" + path + "'");
|
||||
}
|
||||
yield break;
|
||||
}
|
||||
|
||||
int yielded = 0;
|
||||
foreach (SongData data in assets)
|
||||
{
|
||||
if (data == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (!songDataDictionary.ContainsKey(data.songID))
|
||||
{
|
||||
songDataDictionary.Add(data.songID, data);
|
||||
if (logLoadProgress)
|
||||
{
|
||||
Debug.LogWarning("重复的 songID: " + data.songID);
|
||||
Debug.Log("Loaded SongData [" + label + "] songID: " + data.songID + ", name: " + data.songName);
|
||||
}
|
||||
}
|
||||
else if (logLoadProgress)
|
||||
{
|
||||
Debug.LogWarning("Duplicate songID: " + data.songID);
|
||||
}
|
||||
|
||||
yielded++;
|
||||
if (yieldEvery > 0 && (yielded % yieldEvery) == 0)
|
||||
{
|
||||
// yield to spread work across frames
|
||||
yield return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public SongData GetSongDataByID(int songID)
|
||||
|
||||
private IEnumerator LoadFromList(List<SongData> list, string label)
|
||||
{
|
||||
if (list == null || list.Count == 0)
|
||||
{
|
||||
yield break;
|
||||
}
|
||||
|
||||
int yielded = 0;
|
||||
for (int i = 0; i < list.Count; i++)
|
||||
{
|
||||
SongData data = list[i];
|
||||
if (data == null) continue;
|
||||
if (!songDataDictionary.ContainsKey(data.songID))
|
||||
{
|
||||
songDataDictionary.Add(data.songID, data);
|
||||
if (logLoadProgress)
|
||||
{
|
||||
Debug.Log("Loaded SongData [" + label + "] songID: " + data.songID + ", name: " + data.songName);
|
||||
}
|
||||
}
|
||||
else if (logLoadProgress)
|
||||
{
|
||||
Debug.LogWarning("Duplicate songID: " + data.songID);
|
||||
}
|
||||
|
||||
yielded++;
|
||||
if (yieldEvery > 0 && (yielded % yieldEvery) == 0)
|
||||
{
|
||||
yield return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
public SongData GetSongDataByID(int songID)
|
||||
{
|
||||
if (songDataDictionary.ContainsKey(songID))
|
||||
{
|
||||
return songDataDictionary[songID];
|
||||
}
|
||||
Debug.LogError("未找到 songID: " + songID);
|
||||
Debug.LogError("δ�ҵ� songID: " + songID);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user