feat:场景视图添加属性编辑,添加轮廓显示
This commit is contained in:
134
CharacterPreview/ModBehaviour.cs
Normal file
134
CharacterPreview/ModBehaviour.cs
Normal file
@@ -0,0 +1,134 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user