-
-
Notifications
You must be signed in to change notification settings - Fork 220
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Unity Keyframe bug, different size in editor and app #368
Comments
[Preserve]
internal sealed class AnimationCurveFormatter : MemoryPackFormatter<AnimationCurve>
{
public void WriteArray<T, TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, T?[]? value) where TBufferWriter : class, IBufferWriter<byte>
{
if (value == null)
{
writer.WriteNullCollectionHeader();
}
else
{
IMemoryPackFormatter<T> formatter = writer.GetFormatter<T>();
writer.WriteCollectionHeader(value.Length);
for (int index = 0; index < value.Length; ++index)
formatter.Serialize<TBufferWriter>(ref writer, ref value[index]);
}
}
public void ReadArray<T>(ref MemoryPackReader reader, ref T?[]? value)
{
int length;
if (!reader.TryReadCollectionHeader(out length))
value = (T[]) null;
else if (length == 0)
{
value = Array.Empty<T>();
}
else
{
if (value == null || value.Length != length)
value = new T[length];
IMemoryPackFormatter<T> formatter = reader.GetFormatter<T>();
for (int index = 0; index < length; ++index)
formatter.Deserialize(ref reader, ref value[index]);
}
}
[Preserve]
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, ref AnimationCurve? value)
{
if (value == null)
{
writer.WriteNullObjectHeader();
return;
}
writer.WriteUnmanagedWithObjectHeader(3, value.@preWrapMode, value.@postWrapMode);
WriteArray(ref writer, value.@keys);
}
[Preserve]
public override void Deserialize(ref MemoryPackReader reader, ref AnimationCurve? value)
{
if (!reader.TryReadObjectHeader(out var count))
{
value = null;
return;
}
if (count != 3) MemoryPackSerializationException.ThrowInvalidPropertyCount(3, count);
reader.ReadUnmanaged(out WrapMode preWrapMode, out WrapMode postWrapMode);
Keyframe[]? keys = null;
ReadArray<global::UnityEngine.Keyframe>(ref reader, ref keys);
if (value == null)
{
value = new AnimationCurve();
}
value.preWrapMode = preWrapMode;
value.postWrapMode = postWrapMode;
value.keys = keys;
}
}
[Preserve]
internal sealed class KeyframeFormatter : MemoryPackFormatter<Keyframe>
{
[Preserve]
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, ref Keyframe value)
{
writer.WriteUnmanaged(value.time, value.value, value.inTangent, value.outTangent, value.weightedMode, value.inWeight, value.outWeight);
}
[Preserve]
public override void Deserialize(ref MemoryPackReader reader, ref Keyframe value)
{
float ___time;
float ___value;
float ___inTangent;
float ___outTangent;
int ___weightedMode;
float ___inWeight;
float ___outWeight;
reader.ReadUnmanaged(out ___time, out ___value, out ___inTangent, out ___outTangent, out ___weightedMode, out ___inWeight, out ___outWeight);
value.time = ___time;
value.value = ___value;
value.inTangent = ___inTangent;
value.outTangent = ___outTangent;
value.weightedMode = (WeightedMode)___weightedMode;
value.inWeight = ___inWeight;
value.outWeight = ___outWeight;
}
} I just change this code. then it will be ok. however, I'm not really sure that some custom struct need add the [StructLayout(LayoutKind.Sequential, Pack = 8)] to force my custom struct to be the same in different platforms. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
in release:
keyframe:
here SizeOf will change, because m_TangentMode doesn't exist in release.
by the way, should I also consider the struct layout in different platform? will this also cause deserialize fail?
The text was updated successfully, but these errors were encountered: