using System; using System.Linq; using System.Reflection; using Duckov.Utilities; using Saves; using UnityEngine; using UnityEngine.SceneManagement; using Object = UnityEngine.Object; namespace CharacterPreview { public class ModBehaviour : Duckov.Modding.ModBehaviour { private static CharacterModel characterModel; private const string characterFaceSaveKey = "CustomFace_MainCharacter"; private OnPointerClick? instance; private const string ModelName = "CharacterPreviewModel"; protected override void OnAfterSetup() { MainMenu.OnMainMenuAwake += CreateCharacterModel; // // if (!instance) // { // instance = GetPointerClickEventReceiver(); // if (instance == null) // { // Debug.LogError("未能找到 SceneLoader.Instance.pointerClickEventRecevier!"); // } // else // { // instance.onPointerClick.AddListener((t) => CreateCharacterModel()); // } // // } } protected override void OnBeforeDeactivate() { MainMenu.OnMainMenuAwake -= CreateCharacterModel; if (characterModel) { Destroy(characterModel.gameObject); } } public static void CreateCharacterModel() { if (characterModel) { Debug.LogWarning("CharacterModel is already created"); return; } if (SceneManager.GetActiveScene().name != "MainMenu") { Debug.LogWarning("非主菜单"); return; } if (!characterModel) { var prefab = GetCharacterModelPrefab_Reflection(); if (prefab == null) { Debug.LogError("未能获取 CharacterModel 预制体!"); return; } characterModel = Instantiate(prefab); } if (characterModel) { characterModel.name = ModelName; var customFaceSettingData = SavesSystem.Load(characterFaceSaveKey); if (!customFaceSettingData.savedSetting) { Debug.LogError("未能找到或加载 CustomFaceSettingData !"); customFaceSettingData = GameplayDataSettings.CustomFaceData.DefaultPreset.settings; } characterModel.CustomFace.LoadFromData(customFaceSettingData); characterModel.gameObject.AddComponent(); } } OnPointerClick GetPointerClickEventReceiver() { var sl = SceneLoader.Instance; // 使用反射获取 SceneLoader 中的 pointerClickEventReceiver 字段 var field = typeof(SceneLoader).GetField("pointerClickEventRecevier", BindingFlags.Instance | BindingFlags.NonPublic); if (field == null) { Debug.LogError("pointerClickEventRecevier 字段在 SceneLoader 中未找到!"); return null; } // 获取字段值并转换为 OnPointerClick var eventReceiver = field.GetValue(sl) as OnPointerClick; if (eventReceiver == null) { Debug.LogError("pointerClickEventRecevier 字段的值为空!"); return null; } return eventReceiver; } private static CharacterModel GetCharacterModelPrefab_Reflection() { // 获取 LevelManager 实例 var lm = GameplayDataSettings.Prefabs.LevelManagerPrefab; if (lm == null) { Debug.LogError("LevelManager 实例未找到!"); return null; } // 使用反射获取 LevelManager 中的 characterModel 字段 var field = typeof(LevelManager).GetField("characterModel", BindingFlags.Instance | BindingFlags.NonPublic); if (field == null) { Debug.LogError("characterModel 字段在 LevelManager 中未找到!"); return null; } // 获取字段值并转换为 CharacterModel var modelPrefab = field.GetValue(lm) as CharacterModel; if (modelPrefab == null) { Debug.LogError("characterModel 字段的值为空!"); return null; } return modelPrefab; } } }