Skip to content

Commit 3138102

Browse files
committed
fix: Milease key event & property animation
1 parent fb52635 commit 3138102

File tree

5 files changed

+106
-68
lines changed

5 files changed

+106
-68
lines changed

Scripts/Milease/Core/AnimatorExprManager.cs

+36-26
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System;
33
using System.Collections.Generic;
44
using System.Linq.Expressions;
5+
using System.Reflection;
56

67
namespace Milease.Core
78
{
@@ -24,33 +25,42 @@ internal class ExprMetaData
2425

2526
public static void WarmUp<T, E>(Expression<Func<T, E>> mbExpr)
2627
{
27-
if (mbExpr.Body is not MemberExpression memberExpr)
28+
MemberInfo memberInfo = null;
29+
if (mbExpr.Body is MemberExpression memberExpr)
30+
{
31+
memberInfo = memberExpr.Member;
32+
}
33+
else if (mbExpr.Body is UnaryExpression unaryExpr && unaryExpr.Operand is MemberExpression propExpr)
34+
{
35+
memberInfo = propExpr.Member;
36+
}
37+
else
2838
{
2939
throw new Exception("You must pass in a MemberExpression to construct the animator.");
3040
}
31-
_ = GetExprWithOffset<T, E>(memberExpr);
32-
_ = GetExpr<T, E>(memberExpr);
33-
_ = GetValSetter<T, E>(memberExpr);
34-
_ = GetValGetter<T, E>(memberExpr);
41+
_ = GetExprWithOffset<T, E>(memberInfo);
42+
_ = GetExpr<T, E>(memberInfo);
43+
_ = GetValSetter<T, E>(memberInfo);
44+
_ = GetValGetter<T, E>(memberInfo);
3545
}
3646

37-
internal static OffsetAnimatorExpression<T, E> GetExprWithOffset<T, E>(MemberExpression memberExpr)
47+
internal static OffsetAnimatorExpression<T, E> GetExprWithOffset<T, E>(MemberInfo memberInfo)
3848
{
39-
var key = (typeof(T), memberExpr.Member.Name);
49+
var key = (typeof(T), memberInfo.Name);
4050
if (offsetExpressionMap.TryGetValue(key, out var expr))
4151
{
4252
return (OffsetAnimatorExpression<T, E>)expr;
4353
}
4454

45-
expr = MakeExprWithOffset<T, E>(memberExpr);
55+
expr = MakeExprWithOffset<T, E>(memberInfo);
4656
offsetExpressionMap.Add(key, expr);
4757
return (OffsetAnimatorExpression<T, E>)expr;
4858
}
4959

50-
private static OffsetAnimatorExpression<T, E> MakeExprWithOffset<T, E>(MemberExpression memberExpr)
60+
private static OffsetAnimatorExpression<T, E> MakeExprWithOffset<T, E>(MemberInfo memberInfo)
5161
{
5262
var targetParam = Expression.Parameter(typeof(T), "target");
53-
var mutableMemberExpr = Expression.MakeMemberAccess(targetParam, memberExpr.Member);
63+
var mutableMemberExpr = Expression.MakeMemberAccess(targetParam, memberInfo);
5464

5565
var startParam = Expression.Parameter(typeof(E), "start");
5666
var endParam = Expression.Parameter(typeof(E), "end");
@@ -82,33 +92,33 @@ private static OffsetAnimatorExpression<T, E> MakeExprWithOffset<T, E>(MemberExp
8292
}
8393
}
8494

85-
internal static AnimatorExpression<T, E> GetExpr<T, E>(MemberExpression memberExpr)
95+
internal static AnimatorExpression<T, E> GetExpr<T, E>(MemberInfo memberInfo)
8696
{
87-
var key = (typeof(T), memberExpr.Member.Name);
97+
var key = (typeof(T), memberInfo.Name);
8898
if (expressionMap.TryGetValue(key, out var expr))
8999
{
90100
return (AnimatorExpression<T, E>)expr;
91101
}
92102

93-
expr = MakeExpr<T, E>(memberExpr);
103+
expr = MakeExpr<T, E>(memberInfo);
94104
expressionMap.Add(key, expr);
95105

96106
#if UNITY_EDITOR
97107
MetaData.Add(new ExprMetaData()
98108
{
99109
TName = typeof(T).FullName,
100110
EName = typeof(E).FullName,
101-
MemberName = memberExpr.Member.Name
111+
MemberName = memberInfo.Name
102112
});
103113
#endif
104114

105115
return (AnimatorExpression<T, E>)expr;
106116
}
107117

108-
private static AnimatorExpression<T, E> MakeExpr<T, E>(MemberExpression memberExpr)
118+
private static AnimatorExpression<T, E> MakeExpr<T, E>(MemberInfo memberInfo)
109119
{
110120
var targetParam = Expression.Parameter(typeof(T), "target");
111-
var mutableMemberExpr = Expression.MakeMemberAccess(targetParam, memberExpr.Member);
121+
var mutableMemberExpr = Expression.MakeMemberAccess(targetParam, memberInfo);
112122

113123
var startParam = Expression.Parameter(typeof(E), "start");
114124
var endParam = Expression.Parameter(typeof(E), "end");
@@ -143,44 +153,44 @@ private static AnimatorExpression<T, E> MakeExpr<T, E>(MemberExpression memberEx
143153
}
144154
}
145155

146-
internal static Func<T, E> GetValGetter<T, E>(MemberExpression memberExpr)
156+
internal static Func<T, E> GetValGetter<T, E>(MemberInfo memberInfo)
147157
{
148-
var key = (typeof(T), memberExpr.Member.Name);
158+
var key = (typeof(T), memberInfo.Name);
149159
if (valueGetterMap.TryGetValue(key, out var expr))
150160
{
151161
return (Func<T, E>)expr;
152162
}
153163

154-
expr = MakeGetter<T, E>(memberExpr);
164+
expr = MakeGetter<T, E>(memberInfo);
155165
valueGetterMap.Add(key, expr);
156166
return (Func<T, E>)expr;
157167
}
158168

159-
private static Func<T, E> MakeGetter<T, E>(MemberExpression memberExpr)
169+
private static Func<T, E> MakeGetter<T, E>(MemberInfo memberInfo)
160170
{
161171
var targetParam = Expression.Parameter(typeof(T), "target");
162-
var mutableMemberExpr = Expression.MakeMemberAccess(targetParam, memberExpr.Member);
172+
var mutableMemberExpr = Expression.MakeMemberAccess(targetParam, memberInfo);
163173

164174
return Expression.Lambda<Func<T, E>>(mutableMemberExpr, targetParam).Compile();
165175
}
166176

167-
internal static Action<T, E> GetValSetter<T, E>(MemberExpression memberExpr)
177+
internal static Action<T, E> GetValSetter<T, E>(MemberInfo memberInfo)
168178
{
169-
var key = (typeof(T), memberExpr.Member.Name);
179+
var key = (typeof(T), memberInfo.Name);
170180
if (valueSetterMap.TryGetValue(key, out var expr))
171181
{
172182
return (Action<T, E>)expr;
173183
}
174184

175-
expr = MakeSetter<T, E>(memberExpr);
185+
expr = MakeSetter<T, E>(memberInfo);
176186
valueSetterMap.Add(key, expr);
177187
return (Action<T, E>)expr;
178188
}
179189

180-
private static Action<T, E> MakeSetter<T, E>(MemberExpression memberExpr)
190+
private static Action<T, E> MakeSetter<T, E>(MemberInfo memberInfo)
181191
{
182192
var targetParam = Expression.Parameter(typeof(T), "target");
183-
var mutableMemberExpr = Expression.MakeMemberAccess(targetParam, memberExpr.Member);
193+
var mutableMemberExpr = Expression.MakeMemberAccess(targetParam, memberInfo);
184194
var valParam = Expression.Parameter(typeof(E), "value");
185195

186196
return Expression.Lambda<Action<T, E>>(

Scripts/Milease/Core/RuntimeAnimationPart.cs

+8-8
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public RuntimeAnimationPart(T target, MilInstantAnimator animator,
6060
}
6161

6262
public RuntimeAnimationPart(T target, MilInstantAnimator animator,
63-
MilAnimation.AnimationPart<E> animation, MemberExpression memberExpr,
63+
MilAnimation.AnimationPart<E> animation, MemberInfo member,
6464
MileaseHandleFunction<T, E> handleFunction = null)
6565
{
6666
if (target == null)
@@ -72,17 +72,17 @@ public RuntimeAnimationPart(T target, MilInstantAnimator animator,
7272
Source = animation;
7373
ParentAnimator = animator;
7474

75-
if (memberExpr != null)
75+
if (member != null)
7676
{
77-
MemberPath = memberExpr.Member.Name + target.GetHashCode();
77+
MemberPath = member.Name + target.GetHashCode();
7878
#if MILEASE_ENABLE_EXPRESSION
79-
ValueGetter = AnimatorExprManager.GetValGetter<T, E>(memberExpr);
80-
ValueSetter = AnimatorExprManager.GetValSetter<T, E>(memberExpr);
79+
ValueGetter = AnimatorExprManager.GetValGetter<T, E>(member);
80+
ValueSetter = AnimatorExprManager.GetValSetter<T, E>(member);
8181

82-
expression = AnimatorExprManager.GetExpr<T, E>(memberExpr);
83-
offsetExpression = AnimatorExprManager.GetExprWithOffset<T, E>(memberExpr);
82+
expression = AnimatorExprManager.GetExpr<T, E>(member);
83+
offsetExpression = AnimatorExprManager.GetExprWithOffset<T, E>(member);
8484
#else
85-
BindMember = memberExpr.Member;
85+
BindMember = member;
8686

8787
offsetCalcFunc = RuntimeBridge.GetOffsetFunc<E>();
8888
calcFunc = RuntimeBridge.GetFunc<E>();

Scripts/Milease/DSL/DSLCore.cs

+11-2
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,16 @@ private static MilInstantAnimator generate<T, E>(
5353
EaseType easeType, EaseFunction easeFunction
5454
)
5555
{
56-
if (mbExpr.Body is not MemberExpression memberExpr)
56+
MemberInfo memberInfo = null;
57+
if (mbExpr.Body is MemberExpression memberExpr)
58+
{
59+
memberInfo = memberExpr.Member;
60+
}
61+
else if (mbExpr.Body is UnaryExpression unaryExpr && unaryExpr.Operand is MemberExpression propExpr)
62+
{
63+
memberInfo = propExpr.Member;
64+
}
65+
else
5766
{
5867
throw new Exception("You must pass in a MemberExpression to construct the animator.");
5968
}
@@ -74,7 +83,7 @@ private static MilInstantAnimator generate<T, E>(
7483

7584
animator.Collection.Add(new List<IAnimationController>()
7685
{
77-
new RuntimeAnimationPart<T,E>(target, animator, animationPart, memberExpr, handleFunction)
86+
new RuntimeAnimationPart<T,E>(target, animator, animationPart, memberInfo, handleFunction)
7887
});
7988

8089
return animator;

Scripts/Milease/Editor/Il2CppCalFuncGenerator.cs

+47-30
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.IO;
55
using System.Linq;
66
using System.Linq.Expressions;
7+
using System.Reflection;
78
using System.Text;
89
using Milease.CodeGen;
910
using Milease.Core;
@@ -14,6 +15,11 @@ namespace Milease.Editor
1415
{
1516
public class Il2CppCalFuncGenerator
1617
{
18+
private class MemberMetaData
19+
{
20+
public string TName, EName, MemberName;
21+
}
22+
1723
[MenuItem("Milease/Generate source code")]
1824
public static void Generate()
1925
{
@@ -31,7 +37,33 @@ public static void Generate()
3137
EditorUtility.DisplayProgressBar("Milease", "Preparing...", 0f);
3238

3339
var types = GenerationBridge.GetAnimatableTypes();
34-
var members = AccessorGenerationList.GetGenerateMembers();
40+
var members =
41+
AccessorGenerationList.GetGenerateMembers().Select(x =>
42+
{
43+
if (x.Body is MemberExpression memberExpr)
44+
{
45+
return new MemberMetaData()
46+
{
47+
TName = x.Parameters[0].Type.FullName,
48+
EName = x.ReturnType.FullName,
49+
MemberName = memberExpr.Member.Name
50+
};
51+
}
52+
else if (x.Body is UnaryExpression unaryExpr && unaryExpr.Operand is MemberExpression propExpr)
53+
{
54+
return new MemberMetaData()
55+
{
56+
TName = x.Parameters[0].Type.FullName,
57+
EName = x.ReturnType.FullName,
58+
MemberName = propExpr.Member.Name
59+
};
60+
}
61+
else
62+
{
63+
return null;
64+
}
65+
}).Where(x => x != null);
66+
3567
if (!EditorUtility.DisplayDialog("Milease",
3668
$"Found {types.Count()} animatable type(s) and {members.Count()} member(s), " +
3769
$"do you want to generate now?",
@@ -80,7 +112,7 @@ public static void Reset()
80112
AssetDatabase.Refresh();
81113
AssetDatabase.ImportAsset(path);
82114

83-
code = GenerateAccessors(ArraySegment<LambdaExpression>.Empty);
115+
code = GenerateAccessors(ArraySegment<MemberMetaData>.Empty);
84116
path = Path.Combine(folder!, "GeneratedAccessors.cs");
85117
File.WriteAllText(path, code);
86118
AssetDatabase.Refresh();
@@ -89,7 +121,7 @@ public static void Reset()
89121
EditorUtility.ClearProgressBar();
90122
}
91123

92-
private static string GenerateAccessors(IEnumerable<LambdaExpression> members)
124+
private static string GenerateAccessors(IEnumerable<MemberMetaData> members)
93125
{
94126
string template;
95127
var sb = new StringBuilder();
@@ -112,17 +144,12 @@ public static partial class GeneratedAccessors
112144
template = " [(typeof(<<t>>), \"<<m>>\")] = new Func<<<t>>, <<e>>>(_mil_generated_get_<<n>>),";
113145
foreach (var member in members)
114146
{
115-
if (member.Body is not MemberExpression mbExpr)
116-
{
117-
continue;
118-
}
119-
120147
sb.AppendLine(
121-
template.Replace("<<t>>", member.Parameters[0].Type.FullName)
122-
.Replace("<<e>>", member.ReturnType.FullName)
123-
.Replace("<<m>>", mbExpr.Member.Name)
148+
template.Replace("<<t>>", member.TName)
149+
.Replace("<<e>>", member.EName)
150+
.Replace("<<m>>", member.MemberName)
124151
.Replace("<<n>>",
125-
(member.Parameters[0].Type.FullName + "_" + mbExpr.Member.Name)
152+
(member.TName + "_" + member.MemberName)
126153
.Replace(".", "_")
127154
)
128155
);
@@ -137,17 +164,12 @@ public static partial class GeneratedAccessors
137164
template = " [(typeof(<<t>>), \"<<m>>\")] = new Action<<<t>>, <<e>>>(_mil_generated_set_<<n>>),";
138165
foreach (var member in members)
139166
{
140-
if (member.Body is not MemberExpression mbExpr)
141-
{
142-
continue;
143-
}
144-
145167
sb.AppendLine(
146-
template.Replace("<<t>>", member.Parameters[0].Type.FullName)
147-
.Replace("<<e>>", member.ReturnType.FullName)
148-
.Replace("<<m>>", mbExpr.Member.Name)
168+
template.Replace("<<t>>", member.TName)
169+
.Replace("<<e>>", member.EName)
170+
.Replace("<<m>>", member.MemberName)
149171
.Replace("<<n>>",
150-
(member.Parameters[0].Type.FullName + "_" + mbExpr.Member.Name)
172+
(member.TName + "_" + member.MemberName)
151173
.Replace(".", "_")
152174
)
153175
);
@@ -171,17 +193,12 @@ public static void _mil_generated_set_<<n>>(<<t>> o, <<e>> v)
171193
";
172194
foreach (var member in members)
173195
{
174-
if (member.Body is not MemberExpression mbExpr)
175-
{
176-
continue;
177-
}
178-
179196
sb.AppendLine(
180-
template.Replace("<<t>>", member.Parameters[0].Type.FullName)
181-
.Replace("<<e>>", member.ReturnType.FullName)
182-
.Replace("<<m>>", mbExpr.Member.Name)
197+
template.Replace("<<t>>", member.TName)
198+
.Replace("<<e>>", member.EName)
199+
.Replace("<<m>>", member.MemberName)
183200
.Replace("<<n>>",
184-
(member.Parameters[0].Type.FullName + "_" + mbExpr.Member.Name)
201+
(member.TName + "_" + member.MemberName)
185202
.Replace(".", "_")
186203
)
187204
);

Scripts/Milease/Extension/MilInstantAnimatorExtension.cs

+4-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ public static MilInstantAnimator AsMileaseKeyEvent(this Action action, float del
2424
var animationPart = MilAnimation.SimplePart(action, delay);
2525
animator.Collection.Add(new List<IAnimationController>()
2626
{
27-
new RuntimeAnimationPart<Action, Action>(default, animator, animationPart, (MemberExpression)null, null)
27+
new RuntimeAnimationPart<Action, Action>(default, animator, animationPart,
28+
(_) => action.Invoke(),
29+
null)
2830
});
2931

3032
return animator;
@@ -39,7 +41,7 @@ public static MilInstantAnimator AsMileaseHandleFunction<E>(
3941
var animationPart = MilAnimation.SimplePart<E>(duration, delay);
4042
animator.Collection.Add(new List<IAnimationController>()
4143
{
42-
new RuntimeAnimationPart<E, E>(default, animator, animationPart, (MemberExpression)null, null)
44+
new RuntimeAnimationPart<E, E>(default, animator, animationPart, func, null)
4345
});
4446
return animator;
4547
}

0 commit comments

Comments
 (0)