unityzgy/Assets/Scripts/ZFramwork/Editor/PropertyActiveEditor.cs
ayuan9957 bf12e02276 feat: 多语言本地化系统 - 支持中/英/法/俄实时切换
- LocalizationManager: 新增翻译表(SetFormatted/SetDuration/LocalizeOperateMsg)
- LoginPanel: InputField placeholder本地化、字体颜色保持
- HistoryPanel: 用时数据本地化、placeholder本地化
- RecordDetailPanel: 操作详情消息本地化(LanguageChanged重建)
- AppraiseWindowBase: 评价等级本地化、操作消息重建
- EditorAppraiser: 所有评估消息改用InjectOperateMsgLocalized
- StudentOperateRecorder: 新增InjectOperateMsgLocalized方法
- LocalizationLanguageTestBar: 单例模式、ScreenSpaceOverlay筛选
- 字体切换时保留颜色和verticalOverflow
2026-07-16 10:05:59 +08:00

158 lines
5.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.Linq;
using System.Reflection;
using System;
[CustomPropertyDrawer(typeof(PropertyActiveAttribute), false)]
public class PropertyActiveEditor : PropertyDrawer
{
//字段路径
private string field;
//比较的值
private object compareValue;
//比较类型
private CompareType compare;
//计算的值
private object calculateValue;
//计算类型
private CalculateType calculate;
//是否隐藏
private bool flag;
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
//attribute是父类的传过来的是属性值
PropertyActiveAttribute attr = attribute as PropertyActiveAttribute;
//对应变量赋值
field = attr.FieldPath;
compareValue = attr.CompareValue;
compare = attr.Compare;
calculate = attr.Calculate;
calculateValue = attr.CalculateValue;
//获取当前属性所在的类例如当前属性是a.b那么就是获取a
var parent = property.GetActualObjectParent();
//获取用于条件判断的字段信息,值以及类型
var ComparePropertyField = parent.GetType().GetField(field);
var ComparePropertyValue = ComparePropertyField?.GetValue(parent);
var ComparePropertyType = ComparePropertyValue?.GetType();
//如果计算的类型不为None说明要计算
object calculateRes = ComparePropertyValue;
if (calculate != CalculateType.None)
{
//目前仅支持int或enum其实写这个主要为了enum判断
if (CanChangeToInt(ComparePropertyValue) && CanChangeToInt(calculateValue))
{
switch (attr.Calculate)
{
case CalculateType.Or:
{
calculateRes = (int)ComparePropertyValue | (int)calculateValue;
}
break;
case CalculateType.And:
{
calculateRes = (int)ComparePropertyValue & (int)calculateValue;
}
break;
case CalculateType.Xor:
{
calculateRes = (int)ComparePropertyValue ^ (int)calculateValue;
}
break;
default:
{
return EditorGUI.GetPropertyHeight(property);
}
}
}
else
{
return EditorGUI.GetPropertyHeight(property);
}
}
if (calculateRes == null) return EditorGUI.GetPropertyHeight(property);
//等于和不等于直接调用object的Equals
if (compare == CompareType.Equl)
{
flag = calculateRes.Equals(compareValue);
}
else if (compare == CompareType.NotEqul)
{
flag = !calculateRes.Equals(compareValue);
}
else if (ComparePropertyType == compareValue.GetType() && IsNumberType(ComparePropertyType))
{
//其他比较需要使用Comparer来比较两个object
switch (compare)
{
case CompareType.Less:
{
flag = Comparer.DefaultInvariant.Compare(calculateRes, compareValue) < 0;
}
break;
case CompareType.Greater:
{
flag = Comparer.DefaultInvariant.Compare(calculateRes, compareValue) > 0;
}
break;
case CompareType.LessAndEqul:
{
flag = Comparer.DefaultInvariant.Compare(calculateRes, compareValue) <= 0;
}
break;
case CompareType.GreaterAndEqul:
{
flag = Comparer.DefaultInvariant.Compare(calculateRes, compareValue) >= 0;
}
break;
}
}
if (flag) return 0;
else
{
return EditorGUI.GetPropertyHeight(property);
}
}
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
//不隐藏再进行一个绘制
if (!flag)
{
EditorGUI.PropertyField(position, property, label, true);
}
}
//判断是否是数值类型
public static bool IsNumberType(Type type)
{
//IsPrimitive就是系统自带的类IsValueType就是值类型再排除char剩下的就是intfloat这些了
return (type.IsPrimitive && type.IsValueType && type != typeof(char));
}
//。。。。
public static bool CanChangeToInt(object value)
{
try
{
int i = (int)value;
return true;
}
catch
{
return false;
}
}
public static bool CanChangeToDouble(object value)
{
try
{
double i = (double)value;
return true;
}
catch
{
return false;
}
}
}