135 lines
4.6 KiB
C#
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;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|