feat(gameplay): 更新单位属性和材质配置 - 调整多个单位的基础生命值和攻击力数值平衡 - 修改CoreBattleGround材质的纹理缩放比例 - 更新地砖材质颜色为白色 - 优化纹理资源设置,调整最大纹理尺寸并添加PlayableAds平台支持 - 修复弓箭手技能目标查找逻辑,改用统一的敌人检测方法 - 为水晶矿添加中立阵营设置和光球视觉效果同步 - 调整预制体中的全局缩放参数 - 为狼人和石巨人添加NavMeshAgent组件支持 - 优化水晶矿血条显示位置计算方式 ```
115 lines
3.3 KiB
C#
115 lines
3.3 KiB
C#
#if UNITY_EDITOR_OSX || UNITY_EDITOR_WIN
|
|
using System;
|
|
using System.Reflection;
|
|
using UnityEditor;
|
|
|
|
namespace Cn.Tuanjie.Codely.Editor
|
|
{
|
|
public static class EditorWindowNativeHandleHelper
|
|
{
|
|
private const BindingFlags InstanceFlags =
|
|
BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public;
|
|
|
|
public static IntPtr GetGUIViewHandle(EditorWindow window)
|
|
{
|
|
if (window == null)
|
|
{
|
|
return IntPtr.Zero;
|
|
}
|
|
|
|
var parentField = typeof(EditorWindow).GetField("m_Parent", InstanceFlags);
|
|
object guiView = parentField?.GetValue(window);
|
|
if (guiView == null)
|
|
{
|
|
return IntPtr.Zero;
|
|
}
|
|
|
|
IntPtr nativeHandle = TryGetNativeHandleProperty(guiView);
|
|
if (nativeHandle != IntPtr.Zero)
|
|
{
|
|
return nativeHandle;
|
|
}
|
|
|
|
return TryGetViewPtrField(guiView);
|
|
}
|
|
|
|
private static IntPtr TryGetNativeHandleProperty(object guiView)
|
|
{
|
|
var nativeHandleProperty = guiView.GetType().GetProperty("nativeHandle", InstanceFlags);
|
|
if (nativeHandleProperty == null)
|
|
{
|
|
return IntPtr.Zero;
|
|
}
|
|
|
|
return TryConvertToIntPtr(nativeHandleProperty.GetValue(guiView, null));
|
|
}
|
|
|
|
private static IntPtr TryGetViewPtrField(object guiView)
|
|
{
|
|
var viewPtrField = GetFieldInTypeHierarchy(guiView.GetType(), "m_ViewPtr");
|
|
if (viewPtrField == null)
|
|
{
|
|
return IntPtr.Zero;
|
|
}
|
|
|
|
return TryConvertToIntPtr(viewPtrField.GetValue(guiView));
|
|
}
|
|
|
|
private static IntPtr TryConvertToIntPtr(object value)
|
|
{
|
|
if (value == null)
|
|
{
|
|
return IntPtr.Zero;
|
|
}
|
|
|
|
if (value is IntPtr ptr)
|
|
{
|
|
return ptr;
|
|
}
|
|
|
|
Type valueType = value.GetType();
|
|
foreach (string memberName in new[] { "m_IntPtr", "m_Ptr", "m_Value", "value" })
|
|
{
|
|
var field = GetFieldInTypeHierarchy(valueType, memberName);
|
|
if (field != null && field.FieldType == typeof(IntPtr))
|
|
{
|
|
return (IntPtr)field.GetValue(value);
|
|
}
|
|
|
|
var property = valueType.GetProperty(memberName, InstanceFlags);
|
|
if (property != null && property.PropertyType == typeof(IntPtr))
|
|
{
|
|
return (IntPtr)property.GetValue(value, null);
|
|
}
|
|
}
|
|
|
|
foreach (var field in valueType.GetFields(InstanceFlags))
|
|
{
|
|
if (field.FieldType == typeof(IntPtr))
|
|
{
|
|
return (IntPtr)field.GetValue(value);
|
|
}
|
|
}
|
|
|
|
return IntPtr.Zero;
|
|
}
|
|
|
|
private static FieldInfo GetFieldInTypeHierarchy(Type type, string name)
|
|
{
|
|
while (type != null)
|
|
{
|
|
var field = type.GetField(name, InstanceFlags);
|
|
if (field != null)
|
|
{
|
|
return field;
|
|
}
|
|
|
|
type = type.BaseType;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
#endif
|