using System; using System.Collections.Generic; using Animancer; using Logic; using Logic.Action; using Logic.AI; using Logic.Audio; using Logic.Config; using Logic.Multilingual; using ParadoxNotion; using RuntimeData; using Steamworks; using TH1_Core.Events; using TH1_Core.Managers; using TH1_Logic.Action; using TH1_Logic.Config; using TH1_Logic.Core; using TH1_Logic.Net; using TH1_Logic.Steam; using TH1_UI.View.Announce; using TH1Resource; using TMPro; using Unity.VisualScripting; using UnityEngine; using UnityEngine.UI; using ConfigManager = TH1_Logic.Config.ConfigManager; namespace TH1_UI.View.Outside { public class UIOutsideMenuSettingPanelMono : MonoBehaviour { public AnimancerComponent Animancer; public Button CloseButton; public Button BlockButton; public UIOutsideSelectOptionGroupMono LanguageOptionGroup; // MoreLanguage 模块:仅在 LanguageOptionGroup 选中索引 5 (moreLanguage) 时显示 // 本面板不需要 ManageHint,ManageButton 直接关闭本 Setting 并打开 UIOutsideMod public GameObject MoreLanguageModule; public TMP_Text NowUsingLanguageText; public Button ManageButton; //关闭时执行的委托 public ViDelegateAssisstant.Dele OnBtnCloseClick; //开始游戏时执行的委托(目前委托内容就是执行controller的Close()) public ViDelegateAssisstant.Dele OnStartGame; public void OnInit() { CloseButton.onClick.RemoveAllListeners(); CloseButton.onClick.AddListener(OnClose); BlockButton.onClick.RemoveAllListeners(); BlockButton.onClick.AddListener(OnClose); if (ManageButton != null) { ManageButton.onClick.RemoveAllListeners(); ManageButton.onClick.AddListener(OnManageButtonClicked); } gameObject.SetActive(false); } public void RefreshLanguageOption() { var lan = MultilingualManager.Instance.GetCurLanguage(); // 当前语言只要不是 5 主语言之一,就停在 moreLanguage (索引 5),并展开 MoreLanguageModule。 // SecondaryLanguage 仅作为"点击 moreLanguage 时切到哪个语言"的预设值使用,不参与此判定。 uint idx; bool useMore = !IsPrimaryLanguage(lan); if (useMore) { idx = 5; // 同步 SecondaryLanguage = 当前语言 if (ConfigManager.Instance.Config.SecondaryLanguage != lan) { ConfigManager.Instance.Config.SecondaryLanguage = lan; } } else { idx = lan switch { MultilingualType.ZH => 0, MultilingualType.TDZH => 1, MultilingualType.JP => 2, MultilingualType.EN => 3, MultilingualType.KR => 4, _ => 3 //默认英文 }; } LanguageOptionGroup.Init(idx); LanguageOptionGroup.OnOptionClicked = OnLanguageClicked; RefreshMoreLanguageModule(useMore); } // 主语言区即 OptionGroup 索引 0~4 直接对应的 5 种语言 private bool IsPrimaryLanguage(MultilingualType type) { return type == MultilingualType.ZH || type == MultilingualType.TDZH || type == MultilingualType.JP || type == MultilingualType.EN || type == MultilingualType.KR; } private void RefreshMoreLanguageModule(bool show) { if (MoreLanguageModule != null) { MoreLanguageModule.SetActive(show); } if (NowUsingLanguageText != null) { // 显示当前正在用的语言(与高亮的 MoreLanguage 选项对应),而不是 SecondaryLanguage —— 两者已经同步 NowUsingLanguageText.text = GetLanguageDisplayName(MultilingualManager.Instance.GetCurLanguage()); } } // 第二语言显示名(与 UITopSettingView 一致) private string GetLanguageDisplayName(MultilingualType type) { return type switch { MultilingualType.ZH => "简体中文", MultilingualType.TDZH => "繁體中文", MultilingualType.EN => "English", MultilingualType.JP => "日本語", MultilingualType.KR => "한국어", MultilingualType.RU => "Русский", MultilingualType.ES => "Español", MultilingualType.PT => "Português", MultilingualType.FR => "Français", MultilingualType.DE => "Deutsch", MultilingualType.ID => "Bahasa Indonesia", MultilingualType.TH => "ภาษาไทย", //这个没字体 MultilingualType.PL => "Polski", MultilingualType.VI => "Tiếng Việt", MultilingualType.MS => "Bahasa Melayu", MultilingualType.UK => "Українська", MultilingualType.KZ => "Қазақша", MultilingualType.TR => "Türkçe", MultilingualType.IT => "Italiano", MultilingualType.NL => "Nederlands", MultilingualType.FI => "Suomi", MultilingualType.SV => "Svenska", MultilingualType.NO => "Norsk", MultilingualType.CS => "Čeština", MultilingualType.HU => "Magyar", MultilingualType.EL => "Ελληνικά", MultilingualType.RO => "Română", MultilingualType.ET => "Eesti", MultilingualType.LT => "Lietuvių", MultilingualType.HR => "Hrvatski", MultilingualType.SR => "Српски", MultilingualType.SL => "Slovenščina", MultilingualType.SK => "Slovenčina", MultilingualType.BE => "Беларуская", MultilingualType.HE => "עברית",//没字体 MultilingualType.BG => "Български",//没字体 MultilingualType.UZ => "Oʻzbekcha",//没字体 MultilingualType.KY => "Кыргызча", MultilingualType.MN => "Монгол", MultilingualType.AR => "العربية", MultilingualType.DA => "Dansk", MultilingualType.TL => "Filipino", MultilingualType.Custom => "Custom", _ => type.ToString() }; } // ManageButton 点击:先关掉本 Setting 面板,再发事件打开 UIOutsideMod // 注意:跳到外层 OutsideManager 切换 Task 时,整个 MenuView 会被 SetActive(false), // 中断 OnClose 的 fadeOut 动画,导致 OnEnd 回调残留 + gameObject 仍保持 active=true。 // 等玩家从 Mod 回来再次点 Setting 时,新 fadeIn 触发会结算上一次残留的 OnEnd 把面板瞬间关掉。 // 所以这里不走带回调的 OnClose(),直接同步隐藏。 private void OnManageButtonClicked() { gameObject.SetActive(false); EventManager.Publish(new ShowUIOutsideMod()); } public void Open() { gameObject.SetActive(true); RefreshLanguageOption(); Animancer.Play(ResourceCache.Instance.AnimCache.UICommonPanelFadeIn); } public void OnClose() { AnimancerState state = Animancer.Play(ResourceCache.Instance.AnimCache.UICommonPanelFadeOut); state.Events.OnEnd += () => { gameObject.SetActive(false); }; } private void OnLanguageClicked(uint idx) { // 触发语言切换 0=CN 1=TC 2=JP 3=EN 4=KR 5=moreLanguage if (idx == 5) { // 切到玩家配置的第二语言,并展开 MoreLanguageModule var secondary = ConfigManager.Instance.Config.SecondaryLanguage; if (secondary == MultilingualType.None) secondary = MultilingualType.EN; MultilingualManager.Instance.ChangedMultilingual(secondary); RefreshMoreLanguageModule(true); return; } // 切回主语言时收起 MoreLanguageModule RefreshMoreLanguageModule(false); switch (idx) { case 0: MultilingualManager.Instance.ChangedMultilingual(MultilingualType.ZH); break; case 1: MultilingualManager.Instance.ChangedMultilingual(MultilingualType.TDZH); break; case 2: MultilingualManager.Instance.ChangedMultilingual(MultilingualType.JP); break; case 3: MultilingualManager.Instance.ChangedMultilingual(MultilingualType.EN); break; case 4: MultilingualManager.Instance.ChangedMultilingual(MultilingualType.KR); break; } } } }