Added serializable action.

This commit is contained in:
2025-11-03 20:34:21 +01:00
parent b0cd87be7d
commit 21b9cdc77c
11 changed files with 125 additions and 51 deletions

View File

@@ -0,0 +1,83 @@
using System;
using System.Linq;
using System.Reflection;
using UnityEngine;
using Object = UnityEngine.Object;
namespace SerializableFunc.Runtime
{
[Serializable]
public class SerializableAction
{
[SerializeField] private Object targetObject;
[SerializeField] private string methodName;
private Action cachedAction;
private static readonly BindingFlags SuitableMethodsFlags =
BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Instance;
public Object TargetObject
{
get => targetObject;
set => targetObject = value;
}
public string MethodName
{
get => methodName;
set => methodName = value;
}
private Action GetAction()
{
if (cachedAction == null)
{
if (targetObject == null)
throw new ArgumentNullException(nameof(targetObject), "Target Object is null!");
if (string.IsNullOrWhiteSpace(methodName))
throw new ArgumentNullException(nameof(methodName), "Target Method is null!");
MethodInfo info = targetObject
.GetType()
.GetMethods(SuitableMethodsFlags)
.FirstOrDefault(IsTargetMethodInfo);
if (info == null)
{
throw new MissingMethodException($"Object \"{targetObject.name}\" is missing target void method: {methodName}");
}
cachedAction = (Action)Delegate.CreateDelegate(typeof(Action), targetObject, methodName);
}
return cachedAction;
}
private bool IsTargetMethodInfo(MethodInfo methodInfo)
{
if (!string.Equals(methodInfo.Name, methodName, StringComparison.InvariantCulture))
return false;
if (methodInfo.ReturnType != typeof(void))
return false;
// Only allow parameterless void methods for this version
if (methodInfo.GetParameters().Length != 0)
return false;
return true;
}
public void Invoke()
{
GetAction()?.Invoke();
}
public static implicit operator Action(SerializableAction serializableAction)
{
return serializableAction?.GetAction();
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 2ba5aa5c8f7c474fbaba429c733d8d7c
timeCreated: 1762160974

View File

@@ -1,6 +1,6 @@
{
"name": "SerializableFunc.Runtime",
"rootNamespace": "",
"rootNamespace": "SerializableFunc.Runtime",
"references": [],
"includePlatforms": [],
"excludePlatforms": [],

View File

@@ -1,8 +1,8 @@
namespace UnityUtilities.SerializableDataHelpers
{
using System;
using System;
[System.Serializable]
namespace SerializableFunc.Runtime
{
[Serializable]
public class SerializableFunc<TReturn> : SerializableFuncBase<Func<TReturn>>
{
public TReturn Invoke()
@@ -12,7 +12,7 @@ namespace UnityUtilities.SerializableDataHelpers
}
}
[System.Serializable]
[Serializable]
public class SerializableFunc<TArg0, TReturn> : SerializableFuncBase<Func<TArg0, TReturn>>
{
public TReturn Invoke(TArg0 arg0)
@@ -22,7 +22,7 @@ namespace UnityUtilities.SerializableDataHelpers
}
}
[System.Serializable]
[Serializable]
public class SerializableFunc<TArg0, TArg1, TReturn> : SerializableFuncBase<Func<TArg0, TArg1, TReturn>>
{
public TReturn Invoke(TArg0 arg0, TArg1 arg1)
@@ -32,7 +32,7 @@ namespace UnityUtilities.SerializableDataHelpers
}
}
[System.Serializable]
[Serializable]
public class SerializableFunc<TArg0, TArg1, TArg2, TReturn> : SerializableFuncBase<Func<TArg0, TArg1, TArg2, TReturn>>
{
public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2)
@@ -42,7 +42,7 @@ namespace UnityUtilities.SerializableDataHelpers
}
}
[System.Serializable]
[Serializable]
public class SerializableFunc<TArg0, TArg1, TArg2, TArg3, TReturn> : SerializableFuncBase<Func<TArg0, TArg1, TArg2, TArg3, TReturn>>
{
public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3)
@@ -52,7 +52,7 @@ namespace UnityUtilities.SerializableDataHelpers
}
}
[System.Serializable]
[Serializable]
public class SerializableFunc<TArg0, TArg1, TArg2, TArg3, TArg4, TReturn> : SerializableFuncBase<Func<TArg0, TArg1, TArg2, TArg3, TArg4, TReturn>>
{
public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4)
@@ -62,7 +62,7 @@ namespace UnityUtilities.SerializableDataHelpers
}
}
[System.Serializable]
[Serializable]
public class SerializableFunc<TArg0, TArg1, TArg2, TArg3, TArg4, TArg5, TReturn> : SerializableFuncBase<Func<TArg0, TArg1, TArg2, TArg3, TArg4, TArg5, TReturn>>
{
public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5)
@@ -72,7 +72,7 @@ namespace UnityUtilities.SerializableDataHelpers
}
}
[System.Serializable]
[Serializable]
public class SerializableFunc<TArg0, TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TReturn> : SerializableFuncBase<Func<TArg0, TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TReturn>>
{
public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6)
@@ -82,7 +82,7 @@ namespace UnityUtilities.SerializableDataHelpers
}
}
[System.Serializable]
[Serializable]
public class SerializableFunc<TArg0, TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TReturn> : SerializableFuncBase<Func<TArg0, TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TReturn>>
{
public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, TArg7 arg7)
@@ -92,7 +92,7 @@ namespace UnityUtilities.SerializableDataHelpers
}
}
[System.Serializable]
[Serializable]
public class SerializableFunc<TArg0, TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TArg8, TReturn> : SerializableFuncBase<Func<TArg0, TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TArg8, TReturn>>
{
public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, TArg7 arg7, TArg8 arg8)
@@ -102,7 +102,7 @@ namespace UnityUtilities.SerializableDataHelpers
}
}
[System.Serializable]
[Serializable]
public class SerializableFunc<TArg0, TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TArg8, TArg9, TReturn> : SerializableFuncBase<Func<TArg0, TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TArg8, TArg9, TReturn>>
{
public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, TArg7 arg7, TArg8 arg8, TArg9 arg9)
@@ -112,7 +112,7 @@ namespace UnityUtilities.SerializableDataHelpers
}
}
[System.Serializable]
[Serializable]
public class SerializableFunc<TArg0, TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TArg8, TArg9, TArg10, TReturn> : SerializableFuncBase<Func<TArg0, TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TArg8, TArg9, TArg10, TReturn>>
{
public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, TArg7 arg7, TArg8 arg8, TArg9 arg9, TArg10 arg10)
@@ -122,7 +122,7 @@ namespace UnityUtilities.SerializableDataHelpers
}
}
[System.Serializable]
[Serializable]
public class SerializableFunc<TArg0, TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TArg8, TArg9, TArg10, TArg11, TReturn> : SerializableFuncBase<Func<TArg0, TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TArg8, TArg9, TArg10, TArg11, TReturn>>
{
public TReturn Invoke(TArg0 arg0, TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, TArg5 arg5, TArg6 arg6, TArg7 arg7, TArg8 arg8, TArg9 arg9, TArg10 arg10, TArg11 arg11)
@@ -132,7 +132,7 @@ namespace UnityUtilities.SerializableDataHelpers
}
}
[System.Serializable]
[Serializable]
public class SerializableFunc<TArg0, TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TArg8, TArg9, TArg10, TArg11, TArg12, TReturn> :
SerializableFuncBase<Func<TArg0, TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TArg8, TArg9, TArg10, TArg11, TArg12, TReturn>>
{
@@ -143,7 +143,7 @@ namespace UnityUtilities.SerializableDataHelpers
}
}
[System.Serializable]
[Serializable]
public class SerializableFunc<TArg0, TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TArg8, TArg9, TArg10, TArg11, TArg12, TArg13, TReturn> :
SerializableFuncBase<Func<TArg0, TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TArg8, TArg9, TArg10, TArg11, TArg12, TArg13, TReturn>>
{
@@ -154,7 +154,7 @@ namespace UnityUtilities.SerializableDataHelpers
}
}
[System.Serializable]
[Serializable]
public class SerializableFunc<TArg0, TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TArg8, TArg9, TArg10, TArg11, TArg12, TArg13, TArg14, TReturn> :
SerializableFuncBase<Func<TArg0, TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TArg8, TArg9, TArg10, TArg11, TArg12, TArg13, TArg14, TReturn>>
{
@@ -165,7 +165,7 @@ namespace UnityUtilities.SerializableDataHelpers
}
}
[System.Serializable]
[Serializable]
public class SerializableFunc<TArg0, TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TArg8, TArg9, TArg10, TArg11, TArg12, TArg13, TArg14, TArg15, TReturn> :
SerializableFuncBase<Func<TArg0, TArg1, TArg2, TArg3, TArg4, TArg5, TArg6, TArg7, TArg8, TArg9, TArg10, TArg11, TArg12, TArg13, TArg14, TArg15, TReturn>>
{

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: fe4625ec820a55848834d700960d1a9f
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 4bd647a4a04c7f947afa36dc0ab3e8bf
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: a05eff3308be0b2489425421e455c65f
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -4,9 +4,9 @@ using System.Reflection;
using UnityEngine;
using Object = UnityEngine.Object;
namespace UnityUtilities.SerializableDataHelpers
namespace SerializableFunc.Runtime
{
[System.Serializable]
[Serializable]
public abstract class SerializableFuncBase<TFuncType>
where TFuncType : Delegate
{