Files
DuckovMods/CharacterPreview/ModBehaviour.cs

135 lines
4.6 KiB
C#

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<CustomFaceSettingData>(characterFaceSaveKey);
if (!customFaceSettingData.savedSetting)
{
Debug.LogError("未能找到或加载 CustomFaceSettingData !");
customFaceSettingData = GameplayDataSettings.CustomFaceData.DefaultPreset.settings;
}
characterModel.CustomFace.LoadFromData(customFaceSettingData);
characterModel.gameObject.AddComponent<ModelMove>();
}
}
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;
}
}
}