using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
public struct SpellEffectDataDefault
[StructLayout(LayoutKind.Sequential)]
public struct SpellEffectDataUnitPropertyModifier
[StructLayout(LayoutKind.Sequential)]
public struct SpellEffectDataProxy
[StructLayout(LayoutKind.Sequential)]
public struct SpellEffectDataDamage
[StructLayout(LayoutKind.Explicit)]
public struct SpellEffectDataUnion
public SpellEffectDataDefault Default;
public SpellEffectDataUnitPropertyModifier UnitPropertyModifier;
public SpellEffectDataProxy Proxy;
public SpellEffectDataDamage Damage;
var data = new SpellEffectDataDefault
Span<SpellEffectDataDefault> dataSpan = MemoryMarshal.CreateSpan(ref data, 1);
Span<byte> byteSpan = MemoryMarshal.Cast<SpellEffectDataDefault, byte>(dataSpan);
SpellEffectDataUnion union = MemoryMarshal.Cast<byte, SpellEffectDataUnion>(byteSpan)[0];
Console.WriteLine(union.Default.DataBits00);
Console.WriteLine(union.UnitPropertyModifier.Property);
Console.WriteLine(union.Proxy.Spell4Id);
Console.WriteLine(union.Damage.Amount);