using System;
using System.Collections.Generic;
using UnityEngine;
///
/// 单个语言的通用排版适配数据节点 (仅包含 RectTransform 和 enabled)
///
[Serializable]
public class CommonLanguageConfigItem
{
[Header("RectTransform 配置")]
public Vector2 anchoredPosition = Vector2.zero;
public Vector2 sizeDelta = new Vector2(100f, 100f);
public Vector2 anchorMin = new Vector2(0.5f, 0.5f);
public Vector2 anchorMax = new Vector2(0.5f, 0.5f);
public Vector2 pivot = new Vector2(0.5f, 0.5f);
public Vector3 localScale = Vector3.one;
public Vector3 localRotation = Vector3.zero;
[Header("基础配置")]
public bool enabled = true;
public void ApplyToRectTransform(RectTransform rt)
{
if (rt == null) return;
rt.anchorMin = anchorMin;
rt.anchorMax = anchorMax;
rt.pivot = pivot;
rt.anchoredPosition = anchoredPosition;
rt.sizeDelta = sizeDelta;
rt.localScale = localScale;
rt.localRotation = Quaternion.Euler(localRotation);
// 应用 enabled 状态到 GameObject
if (rt.gameObject.activeSelf != enabled)
{
rt.gameObject.SetActive(enabled);
}
}
public void ReadFromRectTransform(RectTransform rt)
{
if (rt == null) return;
anchorMin = rt.anchorMin;
anchorMax = rt.anchorMax;
pivot = rt.pivot;
anchoredPosition = rt.anchoredPosition;
sizeDelta = rt.sizeDelta;
localScale = rt.localScale;
localRotation = rt.localRotation.eulerAngles;
// 读取当前 GameObject 的 active 状态
enabled = rt.gameObject.activeSelf;
}
public CommonLanguageConfigItem Clone() => (CommonLanguageConfigItem)MemberwiseClone();
}
///
/// 支持 Unity 序列化的字典
///
[Serializable]
public class CommonLanguageConfigDictionary
{
public List keys = new List();
public List values = new List();
public CommonLanguageConfigItem Get(string key)
{
if (string.IsNullOrEmpty(key)) return null;
int index = keys.IndexOf(key);
return index >= 0 ? values[index] : null;
}
public void Set(string key, CommonLanguageConfigItem value)
{
int index = keys.IndexOf(key);
if (index >= 0) values[index] = value;
else
{
keys.Add(key);
values.Add(value);
}
}
public bool ContainsKey(string key) => keys.Contains(key);
public void Remove(string key)
{
int index = keys.IndexOf(key);
if (index >= 0)
{
keys.RemoveAt(index);
values.RemoveAt(index);
}
}
}
///
/// 多语言通用排版适配器
///
[RequireComponent(typeof(RectTransform))]
public class CommonLanguageAdapter : MonoBehaviour
{
public const string DefaultLangId = "default";
[SerializeField, Tooltip("语言配置字典")]
private CommonLanguageConfigDictionary m_LanguageConfigs = new CommonLanguageConfigDictionary();
[SerializeField, Tooltip("目标 RectTransform 引用 (留空默认为自身)")]
private RectTransform m_TargetRectTransform;
private bool m_IsApplied = false;
public RectTransform TargetRectTransform
{
get => m_TargetRectTransform;
set => m_TargetRectTransform = value;
}
public CommonLanguageConfigDictionary LanguageConfigs => m_LanguageConfigs;
private void Awake() => DetectTargetComponent();
private void OnEnable()
{
if (!Application.isPlaying || !m_IsApplied)
{
// 获取当前语言环境,这里兼容您的语言系统逻辑
string langId = Application.isPlaying ? (Language.Id ?? DefaultLangId) : DefaultLangId;
ApplyConfig(langId);
}
}
#if UNITY_EDITOR
private void Reset()
{
DetectTargetComponent();
if (!HasConfig(DefaultLangId)) ReadCurrentToConfig(DefaultLangId);
}
#endif
public CommonLanguageConfigItem GetConfig(string languageId) => m_LanguageConfigs.Get(languageId);
public void SetConfig(string languageId, CommonLanguageConfigItem config) => m_LanguageConfigs.Set(languageId, config);
public void RemoveConfig(string languageId) => m_LanguageConfigs.Remove(languageId);
public bool HasConfig(string languageId) => m_LanguageConfigs.ContainsKey(languageId);
public List GetConfiguredLanguages() => new List(m_LanguageConfigs.keys);
public void ApplyConfig(string languageId)
{
var config = GetConfig(languageId);
if (config == null) return;
// 应用配置到目标组件(默认为自身的 RectTransform)
RectTransform targetRt = m_TargetRectTransform != null ? m_TargetRectTransform : GetComponent();
config.ApplyToRectTransform(targetRt);
m_IsApplied = true;
}
public void ReadCurrentToConfig(string languageId)
{
var config = new CommonLanguageConfigItem();
RectTransform targetRt = m_TargetRectTransform != null ? m_TargetRectTransform : GetComponent();
config.ReadFromRectTransform(targetRt);
SetConfig(languageId, config);
}
public static string GetLanguageShowName(string languageId)
{
if (Language.languageShowDict != null && Language.languageShowDict.TryGetValue(languageId, out string showName))
return showName;
return languageId;
}
private void DetectTargetComponent()
{
if (m_TargetRectTransform == null)
{
m_TargetRectTransform = GetComponent();
}
}
#if UNITY_EDITOR
[ContextMenu("读取当前配置")]
public void Editor_ReadCurrentConfig()
{
ReadCurrentToConfig(DefaultLangId);
UnityEditor.EditorUtility.SetDirty(this);
}
[ContextMenu("应用默认配置")]
public void Editor_ApplyDefaultConfig() => ApplyConfig(DefaultLangId);
#endif
}