TH1/Unity/Assets/Scripts/TH1_UI/View/Outside/UIOutsideMenuSettingPanelMono.cs
2026-05-14 02:41:49 +08:00

244 lines
7.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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) 时显示
// 本面板不需要 ManageHintManageButton 直接关闭本 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;
}
}
}
}