Story流程+本地化
This commit is contained in:
@@ -25,10 +25,21 @@ namespace Ichni.UI
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void FadeIn(float duration = 0.5f, bool ignoreTimeScale = false, UnityAction action = null)
|
||||
/// <summary>
|
||||
/// 显示页面并播放淡入动画。
|
||||
/// <paramref name="beforeFadeAction"/> 在 Canvas 已激活、保持完全透明且输入仍被阻断时执行,
|
||||
/// 适用于需要先完成视口定位、动态布局或数据绑定,再让玩家看见页面的场景。
|
||||
/// </summary>
|
||||
public virtual void FadeIn(float duration = 0.5f, bool ignoreTimeScale = false,
|
||||
UnityAction action = null, UnityAction beforeFadeAction = null)
|
||||
{
|
||||
mainCanvasGroup.gameObject.SetActive(true);
|
||||
// 明确重置为不可见、不可交互状态,保证 beforeFadeAction 的任何布局变化都不会闪现在屏幕上。
|
||||
mainCanvasGroup.alpha = 0f;
|
||||
mainCanvasGroup.interactable = false;
|
||||
mainCanvasGroup.blocksRaycasts = false;
|
||||
fadeInStartAction?.Invoke();
|
||||
beforeFadeAction?.Invoke();
|
||||
|
||||
Tweener fade = mainCanvasGroup.DOFade(1f, duration).OnComplete(() =>
|
||||
{
|
||||
@@ -66,4 +77,4 @@ namespace Ichni.UI
|
||||
fade.Play();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using Ichni.Diagnostics;
|
||||
using Ichni.Menu;
|
||||
using UnityEngine;
|
||||
|
||||
@@ -22,20 +19,16 @@ namespace Ichni.UI
|
||||
MenuManager.instance.settingsUIPage.settingsWindowController.buttonsContainer.gameObject.SetActive(false);
|
||||
};
|
||||
|
||||
languageDropdown.SetUp(gameSettings.languageIndex, MenuManager.instance.displayLanguageList, "Menu UI/Settings_Language");
|
||||
languageDropdown.SetUp(SettingsManager.instance.GetLanguageDropdownIndex(), MenuManager.instance.displayLanguageList, "Menu UI/Settings_Language");
|
||||
languageDropdown.updateValueAction = () =>
|
||||
{
|
||||
BuildHangTracer.Log("UI_DROPDOWN", $"[Dropdown] 玩家选择语言索引: {languageDropdown.selectedIndex}");
|
||||
gameSettings.languageIndex = languageDropdown.selectedIndex;
|
||||
BuildHangTracer.Log("UI_DROPDOWN", "[Dropdown] 即将调用 SettingsManager.ApplyLanguageSettings()");
|
||||
SettingsManager.instance.ApplyLanguageSettings();
|
||||
BuildHangTracer.Log("UI_DROPDOWN", "[Dropdown] SettingsManager.ApplyLanguageSettings() 调用完成返回");
|
||||
SettingsManager.instance.SetLanguageByDropdownIndex(languageDropdown.selectedIndex);
|
||||
};
|
||||
}
|
||||
|
||||
public override void SetValuesFromSettings()
|
||||
{
|
||||
languageDropdown.SetValue(gameSettings.languageIndex);
|
||||
languageDropdown.SetValue(SettingsManager.instance.GetLanguageDropdownIndex());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -70,13 +70,13 @@ namespace Ichni.Menu
|
||||
public void SetBeatmapInfo(BeatmapSave beatmapSave)
|
||||
{
|
||||
accuracyText.text = $"{beatmapSave.accuracy * 100:F2}%";
|
||||
|
||||
if (!beatmapSave.isAllPerfect)
|
||||
{
|
||||
fullComboMark.gameObject.SetActive(beatmapSave.isFullCombo);
|
||||
}
|
||||
|
||||
allPerfectMark.gameObject.SetActive(beatmapSave.isAllPerfect);
|
||||
// 两种成绩徽记互斥显示:All Perfect 的优先级高于 Full Combo。
|
||||
// 必须每次都显式设置两个对象;仅在非 All Perfect 时更新 Full Combo 会让 Prefab
|
||||
// 初始状态或上一次选择谱面的显示状态残留,造成首次进入时同时出现两个徽记。
|
||||
bool showAllPerfect = beatmapSave.isAllPerfect;
|
||||
fullComboMark.gameObject.SetActive(!showAllPerfect && beatmapSave.isFullCombo);
|
||||
allPerfectMark.gameObject.SetActive(showAllPerfect);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ using Ichni.RhythmGame;
|
||||
using Ichni.Story;
|
||||
using Ichni.UI;
|
||||
using SLSUtilities.WwiseAssistance;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Events;
|
||||
using UnityEngine.UI;
|
||||
using UnityEngine.UI.Extensions;
|
||||
@@ -12,6 +13,9 @@ namespace Ichni.Menu
|
||||
public partial class SongSelectionUIPage : UIPageBase
|
||||
{
|
||||
public Button backButton;
|
||||
|
||||
[Tooltip("从选曲页进入当前章节剧情树的按钮。会优先定位当前选中歌曲对应的 SongBlock;未找到时显示剧情开头。")]
|
||||
public Button enterStoryButton;
|
||||
|
||||
public Gradient2 backgroundFrames;
|
||||
public float framePositionOffset = -1;
|
||||
@@ -44,21 +48,48 @@ namespace Ichni.Menu
|
||||
MenuInputManager.OnMoveDown += songListController.GoToNextTab;
|
||||
};
|
||||
|
||||
backButton.onClick.AddListener(() =>
|
||||
{
|
||||
FadeOut();
|
||||
SongSelectionManager.instance.StopPreviewSong();
|
||||
backButton.onClick.AddListener(ReturnToChapterSelection);
|
||||
|
||||
// 仅当本次选曲由剧情 SongBlock 发起时返回剧情页;普通选曲保持原有的章节选择返回逻辑。
|
||||
if (StoryManager.instance != null && StoryManager.instance.TryReturnFromSongSelection())
|
||||
StoryManager.instance.storyUIPage.FadeIn();
|
||||
else
|
||||
MenuManager.instance.chapterSelectionUIPage.FadeIn();
|
||||
});
|
||||
if (enterStoryButton != null)
|
||||
enterStoryButton.onClick.AddListener(OpenStoryForSelectedSong);
|
||||
|
||||
songInfoUI.SetUp();
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
backButton.onClick.RemoveListener(ReturnToChapterSelection);
|
||||
|
||||
if (enterStoryButton != null)
|
||||
enterStoryButton.onClick.RemoveListener(OpenStoryForSelectedSong);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 选曲页的全局返回语义固定为回到章节选择页。
|
||||
/// 即使本次页面最初由 Story SongBlock 打开,也不再把 Back 视为“返回剧情树”;
|
||||
/// 玩家需要使用专门的 <see cref="enterStoryButton"/> 进入剧情。
|
||||
/// </summary>
|
||||
private void ReturnToChapterSelection()
|
||||
{
|
||||
FadeOut();
|
||||
SongSelectionManager.instance.StopPreviewSong();
|
||||
|
||||
// Story SongBlock 入口上下文只服务于一次“进入游戏后返回剧情”的流程。
|
||||
// 玩家主动离开选曲页时必须清除它,避免之后普通选曲误继承旧的目标歌曲与返回目的地。
|
||||
InformationTransistor.instance?.storySongEntryContext?.Clear();
|
||||
MenuManager.instance.chapterSelectionUIPage.FadeIn();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 从选曲页打开当前章节的剧情树。若当前歌曲在 StoryData 中存在对应 SongBlock,
|
||||
/// StoryManager 会把视口定位到该 Block;未选中歌曲或没有对应 Block 时则显示剧情开头。
|
||||
/// </summary>
|
||||
private void OpenStoryForSelectedSong()
|
||||
{
|
||||
ChapterSelectionUnit chapter = ChapterSelectionManager.instance?.currentChapter;
|
||||
StoryManager.instance?.TryOpenStoryForSong(chapter, selectedSong);
|
||||
}
|
||||
|
||||
private void Start()
|
||||
{
|
||||
Sequence framesSeq = DOTween.Sequence();
|
||||
|
||||
Reference in New Issue
Block a user