-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Change ValueHolder's namespace to Core (some items need to be repac…
…kaged). - Add reflection method Components (ReflectionMethodHolderXXX).
- Loading branch information
1 parent
bb59763
commit 6affd8e
Showing
115 changed files
with
2,590 additions
and
1,111 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
83 changes: 83 additions & 0 deletions
83
Threeyes/Plugins/ThreeyesPlugin/Core/Extension/LazyExtension_Enum.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
using System; | ||
using System.Collections; | ||
using System.Collections.Generic; | ||
using UnityEngine; | ||
namespace Threeyes.Core | ||
{ | ||
public static class LazyExtension_Enum | ||
{ | ||
/// <summary> | ||
/// Parse string to Enum,Int, Etc | ||
/// </summary> | ||
/// <typeparam name="T"></typeparam> | ||
/// <param name="myString"></param> | ||
/// <returns></returns> | ||
public static T Parse<T>(this string myString) where T : struct | ||
{ | ||
T enumerable = default; | ||
try | ||
{ | ||
enumerable = (T)Enum.Parse(typeof(T), myString); | ||
//Foo(enumerable); //Now you have your enum, do whatever you want. | ||
} | ||
catch (Exception) | ||
{ | ||
Debug.LogErrorFormat("Parse: Can't convert {0} to enum, please check the spell.", myString); | ||
} | ||
return enumerable; | ||
} | ||
|
||
//——Flag—— | ||
|
||
/// <summary> | ||
/// 检测使用位运算负责的枚举(标记为[Flag]),是否包含某个值(如果报错不会影响后续代码) | ||
/// </summary> | ||
/// <typeparam name="T">枚举类型</typeparam> | ||
/// <param name="en">实例</param> | ||
/// <param name="flag">某个枚举</param> | ||
/// <returns></returns> | ||
public static bool Has(this Enum en, Enum flag, bool ignoreZero = false) | ||
{ | ||
try | ||
{ | ||
if (ignoreZero && (int)(object)flag == 0)//PS:忽略 (None = 0),否则如果flag为0则一定会返回true | ||
return false; | ||
|
||
return en.HasFlag(flag);//PS:Unity2021.2的性能比旧版快100倍以上 | ||
//return ((int)(object)en & (int)(object)flag) == (int)(object)flag;//PS: 如果上面的方法在旧版C#不可用,可改用下面的判断 | ||
} | ||
catch | ||
{ | ||
return false; | ||
} | ||
} | ||
|
||
/// <summary> | ||
/// 获取Enum值的具体枚举名称,排除None或All | ||
/// | ||
/// PS: | ||
/// -【待确认】仅适用于使用了Flag标记的Enum | ||
/// </summary> | ||
/// <typeparam name="TEnumType"></typeparam> | ||
/// <param name="value"></param> | ||
/// <returns></returns> | ||
public static List<string> GetNamesEx(this Enum value, bool ignoreNone = true, bool ignoreEverything = true) | ||
{ | ||
List<string> result = new List<string>(); | ||
Type enumType = value.GetType(); | ||
foreach (int i in Enum.GetValues(enumType))//先转为Value,排除None或All为自定义名称的干扰 | ||
{ | ||
if (ignoreNone && i == 0) continue;//排除None | ||
|
||
if (ignoreEverything && i == ~0) continue;//排除All | ||
|
||
Enum curEnum = Enum.Parse(enumType, i.ToString()) as Enum; | ||
if (value.Has(curEnum)) | ||
{ | ||
result.Add(curEnum.ToString()); | ||
} | ||
} | ||
return result; | ||
} | ||
} | ||
} |
11 changes: 11 additions & 0 deletions
11
Threeyes/Plugins/ThreeyesPlugin/Core/Extension/LazyExtension_Enum.cs.meta
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
2 changes: 1 addition & 1 deletion
2
...reeyesPlugin/Core/Module/ValueHolder.meta → ...eeyesPlugin/Core/Module/MemberHolder.meta
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
2 changes: 1 addition & 1 deletion
2
...e/Module/ValueHolder/Reflection/Base.meta → ...Plugin/Core/Module/MemberHolder/Base.meta
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
86 changes: 86 additions & 0 deletions
86
Threeyes/Plugins/ThreeyesPlugin/Core/Module/MemberHolder/Base/ReflectionMemberHolderBase.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
using UnityEngine; | ||
using System; | ||
using System.Reflection; | ||
using UnityEngine.Events; | ||
|
||
namespace Threeyes.Core | ||
{ | ||
public abstract class ReflectionMemberHolderBase : MonoBehaviour | ||
{ | ||
public static string emptyMemberName = "___";//占位,代表不选,用于EditorGUI | ||
public const BindingFlags defaultBindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; | ||
|
||
public Type TargetType { get { return Target ? Target.GetType() : null; } } | ||
public UnityEngine.Object Target { get { return target; } set { target = value; } } | ||
|
||
/// <summary> | ||
/// Target Script instance in Scene or Asset window | ||
/// </summary> | ||
[SerializeField] protected UnityEngine.Object target; | ||
|
||
#region Utility | ||
|
||
protected bool SetMember<TMemberInfo>(TMemberInfo memberInfo, UnityAction<TMemberInfo, object, object> | ||
actSetValue, object value, Func<TMemberInfo, bool> actCheckIfCanSet = null) | ||
where TMemberInfo : MemberInfo | ||
{ | ||
if (memberInfo != null) | ||
{ | ||
bool canSet = actCheckIfCanSet != null ? actCheckIfCanSet(memberInfo) : true;//默认代表可写 | ||
if (canSet) | ||
{ | ||
if (IsSetValueValid(memberInfo, value)) | ||
{ | ||
try | ||
{ | ||
actSetValue(memberInfo, Target, value); | ||
return true; | ||
} | ||
catch (Exception e) | ||
{ | ||
Debug.LogError("SetMember with error: \r\n" + e); | ||
} | ||
} | ||
} | ||
} | ||
return false; | ||
} | ||
|
||
/// <summary> | ||
/// 在SetValue时判断是否有效 | ||
/// (eg:如果需要排除值为null的情况,可以覆写该方法) | ||
/// </summary> | ||
/// <param name="memberInfo"></param> | ||
/// <param name="value"></param> | ||
/// <returns></returns> | ||
protected virtual bool IsSetValueValid(MemberInfo memberInfo, object value) { return true; } | ||
|
||
/// <summary> | ||
/// | ||
/// Todo: | ||
/// -将GetMemberInfo弄成链式调用,而不是包含 | ||
/// </summary> | ||
/// <typeparam name="TMemberInfo"></typeparam> | ||
/// <param name="actGetMemberInfo"></param> | ||
/// <param name="memberName"></param> | ||
/// <param name="bindingFlags"></param> | ||
/// <returns></returns> | ||
protected TMemberInfo GetMemberInfo<TMemberInfo>(Func<Type, string, BindingFlags, TMemberInfo> actGetMemberInfo, string memberName, BindingFlags bindingFlags = defaultBindingFlags) | ||
where TMemberInfo : MemberInfo | ||
{ | ||
if (TargetType == null) | ||
return null; | ||
|
||
if (memberName == emptyMemberName || string.IsNullOrEmpty(memberName))//该字段没选择任意Member,不当报错 | ||
return null; | ||
|
||
TMemberInfo memberInfo = actGetMemberInfo(TargetType, memberName, bindingFlags); | ||
if (memberInfo == null) | ||
{ | ||
Debug.LogError("Can't find " + typeof(TMemberInfo) + " with name " + memberName + "in" + TargetType + "!"); | ||
} | ||
return memberInfo; | ||
} | ||
#endregion | ||
} | ||
} |
11 changes: 11 additions & 0 deletions
11
...s/Plugins/ThreeyesPlugin/Core/Module/MemberHolder/Base/ReflectionMemberHolderBase.cs.meta
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
8 changes: 8 additions & 0 deletions
8
Threeyes/Plugins/ThreeyesPlugin/Core/Module/MemberHolder/Editor.meta
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Oops, something went wrong.